What's cooking (2012/09 #04)
[alt-git.git] / Reintegrate
blob92f3d278b8e4a0f385587c8ee9e07c7518725d44
1 #!/bin/sh
3 accept_rerere="--rerere-autoupdate" generate=no update= diff= edit= stop_at_cut=
4 while case "$#,$1" in 0,*) break;; *,-*) ;; esac
5 do
6 case "$1" in
7 -n) accept_rerere= ;;
8 -e) edit=t ;;
9 -c) stop_at_cut=1 ;;
10 -c?*) stop_at_cut=${1#-c} ;;
11 -d) update=${2?"diff with what?"}
12 diff=yes
13 generate=yes
14 shift ;;
15 -u) update=${2?"update what?"}
16 generate=yes
17 shift ;;
18 *) generate=yes
19 break ;;
20 esac
21 shift
22 done
24 annotate_merge () {
25 test -f Meta/whats-cooking.txt || return 0
27 perl -e '
28 my ($branch) = $ARGV[0];
29 my ($in_section) = 0;
30 my @msg = ();
31 while (<STDIN>) {
32 if (/^\* $branch /) {
33 $in_section = 1;
34 next;
36 if (/^[-*\[]/) {
37 last if $in_section;
39 next unless $in_section;
40 next if (/^ /);
41 push @msg, $_;
44 if ($in_section && @msg) {
45 open(my $fh, "-|", qw(git cat-file commit HEAD));
46 my @original = (<$fh>);
47 my @final;
48 $in_section = 0;
49 for (@original) {
50 if (!$in_section) {
51 $in_section = 1 if (/^$/);
52 next;
54 push @final, $_;
55 if (/^$/ && $in_section == 1) {
56 push @final, @msg;
57 push @final, "\n";
58 $in_section = 2;
61 close $fh;
62 open($fh, "|-", qw(git commit --amend -F -));
63 print $fh @final;
64 close $fh;
66 ' <Meta/whats-cooking.txt "$1"
69 case "$generate" in
70 no)
71 accept_rerere () {
72 if ! git write-tree 2>/dev/null >/dev/null
73 then
74 git rerere remaining
75 return 1
76 else
77 EDITOR=: git commit --no-verify
78 echo "Accepted previous resolution"
79 return 0
83 cut_seen=0
84 while read branch eh
86 case "$branch" in '###') cut_seen=$(( $cut_seen + 1 )) ;; esac
87 if test -n "$stop_at_cut" && test $stop_at_cut -le $cut_seen
88 then
89 continue
92 case "$branch" in '#'* | '') continue ;; esac
94 case "$eh" in
95 "" | "#"*)
96 echo >&2 "* $branch"
98 save=$(git rev-parse --verify HEAD)
99 tip=$(git rev-parse --verify "$branch^0")
100 mb=$(git merge-base "$tip" "$save")
101 test "$mb" = "$tip" && continue
103 EDITOR=: git merge $accept_rerere --edit "$branch" ||
104 accept_rerere ||
105 exit
107 annotate_merge "$branch" || exit
108 test -z "$edit" ||
109 git commit --amend || exit
111 this=$(git rev-parse --verify HEAD)
112 if test "$this" = "$save"
113 then
115 elif git show-ref -q --verify "refs/merge-fix/$branch"
116 then
117 echo >&2 "Fixing up the merge"
118 git cherry-pick --no-commit "refs/merge-fix/$branch" &&
119 EDITOR=: git commit --amend -a || exit
122 pick" "*)
123 echo >&2 "* $eh"
124 git cherry-pick "$branch" || exit ;;
125 *) echo >&2 "Eh? $branch $eh"; exit ;;
126 esac
127 done
128 exit
129 esac
131 if test -n "$update" && test $# = 0
132 then
133 set x $(sed -n -e '2s/^# //p' <"$update") &&
134 shift
137 # Generation (or updating)
139 x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
140 x40="$x40$x40$x40$x40$x40$x40$x40$x40"
141 LF='
144 show_merge () {
145 case "$msg" in
146 "Merge branch '"*"'"*)
147 branch=$(expr "$msg" : "Merge branch '\(.*\)'")
148 merge_hier=heads/
150 "Merge remote branch '"*"'"*)
151 branch=$(expr "$msg" : "Merge remote branch '\(.*\)'")
152 merge_hier=
155 echo 2>&1 "Huh?: $msg"
156 return
158 esac &&
159 tip=$(git rev-parse --verify "refs/$merge_hier$branch" 2>/dev/null) &&
160 merged=$(git name-rev --refs="refs/$merge_hier$branch" "$other" 2>/dev/null) &&
161 merged=$(expr "$merged" : "$x40 \(.*\)") &&
162 test "$merged" != undefined || {
163 other=$(git log -1 --pretty='format:%s' $other) &&
164 merged="$branch :rebased? $other"
168 show_pick () {
169 merged="$(git rev-parse --verify "$commit") pick $msg"
172 generate () {
173 PROGRAM=$1
174 shift
175 echo '#!/bin/sh'
176 echo "# $1"
177 echo 'case "$#,$1" in'
178 echo '1,-u|1,-d)'
179 echo " exec $PROGRAM" '"$1" "$0"'
180 echo 'esac'
181 echo "$PROGRAM" '"$@" <<\EOF'
182 git log --pretty=oneline --first-parent "$1" |
184 series=
185 while read commit msg
187 if other=$(git rev-parse -q --verify "$commit^2")
188 then
189 show_merge
190 else
191 show_pick
194 if test -z "$series"
195 then
196 series="$merged"
197 else
198 series="$merged$LF$series"
200 done
201 echo "$series"
203 echo EOF
206 if test -z "$update"
207 then
208 generate "$0" "$@"
209 elif test -z "$diff"
210 then
211 generate "$0" "$@" | diff -u "$update" -
212 if test $? = 0
213 then
214 echo >&2 "No changes."
215 else
216 echo >&2 -n "Update [y/N]? "
217 read yesno
218 case "$yesno" in
219 [Yy]*)
220 generate "$0" "$@" |
221 sed -e 's/ :rebased?.*//' >"$update" ;;
223 echo >&2 "No update then." ;;
224 esac
226 else
227 generate "$0" "$@" | diff -u "$update" -