X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-utils.git;a=blobdiff_plain;f=scripts%2Fcvs-repomove;h=a3bb60f1d70d3873cf71087851249a333674c86b;hp=d53528db31fdef521c34898bdf0b5ec9233a80bd;hb=baf561ddf88e9b6f016bdd76e9757cb161ed1d71;hpb=49d70032448b886fc0de88ffd9a4843845deb93b diff --git a/scripts/cvs-repomove b/scripts/cvs-repomove index d53528d..a3bb60f 100755 --- a/scripts/cvs-repomove +++ b/scripts/cvs-repomove @@ -4,11 +4,29 @@ 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 } +# Copyright 2004-2006 Ian Jackson +# +# This script and its documentation (if any) are free software; you +# can redistribute it and/or modify them under the terms of the GNU +# General Public License as published by the Free Software Foundation; +# either version 3, or (at your option) any later version. +# +# chiark-named-conf and its manpage are distributed in the hope that +# it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, consult the Free Software Foundation's +# website at www.fsf.org, or the GNU Project website at www.gnu.org. + + # We do things in the following order: # src dst # 0. Check things @/..moving-to none/..moved-to @@ -46,7 +64,7 @@ check_module () { esac } -check_remote_host () { +check_hostname () { case "$1" in /*|.*|-*) fail "bad hostname $dsthost" ;; esac @@ -55,13 +73,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 +89,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 / :)" + dstrepotrans="$(printf '%s\n' "$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 +175,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 +202,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 \ @@ -204,7 +244,7 @@ do_furtle () { exit 4 ;; *..moved-to-*) - goose="$(printf "%s" \ + goose="$(printf '%s\n' \ "${new_goose_info#*..moved-to-}" | \ tr : / | sed -e 's,/,:,')" ;; @@ -220,8 +260,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"