/usr/bin/cvs-switchroot is in cvs 2:1.12.13+real-15.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | #!/bin/mksh
#-
# Copyright © 2005, 2008, 2011
# Thorsten “mirabilos” Glaser <tg@mirbsd.org>
#
# Provided that these terms and disclaimer and all copyright notices
# are retained or reproduced in an accompanying document, permission
# is granted to deal in this work without restriction, including un‐
# limited rights to use, publicly perform, distribute, sell, modify,
# merge, give away, or sublicence.
#
# This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
# the utmost extent permitted by applicable law, neither express nor
# implied; without malicious intent or gross negligence. In no event
# may a licensor, author or contributor be held liable for indirect,
# direct, other damage, loss, or other issues arising in any way out
# of dealing in the work, even if advised of the possibility of such
# damage or existence of a defect, except proven that it results out
# of said person’s immediate fault when using the work as intended.
#-
# Change CVSROOT of a checked out tree (and save space with it)
# With option -T: change Tag instead of Root
me=${0##*/}
if [[ $1 = -T ]]; then
tagmode=-T
fn=Tag
shift
else
tagmode=
fn=Root
fi
newroot=$1
useroot=0
if [[ $newroot = - ]]; then
shift
newroot=$(realpath "$1")
[[ -d $newroot ]] && if [[ -d $newroot/CVS ]]; then
newroot=$newroot/CVS/$fn
else
newroot=$newroot/$fn
fi
useroot=1
fi
if [[ -z $newroot || $newroot = -? ]]; then
print -u2 "Syntax: $me newroot [dir [...]]"
print -u2 "\t$me - .../CVS/Root [dir [...]]"
print -u2 "\t$me -T - .../CVS/Tag [dir [...]]"
exit 1
fi
shift
[[ -z $1 ]] && set -- .
# realpath(2)ise arguments
set -A arg
let i=0
for name in "$@"; do
arg[i++]=$(realpath "$name")
done
if ! T="$(mktemp ${arg[0]}/$me.XXXXXXXXXX)"; then
print -u2 "$me: fatal: cannot mktemp"
exit 1
fi
if (( useroot )); then
rm -f "$T"
ln "$newroot" "$T" || cp "$newroot" "$T"
fi
trap 'rm -f "$T"; exit 0' 0
trap 'rm -f "$T"; trap - EXIT; exit 1' 1 2 3 5 13 15
if (( !useroot )); then
chmod 664 "$T"
print -r -- "$newroot" >"$T"
fi
let rv=0
find "${arg[@]}" -path \*/CVS/$fn -print0 |&
while IFS= read -d '' -pr name; do
if ! rm "$name"; then
print -u2 "$me: error: cannot rm <$name>"
exit 1
fi
ln -f "$T" "$name" || if ! U="$(mktemp ${arg[0]}/$me.XXXXXXXXXX)"; then
cp "$T" "$name"
elif cat "$T" >"$U" && ln -f "$U" "$name"; then
rm -f "$T"
T="$U"
else
rm -f "$U"
cp "$T" "$name"
fi
done
exit 0
|