From f3ae31f1c2d4c13417e1d9451e1129eeb94d513c Mon Sep 17 00:00:00 2001 From: Tim Byrne Date: Sun, 18 Aug 2019 12:51:53 -0500 Subject: [PATCH] Separate alternate linking code from other operations --- yadm | 110 +++++++++++++++++++++++++++++++---------------------------- 1 file changed, 57 insertions(+), 53 deletions(-) diff --git a/yadm b/yadm index badf2d4..145d249 100755 --- a/yadm +++ b/yadm @@ -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$"