On Thu, 2 Mar 2006, Alex Riesen wrote: > 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(" ..."); } } } - : send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html