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