set -e
print_usage () { cat <<'END'
usage:
- in repository directory
+ to move repository directory, cd to anywhere and
cvs-repomove --move local-repo module hostname remote-repo
- in working directory
+ 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 <ian@chiark.greenend.org.uk>
+#
+# 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
esac
}
-check_remote_host () {
+check_hostname () {
case "$1" in
/*|.*|-*) fail "bad hostname $dsthost" ;;
esac
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
*) 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
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"
}
*[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 \
exit 4
;;
*..moved-to-*)
- goose="$(printf "%s" \
+ goose="$(printf '%s\n' \
"${new_goose_info#*..moved-to-}" | \
tr : / | sed -e 's,/,:,')"
;;
}
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"