Style - churchers/vm-bhyve GitHub Wiki

Variables

In general we take the following format for variables:

Global - ${ALL_CAPS}
Local  - ${_variable}

Unless variables are designed to be global, they should always be declared at the top of the current function using local. Quite often functions are designed to modify variables declared in a parent function. In this case, the variable should be listed in the @modifies list in the function description to make it clear that the function modifies variables declared outside of its scope.

All variables are accessed using braces - ${_variable}

Functions

The majority of functions are prefixed with the name of the library they belong to, as this helps make it obvious where functions are defined.

lib::function_name

We precede most functions with a small description that explains what the function does, and lists arguments and/or return values, unless the code is obvious.

Private functions are prefixed with __.

Coding Style

Commenting

Any code should be well commented, especially if it's not instantly clear exactly what the code is doing.

Indentation & Length

All code should be correctly indented, using 4 spaces.

Line length should be kept to a reasonable length, making use of \ to split code across multiple lines if necessary.

If Statements

If statements are written as follows. If there are multiple statements, there should be a blank line inbetween.

# check something
if [ test ]; then
    code
fi

# check something else
if [ test2 ]; then
    code2
fi

Where appropriate, tests are reduced to one line for brevity and clarity

[ "check err" ] && util::err "Some error"
[ "check ok" ] || util::err "Another error"

In order to simply code and help reduce line length, code should be designed to perform a check, then return or exit if appropriate, rather than containing large blocks of code inside if statements, e.g.:

lib::good_function(){

   [ "check err condition" ] && return 1

   main_code_block
}

lib::bad_function(){

    if [ "check ok condition" ]; then

        main_code_block
    else
        return 1
    fi
}
Return Values

Where it makes sense, functions return 0 on success, or any other integer on error. For return values we prefer using setvar, rather than $(func) and echo, which requires a subshell. Not using a subshell has been shown to improve performance.

lib::good_function(){
    local _var="$1"

    setvar "${_var}" "return value"
}

lib::bad_function(){

    echo "return value"
}

_variable=$(lib::bad_function)
lib::good_function "_variable"
Case Statements

In general, ;; should be placed on a new line to improve readability. The exception to this is when each case only contains one line, where adding ;; on a newline would needlessly increase code length. The function calls should however be lined up.

case "${_variable}" in
    one)   func_one ;;
    two)   func_two ;;
    three) func_three ;;
esac