[PATCH] Add log.abbrev-commit config option

Subsystems: documentation, the rest

DORMANTno replies

10 messages, 2 authors, 2016-06-15 · open the first message on its own page

[PATCH] Add log.abbrev-commit config option

From: Jay Soffian <hidden>
Date: 2016-06-15 22:51:14

Add log.abbrev-commit (and log.abbrevCommit synonym) config option as
a convenience for users who often use --abbrev-commit with git log and
git show (but not git whatchanged, as its output is more likely to be
parsed even though it is not technically plumbing).

Allow the option to be overridden via --no-abbrev-commit.

(Also, a drive-by spelling correction in git log's short help.)

Signed-off-by: Jay Soffian <redacted>
---
 Documentation/config.txt  |    6 ++++++
 Documentation/git-log.txt |    3 +++
 builtin/log.c             |   17 +++++++++++++++--
 t/t4202-log.sh            |    8 ++++++++
 4 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 285c7f73ca..85f00f6bb1 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -1314,6 +1314,12 @@ interactive.singlekey::
 	linkgit:git-checkout[1]. Note that this setting is silently
 	ignored if portable keystroke input is not available.
 
+log.abbrev-commit::
+log.abbrevCommit::
+	If true, act as if --abbrev-commit were specified on the command
+	line. May be overridden with --no-abbrev-commit. Note that this setting
+	is ignored by rev-list.
+
 log.date::
 	Set the default date-time mode for the 'log' command.
 	Setting a value for log.date is similar to using 'git log''s
diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt
index de5c0d37a5..3061eec9b7 100644
--- a/Documentation/git-log.txt
+++ b/Documentation/git-log.txt
@@ -38,6 +38,9 @@ OPTIONS
 	Continue listing the history of a file beyond renames
 	(works only for a single file).
 
+--no-abbrev-commit::
+	Don't abbreviate commit name. Useful for overridding log.abbrevCommit.
+
 --no-decorate::
 --decorate[=short|full|no]::
 	Print out the ref names of any commits that are shown. If 'short' is
diff --git a/builtin/log.c b/builtin/log.c
index f6219909a7..cfac510b24 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -23,6 +23,7 @@
 /* Set a default date-time format for git log ("log.date" config variable) */
 static const char *default_date_mode = NULL;
 
+static int default_abbrev_commit = 0;
 static int default_show_root = 1;
 static int decoration_style;
 static int decoration_given;
@@ -77,6 +78,7 @@ static void cmd_log_init_defaults(struct rev_info *rev)
 		get_commit_format(fmt_pretty, rev);
 	rev->verbose_header = 1;
 	DIFF_OPT_SET(&rev->diffopt, RECURSIVE);
+	rev->abbrev_commit = default_abbrev_commit;
 	rev->show_root_diff = default_show_root;
 	rev->subject_prefix = fmt_patch_subject_prefix;
 	DIFF_OPT_SET(&rev->diffopt, ALLOW_TEXTCONV);
@@ -89,11 +91,13 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
 			 struct rev_info *rev, struct setup_revision_opt *opt)
 {
 	struct userformat_want w;
-	int quiet = 0, source = 0;
+	int quiet = 0, source = 0, no_abbrev_commit = 0;
 
 	const struct option builtin_log_options[] = {
-		OPT_BOOLEAN(0, "quiet", &quiet, "supress diff output"),
+		OPT_BOOLEAN(0, "quiet", &quiet, "suppress diff output"),
 		OPT_BOOLEAN(0, "source", &source, "show source"),
+		OPT_BOOLEAN(0, "no-abbrev-commit", &no_abbrev_commit,
+			    "don't abbreviate commit name"),
 		{ OPTION_CALLBACK, 0, "decorate", NULL, NULL, "decorate options",
 		  PARSE_OPT_OPTARG, decorate_callback},
 		OPT_END()
@@ -129,6 +133,9 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
 	if (source)
 		rev->show_source = 1;
 
+	if (no_abbrev_commit)
+		rev->abbrev_commit = 0;
+
 	/*
 	 * defeat log.decorate configuration interacting with --pretty=raw
 	 * from the command line.
@@ -323,6 +330,11 @@ static int git_log_config(const char *var, const char *value, void *cb)
 		return git_config_string(&fmt_pretty, var, value);
 	if (!strcmp(var, "format.subjectprefix"))
 		return git_config_string(&fmt_patch_subject_prefix, var, value);
+	if (!strcasecmp(var, "log.abbrevcommit") ||
+	    !strcasecmp(var, "log.abbrev-commit")) {
+		default_abbrev_commit = git_config_bool(var, value);
+		return 0;
+	}
 	if (!strcmp(var, "log.date"))
 		return git_config_string(&default_date_mode, var, value);
 	if (!strcmp(var, "log.decorate")) {
@@ -347,6 +359,7 @@ int cmd_whatchanged(int argc, const char **argv, const char *prefix)
 	struct setup_revision_opt opt;
 
 	git_config(git_log_config, NULL);
+	default_abbrev_commit = 0;
 
 	if (diff_use_color_default == -1)
 		diff_use_color_default = git_use_color_default;
diff --git a/t/t4202-log.sh b/t/t4202-log.sh
index 2fcc31a6f3..83c6576feb 100755
--- a/t/t4202-log.sh
+++ b/t/t4202-log.sh
@@ -450,6 +450,14 @@ test_expect_success 'log.decorate configuration' '
 
 '
 
+test_expect_success 'log.abbrev-commit configuration' '
+	test_might_fail git config --remove-section log &&
+	git log --abbrev-commit >expect &&
+	git config log.abbrev-commit true &&
+	git log >actual &&
+	test_cmp expect actual
+'
+
 test_expect_success 'show added path under "--follow -M"' '
 	# This tests for a regression introduced in v1.7.2-rc0~103^2~2
 	test_create_repo regression &&
-- 
1.7.5

Re: [PATCH] Add log.abbrev-commit config option

From: Jay Soffian <hidden>
Date: 2016-06-15 22:51:14

On Sat, May 14, 2011 at 1:22 PM, Jay Soffian [off-list ref] wrote:
+log.abbrev-commit::
+log.abbrevCommit::
+       If true, act as if --abbrev-commit were specified on the command
+       line. May be overridden with --no-abbrev-commit. Note that this setting
+       is ignored by rev-list.
+
The last sentence should probably read:

   Honored by the 'log' and 'show' commands.

j.

Re: [PATCH] Add log.abbrev-commit config option

From: Jonathan Nieder <hidden>
Date: 2016-06-15 22:51:14

Hi,

I like the idea.

Jay Soffian wrote:
Add log.abbrev-commit (and log.abbrevCommit synonym)
Why two options?  It would be more conventional to provide just
log.abbrevCommit.  The existing "[add] ignore-errors" is explained in
the manual to be a mistake and "[add] ignoreerrors" is the fixed
version; adding more configuration variables with dashes in the name
would seem to make guessing variable names even more hit-or-miss.
config option as
a convenience for users who often use --abbrev-commit with git log and
git show (but not git whatchanged, as its output is more likely to be
parsed even though it is not technically plumbing).
Hm, that wouldn't have been my hunch.  Are you aware of any scripts
that parse "git whatchanged" output?

More worrying is "git log --format=raw".  I think as long as we're
cautious about rolling this out slowly and noticing breakage early it
should be okay.  It might even be nice to find out if there are
scripts or tests that care deeply about "git log"'s output format
(which would be more reliable if they had been written to use
"git rev-list | git diff-tree -s --stdin").
Allow the option to be overridden via --no-abbrev-commit.
Good idea anyway.  Once parse_revision_opt learns to use parse_options
these negated options would be automatic (though that's a long way
away).

Unfortunately this wouldn't help scripts much until the option has
been around for a while.  Maybe it would be safer to have two patches
--- one to add --no-abbrev-commit which could be included in "maint"
and widely deployed, and one to add the new configuration only after
--no-abbrev-commit can be relied on?  But on the other hand, scripts
can be updated today to use rev-list | diff-tree, so maybe that's not
worth the trouble.

People using git by hand would certainly appreciate
--no-abbrev-commit, I suspect.  Thanks for thinking about these
things.
quoted hunk
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -1314,6 +1314,12 @@ interactive.singlekey::
 	linkgit:git-checkout[1]. Note that this setting is silently
 	ignored if portable keystroke input is not available.
 
+log.abbrev-commit::
+log.abbrevCommit::
+	If true, act as if --abbrev-commit were specified on the command
+	line. May be overridden with --no-abbrev-commit. Note that this setting
+	is ignored by rev-list.
Style: most of that page is written from the point of view of the
user, like:

	Tells 'git apply' how to handle whitespace.  Set this to
	"ignore" if you don't want to be bothered.  See
	linkgit:git-apply[1] for details.

So maybe something like:

	Whether to abbreviate hexadecimal commit object names in
	output from the 'log' family of commands.  The number of
	digits shown is determined by the `--abbrev` command-line
	option and `core.abbrev` configuration variable.  Can be
	overridden on the command line by --abbrev-commit /
	--no-abbrev-commit.  The default is false.
 +
 This does not affect the 'git diff-tree' and 'git rev-list'
 commands.
quoted hunk
--- a/Documentation/git-log.txt
+++ b/Documentation/git-log.txt
@@ -38,6 +38,9 @@ OPTIONS
 	Continue listing the history of a file beyond renames
 	(works only for a single file).
 
+--no-abbrev-commit::
+	Don't abbreviate commit name. Useful for overridding log.abbrevCommit.
Also useful for overriding --abbrev-commit from aliases. :)

Shouldn't it be documented next to --abbrev-commit?
quoted hunk
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -23,6 +23,7 @@
 /* Set a default date-time format for git log ("log.date" config variable) */
 static const char *default_date_mode = NULL;
 
+static int default_abbrev_commit = 0;
 static int default_show_root = 1;
 static int decoration_style;
Style: we try to avoid unnecessary zero initializers for variables in
the BSS section.

[...]
quoted hunk
@@ -89,11 +91,13 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
 			 struct rev_info *rev, struct setup_revision_opt *opt)
 {
 	struct userformat_want w;
-	int quiet = 0, source = 0;
+	int quiet = 0, source = 0, no_abbrev_commit = 0;
 
 	const struct option builtin_log_options[] = {
-		OPT_BOOLEAN(0, "quiet", &quiet, "supress diff output"),
+		OPT_BOOLEAN(0, "quiet", &quiet, "suppress diff output"),
 		OPT_BOOLEAN(0, "source", &source, "show source"),
+		OPT_BOOLEAN(0, "no-abbrev-commit", &no_abbrev_commit,
+			    "don't abbreviate commit name"),
What happens if I do

	git log --no-abbrev-commit --abbrev-commit

?  How about

	git log --no-abbrev-commit --no-no-abbrev-commit --abbrev-commit

? :)  The behavior should be nicer if this is implemented in revision.c.

[...]
quoted hunk
@@ -323,6 +330,11 @@ static int git_log_config(const char *var, const char *value, void *cb)
 		return git_config_string(&fmt_pretty, var, value);
 	if (!strcmp(var, "format.subjectprefix"))
 		return git_config_string(&fmt_patch_subject_prefix, var, value);
+	if (!strcasecmp(var, "log.abbrevcommit") ||
+	    !strcasecmp(var, "log.abbrev-commit")) {
No need to use strcasecmp --- the vars passed to config functions
already have the section and variable names in lowercase.
quoted hunk
@@ -347,6 +359,7 @@ int cmd_whatchanged(int argc, const char **argv, const char *prefix)
 	struct setup_revision_opt opt;
 
 	git_config(git_log_config, NULL);
+	default_abbrev_commit = 0;
Puzzling as mentioned above.
quoted hunk
--- a/t/t4202-log.sh
+++ b/t/t4202-log.sh
@@ -450,6 +450,14 @@ test_expect_success 'log.decorate configuration' '
 
 '
 
+test_expect_success 'log.abbrev-commit configuration' '
+	test_might_fail git config --remove-section log &&
+	git log --abbrev-commit >expect &&
+	git config log.abbrev-commit true &&
+	git log >actual &&
+	test_cmp expect actual
+'
To avoid polluting the configuration, it would be nicest to do:

	git config log.abbrev-commit true &&
	test_when_finished "git config --unset log.abbrev-commit" &&
	git log >actual &&

though it looks like some tests already protect themselves.

Just because I'm curious: what happens if you do

	git config log.abbrev-commit true

in test_create_repo in test-lib.sh?  (I.e., are there many tests that
would be confused by this?)  Tests tend to be more picky than user
scripts about the output of git but it might still be an ok way to
get a vague sense of the impact.

Hope that helps, and thanks for a pleasant read.

Regards,
Jonathan

Re: [PATCH] Add log.abbrev-commit config option

From: Jay Soffian <hidden>
Date: 2016-06-15 22:51:14

On Sat, May 14, 2011 at 3:01 PM, Jonathan Nieder [off-list ref] wrote:
Why two options?  It would be more conventional to provide just
log.abbrevCommit.  The existing "[add] ignore-errors" is explained in
the manual to be a mistake
Ah, okay.
quoted
config option as
a convenience for users who often use --abbrev-commit with git log and
git show (but not git whatchanged, as its output is more likely to be
parsed even though it is not technically plumbing).
Hm, that wouldn't have been my hunch.  Are you aware of any scripts
that parse "git whatchanged" output?
Yes, I've seen it in post-receive hooks, however, that's typically in
bare repos where I suppose it's unlikely for the user to set
log.abbrevCommit, so maybe I was just being overly cautious.
quoted hunk
More worrying is "git log --format=raw".  I think as long as we're
cautious about rolling this out slowly and noticing breakage early it
should be okay.  It might even be nice to find out if there are
scripts or tests that care deeply about "git log"'s output format
(which would be more reliable if they had been written to use
"git rev-list | git diff-tree -s --stdin").
quoted
Allow the option to be overridden via --no-abbrev-commit.
Good idea anyway.  Once parse_revision_opt learns to use parse_options
these negated options would be automatic (though that's a long way
away).

Unfortunately this wouldn't help scripts much until the option has
been around for a while.  Maybe it would be safer to have two patches
--- one to add --no-abbrev-commit which could be included in "maint"
and widely deployed, and one to add the new configuration only after
--no-abbrev-commit can be relied on?  But on the other hand, scripts
can be updated today to use rev-list | diff-tree, so maybe that's not
worth the trouble.
I think that's overkill. Thinking through it more, this would only
break any scripts:

a) that are parsing whatchanged output; and
b) the user sets log.abbrevCommit w/o updating his script
People using git by hand would certainly appreciate
--no-abbrev-commit, I suspect.
That's why I added it.
quoted
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -1314,6 +1314,12 @@ interactive.singlekey::
      linkgit:git-checkout[1]. Note that this setting is silently
      ignored if portable keystroke input is not available.

+log.abbrev-commit::
+log.abbrevCommit::
+     If true, act as if --abbrev-commit were specified on the command
+     line. May be overridden with --no-abbrev-commit. Note that this setting
+     is ignored by rev-list.
Style: most of that page is written from the point of view of the
user

[...]

So maybe something like:

       Whether to abbreviate hexadecimal commit object names in
       output from the 'log' family of commands.  The number of
       digits shown is determined by the `--abbrev` command-line
       option and `core.abbrev` configuration variable.  Can be
       overridden on the command line by --abbrev-commit /
       --no-abbrev-commit.  The default is false.
 +
 This does not affect the 'git diff-tree' and 'git rev-list'
 commands.
I thought I phrased it like the nearby options in config.txt. and that
sounds overly verbose to me, but I'll take another look.
quoted
--- a/Documentation/git-log.txt
+++ b/Documentation/git-log.txt
@@ -38,6 +38,9 @@ OPTIONS
      Continue listing the history of a file beyond renames
      (works only for a single file).

+--no-abbrev-commit::
+     Don't abbreviate commit name. Useful for overridding log.abbrevCommit.
Also useful for overriding --abbrev-commit from aliases. :)

