chiark / gitweb /
tg import: Fix up process_commit() progress reporting
[topgit.git] / tg-import.sh
1 #!/bin/sh
2 # TopGit - A different patch queue manager
3 # (c) Petr Baudis <pasky@suse.cz>  2008
4 # (c) Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>  2008
5 # GPLv2
6
7 branch_prefix=t/
8 ranges=
9
10
11 ## Parse options
12
13 while [ -n "$1" ]; do
14         arg="$1"; shift
15         case "$arg" in
16         -p)
17                 branch_prefix="$1"; shift;;
18         -*)
19                 echo "Usage: tg [...] import [-p PREFIX] RANGE..." >&2
20                 exit 1;;
21         *)
22                 ranges="$ranges $arg";;
23         esac
24 done
25
26
27 get_commit_msg()
28 {
29         commit="$1"
30         git log -1 --pretty=format:"From: %an <%ae>%n%n%s%n%n%b" "$commit"
31 }
32
33 get_branch_name()
34 {
35         # nice sed script from git-format-patch.sh
36         commit="$1"
37         titleScript='
38         s/[^-a-z.A-Z_0-9]/-/g
39         s/\.\.\.*/\./g
40         s/\.*$//
41         s/--*/-/g
42         s/^-//
43         s/-$//
44         q
45 '
46         git log -1 --pretty=format:"%s" "$commit" | sed -e "$titleScript"
47 }
48
49 process_commit()
50 {
51         commit="$1"
52         branch_name=$(get_branch_name "$commit")
53         info "Importing $commit to $branch_prefix$branch_name"
54         tg create "$branch_prefix""$branch_name"
55         git read-tree "$commit"
56         get_commit_msg "$commit" > .topmsg
57         git add -f .topmsg .topdeps
58         git commit -C "$commit"
59 }
60
61 # nice arg verification stolen from git-format-patch.sh
62 for revpair in $ranges
63 do
64         case "$revpair" in
65         ?*..?*)
66                 rev1=`expr "z$revpair" : 'z\(.*\)\.\.'`
67                 rev2=`expr "z$revpair" : 'z.*\.\.\(.*\)'`
68                 ;;
69         *)
70                 die "Unknow range spec $revpair"
71                 ;;
72         esac
73         git rev-parse --verify "$rev1^0" >/dev/null 2>&1 ||
74                 die "Not a valid rev $rev1 ($revpair)"
75         git rev-parse --verify "$rev2^0" >/dev/null 2>&1 ||
76                 die "Not a valid rev $rev2 ($revpair)"
77         git cherry -v "$rev1" "$rev2" |
78         while read sign rev comment
79         do
80                 case "$sign" in
81                 '-')
82                         info "Merged already: $comment"
83                         ;;
84                 *)
85                         process_commit "$rev"
86                         ;;
87                 esac
88         done
89 done