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

[PATCH] pretty: find pretty formats case-insensitively

From
Brian Lyles <brianmlyles@gmail.com>
Date
Mar 24, 2024, 21:43 UTC
Message-ID
<20240324214316.917513-1-brianmlyles@gmail.com>

User-defined pretty formats are stored in config, which is meant to use case-insensitive matching for names as noted in config.txt's 'Syntax' section:

    All the other lines [...] are recognized as setting variables, in
    the form 'name = value' [...]. The variable names are
    case-insensitive, [...].

When a user specifies one of their format aliases with an uppercase in it, however, it is not found.

    $ git config pretty.testAlias %h
    $ git config --list | grep pretty
    pretty.testalias=%h
    $ git log --format=testAlias -1
    fatal: invalid --pretty format: testAlias
    $ git log --format=testalias -1
    3c2a3fdc38

This is true whether the name in the config file uses any uppercase characters or not.

Normalize the format name specified via `--format` to lowercase so that format aliases are found case-insensitively. The format aliases loaded from config against which this name is compared are already normalized to lowercase since they are loaded through `git_config()`.

`xstrdup_tolower` is used instead of modifying the string in-place to ensure that the error shown to the user when the format is not found has the same casing that the user entered. Otherwise, the mismatch may be confusing to the user.

Signed-off-by: Brian Lyles <brianmlyles@gmail.com>
---
 pretty.c                      | 12 +++++++++++-
 t/t4205-log-pretty-formats.sh |  7 +++++++
 2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/pretty.c b/pretty.c
index cf964b060c..78ec7a75ff 100644
--- a/pretty.c
+++ b/pretty.c
@@ -168,10 +168,20 @@ static struct cmt_fmt_map *find_commit_format_recursive(const char *sought,
 
 static struct cmt_fmt_map *find_commit_format(const char *sought)
 {
+	struct cmt_fmt_map *result;
+	char *sought_lower;
+
 	if (!commit_formats)
 		setup_commit_formats();
 
-	return find_commit_format_recursive(sought, sought, 0);
+	/*
+	 * The sought name will be compared to config names that have already
+	 * been normalized to lowercase.
+	 */
+	sought_lower = xstrdup_tolower(sought);
+	result = find_commit_format_recursive(sought_lower, sought_lower, 0);
+	free(sought_lower);
+	return result;
 }
 
 void get_commit_format(const char *arg, struct rev_info *rev)
diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh
index e3d655e6b8..321e305979 100755
--- a/t/t4205-log-pretty-formats.sh
+++ b/t/t4205-log-pretty-formats.sh
@@ -59,6 +59,13 @@ test_expect_success 'alias user-defined format' '
 	test_cmp expected actual
 '
 
+test_expect_success 'alias user-defined format is matched case-insensitively' '
+	git log --pretty="format:%h" >expected &&
+	git config pretty.testalias "format:%h" &&
+	git log --pretty=testAlias >actual &&
+	test_cmp expected actual
+'
+
 test_expect_success 'alias user-defined tformat with %s (ISO8859-1 encoding)' '
 	git config i18n.logOutputEncoding $test_encoding &&
 	git log --oneline >expected-s &&
-- 
2.43.2
Next: Jeff King
Message 1 of 9 in “pretty: find pretty formats case-insensitively”
  1. pretty: find pretty formats case-insensitivelyBrian Lyles, Mar 24, 2024
  2. Jeff KingMar 25, 2024
  3. Brian LylesMar 25, 2024
  4. Junio C HamanoMar 25, 2024
  5. 1/2 pretty: update tests to use `test_config`Brian Lyles, Mar 25, 2024
  6. Jeff KingMar 25, 2024
  7. 2/2 pretty: find pretty formats case-insensitivelyBrian Lyles, Mar 25, 2024
  8. Jeff KingMar 25, 2024
  9. Brian LylesMar 25, 2024

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.