Refactor the edit tool

This commit is contained in:
Tobias Reisinger 2023-06-03 01:29:58 +02:00
parent 704e16c6fe
commit de982f5249
Signed by: serguzim
GPG key ID: 13AD60C237A28DFE
2 changed files with 78 additions and 19 deletions

View file

@ -13,6 +13,7 @@ declare -A mapper=(
["git"]="$HOME/.config/git/config" ["git"]="$HOME/.config/git/config"
["git-ignore"]="$HOME/.config/git/ignore" ["git-ignore"]="$HOME/.config/git/ignore"
["home-manager"]="$HOME/.config/home-manager/home.nix" ["home-manager"]="$HOME/.config/home-manager/home.nix"
["hyprland"]="$HOME/.config/hypr/hyprland.conf"
["nvim"]="$HOME/.config/nvim/" ["nvim"]="$HOME/.config/nvim/"
["nvim.packer"]="$HOME/.config/nvim/lua/plugins.lua" ["nvim.packer"]="$HOME/.config/nvim/lua/plugins.lua"
["polybar"]="$HOME/.config/polybar" ["polybar"]="$HOME/.config/polybar"

View file

@ -2,31 +2,89 @@
set -e set -e
edit_directory="$HOME/.cache/edit/" edit_dir_base="$HOME/.cache/edit/"
filehash=$(readlink -fn "$1" | md5sum | awk '{ print $1 }') _pre_checks() {
filedirectory="$edit_directory/$filehash/" if [ -z "$EDITOR" ]; then
echo "EDITOR is not set"
exit 1
fi
}
mkdir -p "$filedirectory" _pre_checks_file() {
if [ -z "$1" ]; then
echo "No file specified"
exit 1
fi
if sudo test -d "$1"; then
echo "Cannot edit directory"
exit 1
fi
}
basename=$(basename "$1") _get_edit_directory() {
filepath=$(realpath -s "$filedirectory/$basename") target_dir=$(dirname "$1")
edit_dir_sub=$(readlink -fn "$target_dir" | md5sum | awk '{ print $1 }')
edit_directory="$edit_dir_base/$edit_dir_sub/"
echo "$edit_directory"
}
_get_edit_file() {
target=$(readlink -fn "$1")
target_name=$(basename "$target")
edit_directory=$(_get_edit_directory "$target")
edit_file=$(realpath -s "$edit_directory/$target_name")
echo "$edit_file"
}
_prepare_for_edit() {
target=$(readlink -fn "$1")
_pre_checks_file "$target"
edit_directory=$(_get_edit_directory "$target")
edit_file=$(_get_edit_file "$target")
mkdir -p "$edit_directory"
user=$(id -un) user=$(id -un)
group=$(id -gn) group=$(id -gn)
echo "Editing $1 in $filepath as $user:$group" if sudo test -e "$target"; then
sudo cp -i "$target" "$edit_file"
sudo chown "$user":"$group" "$edit_file"
else
touch "$edit_file"
fi
sudo test -e "$1" && ( echo "$edit_file"
sudo cp -i "$1" "$filepath" }
sudo chown "$user":"$group" "$filepath"
) || ( _pre_checks
touch "$filepath"
# Prepare all files for editing and collect the names of the edit files
all_edit_files=""
for arg in "$@"; do
edit_file=$(_prepare_for_edit "$arg")
all_edit_files="$all_edit_files $edit_file"
done
# Use a subshell to avoid overwriting $@
(
for file in $all_edit_files; do
set -- "$file" "$@"
done
$EDITOR "$@"
) )
$EDITOR "$filepath" # Copy all edit files back
for arg in "$@"; do
edit_file=$(_get_edit_file "$arg")
sudo cp "$edit_file" "$arg" && rm "$edit_file"
sudo cp "$filepath" "$1" edit_directory=$(_get_edit_directory "$target")
# Try to remove the directory, but don't fail if it's not empty
rm "$filepath" rm -d "$edit_directory" 2>/dev/null || true
rm -rd "$filedirectory" done