Compare commits
9 commits
Author | SHA1 | Date | |
---|---|---|---|
419c895408 | |||
94e1996ed4 | |||
bc2836bbda | |||
4bc141d2af | |||
3546da3d2f | |||
31a79b6238 | |||
77d78841e3 | |||
01b2abba57 | |||
9abdfb89f9 |
2 changed files with 181 additions and 85 deletions
11
README.md
11
README.md
|
@ -57,7 +57,7 @@ This function check if binary file is avaible in the `PATH`.
|
|||
required_commands "ls mv git"
|
||||
```
|
||||
|
||||
#### conf_process_dirs
|
||||
#### link_dirs
|
||||
|
||||
Process a directory that contains others directories an symblink them to the
|
||||
destination folder :
|
||||
|
@ -68,10 +68,11 @@ destination folder :
|
|||
- **return** : no value, exit the funtion if there is an error on path
|
||||
|
||||
```
|
||||
conf_process_dirs "${repository}/config" "${HOME}/.config"
|
||||
link_dirs "${repository}/config" "${HOME}/.config"
|
||||
```
|
||||
Old function `conf_process_dirs` still avaiable for compatibility.
|
||||
|
||||
#### conf_process_files
|
||||
#### link_files
|
||||
|
||||
Process a directory than contains files and symblink them to the destination
|
||||
folder :
|
||||
|
@ -82,9 +83,11 @@ folder :
|
|||
- **return** : no value, exit the funtion if there is an error on path
|
||||
|
||||
```
|
||||
conf_process_dirs "${repository}/zshrc" "${HOME}"
|
||||
link_files "${repository}/zshrc" "${HOME}"
|
||||
```
|
||||
|
||||
Old function `conf_process_files` still avaiable for compatibility
|
||||
|
||||
#### bin_install
|
||||
|
||||
Symblink an executable file to the `~/.local/bin` folder.
|
||||
|
|
255
src/dotinstall
255
src/dotinstall
|
@ -32,35 +32,51 @@ die ()
|
|||
# $1 : error message before quit
|
||||
# $2 : exit code - default 99
|
||||
# $3 : 1 if print usage
|
||||
local message
|
||||
local code
|
||||
local usage
|
||||
|
||||
[ -z $2 ] && $2=99
|
||||
printf "\e[31mFATAL : %s\e[0m\n" "$1"
|
||||
[ $3 == 1 ] && usage
|
||||
exit $2
|
||||
message="$1"
|
||||
code="$2"
|
||||
usage="$3"
|
||||
|
||||
[ -z "$code" ] && code=99
|
||||
printf "\e[31mFATAL : %s\e[0m\n" "$message"
|
||||
[ $usage -eq 1 ] && usage
|
||||
exit $code
|
||||
}
|
||||
|
||||
error ()
|
||||
{
|
||||
# print error message in red
|
||||
# $@ : message
|
||||
|
||||
printf "\e[31m%s\e[0m\n" "$*"
|
||||
|
||||
local message
|
||||
message="$*"
|
||||
printf "\e[31m%s\e[0m\n" "$message"
|
||||
}
|
||||
|
||||
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 [[ "$*" =~ ^/[[:graph:]]*$ ]]
|
||||
if [[ "$path" =~ ^/[[:graph:]]*$ ]]
|
||||
then
|
||||
repository="$(dirname $*)"
|
||||
return
|
||||
repository="$(dirname "$path")"
|
||||
return
|
||||
fi
|
||||
|
||||
local relative_path="$*"
|
||||
local current_path="$(pwd)"
|
||||
local relative_path
|
||||
local current_path
|
||||
|
||||
current_path="$(pwd)"
|
||||
relative_path="$path"
|
||||
|
||||
while [[ $relative_path =~ ^../[[:graph:]]*$ ]]
|
||||
do
|
||||
printf "We found ..\n"
|
||||
|
@ -74,19 +90,22 @@ private:remove_symblink()
|
|||
{
|
||||
# Remove a symblink
|
||||
# $* source
|
||||
|
||||
local source
|
||||
source="$*"
|
||||
|
||||
printf " -> Remove symblink %s : " "$symblink"
|
||||
if [ -L "$*" ]
|
||||
if [ -L "$source" ]
|
||||
then
|
||||
local ret;
|
||||
ret=$(rm "$*" 2>&1)
|
||||
[ $? -ne 0 ] && { error "can't remove : $ret"; return; }
|
||||
elif [ ! -f "$*" ]
|
||||
elif [ ! -f "$source" ]
|
||||
then
|
||||
error "$* not exist"
|
||||
error "$source not exist"
|
||||
return
|
||||
else
|
||||
error "$* is not a symblink"
|
||||
error "$source is not a symblink"
|
||||
fi
|
||||
printf "\e[32mdone\e[0m\n"
|
||||
}
|
||||
|
@ -97,8 +116,11 @@ private:create_symblink ()
|
|||
# $1: source
|
||||
# $2: destination
|
||||
|
||||
local source="$1"
|
||||
local dest="$2"
|
||||
local source
|
||||
local dest
|
||||
|
||||
source="$1"
|
||||
dest="$2"
|
||||
|
||||
printf " -> Create a symblink from %s : " "$source"
|
||||
|
||||
|
@ -116,11 +138,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 "destination exist but is not a directory"
|
||||
error "destin ation exist but is not a directory"
|
||||
return
|
||||
fi
|
||||
|
||||
|
@ -153,9 +175,15 @@ private:clone_repository ()
|
|||
# $1 url
|
||||
# $2 local repository
|
||||
# return : local directory
|
||||
|
||||
|
||||
local url
|
||||
local repo
|
||||
local ret
|
||||
ret=$(git clone -q "$1" "${2}" 2>&1)
|
||||
|
||||
url="$1"
|
||||
repo="$2"
|
||||
|
||||
ret=$(git clone -q "$url" "$repo" 2>&1)
|
||||
[[ $? -ne 0 ]] && die "Can't clone_repository : $ret" 20 0
|
||||
}
|
||||
|
||||
|
@ -164,15 +192,53 @@ private:update_repository ()
|
|||
# Update a git repository
|
||||
# $1 : local repository
|
||||
|
||||
[ ! -d "$1" ] && die "Git update : directory $1 does not exist" 25 0
|
||||
local current_dir=$(pwd)
|
||||
local repo
|
||||
repo="$1"
|
||||
|
||||
[ ! -d "$repo" ] && die "Git update : directory $1 does not exist" 25 0
|
||||
|
||||
local current_dir
|
||||
local ret
|
||||
cd "$1"
|
||||
|
||||
current_dir=$(pwd)
|
||||
|
||||
cd "$repo" || die "Can't go to directory ${repo}"
|
||||
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"
|
||||
}
|
||||
|
||||
process_dirs () {
|
||||
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 a directory than contains subdir, create symblink from each subdir
|
||||
# to the destination.
|
||||
|
@ -180,53 +246,60 @@ process_dirs () {
|
|||
# $1: source directory
|
||||
# $2: destination directory
|
||||
|
||||
local source="${repository}/$1"
|
||||
local dest="$2"
|
||||
local source
|
||||
source="$1"
|
||||
local dest
|
||||
dest="$2"
|
||||
printf "\nProcess directory %s\n" "$source"
|
||||
|
||||
[ ! -d "$source" ] && { error " -> source is not a directory"; return; }
|
||||
[ ! -d "$dest" ] && { error " -> destination is not a directory"; return; }
|
||||
|
||||
while read d
|
||||
while read -r d
|
||||
do
|
||||
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}"/*/)
|
||||
link_directory "$d" "${dest}"
|
||||
done < <(ls -d -1 "${repository}/${source}"/*/)
|
||||
}
|
||||
|
||||
process_files () {
|
||||
process_dirs () {
|
||||
|
||||
printf "This function is deprecated, use link_directories instead.\n"
|
||||
link_directories $@
|
||||
}
|
||||
|
||||
link_files () {
|
||||
|
||||
# Process a directory than contains config files, create symblink from each
|
||||
# files to the destination.
|
||||
# $1: source directory
|
||||
# $2: destination directory
|
||||
|
||||
local source="${repository}/$1"
|
||||
local dest="$2"
|
||||
printf "Process files from directory %s:\n" "$source"
|
||||
local source
|
||||
local dest
|
||||
|
||||
dest="$2"
|
||||
source="${repository}/$1"
|
||||
|
||||
printf "\nProcess 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 d
|
||||
while read -r d
|
||||
do
|
||||
if [ $install -eq 1 ]
|
||||
then
|
||||
private:create_symblink "${source}/$d" "${dest}/$(basename "$d")"
|
||||
else
|
||||
local symblink="${2}/$(basename ${d})"
|
||||
local symblink
|
||||
symblink="${dest}/$(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 ()
|
||||
{
|
||||
|
@ -234,32 +307,43 @@ install_service ()
|
|||
# $1 file
|
||||
# $2 1 to Activate the service
|
||||
|
||||
local source="${repository}/$1"
|
||||
local source
|
||||
local activate
|
||||
source="${repository}/$1"
|
||||
activate=$2
|
||||
|
||||
[ -z "$activate" ] && activate=0
|
||||
|
||||
local ret
|
||||
[ ! -f "$source" ] && { error "$1 not found"; return; }
|
||||
local basename=$(basename "$source")
|
||||
|
||||
local basename
|
||||
basename=$(basename "$source")
|
||||
|
||||
if [ $install -eq 1 ]
|
||||
then
|
||||
printf "\nInstall service %s :\n" "$source"
|
||||
private:create_symblink "$source" "${SYD_DIRECTORY}/${basename}"
|
||||
|
||||
# activate service
|
||||
if [ $2 ]
|
||||
if [ $activate -eq 1 ]
|
||||
then
|
||||
printf " -> Activate $basename : "
|
||||
ret=$(systemctl --user enable ${basename} 2>&1)
|
||||
[[ $? -ne 0 || ! $(systemctl --user is-enabled $basename) ]] && { error "$ret"; return; }
|
||||
printf " -> Activate %s :" "$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 [ $1 ]
|
||||
if [ $activate -eq 1 ]
|
||||
then
|
||||
printf " -> Deactivate $basename : "
|
||||
ret=$(systemctl --user disable ${basename} 2>&1)
|
||||
printf " -> Deactivate %s : " "$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
|
||||
|
||||
|
@ -269,14 +353,17 @@ 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 p in $1
|
||||
for bin in $bins
|
||||
do
|
||||
printf " -> %s:" "$p"
|
||||
command -v $p >/dev/null 2>&1 || die "not found" 128
|
||||
printf " -> %s:" "$bin"
|
||||
command -v "$bin" >/dev/null 2>&1 || die "not found" 128
|
||||
printf " \e[32mfound\e[0m\n"
|
||||
done
|
||||
}
|
||||
|
@ -287,8 +374,10 @@ install_bin ()
|
|||
# Via a symbolic link
|
||||
# $1 : path to script
|
||||
|
||||
local source="${repository}/${1}"
|
||||
local dest="${BIN_DIRECTORY}/$(basename $1)"
|
||||
local source
|
||||
source="${repository}/${1}"
|
||||
local dest
|
||||
dest="${BIN_DIRECTORY}/$(basename "$1")"
|
||||
|
||||
printf "\nProcess executable :\n"
|
||||
[ ! -f "$source" ] && { error "$source is not a file"; return; }
|
||||
|
@ -308,21 +397,27 @@ 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 : " "$1"
|
||||
[ $(grep -c -m 1 $1 $ENV_FILE) -eq 1 ] && { error "already exist"; return; }
|
||||
printf "\nCreate an environment variable %s : " "$name"
|
||||
[ $(grep -c -m 1 "$name" "$ENV_FILE") -eq 1 ] && { error "already exist"; return; }
|
||||
local line
|
||||
line="export ${1}=\"${2}\""
|
||||
echo "$line" >> $ENV_FILE
|
||||
line="export ${name}=\"${value}\""
|
||||
echo "$line" >> "$ENV_FILE"
|
||||
printf "\e[32mdone\e[0m\n"
|
||||
else
|
||||
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 "\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 "\e[32mdone\e[0m\n"
|
||||
|
||||
fi
|
||||
|
@ -351,10 +446,10 @@ esac
|
|||
|
||||
if [[ $* =~ ^https://.*\.git$ || $* =~ ^ssh://.*\.git$ ]]
|
||||
then
|
||||
check_bin "git"
|
||||
required_commands "git"
|
||||
|
||||
# Check
|
||||
localrepo="${DOTREPO}/$(basename $* .git)"
|
||||
localrepo="${DOTREPO}/$(basename "$*" .git)"
|
||||
if [ $update -eq 1 ]
|
||||
then
|
||||
private:update_repository "$localrepo"
|
||||
|
@ -362,7 +457,7 @@ then
|
|||
if [ $install -eq 1 ]
|
||||
then
|
||||
private:clone_repository "$*" "$localrepo"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
bootstrap_file="${localrepo}/bootstrap"
|
||||
else
|
||||
|
@ -372,23 +467,22 @@ 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 "$bootstrap_file" "$cache_file" > /dev/null; echo $?;) -eq 0 ]
|
||||
if [ $(diff "$bootst rap_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
|
||||
|
@ -405,8 +499,7 @@ source "$bootstrap_file"
|
|||
if [ $install -eq 0 ]
|
||||
then
|
||||
printf "\nRemove files for complete uninstall\n"
|
||||
rm $cache_file
|
||||
rm -rf $repository
|
||||
rm "$cache_file"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
|
Reference in a new issue