chiark / gitweb /
topgit: Implement tg-import
[topgit.git] / tg-import.sh
1 #!/bin/sh
2 # TopGit - A different patch queue manager
3 # GPLv2
4
5
6 tg_get_commit_msg()
7 {
8         commit="$1"
9         git log -1 --pretty=format:"From: %an <%ae>%n%n%s%n%n%b" "$commit"
10 }
11
12 tg_get_branch_name()
13 {
14         # nice sed script from git-format-patch.sh
15         commit="$1"
16         titleScript='
17         s/[^-a-z.A-Z_0-9]/-/g
18         s/\.\.\.*/\./g
19         s/\.*$//
20         s/--*/-/g
21         s/^-//
22         s/-$//
23         q
24 '
25         git log -1 --pretty=format:"%s" "$commit" | sed -e "$titleScript"
26 }
27
28 tg_process_commit()
29 {
30         commit="$1"
31         branch_name=$(tg_get_branch_name "$commit")
32         echo "Importing $commit to $branch_name"
33         tg create tp/"$branch_name"
34         git read-tree "$commit"
35         tg_get_commit_msg "$commit" > .topmsg
36         git add -f .topmsg .topdeps
37         git commit -C "$commit"
38 }
39
40 # nice arg verification stolen from git-format-patch.sh
41 for revpair
42 do
43         case "$revpair" in
44         ?*..?*)
45                 rev1=`expr "z$revpair" : 'z\(.*\)\.\.'`
46                 rev2=`expr "z$revpair" : 'z.*\.\.\(.*\)'`
47                 ;;
48         *)
49                 die "Unknow range spec $revpair"
50                 ;;
51         esac
52         git rev-parse --verify "$rev1^0" >/dev/null 2>&1 ||
53                 die "Not a valid rev $rev1 ($revpair)"
54         git rev-parse --verify "$rev2^0" >/dev/null 2>&1 ||
55                 die "Not a valid rev $rev2 ($revpair)"
56         git cherry -v "$rev1" "$rev2" |
57         while read sign rev comment
58         do
59                 case "$sign" in
60                 '-')
61                         info "Merged already: $comment"
62                         ;;
63                 *)
64                         tg_process_commit "$rev"
65                         ;;
66                 esac
67         done
68 done