chiark / gitweb /
tg import -s: Import single commit using well-defined name
[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 single=
9 ranges=
10
11
12 ## Parse options
13
14 while [ -n "$1" ]; do
15         arg="$1"; shift
16         case "$arg" in
17         -p)
18                 branch_prefix="$1"; shift;;
19         -s)
20                 single="$1"; shift;;
21         -*)
22                 echo "Usage: tg [...] import {[-p PREFIX] RANGE...|-s NAME COMMIT}" >&2
23                 exit 1;;
24         *)
25                 ranges="$ranges $arg";;
26         esac
27 done
28
29
30 ## Make sure our tree is clean
31
32 git update-index --ignore-submodules --refresh || exit
33 [ -z "$(git diff-index --cached --name-status -r --ignore-submodules HEAD --)" ] ||
34         die "the index is not clean"
35
36
37 ## Perform import
38
39 get_commit_msg()
40 {
41         commit="$1"
42         git log -1 --pretty=format:"From: %an <%ae>%n%n%s%n%n%b" "$commit"
43 }
44
45 get_branch_name()
46 {
47         # nice sed script from git-format-patch.sh
48         commit="$1"
49         titleScript='
50         s/[^-a-z.A-Z_0-9]/-/g
51         s/\.\.\.*/\./g
52         s/\.*$//
53         s/--*/-/g
54         s/^-//
55         s/-$//
56         q
57 '
58         git log -1 --pretty=format:"%s" "$commit" | sed -e "$titleScript"
59 }
60
61 process_commit()
62 {
63         commit="$1"
64         branch_name="$2"
65         info "---- Importing $commit to $branch_name"
66         tg create "$branch_name"
67         git cherry-pick --no-commit "$commit"
68         get_commit_msg "$commit" > .topmsg
69         git add -f .topmsg .topdeps
70         git commit -C "$commit"
71         info "++++ Importing $commit finished"
72 }
73
74 if [ -n "$single" ]; then
75         process_commit "$ranges" "$single"
76         exit
77 fi
78
79 # nice arg verification stolen from git-format-patch.sh
80 for revpair in $ranges
81 do
82         case "$revpair" in
83         ?*..?*)
84                 rev1=`expr "z$revpair" : 'z\(.*\)\.\.'`
85                 rev2=`expr "z$revpair" : 'z.*\.\.\(.*\)'`
86                 ;;
87         *)
88                 die "Unknow range spec $revpair"
89                 ;;
90         esac
91         git rev-parse --verify "$rev1^0" >/dev/null 2>&1 ||
92                 die "Not a valid rev $rev1 ($revpair)"
93         git rev-parse --verify "$rev2^0" >/dev/null 2>&1 ||
94                 die "Not a valid rev $rev2 ($revpair)"
95         git cherry -v "$rev1" "$rev2" |
96         while read sign rev comment
97         do
98                 case "$sign" in
99                 '-')
100                         info "Merged already: $comment"
101                         ;;
102                 *)
103                         process_commit "$rev" "$branch_prefix$(get_branch_name "$rev")"
104                         ;;
105                 esac
106         done
107 done