Shouldn't it be documented next to --abbrev-commit?
As I implemented it, --no-abbrev-commit is only honored from within
log.c, so I didn't want it to show up in the rev-list man page.

But, see below where I address your question about why I didn't
implement --no-abbrev-commit in revision.c
quoted
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -23,6 +23,7 @@
 /* Set a default date-time format for git log ("log.date" config variable) */
 static const char *default_date_mode = NULL;

+static int default_abbrev_commit = 0;
 static int default_show_root = 1;
 static int decoration_style;
Style: we try to avoid unnecessary zero initializers for variables in
the BSS section.
Okay.
[...]
quoted
@@ -89,11 +91,13 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
                       struct rev_info *rev, struct setup_revision_opt *opt)
 {
      struct userformat_want w;
-     int quiet = 0, source = 0;
+     int quiet = 0, source = 0, no_abbrev_commit = 0;

      const struct option builtin_log_options[] = {
-             OPT_BOOLEAN(0, "quiet", &quiet, "supress diff output"),
+             OPT_BOOLEAN(0, "quiet", &quiet, "suppress diff output"),
              OPT_BOOLEAN(0, "source", &source, "show source"),
+             OPT_BOOLEAN(0, "no-abbrev-commit", &no_abbrev_commit,
+                         "don't abbreviate commit name"),
What happens if I do

       git log --no-abbrev-commit --abbrev-commit

?  How about

       git log --no-abbrev-commit --no-no-abbrev-commit --abbrev-commit

? :)  The behavior should be nicer if this is implemented in revision.c.

It was a thinko to put it in log.c. I added --no-abbrev-commit
thinking of its primary use case to override log.abbrevCommit. But
obviously it's more generally useful in revision.c (even though that
doesn't honor log.abbrevCommit), since it can still be used to
override earlier CLI options that might enable abbreviation.

I'll move it. Then I can document the option next to --abbrev-commit
where it makes sense.
[...]
quoted
@@ -323,6 +330,11 @@ static int git_log_config(const char *var, const char *value, void *cb)
              return git_config_string(&fmt_pretty, var, value);
      if (!strcmp(var, "format.subjectprefix"))
              return git_config_string(&fmt_patch_subject_prefix, var, value);
+     if (!strcasecmp(var, "log.abbrevcommit") ||
+         !strcasecmp(var, "log.abbrev-commit")) {
No need to use strcasecmp --- the vars passed to config functions
already have the section and variable names in lowercase.
Okay, it was a cut-and-paste from ignore-errors I think.
quoted
@@ -347,6 +359,7 @@ int cmd_whatchanged(int argc, const char **argv, const char *prefix)
      struct setup_revision_opt opt;

      git_config(git_log_config, NULL);
+     default_abbrev_commit = 0;
Puzzling as mentioned above.
Will drop.
quoted
--- a/t/t4202-log.sh
+++ b/t/t4202-log.sh
@@ -450,6 +450,14 @@ test_expect_success 'log.decorate configuration' '
 '

+test_expect_success 'log.abbrev-commit configuration' '
+     test_might_fail git config --remove-section log &&
+     git log --abbrev-commit >expect &&
+     git config log.abbrev-commit true &&
+     git log >actual &&
+     test_cmp expect actual
+'
To avoid polluting the configuration, it would be nicest to do:

       git config log.abbrev-commit true &&
       test_when_finished "git config --unset log.abbrev-commit" &&
       git log >actual &&

though it looks like some tests already protect themselves.

Other tests in t4202 protect themselves at the start, I emulated that behavior.

Just because I'm curious: what happens if you do

       git config log.abbrev-commit true

in test_create_repo in test-lib.sh?  (I.e., are there many tests that
would be confused by this?)  Tests tend to be more picky than user
scripts about the output of git but it might still be an ok way to
get a vague sense of the impact.
I'll let you know. :-)
Hope that helps, and thanks for a pleasant read.
Thanks for the quick review.

j.

[PATCH] add, merge, diff: do not use strcasecmp to compare config variable names

From: Jonathan Nieder <hidden>
Date: 2016-06-15 22:51:14

The config machinery already makes section and variable names
lowercase when parsing them, so using strcasecmp for comparison just
feels wasteful.  No noticeable change intended.

Noticed-by: Jay Soffian [off-list ref]
Signed-off-by: Jonathan Nieder <redacted>
---
Jay Soffian wrote:
On Sat, May 14, 2011 at 3:01 PM, Jonathan Nieder [off-list ref] wrote:
quoted
No need to use strcasecmp --- the vars passed to config functions
already have the section and variable names in lowercase.
Okay, it was a cut-and-paste from ignore-errors I think.
Good catch.

 builtin/add.c     |    4 ++--
 merge-recursive.c |    6 +++---
 xdiff-interface.c |    2 +-
 3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/builtin/add.c b/builtin/add.c
index 704141f..e57abdd 100644
--- a/builtin/add.c
+++ b/builtin/add.c
@@ -331,8 +331,8 @@ static struct option builtin_add_options[] = {
 
 static int add_config(const char *var, const char *value, void *cb)
 {
-	if (!strcasecmp(var, "add.ignoreerrors") ||
-	    !strcasecmp(var, "add.ignore-errors")) {
+	if (!strcmp(var, "add.ignoreerrors") ||
+	    !strcmp(var, "add.ignore-errors")) {
 		ignore_add_errors = git_config_bool(var, value);
 		return 0;
 	}
diff --git a/merge-recursive.c b/merge-recursive.c
index ecb1806..07ad1a3 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -1721,15 +1721,15 @@ int merge_recursive_generic(struct merge_options *o,
 static int merge_recursive_config(const char *var, const char *value, void *cb)
 {
 	struct merge_options *o = cb;
-	if (!strcasecmp(var, "merge.verbosity")) {
+	if (!strcmp(var, "merge.verbosity")) {
 		o->verbosity = git_config_int(var, value);
 		return 0;
 	}
-	if (!strcasecmp(var, "diff.renamelimit")) {
+	if (!strcmp(var, "diff.renamelimit")) {
 		o->diff_rename_limit = git_config_int(var, value);
 		return 0;
 	}
-	if (!strcasecmp(var, "merge.renamelimit")) {
+	if (!strcmp(var, "merge.renamelimit")) {
 		o->merge_rename_limit = git_config_int(var, value);
 		return 0;
 	}
diff --git a/xdiff-interface.c b/xdiff-interface.c
index 164581f..0e2c169 100644
--- a/xdiff-interface.c
+++ b/xdiff-interface.c
@@ -347,7 +347,7 @@ int git_xmerge_style = -1;
 
 int git_xmerge_config(const char *var, const char *value, void *cb)
 {
-	if (!strcasecmp(var, "merge.conflictstyle")) {
+	if (!strcmp(var, "merge.conflictstyle")) {
 		if (!value)
 			die("'%s' is not a boolean", var);
 		if (!strcmp(value, "diff3"))
-- 
1.7.5.1

[PATCH v2] Add log.abbrevCommit config variable

From: Jay Soffian <hidden>
Date: 2016-06-15 22:51:14

Add log.abbrevCommit config variable as a convenience for users who
often use --abbrev-commit with git log and friends. Allow the option
to be overridden with --no-abbrev-commit.

(Also, a drive-by spelling correction in git log's short help.)

Signed-off-by: Jay Soffian <redacted>
---
Addresses Jonathan's feedback.
Just because I'm curious: what happens if you do

       git config log.abbrev-commit true

in test_create_repo in test-lib.sh?  (I.e., are there many tests that
would be confused by this?)  Tests tend to be more picky than user
scripts about the output of git but it might still be an ok way to
get a vague sense of the impact.
As expected, it breaks all the tests which rely on the output of show,
whatchanged, and log not having abbreviated commit names. They could
all be adjusted to pass '--no-abbrev-commit', but I think that's
pointless churn.

 Documentation/config.txt         |    5 +++++
 Documentation/pretty-options.txt |    5 +++++
 builtin/log.c                    |    8 +++++++-
 revision.c                       |    2 ++
 t/t4202-log.sh                   |   12 ++++++++++++
 5 files changed, 31 insertions(+), 1 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 285c7f73ca..8a3a1d08f7 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -1314,6 +1314,11 @@ interactive.singlekey::
 	linkgit:git-checkout[1]. Note that this setting is silently
 	ignored if portable keystroke input is not available.
 
+log.abbrevCommit::
+	If true, makes linkgit:git-log[1], linkgit:git-show[1], and
+	linkgit:git-whatchanged[1] assume `\--abbrev-commit`. You may
+	override this option with `\--no-abbrev-commit`.
+
 log.date::
 	Set the default date-time mode for the 'log' command.
 	Setting a value for log.date is similar to using 'git log''s
diff --git a/Documentation/pretty-options.txt b/Documentation/pretty-options.txt
index d5c977262a..2a3dc8664f 100644
--- a/Documentation/pretty-options.txt
+++ b/Documentation/pretty-options.txt
@@ -19,6 +19,11 @@ configuration (see linkgit:git-config[1]).
 This should make "--pretty=oneline" a whole lot more readable for
 people using 80-column terminals.
 
+--no-abbrev-commit::
+	Show the full 40-byte hexadecimal commit object name. This negates
+	`--abbrev-commit` and those options which imply it such as
+	"--oneline". It also overrides the 'log.abbrevCommit' variable.
+
 --oneline::
 	This is a shorthand for "--pretty=oneline --abbrev-commit"
 	used together.
diff --git a/builtin/log.c b/builtin/log.c
index f6219909a7..540d1a473a 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -23,6 +23,7 @@
 /* Set a default date-time format for git log ("log.date" config variable) */
 static const char *default_date_mode = NULL;
 
+static int default_abbrev_commit;
 static int default_show_root = 1;
 static int decoration_style;
 static int decoration_given;
@@ -77,6 +78,7 @@ static void cmd_log_init_defaults(struct rev_info *rev)
 		get_commit_format(fmt_pretty, rev);
 	rev->verbose_header = 1;
 	DIFF_OPT_SET(&rev->diffopt, RECURSIVE);
+	rev->abbrev_commit = default_abbrev_commit;
 	rev->show_root_diff = default_show_root;
 	rev->subject_prefix = fmt_patch_subject_prefix;
 	DIFF_OPT_SET(&rev->diffopt, ALLOW_TEXTCONV);
@@ -92,7 +94,7 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
 	int quiet = 0, source = 0;
 
 	const struct option builtin_log_options[] = {
-		OPT_BOOLEAN(0, "quiet", &quiet, "supress diff output"),
+		OPT_BOOLEAN(0, "quiet", &quiet, "suppress diff output"),
 		OPT_BOOLEAN(0, "source", &source, "show source"),
 		{ OPTION_CALLBACK, 0, "decorate", NULL, NULL, "decorate options",
 		  PARSE_OPT_OPTARG, decorate_callback},
@@ -323,6 +325,10 @@ static int git_log_config(const char *var, const char *value, void *cb)
 		return git_config_string(&fmt_pretty, var, value);
 	if (!strcmp(var, "format.subjectprefix"))
 		return git_config_string(&fmt_patch_subject_prefix, var, value);
+	if (!strcmp(var, "log.abbrevcommit")) {
+		default_abbrev_commit = git_config_bool(var, value);
+		return 0;
+	}
 	if (!strcmp(var, "log.date"))
 		return git_config_string(&default_date_mode, var, value);
 	if (!strcmp(var, "log.decorate")) {
diff --git a/revision.c b/revision.c
index a7cf79bf2e..86028917e1 100644
--- a/revision.c
+++ b/revision.c
@@ -1429,6 +1429,8 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
 			revs->abbrev = 40;
 	} else if (!strcmp(arg, "--abbrev-commit")) {
 		revs->abbrev_commit = 1;
+	} else if (!strcmp(arg, "--no-abbrev-commit")) {
+		revs->abbrev_commit = 0;
 	} else if (!strcmp(arg, "--full-diff")) {
 		revs->diff = 1;
 		revs->full_diff = 1;
diff --git a/t/t4202-log.sh b/t/t4202-log.sh
index 2fcc31a6f3..a53a86a989 100755
--- a/t/t4202-log.sh
+++ b/t/t4202-log.sh
@@ -450,6 +450,18 @@ test_expect_success 'log.decorate configuration' '
 
 '
 
+test_expect_success 'log.abbrev-commit configuration' '
+	test_might_fail git config --remove-section log &&
+	test_when_finished "git config --unset log.abbrevCommit" &&
+	git log >expect.full &&
+	git log --abbrev-commit >expect.abbrev &&
+	git config log.abbrevCommit true &&
+	git log >actual.abbrev &&
+	test_cmp expect.abbrev actual.abbrev &&
+	git log --no-abbrev-commit >actual.full &&
+	test_cmp expect.full actual.full
+'
+
 test_expect_success 'show added path under "--follow -M"' '
 	# This tests for a regression introduced in v1.7.2-rc0~103^2~2
 	test_create_repo regression &&
-- 
1.7.5.1.290.g2f216.dirty

Re: [PATCH v2] Add log.abbrevCommit config variable

From: Jonathan Nieder <hidden>
Date: 2016-06-15 22:51:14

Jay Soffian wrote:
Add log.abbrevCommit config variable as a convenience for users who
often use --abbrev-commit with git log and friends. Allow the option
to be overridden with --no-abbrev-commit.
Based on a quick google code search, this will break scripts. :/
For example, tig uses "git log --pretty=raw" to get revision lists,
including expecting 40-digit commit ids.

But aside from that, this looks good to me.  I'm not sure what to
suggest: go out and spread the word about diff-tree? suppress this
configuration when --pretty or --format is passed?  There's no obvious
good answer.

Re: [PATCH v2] Add log.abbrevCommit config variable

From: Jay Soffian <hidden>
Date: 2016-06-15 22:51:14

On Sat, May 14, 2011 at 5:55 PM, Jonathan Nieder [off-list ref] wrote:
Jay Soffian wrote:
quoted
Add log.abbrevCommit config variable as a convenience for users who
often use --abbrev-commit with git log and friends. Allow the option
to be overridden with --no-abbrev-commit.
Based on a quick google code search, this will break scripts. :/
For example, tig uses "git log --pretty=raw" to get revision lists,
including expecting 40-digit commit ids.
Hmfph.
But aside from that, this looks good to me.  I'm not sure what to
suggest: go out and spread the word about diff-tree? suppress this
configuration when --pretty or --format is passed?  There's no obvious
good answer.
Ah, see:

- 635530a2fc (log --pretty/--oneline: ignore log.decorate, 2010-04-06)
- 4f62c2bc57 (log.decorate: only ignore it under "log --pretty=raw", 2010-04-08)

So I'll do the same thing for log.abbrevCommit.

j.

[PATCH v3] Add log.abbrevCommit config variable

From: Jay Soffian <hidden>
Date: 2016-06-15 22:51:14

Add log.abbrevCommit config variable as a convenience for users who
often use --abbrev-commit with git log and friends. Allow the option
to be overridden with --no-abbrev-commit.

(Also, a drive-by spelling correction in git log's short help.)

Signed-off-by: Jay Soffian <redacted>
---
Changes from v2: ignore log.abbrevCommit when given --pretty=raw

 Documentation/config.txt         |    5 +++++
 Documentation/pretty-options.txt |    5 +++++
 builtin/log.c                    |   14 +++++++++++++-
 revision.c                       |    3 +++
 revision.h                       |    1 +
 t/t4202-log.sh                   |   15 +++++++++++++++
 6 files changed, 42 insertions(+), 1 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 285c7f73ca..8a3a1d08f7 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -1314,6 +1314,11 @@ interactive.singlekey::
 	linkgit:git-checkout[1]. Note that this setting is silently
 	ignored if portable keystroke input is not available.
 
+log.abbrevCommit::
+	If true, makes linkgit:git-log[1], linkgit:git-show[1], and
+	linkgit:git-whatchanged[1] assume `\--abbrev-commit`. You may
+	override this option with `\--no-abbrev-commit`.
+
 log.date::
 	Set the default date-time mode for the 'log' command.
 	Setting a value for log.date is similar to using 'git log''s
diff --git a/Documentation/pretty-options.txt b/Documentation/pretty-options.txt
index d5c977262a..2a3dc8664f 100644
--- a/Documentation/pretty-options.txt
+++ b/Documentation/pretty-options.txt
@@ -19,6 +19,11 @@ configuration (see linkgit:git-config[1]).
 This should make "--pretty=oneline" a whole lot more readable for
 people using 80-column terminals.
 
+--no-abbrev-commit::
+	Show the full 40-byte hexadecimal commit object name. This negates
+	`--abbrev-commit` and those options which imply it such as
+	"--oneline". It also overrides the 'log.abbrevCommit' variable.
+
 --oneline::
 	This is a shorthand for "--pretty=oneline --abbrev-commit"
 	used together.
diff --git a/builtin/log.c b/builtin/log.c
index f6219909a7..460fc15d8f 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -23,6 +23,7 @@
 /* Set a default date-time format for git log ("log.date" config variable) */
 static const char *default_date_mode = NULL;
 
+static int default_abbrev_commit;
 static int default_show_root = 1;
 static int decoration_style;
 static int decoration_given;
@@ -77,6 +78,7 @@ static void cmd_log_init_defaults(struct rev_info *rev)
 		get_commit_format(fmt_pretty, rev);
 	rev->verbose_header = 1;
 	DIFF_OPT_SET(&rev->diffopt, RECURSIVE);
+	rev->abbrev_commit = default_abbrev_commit;
 	rev->show_root_diff = default_show_root;
 	rev->subject_prefix = fmt_patch_subject_prefix;
 	DIFF_OPT_SET(&rev->diffopt, ALLOW_TEXTCONV);
@@ -92,7 +94,7 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
 	int quiet = 0, source = 0;
 
 	const struct option builtin_log_options[] = {
-		OPT_BOOLEAN(0, "quiet", &quiet, "supress diff output"),
+		OPT_BOOLEAN(0, "quiet", &quiet, "suppress diff output"),
 		OPT_BOOLEAN(0, "source", &source, "show source"),
 		{ OPTION_CALLBACK, 0, "decorate", NULL, NULL, "decorate options",
 		  PARSE_OPT_OPTARG, decorate_callback},
@@ -137,6 +139,12 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
 	    && rev->commit_format == CMIT_FMT_RAW)
 		decoration_style = 0;
 
+	/* ditto for log.abbrevCommit */
+	if (!rev->abbrev_commit_given && rev->abbrev_commit
+	    && rev->commit_format == CMIT_FMT_RAW)
+		rev->abbrev_commit = 0;
+
+
 	if (decoration_style) {
 		rev->show_decorations = 1;
 		load_ref_decorations(decoration_style);
@@ -323,6 +331,10 @@ static int git_log_config(const char *var, const char *value, void *cb)
 		return git_config_string(&fmt_pretty, var, value);
 	if (!strcmp(var, "format.subjectprefix"))
 		return git_config_string(&fmt_patch_subject_prefix, var, value);
+	if (!strcmp(var, "log.abbrevcommit")) {
+		default_abbrev_commit = git_config_bool(var, value);
+		return 0;
+	}
 	if (!strcmp(var, "log.date"))
 		return git_config_string(&default_date_mode, var, value);
 	if (!strcmp(var, "log.decorate")) {
diff --git a/revision.c b/revision.c
index a7cf79bf2e..be74bf92f5 100644
--- a/revision.c
+++ b/revision.c
@@ -1429,6 +1429,9 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
 			revs->abbrev = 40;
 	} else if (!strcmp(arg, "--abbrev-commit")) {
 		revs->abbrev_commit = 1;
+		revs->abbrev_commit_given = 1;
+	} else if (!strcmp(arg, "--no-abbrev-commit")) {
+		revs->abbrev_commit = 0;
 	} else if (!strcmp(arg, "--full-diff")) {
 		revs->diff = 1;
 		revs->full_diff = 1;
diff --git a/revision.h b/revision.h
index bca9947977..5e1f5c7e8f 100644
--- a/revision.h
+++ b/revision.h
@@ -90,6 +90,7 @@ struct rev_info {
 			show_notes_given:1,
 			pretty_given:1,
 			abbrev_commit:1,
+			abbrev_commit_given:1,
 			use_terminator:1,
 			missing_newline:1,
 			date_mode_explicit:1;
diff --git a/t/t4202-log.sh b/t/t4202-log.sh
index 2fcc31a6f3..9e8afd65a2 100755
--- a/t/t4202-log.sh
+++ b/t/t4202-log.sh
@@ -450,6 +450,21 @@ test_expect_success 'log.decorate configuration' '
 
 '
 
+test_expect_success 'log.abbrev-commit configuration' '
+	test_might_fail git config --remove-section log &&
+	test_when_finished "git config --unset log.abbrevCommit" &&
+	git log >expect.full &&
+	git log --pretty=raw >expect.raw &&
+	git log --abbrev-commit >expect.abbrev &&
+	git config log.abbrevCommit true &&
+	git log >actual.abbrev &&
+	test_cmp expect.abbrev actual.abbrev &&
+	git log --no-abbrev-commit >actual.full &&
+	test_cmp expect.full actual.full &&
+	git log --pretty=raw >actual.raw &&
+	test_cmp expect.raw actual.raw
+'
+
 test_expect_success 'show added path under "--follow -M"' '
 	# This tests for a regression introduced in v1.7.2-rc0~103^2~2
 	test_create_repo regression &&
-- 
1.7.5.1.290.g992321

Re: [PATCH v3] Add log.abbrevCommit config variable

From: Jay Soffian <hidden>
Date: 2016-06-15 22:51:14

On Sat, May 14, 2011 at 6:49 PM, Jay Soffian [off-list ref] wrote:
Add log.abbrevCommit config variable as a convenience for users who
often use --abbrev-commit with git log and friends. Allow the option
to be overridden with --no-abbrev-commit.

(Also, a drive-by spelling correction in git log's short help.)

Signed-off-by: Jay Soffian <redacted>
---
Changes from v2: ignore log.abbrevCommit when given --pretty=raw
Which I meant to mention in the commit message. Updated commit message:

---

Add log.abbrevCommit config variable

Add log.abbrevCommit config variable as a convenience for users who
often use --abbrev-commit with git log and friends. Allow the option
to be overridden with --no-abbrev-commit. Per 635530a2fc and 4f62c2bc57,
the config variable is ignored when log is given "--pretty=raw".

(Also, a drive-by spelling correction in git log's short help.)

Signed-off-by: Jay Soffian <redacted>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help