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
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 / :)"
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 \
}
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"