1
1
Fork 0
mirror of https://github.com/tonydamage/nux-env.git synced 2025-12-11 13:24:28 +01:00
nux-env/bin/nuxfs
Tony Tkacik 089cb5ccce shelldoc: Added micro markup support for shell comments.
Added support for micro markup to ease reading and to
highlight keywords and headings in documentation derived
from shell comments.

nuxfs and nux-runner takes advantage from this.

Signed-off-by: Tony Tkacik <tonydamage@gmail.com>
2017-06-11 17:23:55 +02:00

265 lines
6.5 KiB
Text
Executable file
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env nux-runner
### # nuxfs - Filesystem layout manager
###
### *nuxfs* command uses file structure definition present in *.nuxfs* file
### to understand intented state of directory / filesystem of user.
###
### This definition is not only used to create filesystem hierarchy, checkout
### git repositories but also to verify state of filesystem afterwards.
###
### ## Example of .nuxfs file in home directory
###
### *dir* github
### *git* nux-env https://github.com/tonydamage/nux-env.git
### *git* bats https://github.com/sstephenson/bats.git
### *enddir*
### *link* .bashrc github/nux-env/bashrc
###
### This *.nuxfs* file describes simple home structure. If we execute
### **nuxfs apply** command, it will performs filesystem changes in order to
### recreate structure described in *.nuxfs* file. In case of example it is
### equivalent of executing:
### mkdir -p github
### git clone https://github.com/tonydamage/nux-env.git github/nux-env
### git clone https://github.com/sstephenson/bats.git
### ln -s github/nux-env/bashrc .bashrc
###
local WORKDIR=$(pwd)
local TEMPLATE_DIR=$NUX_ENV_DIR/templates
local SUFFIX=".nuxfs"
local TEMPLATE_FILTER="*$SUFFIX"
nux.use nux.dsl
nux.use nuxfs
GIT_BIN=$(which git)
## check Verifies that directories and files matches the specification
## in *.nuxfs* definition
##
task.check() {
nuxfs.dsl.process "$@";
}
task.describe() {
nuxfs.dsl.process "$@";
}
## apply Creates missing files as specified in *.nuxfs* definition.
## **DOES NOT MODIFY** existing files breaking specification.
##
task.apply() {
nuxfs.dsl.process "$@";
}
## fix Performs apply and tries to fix warnings and errors and files as
## specified in nuxfs definition. This operation **DOES MODIFY**
## existing files.
##
task.fix() {
nuxfs.dsl.process "$@";
}
## help.dsl Displays help for **nuxfs DSL language**
##
task.help.dsl() {
nux.help.comment "$NUX_INC_DIR/dsl/nuxfs.dsl"
}
nuxfs.dsl.process() {
WORKDIR=$(pwd);
TARGET=$1;
if [ -n "$TARGET" ]; then
TARGET=$TARGET
else
TARGET=$(pwd);
fi;
TARGET=$(realpath -Lms "$TARGET")
nux.log debug Target: $TARGET
NUXFS_DEF=$(nuxfs.closest $SUFFIX "$TARGET");
#
if [ "$NUXFS_DEF" = "" ]; then
nuxfs.error $(pwd) "No nuxfs configuration found."
exit 1;
fi
NUXFS_DEF_DIR=$(dirname $NUXFS_DEF);
TARGET_RELATIVE=$(realpath -ms "$TARGET" --relative-to "$NUXFS_DEF_DIR")
TARGET_ABSOLUTE=$(realpath -ms "$TARGET")
if [ "$TARGET_RELATIVE" != . ]; then
if [[ $$TARGET_RELATIVE != ./* ]]; then
TARGET_RELATIVE="./$TARGET_RELATIVE"
fi
nux.dsl.only.subtree "$TARGET_RELATIVE"
fi
nux.log debug nuxfs definition: $NC_White$NUXFS_DEF$NC_No
nux.log debug $NC_White"target directory:$Nc_No"
nux.log debug " relative to def:" $NC_White$TARGET_RELATIVE$NC_No
nux.log debug " absolute path: " $NC_White$TARGET_ABSOLUTE$NC_No
if test -e "$NUXFS_DEF"; then
# #NUXFS_TARGET_FOUND=0;
nux.dsl.execute "$NUX_INC_DIR/dsl/nuxfs.$TASK" "$NUXFS_DEF";
# #if [ $NUXFS_TARGET_FOUND = 0 ]; then
# # nuxfs.warning "$3" "Does not have definition in $DEF";
# fi
else
nuxfs.error "$NUXFS_DEF" Definition file does not exists.
fi
}
## init Initializes a directory using template
##
function task.init {
if [ $# -eq 0 ]; then
nux.log debug "No template specified. Creating empty $SUFFIX definition."
touch .nuxfs
return;
fi
local TEMPLATE=$1
nux.log debug "User specified template is " $TEMPLATE
if [ $(echo $TEMPLATE | grep -c "$SUFFIX\$") -eq 0 ]; then
nux.log debug "Template is common template."
TEMPLATE=$TEMPLATE_DIR/$TEMPLATE$SUFFIX
if [ ! -e $TEMPLATE ]; then
echo -n "Template '$1' does not exists. "
nuxfs.template.list
return;
fi;
fi;
nux.log debug "Using '$TEMPLATE' to initialize."
if [ ! -e $TEMPLATE ]; then
echo "nuxfs template $1 does not exists."
return;
fi;
local template_relative=$(realpath -Lms $TEMPLATE --relative-to $(pwd))
nux.log debug "Creating link $SUFFIX: target is '$template_relative'";
ln -s "$template_relative" "$SUFFIX"
nux.log debug "Invoking create task."
task.create
}
## template - List available templates
##
function task.template {
nux.log debug $NUX_ENV_DIR
nuxfs.template.list
}
function task.info {
nuxfs.initcfg;
if [ -n "$NUXFS_DEF" ]; then
MANAGED_RELATIVE=$(realpath $NUXFS_DEF_DIR --relative-to $(pwd));
if [ "$MANAGED_RELATIVE" = . ]; then
echo $(pwd) is nuxfs managed directory.
else
echo $(pwd) is child of nuxfs managed directory.
echo Managed directory is $NUXFS_DEF_DIR.
fi;
else
echo "$(pwd) is not managed by nuxfs";
fi;
}
function nuxfs.dsl.capture.dir {
local CDIR=$1;
local LEVEL=$2;
nux.log debug "Inspecting directory $CDIR";
if [ -e "$RELATIVE/$SUFFIX" ]; then
return;
fi;
pushd "$CDIR" > /dev/null;
for file in ./* ; do
nuxfs.dsl.capture.file "$file" ".";
done;
popd > /dev/null;
}
function nuxfs.dsl.capture.file {
local file=$1;
local pdir=$2;
local RELATIVE=$(realpath -ms "$file" --relative-to "$pdir");
local ADDARGS="";
local TYPE="";
nux.log debug "Inspecting $file , Relative path is $RELATIVE";
if [ -h "$RELATIVE" ]; then
TYPE="link";
ADDARGS="\"$(readlink "$RELATIVE")\""
elif [ -d "$RELATIVE" -a -d "$RELATIVE/.git" ]; then
TYPE=git;
pushd "$RELATIVE" > /dev/null;
ADDARGS="\"$($GIT_BIN remote get-url origin)\""
popd > /dev/null;
elif [ -d "$RELATIVE" ]; then
TYPE="dir";
fi;
if [ "$TYPE" ]; then
echo -e "${LEVEL}$TYPE \"$RELATIVE\" $ADDARGS";
fi;
if [ "$TYPE" = "dir" -a "$LEVEL" != " " ]; then
nuxfs.dsl.capture.dir "$RELATIVE" "${LEVEL} "
echo "${LEVEL}enddir";
fi;
}
## capture - Captures current directory to nuxfs syntax
function task.capture {
if [ $# -eq 0 ]; then
nuxfs.dsl.capture.dir .
else
for file in "$@" ; do
nuxfs.dsl.capture.file "$file" .;
done;
fi
}
function nuxfs.template.list {
echo "Available templates:";
pushd $TEMPLATE_DIR > /dev/null;
for i in $TEMPLATE_FILTER; do
local TEMPLATE_ID=$(basename $i $SUFFIX)
echo -n " $TEMPLATE_ID - " ;
grep -m1 "^name " $i | sed -e "s/name *//"
echo
done;
popd > /dev/null;
}
function nuxfs.initcfg {
WORKDIR=$1;
if [ -n "$WORKDIR" ]; then
WORKDIR=$WORKDIR
else
WORKDIR=$(pwd);
fi;
nux.log debug Target: $WORKDIR
NUXFS_DEF=$(nuxfs.closest $SUFFIX "$WORKDIR");
if [ "$NUXFS_DEF" = "" ]; then
nuxfs.error $(pwd) "No nuxfs configuration found."
return;
fi;
NUXFS_DEF_DIR=$(dirname $NUXFS_DEF);
WORKDIR_RELATIVE=$(realpath -ms "$WORKDIR" --relative-to "$NUXFS_DEF_DIR")
WORKDIR_ABSOLUTE=$(realpath -ms "$WORKDIR")
}