]> git.wh0rd.org - home.git/blob - .bin/git-svn
cros-board: update
[home.git] / .bin / git-svn
1 #!/bin/sh
2
3 gdir=".git"
4 if [ ! -d ${gdir} ] ; then
5 echo "Run this is in the root of the git tree"
6 exit 1
7 fi
8
9 revmap() {
10 find ${gdir}/svn/$1/ '(' -name '.rev_map.*' -a '!' -name '*.bak' ')' -print
11 }
12
13 decode() {
14 xxd -c24 < $1
15 }
16 encode() {
17 xxd -c24 -r
18 }
19
20 get_branch() {
21 branch=${1:-trunk}
22 if [ ! -d ${gdir}/svn/${branch} ] ; then
23 echo "Branch ${branch} not in ${gdir}/svn/"
24 exit 1
25 fi
26
27 map=$(revmap ${branch})
28
29 cur_rev=$(printf '%i' 0x$(decode $map | tail -n1 | awk '{print $3}'))
30 }
31
32 show() {
33 get_branch "$@"
34 echo "${branch}: at rev ${cur_rev}"
35 exit 0
36 }
37
38 reset() {
39 get_branch "$@"
40 new_rev=$2
41 if [ -z "$new_rev" ] || [ "$new_rev" -gt "$cur_rev" ] ; then
42 echo "${branch}: invalid rev '$new_rev' (at $cur_rev)"
43 exit 1
44 fi
45
46 printf "really reset $branch to $new_rev ? [y/N] "
47 read ans
48 case ${ans} in
49 [yY]) ;;
50 *) exit 1;;
51 esac
52
53 hex0=$(printf '%04x' $(( new_rev % 0x10000 )) )
54 hex1=$(printf '%04x' $(( new_rev / 0x10000 )) )
55 cp $map $map.bak
56 decode $map.bak \
57 | sed -n "1,/^[^:]*: $hex1 $hex0/p" \
58 | encode \
59 > $map
60
61 show ${branch}
62 echo "don't forget to reset manually ref/remotes/${branch}"
63 }
64
65 usage() {
66 echo "Unknown op '$op'"
67 exit 1
68 }
69
70 branch=
71 op=$1
72 shift
73 case $op in
74 -s) show "$@";;
75 -r) reset "$@";;
76 *) usage;;
77 esac