Import patchsync version 2.3
[utils/utils.git] / patchsync
index 07e2f0f..e63d6da 100755 (executable)
--- 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] <staging> [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 <<EOF
-Patchsync version 2 by Matt McCutchen
+Patchsync version $PATCHSYNC_VERSION by Matt McCutchen
 usage: patchsync [--dry-run] <staging> [branch | patch]
        patchsync --new <trunk> <patch> <branch> <staging>
 Please read the top of the script for complete documentation.