chiark / gitweb /
finalise
[chiark-utils.git] / scripts / cvs-repomove
index d53528d..92e1765 100755 (executable)
@@ -4,6 +4,7 @@ print_usage () { cat <<'END'
 usage:
   to move repository directory, cd to anywhere and
     cvs-repomove --move local-repo module hostname remote-repo
+    cvs-repomove --move src-hostname src-repo module dst-hostname dst-repo
   to adjust CVS/Root afterwards, in each working directory
     cvs-repomove                automatically update **/CVS/Root
 END
@@ -46,7 +47,7 @@ check_module () {
        esac
 }
 
-check_remote_host () {
+check_hostname () {
        case "$1" in
        /*|.*|-*)       fail "bad hostname $dsthost" ;;
        esac
@@ -55,13 +56,15 @@ check_remote_host () {
 check_remote_path () {
        case "$1" in
        *[^0-9a-zA-Z/._+,-]*) fail \
-               "remote pathname may not contain metacharacters, sorry" ;;
+               "pathname may not contain metacharacters, sorry" ;;
        esac
 }
 
 do_move () {
        check_module
-       check_remote_host "$dsthost"
+       check_hostname "$srchost"
+       check_hostname "$dsthost"
+       check_remote_path "$srcrepo/$module"
        check_remote_path "$dstrepo/$module"
 
        case "$dstrepo" in
@@ -69,61 +72,79 @@ do_move () {
        *)      bad_usage "destination repo path must be absolute" ;;
        esac
 
-       printf "moving module %s from %s to %s:%s\n" \
-               "$module" "$srcrepo" "$dsthost" "$dstrepo"
+       printf "moving module %s from %s:%s to %s:%s\n" \
+               "$module" "$srchost" "$srcrepo" "$dsthost" "$dstrepo"
 
        mn "checking existing repository"
-       ls -d -- "$srcrepo/CVSROOT" >/dev/null
+       "$CVS_RSH" "$srchost" bash -ec "'
+ ls -d -- $srcrepo/CVSROOT >/dev/null
+       '"
 
        dstrepotrans="$(printf "%s" "$dstrepo" | tr / :)"
        movingto="moving-to-$dsthost:$dstrepotrans"
-       if test -d "$srcrepo/$module..$movingto"; then
-               echo "    resuming previous attempt at a move"
-               resume=true
-               if test -d "$srcrepo/$module"; then
-                       fail "but $srcrepo/$module exists too"
-               fi
-       else
-               resume=false
-               ls -d -- "$srcrepo/$module" >/dev/null
-       fi
-
-       set +e
-       previously="$(ls -d -- "$srcrepo/$module..moved-to-"* 2>/dev/null)"
-       set -e
-       if [ "x$previously" != x ]; then
-               echo "    btw, module was once before moved away from here"
-               mv -- "$previously" \
- "${previously/..moved-to-/..previously-$(date +%s)-moved-to-}"
-       fi
+       resume="$("$CVS_RSH" "$srchost" bash -ec "'
+ if test -d $srcrepo/$module..$movingto; then
+  echo >&2 \"    resuming previous attempt at a move\"
+  resume=true
+  if test -d $srcrepo/$module; then
+   echo >&2 \"but $srcrepo/$module exists too\"
+   exit 1
+  fi
+ else
+  resume=false
+  ls -d -- $srcrepo/$module >/dev/null
+ fi
+ set +e
+ previously=\"$(ls -d -- $srcrepo/$module..moved-to-* 2>/dev/null)\"
+ set -e
+ if [ \"x\$previously\" != x ]; then
+  echo >&2 \"    btw, module was once before moved away from here\"
+  mv -- \"\$previously\" \
+   \"\${previously/..moved-to-/..previously-\$(date +%s)-moved-to-}\"
+ fi
+ echo \$resume
+       '")"
 
        mn "checking dst repository"
        "$CVS_RSH" "$dsthost" bash -ec "'
-               cd $dstrepo
-               ls -d CVSROOT >/dev/null
-               if test -d $dstrepo/$module; then
-                       echo >&2 module already exists in destination repo
-                       exit 1
-               fi
-               for f in $module..*; do
- case \"\$f\" in
- *..moved-to-*) echo \"    btw, module was previously at destn repo\" ;;
- *..previously-*) ;;
- *..tmp-*) echo \"    nb: possibly-stale temp/partial copy \$f\" ;;
- *..\*) ;;
- *) echo >&2 \"error: found unexpected subdir \$f\"; exit 8;;
- esac
-               done
+ cd $dstrepo
+ ls -d CVSROOT >/dev/null
+ if test -d $dstrepo/$module; then
+  echo >&2 module already exists in destination repo
+  exit 1
+ fi
+ for f in $module..*; do
+  case \"\$f\" in
+  *..moved-to-*)
+   echo \"    btw, module was previously at destn repo\"
+   mv -- \"\$f\" \
+    \"\${f/..moved-to-/..previously-\$(date +%s)-moved-to-}\"
+   ;;
+  *..previously-*) ;;
+  *..tmp-*)
+   echo \"    nb: possibly-stale temp/partial copy \$f\"
+   ;;
+  *..\*)
+   ;;
+  *)
+   echo >&2 \"error: found unexpected subdir \$f\"
+   exit 8
+   ;;
+  esac
+ done
        '"
 
        if ! $resume; then
-               mv -- "$srcrepo/$module" "$srcrepo/$module..$movingto"
+               "$CVS_RSH" "$srchost" bash -ec "'
+ mv -- $srcrepo/$module $srcrepo/$module..$movingto
+               '"
        fi
 
        mn "transferring repo data"
        tmpid="tmp-$(uname -n).$(date +%s)"
-       tar -c -C "$srcrepo/$module..$movingto" -f - . | \
-        "$CVS_RSH" "$dsthost" bash -ec "'
+       "$CVS_RSH" "$srchost" bash -ec "'
+ tar -c -C $srcrepo/$module..$movingto -f - .
+       '" | "$CVS_RSH" "$dsthost" bash -ec "'
                cd $dstrepo
                mkdir $module..$tmpid
                cd $module..$tmpid
@@ -137,9 +158,11 @@ do_move () {
                mv $module..$tmpid $module
        '"
 
-       mn "confirming move at local repo"
-       mv -- "$srcrepo/$module..$movingto" \
-               "$srcrepo/$module..moved-to-$dsthost:$dstrepotrans"
+       mn "confirming move at source repo"
+       "$CVS_RSH" "$srchost" bash -ec "'
+ mv -- $srcrepo/$module..$movingto \
+  $srcrepo/$module..moved-to-$dsthost:$dstrepotrans
+       '"
        echo "module moved successfully"
 }
 
@@ -162,8 +185,8 @@ do_furtle () {
                *[0-9a-zA-Z]:/*)
                        remotehost="${goose%%:*}"
                        path="${goose#*:}"
-                       check_remote_host "$remotehost"
-                       check_remote_path "$remotepath/$module"
+                       check_hostname "$remotehost"
+                       check_remote_path "$path/$module"
                        isremote=true
                        compute_fqdn_data "$remotehost"
                        if [ "x$fqdn_data" = "x$our_fqdn_data" -a \
@@ -220,8 +243,17 @@ do_furtle () {
 }
 
 if $move; then
-       [ "$#" = 4 ] || bad_usage "--move needs hostname and path"
-       srcrepo="$1"; module="$2"; dsthost="$3"; dstrepo="$4"
+       if [ $# = 4 ]; then
+               srchost="$(hostname -f)"; srcrepo="$1"
+               module="$2";
+               dsthost="$3"; dstrepo="$4"
+       elif [ $# = 5 ]; then
+               srchost="$1"; srcrepo="$2"
+               module="$3";
+               dsthost="$4"; dstrepo="$5"
+       else
+               bad_usage "--move needs hostname(s) and paths"
+       fi
        do_move
 else
        [ "$#" = 0 ] || bad_usage "without --move, give no arguments"