Skip to content

Hand-of-Doom/budgie

Repository files navigation

Budgie

A simple task runner
No dependencies, blazing fast

How to install

wget -qO- https://raw.githubusercontent.com/Hand-of-Doom/budgie/main/installer/install.sh | sudo sh -s 2.0.0

For the current user (no sudo required)

wget -qO- https://raw.githubusercontent.com/Hand-of-Doom/budgie/main/installer/install.sh | sh -s 2.0.0

You can install it as a go package if you have go installed

go install github.com/Hand-of-Doom/budgie/v2@latest

Examples

Hello World

PrintHelloWorld() {
    echo "Hello world!"
}

Complex example

Use the power of bash

output=$(pwd)

for i in $(seq 1 5); do
    output="$output/$i"
done

Build() {
   go build -o $output
   add() {
       echo $(($1 + $2))
   }
   echo "compilation time is $(add 2 3) ms"
}

Real world example

A single page application written in lit-html and go
Click to go to an example

output="$(pwd)/build"
mkdir -p $output

exe_file="$output/app.bin"

BuildBackend() {
    cd ./backend
    go build -o "$exe_file"
    cp ./config.yaml $output
}

BuildFrontend() {
    cd ./frontend
    [ ! -d ./node_modules ] && npm i
    public_dir="$output/public"
    npx esbuild ./app.js --bundle --minify --outfile="$public_dir/bundle.js"
    cp -a ./static/. "$public_dir/"
}

Build() { 
    BuildBackend
    BuildFrontend
}

Run() {
    Build
    cd $output
    $exe_file
}

How to use

Create a tasks.sh file with the following content

PrintHello() {
    echo -n "Hello "
}

# inline
PrintWorld() { echo "world!" }

# with dependencies
PrintHelloWorld() {
    PrintHello
    PrintWorld
}

Then run a line below in your terminal

$ budgie printHelloWorld

The output

$ Hello world!

If you don't want to use tasks.sh as a filename, just pass a path to the file you want as the second argument

$ budgie printHelloWorld fileYouWant

These commands are the same

$ budgie printHelloWorld
$ budgie printHelloWorld tasks.sh

It uses tasks.sh as the default filename if no filename is passed

More about file parsing

Target

TargetName() {
    echo "this target is named targetName"
}

Target is a function declared in a pascal case
This is an important detail

Try run the following code snippet via budgie targetName

targetName() {
    :
}

The output

$ TargetName: command not found

targetName is a function declared in a top-level scope,
it can be invoked from the target as follows

targetName() {
    :
}

Target() {
    targetName
}

Scopes

The global scope can be accessed from the target as follows

printHello() {
    echo -n "Hello "
}

printWorld() {
    echo "world!"
}

PrintHelloWorld() {
    printHello
    printWorld
}

The global scope below the target cannot be accessed

PrintHelloWorld() {
    printHello
    printWorld
}

printHello() { : }

printWorld() { : }

The output

$ printHello: command not found