On Fri, Aug 30, 2013 at 2:56 AM, Johannes Sixt <j.sixt@xxxxxxxxxxxxx> wrote: > Am 8/30/2013 8:32, schrieb Junio C Hamano: >> If you have a history where >> >> - branches "master" and "maint" point at commit A; >> - branch "next" points at commit B that is a descendant of A; and >> - there are tags X and Y pointing at commits that are ahead of B >> or behind A >> >> i.e. >> >> ----X----A----B----Y >> >> what are the desired semantics for these? > > I think the simplest were that --except trumps everything and means > "whatever else I say, do as if I did not mention the following". Actually, my patch is almost there, I attach the necessary changed below to make everything work. I've added debug prints to show what it's actually doing: >> (1) --branches --except maint > > => master next => master next >> (2) --all --not --branches --except maint > > => X Y --not master next => ^master ^next X Y HEAD >> (3) ^master next --except maint > > => ^master next => ^master next > (4) Y next --except master next --not --branches > > this => Y --not maint > or this => Y --not maint master next => Y Remember that maint (or rather ^maint) is after --except. > (5) --branches --except ^master > > this => maint next > or this => maint master next ^master > or error("--except does not allow negated revisions") => maint next Here's the diff: --- a/revision.c +++ b/revision.c @@ -2578,7 +2578,11 @@ void reset_revision_walk(void) static int refcmp(const char *a, const char *b) { a = prettify_refname(a); + if (*a == '^') + a++; b = prettify_refname(b); + if (*b == '^') + b++; return strcmp(a, b); } @@ -2594,13 +2598,14 @@ int prepare_revision_walk(struct rev_info *revs) revs->pending.alloc = 0; revs->pending.objects = NULL; while (--nr >= 0) { - struct commit *commit = handle_commit(revs, e->item, e->name); + struct commit *commit; for (i = 0; i < revs->cmdline.nr; i++) { struct rev_cmdline_entry *ce; ce = &revs->cmdline.rev[i]; if ((ce->flags & SKIP) && !refcmp(ce->name, e->name)) goto next; } + commit = handle_commit(revs, e->item, e->name); if (commit) { if (!(commit->object.flags & SEEN)) { commit->object.flags |= SEEN; -- Felipe Contreras -- To unsubscribe from this list: 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