Re: [PATCH] fmt-merge-msg: avoid open "-|" list form for Perl 5.6
- From
Linus Torvalds <torvalds@osdl.org>
- Date
- Mar 2, 2006, 23:27 UTC
- Message-ID
- <Pine.LNX.4.64.0603021521250.22647@g5.osdl.org>
- In-Reply-To
- <20060302220930.GE6183@steel.home>
On Thu, 2 Mar 2006, Alex Riesen wrote:
Show 7 quoted lines
> Shawn Pearce, Thu, Mar 02, 2006 17:55:10 +0100: > > > I've been using the Cygwin Perl with GIT without any problems > > whatsoever. Including the open(I, "-|")... exec(@argv) code that > > doesn't work correctly in ActiveState and started this whole thread. > > Unfortunately...
Here's a stupid first cut at git-fmt-merge-msg in C using the new revlist library interface.
It's not actually doing exactly the same thing, because I'm a lazy bastard, but some things it does better.
For example, afaik, when merging multiple branches that had partially been merged already (ie they had overlapping new stuff), if I read the old perl code correctly, it would talk about the new stuff multiple times. This one doesn't.
The things it doesn't do: - the old one had a limit of 20, the new one has a limit of 10 commits reported - the old one was tested, the new one is written by me. - the old one honored the "merge.summary" git config option. The new one doesn't. - the old one did some formatting of the branch message that I don't follow because I'm not a perl user. The new one just takes the explanatory message for the branch merging as-is.
But hey, this is all part of my cunning plan to make people get involved with the new rev-list libification, by giving them things that _almost_ work, but might need some tweaking.
Linus
--- snip snip for "fmt-merge-msg.c" snip snip--- /* * fmt-merge-msg.c * * Magic auto-generation of merge messages. * * Copyright (C) 2006 Linus Torvalds and his army of programming ferrets */ #include "cache.h" #include "commit.h" #include "revision.h"
static void show_commit(struct commit *commit)
{
char buffer[256]; pretty_print_commit(CMIT_FMT_ONELINE, commit, ~0, buffer, sizeof(buffer), 0);
printf(" * %s\n", buffer);
}int main(int argc, char **argv)
{
struct rev_info revs;
struct commit *commit;
unsigned char sha1[20];
char buffer[256]; setup_revisions(0, NULL, &revs, NULL);
if (get_sha1("HEAD", sha1) < 0)
die("no HEAD revision");
commit = lookup_commit_reference(sha1);
if (!commit)
die("no HEAD revision");commit->object.flags |= UNINTERESTING; insert_by_date(commit, &revs.commits); revs.topo_order = 1; revs.limited = 1;
while (fgets(buffer, sizeof(buffer), stdin)) {
int max;
char *marker;if (get_sha1_hex(buffer, sha1) < 0) continue; commit = lookup_commit_reference(sha1); if (!commit) continue;
/*
* Format after the SHA1:
* <tab>marker<tab><type>'<name>' of <src>'
*
* where string is "not-for-merge" if
* we're not interested in this one,
* and empty otherwise.
*/
marker = buffer + 40;
if (*marker++ != '\t')
continue;
if (*marker++ != '\t')
continue;
printf("Merge %s", marker);insert_by_date(commit, &revs.commits); prepare_revision_walk(&revs);
max = 10;
while ((commit = get_revision(&revs)) != NULL) {
int n = --max;
if (n > 0)
show_commit(commit);
else if (!n)
printf(" ...");
}
}
}