From: "brian m. carlson" <sandals@crustytoothpaste.net>
To: <git@vger.kernel.org>
Cc: Jeff King <peff@peff.net>, Taylor Blau <me@ttaylorr.com>
Subject: [PATCH] rev-list: add option for --pretty without header
Date: Tue, 6 Jul 2021 22:43:21 +0000 [thread overview]
Message-ID: <20210706224321.14371-1-sandals@crustytoothpaste.net> (raw)
In general, we encourage users to use plumbing commands, like git
rev-list, over porcelain commands, like git log, when scripting.
However, git rev-list has one glaring problem that prevents it from
being used in certain cases: when --pretty is used, it always prints out
a line containing "commit" and the object ID. This makes it unsuitable
for many scripting needs, and forces users to use git log instead.
While we can't change this behavior for backwards compatibility, we can
add an option to suppress this behavior, so let's do so, and call it
"--no-commit-header". Additionally, add the corresponding positive
option to switch it back on.
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
---
This has come up a lot on the list and I'm sure most of the regulars
have run into it before. It came up at $DAYJOB and I said I intended to
send a patch, so here it is.
I chose --no-commit-header because --header is already taken. Of
course, suggestions for better names are welcome, since we all know my
naming skills are terrible.
Documentation/rev-list-options.txt | 7 +++++++
builtin/rev-list.c | 17 ++++++++++++++---
revision.h | 3 ++-
t/t6006-rev-list-format.sh | 23 ++++++++++++++++++++++-
4 files changed, 45 insertions(+), 5 deletions(-)
diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt
index 5bf2a85f69..84b03a4cde 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -1064,6 +1064,13 @@ ifdef::git-rev-list[]
--header::
Print the contents of the commit in raw-format; each record is
separated with a NUL character.
+
+--no-commit-header::
+ Suppress the header line containing "commit" and the object ID printed before
+ the specified format.
+
+--commit-header::
+ Overrides a previous `--no-commit-header`.
endif::git-rev-list[]
--parents::
diff --git a/builtin/rev-list.c b/builtin/rev-list.c
index 7677b1af5a..f571cc9598 100644
--- a/builtin/rev-list.c
+++ b/builtin/rev-list.c
@@ -132,7 +132,7 @@ static void show_commit(struct commit *commit, void *data)
if (revs->abbrev_commit && revs->abbrev)
fputs(find_unique_abbrev(&commit->object.oid, revs->abbrev),
stdout);
- else
+ else if (revs->include_header)
fputs(oid_to_hex(&commit->object.oid), stdout);
if (revs->print_parents) {
struct commit_list *parents = commit->parents;
@@ -153,7 +153,7 @@ static void show_commit(struct commit *commit, void *data)
show_decorations(revs, commit);
if (revs->commit_format == CMIT_FMT_ONELINE)
putchar(' ');
- else
+ else if (revs->include_header)
putchar('\n');
if (revs->verbose_header) {
@@ -512,6 +512,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
repo_init_revisions(the_repository, &revs, prefix);
revs.abbrev = DEFAULT_ABBREV;
revs.commit_format = CMIT_FMT_UNSPECIFIED;
+ revs.include_header = 1;
/*
* Scan the argument list before invoking setup_revisions(), so that we
@@ -627,6 +628,16 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
continue;
}
+ if (!strcmp(arg, ("--commit-header"))) {
+ revs.include_header = 1;
+ continue;
+ }
+
+ if (!strcmp(arg, ("--no-commit-header"))) {
+ revs.include_header = 0;
+ continue;
+ }
+
if (!strcmp(arg, "--disk-usage")) {
show_disk_usage = 1;
info.flags |= REV_LIST_QUIET;
@@ -639,7 +650,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
if (revs.commit_format != CMIT_FMT_UNSPECIFIED) {
/* The command line has a --pretty */
info.hdr_termination = '\n';
- if (revs.commit_format == CMIT_FMT_ONELINE)
+ if (revs.commit_format == CMIT_FMT_ONELINE || !revs.include_header)
info.header_prefix = "";
else
info.header_prefix = "commit ";
diff --git a/revision.h b/revision.h
index 17698cb51a..7464434f60 100644
--- a/revision.h
+++ b/revision.h
@@ -215,7 +215,8 @@ struct rev_info {
missing_newline:1,
date_mode_explicit:1,
preserve_subject:1,
- encode_email_headers:1;
+ encode_email_headers:1,
+ include_header:1;
unsigned int disable_stdin:1;
/* --show-linear-break */
unsigned int track_linear:1,
diff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh
index 35a2f62392..e68bf9f21c 100755
--- a/t/t6006-rev-list-format.sh
+++ b/t/t6006-rev-list-format.sh
@@ -54,9 +54,15 @@ test_expect_success 'setup' '
# usage: test_format name format_string [failure] <expected_output
test_format () {
+ local header_arg=
+ if test "$1" = "--no-commit-header"
+ then
+ header_arg="--no-commit-header"
+ shift
+ fi
cat >expect.$1
test_expect_${3:-success} "format $1" "
- git rev-list --pretty=format:'$2' main >output.$1 &&
+ git rev-list $header_arg --pretty=format:'$2' main >output.$1 &&
test_cmp expect.$1 output.$1
"
}
@@ -93,6 +99,14 @@ $head1
$head1_short
EOF
+test_format --no-commit-header hash-no-header %H%n%h <<EOF
+$head2
+$head2_short
+$head1
+$head1_short
+EOF
+
+
test_format tree %T%n%t <<EOF
commit $head2
$tree2
@@ -181,6 +195,13 @@ $added
EOF
+test_format --no-commit-header raw-body-no-header %B <<EOF
+$changed
+
+$added
+
+EOF
+
test_expect_success 'basic colors' '
cat >expect <<-EOF &&
commit $head2
next reply other threads:[~2021-07-06 22:45 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-06 22:43 brian m. carlson [this message]
2021-07-09 8:01 ` [PATCH] rev-list: add option for --pretty without header Christian Couder
2021-07-09 15:44 ` Junio C Hamano
2021-07-11 17:02 ` brian m. carlson
2021-07-11 21:55 ` [PATCH v2] rev-list: add option for --pretty=format " brian m. carlson
2021-07-12 7:30 ` Christian Couder
2021-07-13 0:10 ` brian m. carlson
2021-07-12 18:13 ` Jeff King
2021-07-13 0:15 ` brian m. carlson
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
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210706224321.14371-1-sandals@crustytoothpaste.net \
--to=sandals@crustytoothpaste.net \
--cc=git@vger.kernel.org \
--cc=me@ttaylorr.com \
--cc=peff@peff.net \
/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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).