X-Git-Url: https://mattmccutchen.net/utils/utils.git/blobdiff_plain/37ecca1d756945c3fed580d3a991bcfbf41f2314..75ae3f77056cd1dca3424b9eae8391092bed4fd0:/patchsync diff --git a/patchsync b/patchsync index 07e2f0f..e63d6da 100755 --- a/patchsync +++ b/patchsync @@ -1,9 +1,11 @@ #!/bin/bash # patchsync: Synchronizes a trunk, a branch, and a patch containing the # differences between them. -# Version 2 # -- Matt McCutchen -# + +# If I had to update the version in the --version message separately, I would forget. +PATCHSYNC_VERSION=2.3 + # usage: patchsync [--dry-run] [branch | patch] # # Patchsync is invoked on a "staging directory", which holds some configuration @@ -90,7 +92,7 @@ set -o pipefail type rsync >/dev/null 2>&1 || \ { echo "Patchsync requires rsync, but there's no rsync on your path!" 1>&2; exit 1; } # If a cp2 is available, use it; otherwise define our own. -type cp2 >/dev/null 2>&1 || function cp2 { rsync -rltE --chmod=ugo=rwx "$@"; } +type cp2 >/dev/null 2>&1 || function cp2 { exec rsync -rltE --chmod=ugo=rwx "$@"; } function exitoneok { "$@" || [ $? == 1 ] @@ -151,7 +153,7 @@ fi cd "$staging" || { echo "Failed to enter staging dir!" 1>&2; exit 1; } shift -. settings +. ./settings type do_diff >/dev/null 2>&1 || { echo "do_diff is not defined!" 1>&2; exit 1; } type do_patch >/dev/null 2>&1 || { echo "do_patch is not defined!" 1>&2; exit 1; } @@ -211,6 +213,10 @@ if [ -z "$whichtoupdate" ] && [[ -n $trunkch || -n $branchch || -n $patchch ]]; #echo "Synchronization will update $whichtoupdate." fi +# Remove old copy-out files to be clean and to make sure we don't +# mistakenly copy them out this time. +rm -rf patch-new branch-new + if [ -n "$whichtoupdate" ]; then # Always show what would happen if patch-new and branch-new were copied out. @@ -219,9 +225,6 @@ if [ -n "$whichtoupdate" ]; then # state if no error. error= -# Don't let stuff from an old run confuse us. -rm -rf patch-new branch-new - function prepare_branch { echo "Preparing updated branch..." # No link-dest because we will modify and then link-dest when copying out @@ -285,7 +288,7 @@ if ! [ $error ] && ! [ $dryrun ]; then "${COPYOUT[@]}" -i --link-dest="$(wdpp_from branch/)branch-new/" branch-new/ branch/ rm -rf branch-new } - ! [ -e patch-new ] || cmp -s patch-work patch || { + ! [ -e patch-new ] || cmp -s patch patch-new || { hash_file patch-new >patch-new-hash # Don't use rsync because we might have to write through a symlink. echo "> patch" @@ -306,7 +309,7 @@ else "${COPYOUT[@]}" -n -i --link-dest="$(wdpp_from branch/)branch-new/" branch-new/ branch/ #rm -rf branch-new } - ! [ -e patch-new ] || cmp -s patch-work patch || { + ! [ -e patch-new ] || cmp -s patch patch-new || { hash_file patch-new >patch-new-hash # Don't use rsync because we might have to write through a symlink. echo "> patch" @@ -347,13 +350,13 @@ function patchsync_new { exit 1 fi - # Set up arguments. Open templates because we will change directories. + # Set up arguments. trunk="$1" patch="$2" branch="$3" staging="$4" - # What exists? Whichtochange first? + # What exists? ! [ -e "$staging" ] || { echo "Staging dir already exists!" 1>&2; exit 1; } [ -d "$trunk" ] || { echo "Trunk does not exist!" 1>&2; exit 1; } @@ -422,7 +425,7 @@ END function patchsync_help { cat < [branch | patch] patchsync --new Please read the top of the script for complete documentation.