What's cooking (2008/06 #01)

Junio C Hamano committed Aug 5, 2008 at 21:44 UTC 7d77f2e9cc2ccb95922932ddd8499fe17139177a
4 files changed +619
.gitattributes new
+1
@@ -0,0 +1 @@
1 +whats-cooking.txt diff=whatscooking
README.cooking new
+17
@@ -0,0 +1,17 @@
1 +The compare-cooking.perl script is meant to help viewing the differences
2 +between periodical "What's cooking" messages, and can be used as an
3 +external diff driver by:
4 +
5 + $ git config diff.whatscooking.command ./compare-cooking.perl
6 +
7 +to produce this section in your .git/config
8 +
9 + [diff "whatscooking"]
10 + command = ./compare-cooking.perl
11 +
12 +You can use e.g.
13 +
14 + $ git log -p --ext-diff whats-cooking.txt
15 + $ git show --ext-diff whats-cooking.txt
16 +
17 +to review the history.
compare-cooking.perl new
+293
@@ -0,0 +1,293 @@
1 +#!/usr/bin/perl -w
2 +
3 +my ($old, $new);
4 +
5 +if (@ARGV == 7) {
6 + # called as GIT_EXTERNAL_DIFF script
7 + $old = parse_cooking($ARGV[1]);
8 + $new = parse_cooking($ARGV[4]);
9 +} else {
10 + # called with old and new
11 + $old = parse_cooking($ARGV[0]);
12 + $new = parse_cooking($ARGV[1]);
13 +}
14 +compare_cooking($old, $new);
15 +
16 +################################################################
17 +
18 +use File::Temp qw(tempfile);
19 +
20 +sub compare_them {
21 + local($_);
22 + my ($a, $b, $force, $soft) = @_;
23 +
24 + if ($soft) {
25 + $plus = $minus = ' ';
26 + } else {
27 + $plus = '+';
28 + $minus = '-';
29 + }
30 +
31 + if (!defined $a->[0]) {
32 + return map { "$plus$_\n" } map { split(/\n/) } @{$b};
33 + } elsif (!defined $b->[0]) {
34 + return map { "$minus$_\n" } map { split(/\n/) } @{$a};
35 + } elsif (join('', @$a) eq join('', @$b)) {
36 + if ($force) {
37 + return map { " $_\n" } map { split(/\n/) } @{$a};
38 + } else {
39 + return ();
40 + }
41 + }
42 + my ($ah, $aname) = tempfile();
43 + my ($bh, $bname) = tempfile();
44 + my $cnt = 0;
45 + my @result = ();
46 + for (@$a) {
47 + print $ah $_;
48 + $cnt += tr/\n/\n/;
49 + }
50 + for (@$b) {
51 + print $bh $_;
52 + $cnt += tr/\n/\n/;
53 + }
54 + close $ah;
55 + close $bh;
56 + open(my $fh, "-|", 'diff', "-U$cnt", $aname, $bname);
57 + $cnt = 0;
58 + while (<$fh>) {
59 + next if ($cnt++ < 3);
60 + push @result, $_;
61 + }
62 + close $fh;
63 + unlink ($aname, $bname);
64 + return @result;
65 +}
66 +
67 +sub flush_topic {
68 + my ($cooking, $name, $desc) = @_;
69 + my $section = $cooking->{SECTIONS}[-1];
70 +
71 + return if (!defined $name);
72 +
73 + $desc =~ s/\s+\Z/\n/s;
74 + $desc =~ s/\A\s+//s;
75 + my $topic = +{
76 + IN_SECTION => $section,
77 + NAME => $name,
78 + DESC => $desc,
79 + };
80 + $cooking->{TOPICS}{$name} = $topic;
81 + push @{$cooking->{TOPIC_ORDER}}, $name;
82 +}
83 +
84 +sub parse_section {
85 + my ($cooking, @line) = @_;
86 +
87 + while (@line && $line[-1] =~ /^\s*$/) {
88 + pop @line;
89 + }
90 + return if (!@line);
91 +
92 + if (!exists $cooking->{SECTIONS}) {
93 + $cooking->{SECTIONS} = [];
94 + $cooking->{TOPICS} = {};
95 + $cooking->{TOPIC_ORDER} = [];
96 + }
97 + if (!exists $cooking->{HEADER}) {
98 + my $line = join('', @line);
99 + $line =~ s/\A.*?\n\n//s;
100 + $cooking->{HEADER} = $line;
101 + return;
102 + }
103 + if (!exists $cooking->{GREETING}) {
104 + $cooking->{GREETING} = join('', @line);
105 + return;
106 + }
107 +
108 + my ($section_name, $topic_name, $topic_desc);
109 + for (@line) {
110 + if (!defined $section_name && /^\[(.*)\]$/) {
111 + $section_name = $1;
112 + push @{$cooking->{SECTIONS}}, $section_name;
113 + next;
114 + }
115 + if (/^\* (\S+) /) {
116 + my $next_name = $1;
117 + flush_topic($cooking, $topic_name, $topic_desc);
118 + $topic_name = $next_name;
119 + $topic_desc = '';
120 + }
121 + $topic_desc .= $_;
122 + }
123 + flush_topic($cooking, $topic_name, $topic_desc);
124 +}
125 +
126 +sub dump_cooking {
127 + my ($cooking) = @_;
128 + print $cooking->{HEADER};
129 + print "-" x 50, "\n";
130 + print $cooking->{GREETING};
131 + for my $section_name (@{$cooking->{SECTIONS}}) {
132 + print "\n", "-" x 50, "\n";
133 + print "[$section_name]\n";
134 + for my $topic_name (@{$cooking->{TOPIC_ORDER}}) {
135 + $topic = $cooking->{TOPICS}{$topic_name};
136 + next if ($topic->{IN_SECTION} ne $section_name);
137 + print "\n", $topic->{DESC};
138 + }
139 + }
140 +}
141 +
142 +sub parse_cooking {
143 + my ($filename) = @_;
144 + my (%cooking, @current, $fh);
145 + open $fh, "<", $filename
146 + or die "cannot open $filename: $!";
147 + while (<$fh>) {
148 + if (/^-{30,}$/) {
149 + parse_section(\%cooking, @current);
150 + @current = ();
151 + next;
152 + }
153 + push @current, $_;
154 + }
155 + close $fh;
156 + parse_section(\%cooking, @current);
157 +
158 + return \%cooking;
159 +}
160 +
161 +sub compare_topics {
162 + my ($a, $b) = @_;
163 + if (!@$a || !@$b) {
164 + print compare_them($a, $b, 1, 1);
165 + return;
166 + }
167 +
168 + # otherwise they both have title.
169 + $a = [map { "$_\n" } split(/\n/, join('', @$a))];
170 + $b = [map { "$_\n" } split(/\n/, join('', @$b))];
171 + my $atitle = shift @$a;
172 + my $btitle = shift @$b;
173 + print compare_them([$atitle], [$btitle], 1);
174 +
175 + my (@atail, @btail);
176 + while (@$a && $a->[-1] !~ /^\s/) {
177 + unshift @atail, pop @$a;
178 + }
179 + while (@$b && $b->[-1] !~ /^\s/) {
180 + unshift @btail, pop @$b;
181 + }
182 + print compare_them($a, $b);
183 + print compare_them(\@atail, \@btail);
184 +}
185 +
186 +sub compare_class {
187 + my ($fromto, $names, $topics) = @_;
188 +
189 + my (@where, %where);
190 + for my $name (@$names) {
191 + my $t = $topics->{$name};
192 + my ($a, $b, $in, $force);
193 + if ($t->{OLD} && $t->{NEW}) {
194 + $a = [$t->{OLD}{DESC}];
195 + $b = [$t->{NEW}{DESC}];
196 + if ($t->{OLD}{IN_SECTION} ne $t->{NEW}{IN_SECTION}) {
197 + $force = 1;
198 + $in = '';
199 + } else {
200 + $in = "[$t->{NEW}{IN_SECTION}]";
201 + }
202 + } elsif ($t->{OLD}) {
203 + $a = [$t->{OLD}{DESC}];
204 + $b = [];
205 + $in = "Was in [$t->{OLD}{IN_SECTION}]";
206 + } else {
207 + $a = [];
208 + $b = [$t->{NEW}{DESC}];
209 + $in = "[$t->{NEW}{IN_SECTION}]";
210 + }
211 + next if (defined $a->[0] &&
212 + defined $b->[0] &&
213 + $a->[0] eq $b->[0] && !$force);
214 +
215 + if (!exists $where{$in}) {
216 + push @where, $in;
217 + $where{$in} = [];
218 + }
219 + push @{$where{$in}}, [$a, $b];
220 + }
221 +
222 + return if (!@where);
223 + for my $in (@where) {
224 + my @bag = @{$where{$in}};
225 + if (defined $fromto && $fromto ne '') {
226 + print "\n", '-' x 50, "\n$fromto\n";
227 + $fromto = undef;
228 + }
229 + print "\n$in\n" if ($in ne '');
230 + for (@bag) {
231 + my ($a, $b) = @{$_};
232 + print "\n";
233 + compare_topics($a, $b);
234 + }
235 + }
236 +}
237 +
238 +sub compare_cooking {
239 + my ($old, $new) = @_;
240 +
241 + print compare_them([$old->{HEADER}], [$new->{HEADER}]);
242 + print compare_them([$old->{GREETING}], [$new->{GREETING}]);
243 +
244 + my (@sections, %sections, @topics, %topics, @fromto, %fromto);
245 +
246 + for my $section_name (@{$old->{SECTIONS}}, @{$new->{SECTIONS}}) {
247 + next if (exists $sections{$section_name});
248 + $sections{$section_name} = scalar @sections;
249 + push @sections, $section_name;
250 + }
251 +
252 + my $gone_class = "Gone topics";
253 + my $born_class = "Born topics";
254 + my $stay_class = "Other topics";
255 +
256 + push @fromto, $born_class;
257 + for my $topic_name (@{$old->{TOPIC_ORDER}}, @{$new->{TOPIC_ORDER}}) {
258 + next if (exists $topics{$topic_name});
259 + push @topics, $topic_name;
260 +
261 + my $oldtopic = $old->{TOPICS}{$topic_name};
262 + my $newtopic = $new->{TOPICS}{$topic_name};
263 + $topics{$topic_name} = +{
264 + OLD => $oldtopic,
265 + NEW => $newtopic,
266 + };
267 + my $oldsec = $oldtopic->{IN_SECTION};
268 + my $newsec = $newtopic->{IN_SECTION};
269 + if (defined $oldsec && defined $newsec) {
270 + if ($oldsec ne $newsec) {
271 + my $fromto =
272 + "Moved from [$oldsec] to [$newsec]";
273 + if (!exists $fromto{$fromto}) {
274 + $fromto{$fromto} = [];
275 + push @fromto, $fromto;
276 + }
277 + push @{$fromto{$fromto}}, $topic_name;
278 + } else {
279 + push @{$fromto{$stay_class}}, $topic_name;
280 + }
281 + } elsif (defined $oldsec) {
282 + push @{$fromto{$gone_class}}, $topic_name;
283 + } else {
284 + push @{$fromto{$born_class}}, $topic_name;
285 + }
286 + }
287 + push @fromto, $stay_class;
288 + push @fromto, $gone_class;
289 +
290 + for my $fromto (@fromto) {
291 + compare_class($fromto, $fromto{$fromto}, \%topics);
292 + }
293 +}
whats-cooking.txt new
+308
@@ -0,0 +1,308 @@
1 +Subject: What's cooking in git.git (Jun 2008, issue #01; Sat, 21)
2 +
3 +What's cooking in git.git (Jun 2008, issue #01; Sat, 21)
4 +--------------------------------------------------------
5 +
6 +Here are the topics that have been cooking. Commits prefixed
7 +with '-' are only in 'pu' while commits prefixed with '+' are
8 +in 'next'.
9 +
10 +The topics list the commits in reverse chronological order.
11 +
12 +It already is beginning to become clear what 1.6.0 will look like. What's
13 +already in 'next' all are well intentioned (I do not guarantee they are
14 +already bug-free --- that is what cooking them in 'next' is for) and are
15 +good set of feature enhancements. But bigger changes will be:
16 +
17 + * MinGW will be in.
18 +
19 + * /usr/bin/git-cat-file is no more. The bulk of the git commands will
20 + move to /usr/libexec/git-core/ or somesuch.
21 +
22 + * git-merge will be rewritten in C.
23 +
24 +Currently tip of 'pu' is broken and does not pass tests, as j6t/mingw has
25 +interaction with dr/ceiling and jc/merge-theirs has interaction with
26 +mv/merge-in-c.
27 +
28 +----------------------------------------------------------------
29 +[New Topics]
30 +
31 +* jc/merge-theirs (Fri Jun 20 00:17:59 2008 -0700) 2 commits
32 + - git-merge-recursive-{ours,theirs}
33 + - git-merge-file --ours, --theirs
34 +
35 +Punting a merge by discarding your own work in conflicting parts but still
36 +salvaging the parts that are cleanly automerged. It is likely that this
37 +will result in nonsense mishmash, but somehow often people want this, so
38 +here they are. The interface to the backends may need to change, though.
39 +
40 +* lt/racy-empty (Tue Jun 10 10:44:43 2008 -0700) 1 commit
41 + + racy-git: an empty blob has a fixed object name
42 +
43 +* ph/mergetool (Mon Jun 16 17:33:41 2008 -0600) 1 commit
44 + + Remove the use of '--' in merge program invocation
45 +
46 +* j6t/mingw (Sat Nov 17 20:48:14 2007 +0100) 38 commits
47 + - compat/pread.c: Add a forward declaration to fix a warning
48 + - Windows: Fix ntohl() related warnings about printf formatting
49 + - Windows: TMP and TEMP environment variables specify a temporary
50 + directory.
51 + - Windows: Make 'git help -a' work.
52 + - Windows: Work around an oddity when a pipe with no reader is
53 + written to.
54 + - Windows: Make the pager work.
55 + - When installing, be prepared that template_dir may be relative.
56 + - Windows: Use a relative default template_dir and ETC_GITCONFIG
57 + - Windows: Compute the fallback for exec_path from the program
58 + invocation.
59 + - Turn builtin_exec_path into a function.
60 + - Windows: Use a customized struct stat that also has the st_blocks
61 + member.
62 + - Windows: Add a custom implementation for utime().
63 + - Windows: Add a new lstat and fstat implementation based on Win32
64 + API.
65 + - Windows: Implement a custom spawnve().
66 + - Windows: Implement wrappers for gethostbyname(), socket(), and
67 + connect().
68 + - Windows: Work around incompatible sort and find.
69 + - Windows: Implement asynchronous functions as threads.
70 + - Windows: Disambiguate DOS style paths from SSH URLs.
71 + - Windows: A rudimentary poll() emulation.
72 + - Windows: Change the name of hook scripts to make them not
73 + executable.
74 + - Windows: Implement start_command().
75 + - Windows: A pipe() replacement whose ends are not inherited to
76 + children.
77 + - Windows: Wrap execve so that shell scripts can be invoked.
78 + - Windows: Implement setitimer() and sigaction().
79 + - Windows: Fix PRIuMAX definition.
80 + - Windows: Implement gettimeofday().
81 + - Windows: Handle absolute paths in
82 + safe_create_leading_directories().
83 + - Windows: Treat Windows style path names.
84 + - setup.c: Prepare for Windows directory separators.
85 + - Windows: Work around misbehaved rename().
86 + - Windows: always chmod(, 0666) before unlink().
87 + - Windows: A minimal implemention of getpwuid().
88 + - Windows: Implement a wrapper of the open() function.
89 + - Windows: Strip ".exe" from the program name.
90 + - Windows: Use the Windows style PATH separator ';'.
91 + - Add target architecture MinGW.
92 + - Compile some programs only conditionally.
93 + - Add compat/regex.[ch] and compat/fnmatch.[ch].
94 +
95 +No explanation is necessary ;-).
96 +
97 +* sn/static (Thu Jun 19 08:21:11 2008 +0900) 2 commits
98 + + config.c: make git_env_bool() static
99 + + environment.c: remove unused function
100 +
101 +* lt/config-fsync (Wed Jun 18 15:18:44 2008 -0700) 4 commits
102 + + Add config option to enable 'fsync()' of object files
103 + + Split up default "i18n" and "branch" config parsing into helper
104 + routines
105 + + Split up default "user" config parsing into helper routine
106 + + Split up default "core" config parsing into helper routine
107 +
108 +* lw/gitweb (Thu Jun 19 22:03:21 2008 +0200) 1 commit
109 + + gitweb: standarize HTTP status codes
110 +
111 +* mv/merge-in-c (Fri Jun 20 01:22:36 2008 +0200) 11 commits
112 + - Add new test to ensure git-merge handles more than 25 refs.
113 + - Build in merge
114 + - Introduce filter_independent() in commit.c
115 + - Introduce get_octopus_merge_bases() in commit.c
116 + - git-fmt-merge-msg: make it usable from other builtins
117 + - Move read_cache_unmerged() to read-cache.c
118 + - parseopt: add a new PARSE_OPT_ARGV0_IS_AN_OPTION option
119 + - Add new test to ensure git-merge handles pull.twohead and
120 + pull.octopus
121 + - Move parse-options's skip_prefix() to git-compat-util.h
122 + - Move commit_list_count() to commit.c
123 + - Move split_cmdline() to alias.c
124 +
125 +* jc/maint-combine-diff-pre-context (Wed Jun 18 23:59:41 2008 -0700) 1 commit
126 + + diff -c/--cc: do not include uninteresting deletion before leading
127 + context
128 +
129 +* lt/maint-gitdir-relative (Thu Jun 19 12:34:06 2008 -0700) 1 commit
130 + + Make git_dir a path relative to work_tree in setup_work_tree()
131 +
132 +----------------------------------------------------------------
133 +[Actively Cooking]
134 +
135 +* nd/dashless (Wed Nov 28 23:21:57 2007 +0700) 1 commit
136 + + Move all dashed-form commands to libexecdir
137 +
138 +Scheduled for 1.6.0.
139 +
140 +* jc/dashless (Sat Dec 1 22:09:22 2007 -0800) 2 commits
141 + - Prepare execv_git_cmd() for removal of builtins from the
142 + filesystem
143 + - git-shell: accept "git foo" form
144 +
145 +We do not plan to remove git-foo form completely from the filesystem at
146 +this point, but git-shell may need to be updated.
147 +
148 +* sg/merge-options (Sun Apr 6 03:23:47 2008 +0200) 1 commit
149 + + merge: remove deprecated summary and diffstat options and config
150 + variables
151 +
152 +* dr/ceiling (Mon May 19 23:49:34 2008 -0700) 4 commits
153 + + Eliminate an unnecessary chdir("..")
154 + + Add support for GIT_CEILING_DIRECTORIES
155 + + Fold test-absolute-path into test-path-utils
156 + + Implement normalize_absolute_path
157 +
158 +* jn/web (Tue Jun 10 19:21:44 2008 +0200) 2 commits
159 + + gitweb: Separate generating 'sort by' table header
160 + + gitweb: Separate filling list of projects info
161 +
162 +* rs/archive-ignore (Sun Jun 8 18:42:33 2008 +0200) 1 commit
163 + + Teach new attribute 'export-ignore' to git-archive
164 +
165 +* rg/gitweb (Fri Jun 6 09:53:32 2008 +0200) 1 commit
166 + + gitweb: remove git_blame and rename git_blame2 to git_blame
167 +
168 +* kh/update-ref (Tue Jun 3 01:34:53 2008 +0200) 2 commits
169 + + Make old sha1 optional with git update-ref -d
170 + + Clean up builtin-update-ref's option parsing
171 +
172 +* mo/status-untracked (Thu Jun 5 14:47:50 2008 +0200) 3 commits
173 + + Add configuration option for default untracked files mode
174 + + Add argument 'no' commit/status option -u|--untracked-files
175 + + Add an optional <mode> argument to commit/status -u|--untracked-
176 + files option
177 +
178 +* sr/tests (Sun Jun 8 16:04:35 2008 +0200) 3 commits
179 + + Hook up the result aggregation in the test makefile.
180 + + A simple script to parse the results from the testcases
181 + + Modify test-lib.sh to output stats to t/test-results/*
182 +
183 +* jh/clone-packed-refs (Sun Jun 15 16:06:16 2008 +0200) 4 commits
184 + + Teach "git clone" to pack refs
185 + + Prepare testsuite for a "git clone" that packs refs
186 + + Move pack_refs() and friends into libgit
187 + + Incorporate fetched packs in future object traversal
188 +
189 +This is useful when cloning from a repository with insanely large number
190 +of refs.
191 +
192 +* jc/reflog-expire (Sun Jun 15 23:48:46 2008 -0700) 1 commit
193 + - Per-ref reflog expiry configuration
194 +
195 +Perhaps a good foundation for optionally unexpirable stash. As 1.6.0 will
196 +be a good time to make backward incompatible changes, we might make expiry
197 +period of stash 'never' in new repositories. Needs a concensus.
198 +
199 +* lw/perlish (Thu Jun 19 22:32:49 2008 +0200) 2 commits
200 + + Git.pm: add test suite
201 + + t/test-lib.sh: add test_external and test_external_without_stderr
202 +
203 +Beginning of regression tests for Perl part of the system.
204 +
205 +* jk/test (Sat Jun 14 03:28:07 2008 -0400) 5 commits
206 + + enable whitespace checking of test scripts
207 + + avoid trailing whitespace in zero-change diffstat lines
208 + + avoid whitespace on empty line in automatic usage message
209 + + mask necessary whitespace policy violations in test scripts
210 + + fix whitespace violations in test scripts
211 +
212 +Tightens whitespace rules for t/*.sh scripts.
213 +
214 +* pb/fast-export (Wed Jun 11 13:17:04 2008 +0200) 1 commit
215 + + builtin-fast-export: Add importing and exporting of revision marks
216 +
217 +----------------------------------------------------------------
218 +[Graduated to "master"]
219 +
220 +Nothing today but expect many small ones to come out of 'next' this
221 +weekend.
222 +
223 +----------------------------------------------------------------
224 +[On Hold]
225 +
226 +* jc/blame (Wed Jun 4 22:58:40 2008 -0700) 7 commits
227 + - blame: show "previous" information in --porcelain/--incremental
228 + format
229 + - git-blame: refactor code to emit "porcelain format" output
230 + + git-blame --reverse
231 + + builtin-blame.c: allow more than 16 parents
232 + + builtin-blame.c: move prepare_final() into a separate function.
233 + + rev-list --children
234 + + revision traversal: --children option
235 +
236 +The blame that finds where each line in the original lines moved to. This
237 +may help a GSoC project that wants to gather statistical overview of the
238 +history. The final presentation may need tweaking (see the log message of
239 +the commit ""git-blame --reverse" on the series).
240 +
241 +The tip two commits are for peeling to see what's behind the blamed
242 +commit, which we should be able to separate out into an independent topic
243 +from the rest.
244 +
245 +* jc/send-pack-tell-me-more (Thu Mar 20 00:44:11 2008 -0700) 1 commit
246 + - "git push": tellme-more protocol extension
247 +
248 +Kicked back to 'pu' for now.
249 +
250 +* js/rebase-i-sequencer (Sun Apr 27 02:55:50 2008 -0400) 17 commits
251 + - Use perl instead of tac
252 + - Fix t3404 assumption that `wc -l` does not use whitespace.
253 + - rebase -i: Use : in expr command instead of match.
254 + - rebase -i: update the implementation of 'mark' command
255 + - Add option --preserve-tags
256 + - Teach rebase interactive the tag command
257 + - Add option --first-parent
258 + - Do rebase with preserve merges with advanced TODO list
259 + - Select all lines with fake-editor
260 + - Unify the length of $SHORT* and the commits in the TODO list
261 + - Teach rebase interactive the merge command
262 + - Move redo merge code in a function
263 + - Teach rebase interactive the reset command
264 + - Teach rebase interactive the mark command
265 + - Move cleanup code into it's own function
266 + - Don't append default merge message to -m message
267 + - fake-editor: output TODO list if unchanged
268 +
269 +It is very likely that this whole thing will be reverted from 'next' and
270 +be replaced with the new sequenser series during 1.6.0 cycle.
271 +
272 +* sj/merge (Sat May 3 16:55:47 2008 -0700) 6 commits
273 + - Introduce fast forward option only
274 + - Head reduction before selecting merge strategy
275 + - Restructure git-merge.sh
276 + - Introduce -ff=<fast forward option>
277 + - New merge tests
278 + - Documentation for joining more than two histories
279 +
280 +This will interfere with Miklos's rewrite of merge to C.
281 +
282 +* jk/renamelimit (Sat May 3 13:58:42 2008 -0700) 1 commit
283 + - diff: enable "too large a rename" warning when -M/-C is explicitly
284 + asked for
285 +
286 +This would be the right thing to do for command line use, but gitk will be
287 +hit due to tcl/tk's limitation, so I am holding this back for now.
288 +
289 +* jc/cherry-pick (Wed Feb 20 23:17:06 2008 -0800) 3 commits
290 + - WIP: rethink replay merge
291 + - Start using replay-tree merge in cherry-pick
292 + - revert/cherry-pick: start refactoring call to merge_recursive
293 +
294 +This is meant to improve cherry-pick's behaviour when renames are
295 +involved, by not using merge-recursive (whose d/f conflict resolution is
296 +quite broken), but unfortunately has stalled for some time now.
297 +
298 +* jc/stripspace (Sun Mar 9 00:30:35 2008 -0800) 6 commits
299 + - git-am --forge: add Signed-off-by: line for the author
300 + - git-am: clean-up Signed-off-by: lines
301 + - stripspace: add --log-clean option to clean up signed-off-by:
302 + lines
303 + - stripspace: use parse_options()
304 + - Add "git am -s" test
305 + - git-am: refactor code to add signed-off-by line for the committer
306 +
307 +Just my toy at this moment.
308 +