diff --git a/README.md b/README.md index aa204e4..7d7bc88 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ This function check if binary file is avaible in the `PATH`. required_commands "ls mv git" ``` -#### link_dirs +#### conf_process_dirs Process a directory that contains others directories an symblink them to the destination folder : @@ -68,11 +68,10 @@ destination folder : - **return** : no value, exit the funtion if there is an error on path ``` -link_dirs "${repository}/config" "${HOME}/.config" +conf_process_dirs "${repository}/config" "${HOME}/.config" ``` -Old function `conf_process_dirs` still avaiable for compatibility. -#### link_files +#### conf_process_files Process a directory than contains files and symblink them to the destination folder : @@ -83,11 +82,9 @@ folder : - **return** : no value, exit the funtion if there is an error on path ``` -link_files "${repository}/zshrc" "${HOME}" +conf_process_dirs "${repository}/zshrc" "${HOME}" ``` -Old function `conf_process_files` still avaiable for compatibility - #### bin_install Symblink an executable file to the `~/.local/bin` folder. diff --git a/src/dotinstall b/src/dotinstall index 07d2a8d..679ddc6 100755 --- a/src/dotinstall +++ b/src/dotinstall @@ -32,51 +32,35 @@ die () # $1 : error message before quit # $2 : exit code - default 99 # $3 : 1 if print usage - local message - local code - local usage - message="$1" - code="$2" - usage="$3" - - [ -z "$code" ] && code=99 - printf "\e[31mFATAL : %s\e[0m\n" "$message" - [ $usage -eq 1 ] && usage - exit $code + [ -z $2 ] && $2=99 + printf "\e[31mFATAL : %s\e[0m\n" "$1" + [ $3 == 1 ] && usage + exit $2 } error () { # print error message in red # $@ : message - - local message - message="$*" - printf "\e[31m%s\e[0m\n" "$message" + + printf "\e[31m%s\e[0m\n" "$*" } private:get_bootstrap_path () { # this function return the absolute path of the bootstrap file # $* : path of bootstrap file - - local path - path="$*" # If the path begin with /, this is an absolute part - if [[ "$path" =~ ^/[[:graph:]]*$ ]] + if [[ "$*" =~ ^/[[:graph:]]*$ ]] then - repository="$(dirname "$path")" - return + repository="$(dirname $*)" + return fi - local relative_path - local current_path - - current_path="$(pwd)" - relative_path="$path" - + local relative_path="$*" + local current_path="$(pwd)" while [[ $relative_path =~ ^../[[:graph:]]*$ ]] do printf "We found ..\n" @@ -90,22 +74,19 @@ private:remove_symblink() { # Remove a symblink # $* source - - local source - source="$*" printf " -> Remove symblink %s : " "$symblink" - if [ -L "$source" ] + if [ -L "$*" ] then local ret; ret=$(rm "$*" 2>&1) [ $? -ne 0 ] && { error "can't remove : $ret"; return; } - elif [ ! -f "$source" ] + elif [ ! -f "$*" ] then - error "$source not exist" + error "$* not exist" return else - error "$source is not a symblink" + error "$* is not a symblink" fi printf "\e[32mdone\e[0m\n" } @@ -116,11 +97,8 @@ private:create_symblink () # $1: source # $2: destination - local source - local dest - - source="$1" - dest="$2" + local source="$1" + local dest="$2" printf " -> Create a symblink from %s : " "$source" @@ -138,11 +116,11 @@ private:create_symblink () error "can't overwrite destination" return else - rm -rf "$dest" + rm -rf $dest fi - elif [ -e "$dest" ] + elif [ -e $dest ] then - error "destin ation exist but is not a directory" + error "destination exist but is not a directory" return fi @@ -175,15 +153,9 @@ private:clone_repository () # $1 url # $2 local repository # return : local directory - - local url - local repo + local ret - - url="$1" - repo="$2" - - ret=$(git clone -q "$url" "$repo" 2>&1) + ret=$(git clone -q "$1" "${2}" 2>&1) [[ $? -ne 0 ]] && die "Can't clone_repository : $ret" 20 0 } @@ -192,53 +164,15 @@ private:update_repository () # Update a git repository # $1 : local repository - local repo - repo="$1" - - [ ! -d "$repo" ] && die "Git update : directory $1 does not exist" 25 0 - - local current_dir + [ ! -d "$1" ] && die "Git update : directory $1 does not exist" 25 0 + local current_dir=$(pwd) local ret - - current_dir=$(pwd) - - cd "$repo" || die "Can't go to directory ${repo}" + cd "$1" ret=$(git pull 2>&1) [[ $? -ne 0 ]] && die "Can't update repository : $ret" 24 0 - - cd "$current_dir" || die "Can't return to directory $current_dir" } -link_directory () { - - # Create a symblink to directory inside an other directory - # - # $1: source directory - # $2: destination directory - - local source - source="$1" - local dest - dest="$2" - printf "\nProcess directory %s\n" "$source" - if [[ ! $source =~ ^$repository ]] - then - echo "Add repo before source" - source="${repository}/$source" - fi - [ ! -d "$source" ] && { error " -> source is not a directory"; return; } - [ ! -d "$dest" ] && { error " -> destination is not a directory"; return; } - - if [ $install -eq 1 ] - then - private:create_symblink "$source" "${dest}/$(basename "$d")" - else - local symblink="${dest}/$(basename "$d")" - private:remove_symblink "$symblink" - fi -} - -link_directories () { +process_dirs () { # Process a directory than contains subdir, create symblink from each subdir # to the destination. @@ -246,60 +180,53 @@ link_directories () { # $1: source directory # $2: destination directory - local source - source="$1" - local dest - dest="$2" + local source="${repository}/$1" + local dest="$2" printf "\nProcess directory %s\n" "$source" - while read -r d + [ ! -d "$source" ] && { error " -> source is not a directory"; return; } + [ ! -d "$dest" ] && { error " -> destination is not a directory"; return; } + + while read d do - link_directory "$d" "${dest}" - done < <(ls -d -1 "${repository}/${source}"/*/) + if [ $install -eq 1 ] + then + private:create_symblink "$d" "${dest}/$(basename "$d")" + else + local symblink="${dest}/$(basename ${d})" + private:remove_symblink "$symblink" + fi + + done < <(ls -d -1 "${source}"/*/) } -process_dirs () { - - printf "This function is deprecated, use link_directories instead.\n" - link_directories $@ -} - -link_files () { +process_files () { # Process a directory than contains config files, create symblink from each # files to the destination. # $1: source directory # $2: destination directory - local source - local dest - - dest="$2" - source="${repository}/$1" - - printf "\nProcess files from directory %s:\n" "$source" + local source="${repository}/$1" + local dest="$2" + printf "Process files from directory %s:\n" "$source" [ ! -d "$source" ] && { error " -> source is not a directory"; return; } [ ! -d "$dest" ] && { error " -> destination is not a directory"; return; } - while read -r d + while read d do if [ $install -eq 1 ] then private:create_symblink "${source}/$d" "${dest}/$(basename "$d")" else - local symblink - symblink="${dest}/$(basename ${d})" + local symblink="${2}/$(basename ${d})" private:remove_symblink "$symblink" fi done < <(ls -A -1 "$source") } -process_files () { - printf "process_files is deprecated, use link_files instead\n" - link_files $@ -} install_service () { @@ -307,43 +234,32 @@ install_service () # $1 file # $2 1 to Activate the service - local source - local activate - source="${repository}/$1" - activate=$2 - - [ -z "$activate" ] && activate=0 - + local source="${repository}/$1" local ret [ ! -f "$source" ] && { error "$1 not found"; return; } - - local basename - basename=$(basename "$source") - + local basename=$(basename "$source") if [ $install -eq 1 ] then printf "\nInstall service %s :\n" "$source" private:create_symblink "$source" "${SYD_DIRECTORY}/${basename}" # activate service - if [ $activate -eq 1 ] + if [ $2 ] then - printf " -> Activate %s :" "$basename" - ret=$(systemctl --user enable "${basename}" 2>&1) - [[ $? -ne 0 || ! $(systemctl --user is-enabled "$basename") ]] && { error "$ret"; return; } + printf " -> Activate $basename : " + ret=$(systemctl --user enable ${basename} 2>&1) + [[ $? -ne 0 || ! $(systemctl --user is-enabled $basename) ]] && { error "$ret"; return; } printf "\e[32mdone\e[0m\n" fi else printf "\nUninstall service %s :\n" "$source" #Deactivate service - if [ $activate -eq 1 ] + if [ $1 ] then - printf " -> Deactivate %s : " "$basename" - ret=$(systemctl --user disable "${basename}" 2>&1) + printf " -> Deactivate $basename : " + ret=$(systemctl --user disable ${basename} 2>&1) [[ $? -ne 0 ]] && { error "$ret"; return; } printf "\e[32mdone\e[0m\n" - else - private:remove_symblink "${SYD_DIRECTORY}/${basename}" fi fi @@ -353,17 +269,14 @@ required_commands () { # Check if an executable exist # $1 executables separated with spaces - - local bins - bins="$*" # if uninstall, we don't need to process required commands. [ $install -eq 0 ] && return printf "Checking required programs :\n" - for bin in $bins + for p in $1 do - printf " -> %s:" "$bin" - command -v "$bin" >/dev/null 2>&1 || die "not found" 128 + printf " -> %s:" "$p" + command -v $p >/dev/null 2>&1 || die "not found" 128 printf " \e[32mfound\e[0m\n" done } @@ -374,10 +287,8 @@ install_bin () # Via a symbolic link # $1 : path to script - local source - source="${repository}/${1}" - local dest - dest="${BIN_DIRECTORY}/$(basename "$1")" + local source="${repository}/${1}" + local dest="${BIN_DIRECTORY}/$(basename $1)" printf "\nProcess executable :\n" [ ! -f "$source" ] && { error "$source is not a file"; return; } @@ -397,27 +308,21 @@ define_env () # on uninstall mode # $1 variable name # $2 value - local name - local value - - name="$1" - value="$2" - - [ -z "$name" ] && { error "You must define a name"; return; } - [ ! -f "$ENV_FILE" ] && touch "$ENV_FILE" + [ -z $1 ] && { error "You must define a name"; return; } + [ ! -f $ENV_FILE ] && touch $ENV_FILE if [ $install -eq 1 ] then - printf "\nCreate an environment variable %s : " "$name" - [ $(grep -c -m 1 "$name" "$ENV_FILE") -eq 1 ] && { error "already exist"; return; } + printf "\nCreate an environment variable %s : " "$1" + [ $(grep -c -m 1 $1 $ENV_FILE) -eq 1 ] && { error "already exist"; return; } local line - line="export ${name}=\"${value}\"" - echo "$line" >> "$ENV_FILE" + line="export ${1}=\"${2}\"" + echo "$line" >> $ENV_FILE printf "\e[32mdone\e[0m\n" else - printf "\nRemove an environ ment variable %s : " "$1" - [ $(grep -c -m 1 "$1" "$ENV_FILE") -eq 0 ] && { error "not exist"; return; } - sed -i "/^export $1=*/d" "$ENV_FILE" + printf "\nRemove an environment variable %s : " "$1" + [ $(grep -c -m 1 $1 $ENV_FILE) -eq 0 ] && { error "not exist"; return; } + sed -i "/^export $1=*/d" $ENV_FILE printf "\e[32mdone\e[0m\n" fi @@ -449,7 +354,7 @@ then required_commands "git" # Check - localrepo="${DOTREPO}/$(basename "$*" .git)" + localrepo="${DOTREPO}/$(basename $* .git)" if [ $update -eq 1 ] then private:update_repository "$localrepo" @@ -457,7 +362,7 @@ then if [ $install -eq 1 ] then private:clone_repository "$*" "$localrepo" - fi + fi fi bootstrap_file="${localrepo}/bootstrap" else @@ -467,22 +372,23 @@ fi [ ! -f "$bootstrap_file" ] && die "$bootstrap_file does not exist" 2 1 private:get_bootstrap_path "$bootstrap_file" -cache_file="${CACHE_DIR}/$(echo "$repository" | tr '/' '_')" +cache_file="${CACHE_DIR}/$(echo $repository | tr '/' '_')" if [ $update -eq 1 ] then # Update mode - if [ -f "$cache_file" ] + if [ -f "$cache_file" ] then - if [ $(diff "$bootst rap_file" "$cache_file" > /dev/null; echo $?;) -eq 0 ] + if [ $(diff "$bootstrap_file" "$cache_file" > /dev/null; echo $?;) -eq 0 ] then - printf "There is no difference between cached copy and the bootstrap file\n"; + printf "There is no difference between cached copy and the bootstrap file\n"; exit 0 else # for updating the dotfile repo, we need to uninstall it then # install it. We need the cached copy for unistall. - install=0 + install=0 source "$cache_file" + rm "$cache_file" install=1 fi else @@ -499,7 +405,8 @@ source "$bootstrap_file" if [ $install -eq 0 ] then printf "\nRemove files for complete uninstall\n" - rm "$cache_file" + rm $cache_file + rm -rf $repository fi exit 0