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