diff --git a/yadm b/yadm index 857f248..d33775f 100755 --- a/yadm +++ b/yadm @@ -30,6 +30,7 @@ YADM_ENCRYPT="encrypt" YADM_ARCHIVE="files.gpg" GPG_PROGRAM="gpg" +GIT_PROGRAM="git" LS_PROGRAM="/bin/ls" #; flag when something may have changes (which prompts auto actions to be performed) @@ -112,7 +113,7 @@ function alt() { match="^(.+)##($match_system|$match_system.$match_host|$match_system.$match_host.$match_user|())$" #; process relative to YADM_WORK - YADM_WORK=$(git config core.worktree) + YADM_WORK=$("$GIT_PROGRAM" config core.worktree) cd "$YADM_WORK" || { debug "Alternates not processed, unable to cd to $YADM_WORK" return @@ -125,7 +126,7 @@ function alt() { #; for every file which matches the above regex, create a symlink last_linked='' local IFS=$'\n' - for tracked_file in $(git ls-files | sort) $(cat "$YADM_ENCRYPT" 2>/dev/null); do + for tracked_file in $("$GIT_PROGRAM" ls-files | sort) $(cat "$YADM_ENCRYPT" 2>/dev/null); do tracked_file="$YADM_WORK/$tracked_file" #; process both the path, and it's parent directory for alt_path in "$tracked_file" "${tracked_file%/*}"; do @@ -154,26 +155,27 @@ function clean() { function clone() { #; clone will begin with a bare repo - init + local empty= + init $empty #; add the specified remote, and configure the repo to track origin/master debug "Adding remote to new repo" - git remote add origin "$1" + "$GIT_PROGRAM" remote add origin "$@" debug "Configuring new repo to track origin/master" - git config branch.master.remote origin - git config branch.master.merge refs/heads/master + "$GIT_PROGRAM" config branch.master.remote origin + "$GIT_PROGRAM" config branch.master.merge refs/heads/master #; fetch / merge (and possibly fallback to reset) debug "Doing an initial fetch of the origin" - git fetch origin || { + "$GIT_PROGRAM" fetch origin || { debug "Removing repo after failed clone" rm -rf "$YADM_REPO" error_out "Unable to fetch origin $1" } debug "Doing an initial merge of origin/master" - git merge origin/master || { + "$GIT_PROGRAM" merge origin/master || { debug "Merge failed, doing a reset." - git reset origin/master + "$GIT_PROGRAM" reset origin/master cat </dev/null) + archive_status=$("$GIT_PROGRAM" status --porcelain -uall "$YADM_ARCHIVE" 2>/dev/null) archive_regex="^\?\?" if [[ $archive_status =~ $archive_regex ]] ; then echo "It appears that $YADM_ARCHIVE is not tracked by yadm's repository." echo "Would you like to add it now? (y/n)" read -r answer if [[ $answer =~ ^[yY]$ ]] ; then - git add "$YADM_ARCHIVE" + "$GIT_PROGRAM" add "$YADM_ARCHIVE" fi fi @@ -302,7 +301,7 @@ function git_command() { CHANGES_POSSIBLE=1 #; pass commands through to git - git "$@" + "$GIT_PROGRAM" "$@" return "$?" } @@ -355,7 +354,7 @@ function init() { #; init a new bare repo debug "Init new repo" - git init --shared=0600 --bare "$YADM_REPO" + "$GIT_PROGRAM" init --shared=0600 --bare "$YADM_REPO" "$@" configure_repo CHANGES_POSSIBLE=1 @@ -368,7 +367,7 @@ function list() { #; process relative to YADM_WORK when --all is specified if [ -n "$LIST_ALL" ] ; then - YADM_WORK=$(git config core.worktree) + YADM_WORK=$("$GIT_PROGRAM" config core.worktree) cd "$YADM_WORK" || { debug "List not processed, unable to cd to $YADM_WORK" return @@ -376,7 +375,7 @@ function list() { fi #; list tracked files - git ls-files + "$GIT_PROGRAM" ls-files } @@ -387,7 +386,7 @@ function perms() { #; TODO: prevent repeats in the files changed #; process relative to YADM_WORK - YADM_WORK=$(git config core.worktree) + YADM_WORK=$("$GIT_PROGRAM" config core.worktree) cd "$YADM_WORK" || { debug "Perms not processed, unable to cd to $YADM_WORK" return @@ -517,16 +516,16 @@ function configure_repo() { debug "Configuring new repo" #; change bare to false (there is a working directory) - git config core.bare 'false' + "$GIT_PROGRAM" config core.bare 'false' #; set the worktree for the yadm repo - git config core.worktree "$YADM_WORK" + "$GIT_PROGRAM" config core.worktree "$YADM_WORK" #; by default, do not show untracked files and directories - git config status.showUntrackedFiles no + "$GIT_PROGRAM" config status.showUntrackedFiles no #; possibly used later to ensure we're working on the yadm repo - git config yadm.managed 'true' + "$GIT_PROGRAM" config yadm.managed 'true' } @@ -578,8 +577,18 @@ function require_encrypt() { [ -f "$YADM_ENCRYPT" ] || error_out "$YADM_ENCRYPT does not exist. did you forget to create it?" } function require_git() { - command -v git >/dev/null 2>&1 || \ - error_out "This functionality requires Git to be installed, but the command git cannot be located." + local alt_git + alt_git="$(config yadm.git-program)" + + local more_info + more_info="" + + if [ "$alt_git" != "" ] ; then + GIT_PROGRAM="$alt_git" + more_info="\nThis command has been set via the yadm.git-program configuration." + fi + command -v "$GIT_PROGRAM" >/dev/null 2>&1 || \ + error_out "This functionality requires Git to be installed, but the command '$GIT_PROGRAM' cannot be located.$more_info" } function require_gpg() { local alt_gpg