334 lines
5.9 KiB
Bash
Executable File
334 lines
5.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -e
|
|
|
|
function print_help() {
|
|
echo "usage .home/update.sh [-g/--gnome] [-h/--help] [-v/--berbose] [-d/--dry]
|
|
|
|
Installs and updates shared configuration on a system. Options are:
|
|
|
|
-h/--help : print this help
|
|
--reinstall : force reinstallation
|
|
-g/--gnome : system is intended to run in a GNOME environement, and
|
|
will setup gnome-terminal accordingly. Do not
|
|
activate on headless system.
|
|
--font : Installs font for gnome environment (selected if --gnome)
|
|
-v/--verbose : prints command before running them
|
|
-n/--dry : dry run, do not execute commands. Implies --verbose.
|
|
"
|
|
}
|
|
|
|
function exit_error() {
|
|
print_help
|
|
exit 1
|
|
}
|
|
|
|
GNOME=false
|
|
FONT=false
|
|
VERBOSE=false
|
|
DRY=false
|
|
REINSTALL=false
|
|
|
|
function set_reinstall_on() {
|
|
REINSTALL=true
|
|
}
|
|
|
|
function set_gnome_on() {
|
|
GNOME=true
|
|
FONT=true
|
|
}
|
|
|
|
function set_font_on() {
|
|
FONT=true
|
|
}
|
|
|
|
function set_verbose_on() {
|
|
VERBOSE=true
|
|
}
|
|
|
|
function set_dry_on() {
|
|
DRY=true
|
|
VERBOSE=true
|
|
}
|
|
|
|
while getopts "vnhg-:" optchar
|
|
do
|
|
case "${optchar}" in
|
|
-)
|
|
case "${OPTARG}" in
|
|
reinstall)
|
|
set_reinstall_on
|
|
;;
|
|
gnome)
|
|
set_gnome_on
|
|
;;
|
|
verbose)
|
|
set_verbose_on
|
|
;;
|
|
font)
|
|
set_font_on
|
|
;;
|
|
dry)
|
|
set_dry_on
|
|
;;
|
|
*)
|
|
echo "invalid argument --${OPTARG}"
|
|
exit_error
|
|
;;
|
|
esac;;
|
|
h)
|
|
print_help
|
|
exit 0
|
|
;;
|
|
g)
|
|
set_gnome_on
|
|
;;
|
|
n)
|
|
set_dry_on
|
|
;;
|
|
v)
|
|
set_verbose_on
|
|
;;
|
|
*)
|
|
exit_error
|
|
;;
|
|
esac
|
|
done
|
|
|
|
|
|
files=".config/fish \
|
|
.config/git \
|
|
.config/omf \
|
|
.config/starship.toml \
|
|
.local/share/omf \
|
|
.emacs \
|
|
.tmux.conf.local \
|
|
.config/alacritty.toml"
|
|
|
|
|
|
|
|
|
|
function this_script_root_dir() {
|
|
dirname $(realpath ${BASH_SOURCE[0]})
|
|
}
|
|
|
|
function run() {
|
|
if $VERBOSE
|
|
then
|
|
echo "[$@]"
|
|
fi
|
|
if ! $DRY
|
|
then
|
|
$@
|
|
fi
|
|
}
|
|
|
|
function run_git() {
|
|
if $VERBOSE
|
|
then
|
|
echo "[git $@] in $(this_script_root_dir)"
|
|
fi
|
|
if ! $DRY
|
|
then
|
|
pushd $(this_script_root_dir) 1>/dev/null
|
|
if $VERBOSE
|
|
then
|
|
git $@
|
|
else
|
|
git $@ 1>/dev/null
|
|
fi
|
|
popd 1>/dev/null
|
|
fi
|
|
}
|
|
|
|
|
|
function load_gnome_terminal_profiles() {
|
|
echo "--- Installing GNOME terminal profile"
|
|
if which dconf 1>/dev/null
|
|
then
|
|
run dconf load /org/gnome/terminal/legacy/profiles:/ < $(this_script_root_dir)/gnome-terminal-profiles.dconf
|
|
fi
|
|
}
|
|
|
|
function install_fish() {
|
|
echo "--- Ensuring fish is current shell"
|
|
local fish_good=0
|
|
if ! which fish 1>/dev/null
|
|
then
|
|
fish_good=1
|
|
fi
|
|
|
|
local current_version=$(fish --version | cut -d " " -f 3)
|
|
local current_version_test=$(cat <<EOF
|
|
${current_version}
|
|
3.4.0
|
|
EOF
|
|
)
|
|
if [ $(echo "${current_version_test}" | sort -n | head -1) != "3.4.0" ]
|
|
then
|
|
echo "Wrong version of fish ${current_version}"
|
|
fish_good=1
|
|
fi
|
|
|
|
if [ $fish_good -eq 1 ]
|
|
then
|
|
echo "+++ Installing fish from PPA"
|
|
run sudo add-apt-repository -y ppa:fish-shell/release-3
|
|
run sudo apt update
|
|
run sudo apt install -y fish
|
|
else
|
|
echo "+++ Fish is installed"
|
|
fi
|
|
|
|
fish=$(which fish)
|
|
current_shell=$(grep $USER /etc/passwd | cut -d ":" -f 7)
|
|
if [ $current_shell != $fish ]
|
|
then
|
|
echo "+++ Changing shell to $fish (you will be prompted for passwd)"
|
|
run chsh -s $fish
|
|
else
|
|
echo "+++ Default shell is $fish"
|
|
fi
|
|
}
|
|
|
|
function install_direnv() {
|
|
echo "--- Ensuring direnv is installed"
|
|
if ! which direnv 1>/dev/null
|
|
then
|
|
echo "++ Installing direnv"
|
|
run sudo apt-get install -y direnv
|
|
else
|
|
echo "+++ direnv is installed"
|
|
fi
|
|
}
|
|
|
|
|
|
function install_starship() {
|
|
echo "--- Ensuring starship is installed"
|
|
if which starship 1>/dev/null
|
|
then
|
|
echo "+++ Starship is installed"
|
|
if ! $REINSTALL
|
|
then
|
|
return
|
|
fi
|
|
echo "+++ Reinstalling starship"
|
|
fi
|
|
echo "+++ Installing starship"
|
|
if $VERBOSE
|
|
then
|
|
echo "[curl -sS https://starship.rs/install.sh | sh -s -- --yes]"
|
|
fi
|
|
if ! $DRY
|
|
then
|
|
curl -sS https://starship.rs/install.sh | sh -s -- --yes
|
|
fi
|
|
}
|
|
|
|
function install_ubuntu_mono_nerd() {
|
|
echo "--- Ensuring Ubuntu Mono Nerd font is present"
|
|
if [ ! -e /usr/share/terminfo/x/xterm-direct ]
|
|
then
|
|
run sudo apt-get install -y ncurses-term
|
|
else
|
|
echo "+++ xterm-direct is in terminfo database"
|
|
fi
|
|
|
|
if fc-list | grep "UbuntuMono Nerd Font" 1>/dev/null
|
|
then
|
|
echo "+++ UbuntuMono Nerd font is installed"
|
|
if ! $REINSTALL
|
|
then
|
|
return
|
|
fi
|
|
echo "+++ Reinstalling UbuntuMono Nerd font"
|
|
fi
|
|
|
|
echo "+++ Fetching UbuntuMono Nerd Font"
|
|
run mkdir -p ~/.local/share/fonts
|
|
pushd ~/.local/share/fonts
|
|
run curl -fL -o UbuntuMonoNerdFontMono-Regular.ttf https://github.com/ryanoasis/nerd-fonts/raw/master/patched-fonts/UbuntuMono/Regular/UbuntuMonoNerdFontMono-Regular.ttf
|
|
popd
|
|
run fc-cache -f
|
|
|
|
}
|
|
|
|
function install_deps() {
|
|
install_fish
|
|
install_direnv
|
|
install_starship
|
|
if $FONT
|
|
then
|
|
install_ubuntu_mono_nerd
|
|
fi
|
|
}
|
|
|
|
function install_files() {
|
|
echo "--- Ensuring symlinks to git file are present"
|
|
for f in $files
|
|
do
|
|
run rm -Rf $HOME/$f
|
|
dir=$(dirname $f)
|
|
if [ ! "$dir" = "." ]
|
|
then
|
|
run mkdir -p $HOME/$dir
|
|
fi
|
|
run ln -sf $(this_script_root_dir)/$f $HOME/$f
|
|
done
|
|
run ln -sf $(this_script_root_dir)/.tmux/.tmux.conf $HOME/.tmux.conf
|
|
}
|
|
|
|
function update_oh_my_fish() {
|
|
echo "--- Updating Oh My Fish"
|
|
FISH=$(which fish)
|
|
if $VERBOSE
|
|
then
|
|
echo "[$FISH -c 'omf install']"
|
|
fi
|
|
if ! $DRY
|
|
then
|
|
if $VERBOSE
|
|
then
|
|
$FISH -c 'omf install'
|
|
else
|
|
$FISH -c 'omf install' 1>/dev/null
|
|
fi
|
|
fi
|
|
}
|
|
|
|
function update_home() {
|
|
if $VERBOSE
|
|
then
|
|
echo "--- this_script_root_dir: $(this_script_root_dir)"
|
|
fi
|
|
update_repos
|
|
install_deps
|
|
install_files
|
|
update_oh_my_fish
|
|
if $GNOME
|
|
then
|
|
load_gnome_terminal_profiles
|
|
fi
|
|
if ! $DRY
|
|
then
|
|
echo "--- git.tuleu.science:atuleu/home.git updated and set"
|
|
fi
|
|
}
|
|
|
|
function update_repos() {
|
|
echo "--- Updating git.tuleu.science:atuleu/home.git"
|
|
run_git pull
|
|
run_git submodule init
|
|
run_git submodule update
|
|
}
|
|
|
|
if [ -z $BASH_SOURCE ] && [ ! -d "$HOME/.home" ]
|
|
then
|
|
echo "--- cloning git.tuleu.science:atuleu/home.git in $HOME/.home"
|
|
pushd $HOME 1>/dev/null
|
|
run_git clone https://git.tuleu.science/atuleu/home.git .home
|
|
popd 1>/dev/null
|
|
else
|
|
update_home
|
|
fi
|