|
|
|
@ -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 <<EOF |
|
|
|
|
**NOTE** |
|
|
|
|
Merging origin/master failed. |
|
|
|
@ -194,9 +196,6 @@ EOF |
|
|
|
|
|
|
|
|
|
function config() { |
|
|
|
|
|
|
|
|
|
#; ensure we have a file, even if empty |
|
|
|
|
[ -f "$YADM_CONFIG" ] || touch "$YADM_CONFIG" |
|
|
|
|
|
|
|
|
|
if [ -z "$*" ] ; then |
|
|
|
|
#; with no parameters, provide some helpful documentation |
|
|
|
|
echo TODO: Print help about available yadm configurations |
|
|
|
@ -212,7 +211,7 @@ function decrypt() { |
|
|
|
|
require_gpg |
|
|
|
|
require_archive |
|
|
|
|
|
|
|
|
|
YADM_WORK=$(git config core.worktree) |
|
|
|
|
YADM_WORK=$("$GIT_PROGRAM" config core.worktree) |
|
|
|
|
|
|
|
|
|
if [ "$DO_LIST" = "YES" ] ; then |
|
|
|
|
tar_option="t" |
|
|
|
@ -238,7 +237,7 @@ function encrypt() { |
|
|
|
|
require_ls |
|
|
|
|
|
|
|
|
|
#; process relative to YADM_WORK |
|
|
|
|
YADM_WORK=$(git config core.worktree) |
|
|
|
|
YADM_WORK=$("$GIT_PROGRAM" config core.worktree) |
|
|
|
|
cd "$YADM_WORK" || { |
|
|
|
|
debug "Encryption not processed, unable to cd to $YADM_WORK" |
|
|
|
|
return |
|
|
|
@ -275,14 +274,14 @@ function encrypt() { |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
#; offer to add YADM_ARCHIVE if untracked |
|
|
|
|
archive_status=$(git status --porcelain -uall "$YADM_ARCHIVE" 2>/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 |
|
|
|
|