init: new dotfile configuration
Remove all org files using a new script to more config over, The old org file configuaration were great but required org. This new version only requires the scripts that is included in the repo. The configuration are all done but have not ported the theming system yet. Signed-off-by: Steve Beaulac <steve@sagacity.ca> Change-Id: I14cd7fe058a71c8ba9d6d35397dc8d7e6a6a6964
This commit is contained in:
Executable
+156
@@ -0,0 +1,156 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
src_dir="$script_dir/script"
|
||||
dest_dir="${HOME}/.local/bin"
|
||||
|
||||
dry_run=false
|
||||
target_path=""
|
||||
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
Usage: sync-script.sh [--dry-run] [path]
|
||||
|
||||
path can be:
|
||||
script (all scripts)
|
||||
script/foo (specific file or folder)
|
||||
.local/bin (all scripts)
|
||||
.local/bin/foo (specific file or folder)
|
||||
foo (file or folder under script)
|
||||
EOF
|
||||
}
|
||||
|
||||
for arg in "$@"; do
|
||||
case "$arg" in
|
||||
--dry-run)
|
||||
dry_run=true
|
||||
;;
|
||||
-h|--help)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
if [[ -z "$target_path" ]]; then
|
||||
target_path="$arg"
|
||||
else
|
||||
echo "Error: too many arguments." >&2
|
||||
usage >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
hash_cmd="sha256sum"
|
||||
if ! command -v "$hash_cmd" >/dev/null 2>&1; then
|
||||
echo "Error: sha256sum not found. Install coreutils or adjust hash_cmd." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
file_hash() {
|
||||
"$hash_cmd" "$1" | awk '{print $1}'
|
||||
}
|
||||
|
||||
copy_file() {
|
||||
local src="$1"
|
||||
local dst="$2"
|
||||
if $dry_run; then
|
||||
echo "copy: $src -> $dst"
|
||||
else
|
||||
mkdir -p "$(dirname "$dst")"
|
||||
cp -a "$src" "$dst"
|
||||
fi
|
||||
}
|
||||
|
||||
if [[ ! -d "$src_dir" ]]; then
|
||||
echo "Error: source script directory not found: $src_dir" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p "$dest_dir"
|
||||
|
||||
target_rel="$target_path"
|
||||
if [[ -n "$target_rel" ]]; then
|
||||
if [[ "$target_rel" == "script" || "$target_rel" == ".local/bin" ]]; then
|
||||
target_rel=""
|
||||
elif [[ "$target_rel" == script/* ]]; then
|
||||
target_rel=${target_rel#script/}
|
||||
elif [[ "$target_rel" == .local/bin/* ]]; then
|
||||
target_rel=${target_rel#.local/bin/}
|
||||
fi
|
||||
target_rel=${target_rel#./}
|
||||
if [[ "$target_rel" == "." ]]; then
|
||||
target_rel=""
|
||||
fi
|
||||
if [[ "$target_rel" == /* ]]; then
|
||||
echo "Error: absolute paths are not supported: $target_path" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
base_path="$src_dir"
|
||||
if [[ -n "$target_rel" ]]; then
|
||||
base_path="$src_dir/$target_rel"
|
||||
fi
|
||||
|
||||
if [[ ! -e "$base_path" ]]; then
|
||||
echo "Error: path not found in source: $base_path" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
sync_file() {
|
||||
local src_path="$1"
|
||||
local rel_path=${src_path#"$src_dir"/}
|
||||
local dst_path="$dest_dir/$rel_path"
|
||||
|
||||
if [[ ! -f "$dst_path" ]]; then
|
||||
copy_file "$src_path" "$dst_path"
|
||||
return
|
||||
fi
|
||||
|
||||
local src_hash
|
||||
local dst_hash
|
||||
src_hash=$(file_hash "$src_path")
|
||||
dst_hash=$(file_hash "$dst_path")
|
||||
|
||||
if [[ "$src_hash" != "$dst_hash" ]]; then
|
||||
copy_file "$src_path" "$dst_path"
|
||||
fi
|
||||
}
|
||||
|
||||
shopt -s globstar nullglob dotglob
|
||||
if [[ -f "$base_path" ]]; then
|
||||
sync_file "$base_path"
|
||||
elif [[ -d "$base_path" ]]; then
|
||||
for src_path in "$base_path"/**; do
|
||||
rel_path=${src_path#"$src_dir"/}
|
||||
|
||||
if [[ "$rel_path" == ".git" || "$rel_path" == .git/* ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
dst_path="$dest_dir/$rel_path"
|
||||
|
||||
if [[ -d "$src_path" ]]; then
|
||||
if ! $dry_run; then
|
||||
mkdir -p "$dst_path"
|
||||
else
|
||||
echo "mkdir: $dst_path"
|
||||
fi
|
||||
continue
|
||||
fi
|
||||
|
||||
if [[ ! -f "$src_path" ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
sync_file "$src_path"
|
||||
done
|
||||
fi
|
||||
|
||||
if $dry_run; then
|
||||
echo "Dry run complete. Re-run without --dry-run to apply changes."
|
||||
else
|
||||
echo "Sync complete. Updated files where content differed."
|
||||
fi
|
||||
Reference in New Issue
Block a user