]> Kevux Git Server - rit/commit
format-rev: introduce builtin for on-demand pretty formatting
authorKristoffer Haugsbakk <code@khaugsbakk.name>
Mon, 11 May 2026 15:45:49 +0000 (17:45 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 12 May 2026 00:09:51 +0000 (09:09 +0900)
commit19e3106c4510bb50c370241c06e93f050f223d5c
tree024d6775f14d0dd0363bc800c9062672c58bfc1e
parentae34adcf035b0b9bed705727e8884082ff4ae7aa
format-rev: introduce builtin for on-demand pretty formatting

Introduce a new builtin for pretty formatting one revision expression
per line or commit object names found in running text.

Sometimes you want to format commits. Most of the time you’re
walking the graph, e.g. getting a range of commits like
`master..topic`. That’s a job for git-log(1).

But there are times when you want to format commits that you encounter
on demand:

• Full hashes in running text that you might want to pretty-print
• git-last-modified(1) outputs full hashes that you can do the same
  with
• git-cherry(1) has `-v` for commit subject, but maybe you want
  something else?

But now you can’t use git-log(1), git-show(1), or git-rev-list(1):

• You can’t feed commits piecemeal to these commands, one input
  for one output; they block until standard in is closed
• You can’t feed a list of possibly duplicate commits, like the output
  of git-last-modified(1); they effectively deduplicate the output

Beyond these two points there’s also the input massage problem: you
cannot feed mixed input (revisions mixed with arbitrary text).

One might hope that git-cat-file(1) can save us. But it doesn’t
support pretty formats.

But there is one command that already both handles revisions as
arguments, revisions on standard input, and even revisions mixed in
with arbitrary text. Namely git-name-rev(1): the command for outputting
symbolic names for commits.

We made some room in `builtin/name-rev.c` two commits ago. Let’s
now add this new git-format-rev(1) command. Taking inspiration from
git-name-rev(1), there are two modes:

• revs: like git-name-rev(1) in argv mode, but one revision per line
  on standard in
• text: like git-name-rev(1) with `--annotate-stdin`

***

We need to add this command to the exception list in
`t/t1517-outside-repo.sh` because it uses “EXPERIMENTAL!”
in the usage line.

Helped-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Helped-by: Ramsay Jones <ramsay@ramsayjones.plus.com>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
.gitignore
Documentation/git-format-rev.adoc [new file with mode: 0644]
Documentation/meson.build
Makefile
builtin.h
builtin/name-rev.c
command-list.txt
git.c
t/t1517-outside-repo.sh
t/t6120-describe.sh