diff --git a/bin/nuxr-nuxsh b/bin/nuxr-nuxsh new file mode 100755 index 0000000..b1beaea --- /dev/null +++ b/bin/nuxr-nuxsh @@ -0,0 +1,153 @@ +#!/usr/bin/env bash + +### +### *nuxr-nuxsh* is wrapped bash interpreter for *nux-env* enhanced bash scripts +### and provides out of the box support for command-style scripts (similar in +### usage such as apt, git) with following features out of the box: +### +### task selection:: +### Automaticly selects correct tasks, displays help if +### task does not exists. +### logging:: +### Using *nux.log* function and changing output using +### *debug*, *trace* prefixes +### help display:: +### Automated help display when no arguments are provided. +### Uses source comments as source for help. +### +### +### # Writing nux-runner scripts +### +### *nux-runner* scripts are basicly bash scripts with some additional conventions. +### +### +### +### +### +### 1. Shebang:: +### Shebang (*#!*) at the start of file is *#!/usr/bin/env nuxr-nuxsh* +### 2. Tasks:: +### Script usually does only defines functions in form task {taskname} +### where taskname +### ## Defining a task +### +### +### +### + + +readonly NUX_RUNNER_BIN_DIR=$(dirname $(realpath ${BASH_SOURCE[0]})) +source $NUX_RUNNER_BIN_DIR/../inc/nux.inc.sh +readonly NUX_RUNNER=$NUX_RUNNER_BIN_DIR/nuxr-nuxsh; + +nux.use nuxr +nux.use nux.cfg + +## +## Additional commands provided by *nux-runner*: +### *nux-runner* automaticly provides following tasks to any script it executes: + +## + + + +## debug:: [] +## Runs specified task with debug messages enabled. +task.debug() { + nux.log.level debug + nuxr.run "$@" +} + +## trace:: [] +## Runs specified task with debug & trace enabled. +task.trace() { + nux.log.level trace + nuxr.run "$@" +} + +## help:: [command] +## Display help for command or topic if specified. Otherwise displays +## documentation. +task.help() { + nuxr.task.help "$@" +} + +## config:: [type] name [value] +## Reads or writes application specific configuration option. +### +### There are 3 *types* of configuration: +### dist:: +### Distribution provided configuration. Read-only configuration. +### global:: +### Global (user-specific) provided configuration. This configuration is +### usually stored in *~/.config/{app-name}/config.yml* +### local:: +### Local configuration. +### +### The resulting application configuration is merger of these three (if available) +### with following preference (most-specific one): +### local, global, dist +### +task.config() { + nux.log trace "global is" $(nux.cfg.dir.global) + nux.log trace "dist is" $(nux.cfg.dir.dist) + nux.log trace "local is" $(nux.cfg.dir.local) + + if [ "$#" -ge 3 ] ; then + nux.cfg.write "$@" + else + nux.cfg.read "$@"; + fi +} + +task.() { + task.help +} + + +## interactive:: +## Executes interactive application shell. +task.interactive() { + nuxr.task.interactive "$@" +} +### +### + +if [ "$NUX_RUNNER" = "$(realpath "$0")" ] +then + NUX_SCRIPT=$1; + shift; +else + NUX_SCRIPT=$0; + NUX_NO_INCLUDE="no include"; +fi + +if [ -n "$NUX_SCRIPT" ]; then + # Determines script + NUX_SCRIPT_DIR=$(dirname "$NUX_SCRIPT") + NUXR_APP_BIN=$(realpath "$NUX_SCRIPT") + NUXR_APP_BIN_DIR=$(dirname "$NUXR_APP_BIN") + NUXR_APP_DIR=$(dirname "$NUXR_APP_BIN_DIR") + NUXR_APP_NAME=$(basename "$NUX_SCRIPT") + + NUX_SCRIPTNAME=$(basename "$NUX_SCRIPT") + + nux.log trace "NUX_SCRIPT env: " $(set | grep NUX_SCRIPT) + if [ -z "$NUX_NO_INCLUDE" ] + then + nux.log debug "Including script: $NUX_SCRIPT" + nux.log trace "NUX_SCRIPT env: " $(set | grep NUX_SCRIPT) + + compilefile=$(realpath nux-env | md5sum | cut -d" " -f1) + #FIXME: check if nux_cache should be used. + nux.nuxsh.use "$NUX_SCRIPT" "/tmp/$compilefile.nuxr.nuxsh"; + NUX_NO_INCLUDE="no-include" + fi + nuxr.main "$@" +else + + echo Usage: nux-runner [script] [task] [options] + echo + grep "^\#\#" "$NUX_RUNNER" | sed -re "s/^#+ ?(.*)/\1/gi" | nux.help.shelldoc + echo +fi