tg import -s: Import single commit using well-defined name
[topgit/lukasnellen.git] / tg-import.sh
blob6f8c8daf08d2bc6abb14d4bb22d49995f4463730
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
7 branch_prefix=t/
8 single=
9 ranges=
12 ## Parse options
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;;
25 ranges="$ranges $arg";;
26 esac
27 done
30 ## Make sure our tree is clean
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"
37 ## Perform import
39 get_commit_msg()
41 commit="$1"
42 git log -1 --pretty=format:"From: %an <%ae>%n%n%s%n%n%b" "$commit"
45 get_branch_name()
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/-$//
58 git log -1 --pretty=format:"%s" "$commit" | sed -e "$titleScript"
61 process_commit()
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"
74 if [ -n "$single" ]; then
75 process_commit "$ranges" "$single"
76 exit
79 # nice arg verification stolen from git-format-patch.sh
80 for revpair in $ranges
82 case "$revpair" in
83 ?*..?*)
84 rev1=`expr "z$revpair" : 'z\(.*\)\.\.'`
85 rev2=`expr "z$revpair" : 'z.*\.\.\(.*\)'`
88 die "Unknow range spec $revpair"
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
98 case "$sign" in
99 '-')
100 info "Merged already: $comment"
103 process_commit "$rev" "$branch_prefix$(get_branch_name "$rev")"
105 esac
106 done
107 done