|
@@ -142,10 +142,60 @@ function alt() {
|
|
|
local local_user
|
|
|
set_local_alt_values
|
|
|
|
|
|
+ # only be noisy if the "alt" command was run directly
|
|
|
+ local loud=
|
|
|
+ [ "$YADM_COMMAND" = "alt" ] && loud="YES"
|
|
|
+
|
|
|
+ # decide if a copy should be done instead of a symbolic link
|
|
|
+ local do_copy=0
|
|
|
+ [[ $OPERATING_SYSTEM == CYGWIN* ]] &&
|
|
|
+ [ "$(config --bool yadm.cygwin-copy)" == "true" ] &&
|
|
|
+ do_copy=1
|
|
|
+
|
|
|
+ cd_work "Alternates" || return
|
|
|
+
|
|
|
+ # determine all tracked files
|
|
|
+ local tracked_files
|
|
|
+ tracked_files=()
|
|
|
+ local IFS=$'\n'
|
|
|
+ for tracked_file in $("$GIT_PROGRAM" ls-files | LC_ALL=C sort); do
|
|
|
+ tracked_files+=("$tracked_file")
|
|
|
+ done
|
|
|
+
|
|
|
+ # generate data for removing stale links
|
|
|
+ local possible_alts
|
|
|
+ possible_alts=()
|
|
|
+ local IFS=$'\n'
|
|
|
+ for possible_alt in "${tracked_files[@]}" "${ENCRYPT_INCLUDE_FILES[@]}"; do
|
|
|
+ if [[ $possible_alt =~ .\#\#. ]]; then
|
|
|
+ possible_alts+=("$YADM_WORK/${possible_alt%##*}")
|
|
|
+ fi
|
|
|
+ done
|
|
|
+ local alt_linked
|
|
|
+ alt_linked=()
|
|
|
+
|
|
|
if [ "$YADM_COMPATIBILITY" = "1" ]; then
|
|
|
- alt_past
|
|
|
+ alt_past_linking
|
|
|
else
|
|
|
- alt_future
|
|
|
+ alt_future_linking
|
|
|
+ fi
|
|
|
+
|
|
|
+ # review alternate candidates for stale links
|
|
|
+ # if a possible alt IS linked, but it's target is not part of alt_linked,
|
|
|
+ # remove it.
|
|
|
+ if readlink_available; then
|
|
|
+ for stale_candidate in "${possible_alts[@]}"; do
|
|
|
+ if [ -L "$stale_candidate" ]; then
|
|
|
+ link_target=$(readlink "$stale_candidate" 2>/dev/null)
|
|
|
+ if [ -n "$link_target" ]; then
|
|
|
+ removal=yes
|
|
|
+ for review_link in "${alt_linked[@]}"; do
|
|
|
+ [ "$link_target" = "$review_link" ] && removal=no
|
|
|
+ done
|
|
|
+ [ "$removal" = "yes" ] && rm -f "$stale_candidate"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ done
|
|
|
fi
|
|
|
|
|
|
}
|
|
@@ -172,12 +222,14 @@ function set_local_alt_values() {
|
|
|
|
|
|
}
|
|
|
|
|
|
-function alt_future() {
|
|
|
- # Future alternate processing, not implemented yet
|
|
|
+function alt_future_linking() {
|
|
|
+
|
|
|
+
|
|
|
return
|
|
|
+
|
|
|
}
|
|
|
|
|
|
-function alt_past() {
|
|
|
+function alt_past_linking() {
|
|
|
|
|
|
if [ -z "$local_class" ] ; then
|
|
|
match_class="%"
|
|
@@ -193,36 +245,6 @@ function alt_past() {
|
|
|
match1="^(.+)##(()|$match_system|$match_system\.$match_host|$match_system\.$match_host\.$match_user)$"
|
|
|
match2="^(.+)##($match_class|$match_class\.$match_system|$match_class\.$match_system\.$match_host|$match_class\.$match_system\.$match_host\.$match_user)$"
|
|
|
|
|
|
- cd_work "Alternates" || return
|
|
|
-
|
|
|
- # only be noisy if the "alt" command was run directly
|
|
|
- [ "$YADM_COMMAND" = "alt" ] && loud="YES"
|
|
|
-
|
|
|
- # decide if a copy should be done instead of a symbolic link
|
|
|
- local do_copy=0
|
|
|
- if [[ $OPERATING_SYSTEM == CYGWIN* ]] ; then
|
|
|
- if [[ $(config --bool yadm.cygwin-copy) == "true" ]] ; then
|
|
|
- do_copy=1
|
|
|
- fi
|
|
|
- fi
|
|
|
-
|
|
|
- # process the files tracked by yadm once, this info is used multiple times
|
|
|
- tracked_files=()
|
|
|
- local IFS=$'\n'
|
|
|
- for tracked_file in $("$GIT_PROGRAM" ls-files | LC_ALL=C sort); do
|
|
|
- tracked_files+=("$tracked_file")
|
|
|
- done
|
|
|
-
|
|
|
- # generate a list of possible alt files
|
|
|
- possible_alts=()
|
|
|
- local IFS=$'\n'
|
|
|
- for possible_alt in "${tracked_files[@]}" "${ENCRYPT_INCLUDE_FILES[@]}"; do
|
|
|
- if [[ $possible_alt =~ .\#\#. ]]; then
|
|
|
- possible_alts+=("$YADM_WORK/${possible_alt%##*}")
|
|
|
- fi
|
|
|
- done
|
|
|
- alt_linked=()
|
|
|
-
|
|
|
# loop over all "tracked" files
|
|
|
# for every file which matches the above regex, create a symlink
|
|
|
for match in $match1 $match2; do
|
|
@@ -253,24 +275,6 @@ function alt_past() {
|
|
|
done
|
|
|
done
|
|
|
|
|
|
- # review alternate candidates for stale links
|
|
|
- # if a possible alt IS linked, but it's target is not part of alt_linked,
|
|
|
- # remove it.
|
|
|
- if readlink_available; then
|
|
|
- for stale_candidate in "${possible_alts[@]}"; do
|
|
|
- if [ -L "$stale_candidate" ]; then
|
|
|
- link_target=$(readlink "$stale_candidate" 2>/dev/null)
|
|
|
- if [ -n "$link_target" ]; then
|
|
|
- removal=yes
|
|
|
- for review_link in "${alt_linked[@]}"; do
|
|
|
- [ "$link_target" = "$review_link" ] && removal=no
|
|
|
- done
|
|
|
- [ "$removal" = "yes" ] && rm -f "$stale_candidate"
|
|
|
- fi
|
|
|
- fi
|
|
|
- done
|
|
|
- fi
|
|
|
-
|
|
|
# loop over all "tracked" files
|
|
|
# for every file which is a *##yadm.j2 create a real file
|
|
|
local match="^(.+)##yadm\\.j2$"
|