From: Mirko Faina <mroik@delayed.space>
To: Johannes Sixt <j6t@kdbg.org>
Cc: "Junio C Hamano" <gitster@pobox.com>, "Jeff King" <peff@peff.net>,
"Jean-Noël Avila" <jn.avila@free.fr>,
"Patrick Steinhardt" <ps@pks.im>, "Tian Yuchen" <cat@malon.dev>,
"Ben Knoble" <ben.knoble@gmail.com>,
"Chris Torek" <chris.torek@gmail.com>,
git@vger.kernel.org, "Mirko Faina" <mroik@delayed.space>
Subject: Re: [PATCH v6] revision.c: implement --max-count-oldest
Date: Wed, 6 May 2026 14:54:19 +0200 [thread overview]
Message-ID: <afs2QVHerGLALFcl@exploit> (raw)
In-Reply-To: <7250e6c1-633e-417b-aacb-94e35d240d3f@kdbg.org>
On Wed, May 06, 2026 at 08:45:36AM +0200, Johannes Sixt wrote:
> > +`--max-count-oldest=<number>`::
> > + Just like `--max-count=<number>`, it limits the output to _<number>_
> > + commits. But instead of limiting to the first _<number>_ commits it
> > + limits to the last _<number>_ commits.
> > +
>
> "Just like --max-count" is a surprising addendum in this sentence,
> because the only thing they have in common is the limiting of commits,
> which it repeats anyway. It's more like "Unlike --max-count, limits the
> output to _<number>_ last commits."
Will fix in v7.
> BTW, this makes me think whether this kind of limiting could be
> triggered by a negative argument to --max-count.
Would be a good idea if it weren't for the fact that --max-count < 0 has
for a long time acted like no max count. I'd imagine many could be
asssuming this behaviour in their scripts.
> > `--skip=<number>`::
> > Skip _<number>_ commits before starting to show the commit output.
> >
> > diff --git a/revision.c b/revision.c
> > index 599b3a66c3..3aaa77ced5 100644
> > --- a/revision.c
> > +++ b/revision.c
> > @@ -2339,10 +2339,24 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
> > }
> >
> > if ((argcount = parse_long_opt("max-count", argv, &optarg))) {
> > + if (revs->max_count_type == 1)
> > + die(_("can't use --max-count with --max-count-oldest"));
>
> To help translators, the usual pattern is to say (here and later)
>
> die(_("options '%s' and '%s' cannot be used together"),
> "--max-count", "--max-count-oldest");
Will do.
> > @@ -4521,15 +4535,68 @@ static struct commit *get_revision_internal(struct rev_info *revs)
> > return c;
> > }
> >
> > +static void retrieve_oldest_commits(struct rev_info *revs,
> > + struct commit_list **queue)
> > +{
> > + struct commit *c;
> > + int max_count = revs->max_count;
> > + int queuei_count = 0;
> > + int queueo_count = 0;
> > + struct commit_list *queueo = NULL;
> > + struct commit_list *queuei = NULL;
> > + struct commit_list *reversed_queue = NULL;
> > +
> > + revs->max_count = -1;
> > + while ((c = get_revision_internal(revs))) {
> > + c->object.flags &= ~SHOWN;
> > + commit_list_insert(c, &queuei);
> > + queuei_count++;
> > + while (queuei_count + queueo_count > max_count) {
> > + if (!queueo_count) {
> > + while (queuei_count > 0) {
> > + c = pop_commit(&queuei);
> > + queuei_count--;
> > + commit_list_insert(c, &queueo);
> > + queueo_count++;
> > + }
> > + }
> > + pop_commit(&queueo);
> > + queueo_count--;
> > + }
> > + }
> > +
> > + while ((c = pop_commit(&queueo)))
> > + commit_list_insert(c, &reversed_queue);
> > + while ((c = pop_commit(&queuei)))
> > + commit_list_insert(c, &queueo);
> > + while ((c = pop_commit(&queueo)))
> > + commit_list_insert(c, &reversed_queue);
> > +
> > + while ((c = pop_commit(&reversed_queue)))
> > + commit_list_insert(c, queue);
> > +}
> > +
> > struct commit *get_revision(struct rev_info *revs)
> > {
> > struct commit *c;
> > struct commit_list *reversed;
> > + struct commit_list *queue = NULL;
> > +
> > + if (revs->max_count_type == 1 && !revs->max_count_stage) {
> > + retrieve_oldest_commits(revs, &queue);
> > + commit_list_free(revs->commits);
> > + revs->commits = queue;
> > + revs->max_count_stage = 1;
> > + }
> >
> > if (revs->reverse) {
> > reversed = NULL;
> > - while ((c = get_revision_internal(revs)))
> > - commit_list_insert(c, &reversed);
> > + if (revs->max_count_type == 1)
> > + while ((c = pop_commit(&revs->commits)))
> > + commit_list_insert(c, &reversed);
> > + else
> > + while ((c = get_revision_internal(revs)))
> > + commit_list_insert(c, &reversed);
> > commit_list_free(revs->commits);
> > revs->commits = reversed;
> > revs->reverse = 0;
>
> I would have expected that this kind of commit counting is handled at
> the same spot where --max-count is handled, i.e., in
> get_revision_internal(). It could make a difference in combination with
> sorting options, --boundary, and --graph. The goal is that --max-count
> and --max-count-oldest behave the same in this regard. (But I am in no
> way an expert of the revision walker.)
It doesn't affect sorting options and the graph output by itself is
handled by setting the commits as not shown when we store them, but the
boundary option does break.
Will fix in v7.
Thank you
next prev parent reply other threads:[~2026-05-06 12:54 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-18 16:47 [PATCH] revision.c: implement --reverse=before for walks Mirko Faina
2026-04-18 18:20 ` Tian Yuchen
2026-04-18 18:42 ` Mirko Faina
2026-04-18 18:51 ` Mirko Faina
2026-04-20 16:06 ` Junio C Hamano
2026-04-20 17:08 ` Tian Yuchen
2026-04-20 23:50 ` Mirko Faina
2026-04-19 12:06 ` Ben Knoble
2026-04-19 18:11 ` Mirko Faina
2026-04-19 19:12 ` D. Ben Knoble
2026-04-19 20:31 ` Mirko Faina
2026-04-20 0:21 ` Jeff King
2026-04-20 9:33 ` Mirko Faina
2026-04-20 10:30 ` Mirko Faina
2026-04-21 3:48 ` Jeff King
2026-04-22 18:24 ` D. Ben Knoble
2026-04-22 19:42 ` Mirko Faina
2026-04-20 0:04 ` Jeff King
2026-04-20 9:22 ` Mirko Faina
2026-04-22 0:28 ` [PATCH v2 0/2] " Mirko Faina
2026-04-22 0:30 ` Mirko Faina
2026-04-23 22:51 ` [PATCH v3 " Mirko Faina
2026-04-23 22:51 ` [PATCH v3 1/2] " Mirko Faina
2026-04-28 1:45 ` Junio C Hamano
2026-04-23 22:52 ` [PATCH v3 2/2] revision.c: reduce memory usage on reverse before Mirko Faina
2026-04-27 0:24 ` [PATCH v4 0/2] revision.c: implement --reverse=before for walks Mirko Faina
2026-04-27 0:24 ` [PATCH v4 1/2] " Mirko Faina
2026-04-27 6:45 ` Junio C Hamano
2026-04-27 7:33 ` Johannes Sixt
2026-04-27 12:30 ` Junio C Hamano
2026-04-27 13:58 ` Chris Torek
2026-04-27 16:48 ` [PATCH v4 1/2] revision.c: implement -b-reverse=before " Mirko Faina
2026-04-28 1:46 ` Junio C Hamano
2026-04-28 1:45 ` [PATCH v4 1/2] revision.c: implement --reverse=before " Junio C Hamano
2026-04-27 0:24 ` [PATCH v4 2/2] revision.c: reduce memory usage on reverse before Mirko Faina
2026-04-28 1:46 ` Junio C Hamano
2026-04-30 19:52 ` [PATCH v5] revision.c: implement --max-count-oldest Mirko Faina
2026-05-04 5:19 ` Junio C Hamano
2026-05-04 13:08 ` Mirko Faina
2026-05-05 21:54 ` [PATCH v6] " Mirko Faina
2026-05-06 6:45 ` Johannes Sixt
2026-05-06 12:54 ` Mirko Faina [this message]
2026-05-07 9:20 ` Junio C Hamano
2026-05-08 0:09 ` Mirko Faina
2026-05-09 12:46 ` Jean-Noël AVILA
2026-05-10 0:41 ` Mirko Faina
2026-05-09 21:01 ` Junio C Hamano
2026-05-10 0:48 ` Mirko Faina
2026-05-09 11:01 ` [PATCH v5] " Junio C Hamano
2026-05-10 0:36 ` Mirko Faina
2026-04-22 0:28 ` [PATCH v2 1/2] revision.c: implement --reverse=before for walks Mirko Faina
2026-04-22 22:44 ` Jeff King
2026-04-22 22:53 ` Mirko Faina
2026-04-22 0:28 ` [PATCH v2 2/2] revision.c: reduce memory usage on reverse before Mirko Faina
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=afs2QVHerGLALFcl@exploit \
--to=mroik@delayed.space \
--cc=ben.knoble@gmail.com \
--cc=cat@malon.dev \
--cc=chris.torek@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=j6t@kdbg.org \
--cc=jn.avila@free.fr \
--cc=peff@peff.net \
--cc=ps@pks.im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.