]>
Commit | Line | Data |
---|---|---|
6c162084 MF |
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 |