git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [RFC PATCH] rev-list: clarify --abbrev and --abbrev-commit usage

From
Jeff King <peff@peff.net>
Date
Jun 14, 2019, 16:18 UTC
Message-ID
<20190614161841.GB30083@sigill.intra.peff.net>
In-Reply-To
<20190613221541.10007-1-emilyshaffer@google.com>
On Thu, Jun 13, 2019 at 03:15:41PM -0700, Emily Shaffer wrote:
Show 15 quoted lines
> I thought this was odd when I was working on the other rev-list changes
> - --abbrev doesn't do anything on its own. It looks like it does work by
> itself in other commands, but apparently not in rev-list.
> 
> Listed this patch as RFC because maybe instead it's better to fix
> something so --abbrev can be used alone, or teach --abbrev-commit=<n>.
> It looks like `git log --abbrev=5` also doesn't work the way one might
> expect, which makes sense to me, as they use the same internals for
> option parsing (parse_revisions()).
> 
> The manpages for log and rev-list both correctly indicate that
> --abbrev=<n> is an optional addition to --abbrev-commit. `git log -h` is
> generated by parse-options tooling and doesn't cover --abbrev-commit at
> all, but `git rev-list` doesn't use an option parser on its own and the
> usage is hardcoded.

Yeah, "--abbrev" is a bit tricky here. It is really "when you abbrev, do it to this level". In "log", that means that "git log --abbrev=5 --raw" _does_ do something useful (it abbreviates the blob hashes). And then you may add "--abbrev-commit" on top to ask to abbreviate the commit ids.

And rev-list follows that same pattern, except that rev-list _never_ shows diff output. You'd traditionally do (and this is how log was implemented once upon a time):

  git rev-list HEAD | git diff-tree --stdin --abbrev=5 --raw

But even there, we are not seeing the commit id output by rev-list. It goes to diff-tree, which then formats it separately. So if you wanted abbreviated commits there, you'd add "--abbrev-commit" to the diff-tree invocation, not rev-list!

So no, I cannot see a way in which "rev-list --abbrev" is useful without "--abbrev-commit". Which means that perhaps the former should imply the latter.

And as you noticed in your other patch, there is no way to abbreviate "--objects" output at all. I am not sure I have ever seen a good use for that. Though to be honest, I am not sure that "--abbrev" is really all that useful in the first place. Machine-readable output should never abbreviate, and human-readable ones generally already do.

But at any rate, before making any behavior changes it may make sense to think about how they'd interact with "rev-list --objects" abbreviation, if it were to be added.

As for the patch itself:
Show 12 quoted lines
> diff --git a/builtin/rev-list.c b/builtin/rev-list.c
> index 9f31837d30..6ae0087b01 100644
> --- a/builtin/rev-list.c
> +++ b/builtin/rev-list.c
> @@ -49,8 +49,8 @@ static const char rev_list_usage[] =
>  "    --objects | --objects-edge\n"
>  "    --unpacked\n"
>  "    --header | --pretty\n"
> -"    --abbrev=<n> | --no-abbrev\n"
> -"    --abbrev-commit\n"
> +"    --abbrev-commit [--abbrev=<n>]\n"
> +"    --no-abbrev\n"

So --no-abbrev clears both --abbrev and --abbrev-commit. That sort of makes sense, though I did not expect it. But it also means that:

  --abbrev-commit [--abbrev=<n> | --no-abbrev]
is not right. Possibly:
  --abbrev-commit [--abbrev=<n>] | --no-abbrev

would show the interaction more clearly, but I don't have a strong opinion.

-Peff
Previous: Junio C HamanoNext: Emily Shaffer
Message 3 of 8 in “rev-list: clarify --abbrev and --abbrev-commit usage”
  1. rev-list: clarify --abbrev and --abbrev-commit usageEmily Shaffer, Jun 13, 2019
  2. Junio C HamanoJun 14, 2019
  3. Jeff KingJun 14, 2019
  4. Emily ShafferJun 14, 2019
  5. Jeff KingJun 14, 2019
  6. Emily ShafferJun 14, 2019
  7. Jeff KingJun 19, 2019
  8. Emily ShafferJun 19, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.