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

[PATCH v3 0/4] Add support for mailmap in cat-file

From
Siddharth Asthana <siddharthasthana31@gmail.com>
Date
Jul 9, 2022, 15:41 UTC
Message-ID
<20220709154149.165524-1-siddharthasthana31@gmail.com>
In-Reply-To
<20220707161554.6900-1-siddharthasthana31@gmail.com>

Thanks a lot for the review and suggestions Junio, Danh and Johannes. Really grateful for that :)

= Description

This patch series adds mailmap support to the git-cat-file command. It adds the mailmap support only for the commit and tag objects by replacing the idents for "author", "committer" and "tagger" headers. The mailmap only takes effect when --[no-]-use-mailmap or --[no-]-mailmap option is passed to the git cat-file command. The changes will work with the batch mode as well.

So, if one wants to enable mailmap they can use either of the following commands: $ git cat-file --use-mailmap -p <object> $ git cat-file --use-mailmap <type> <object>

To use it in the batch mode, one can use the following command: $ git cat-file --use-mailmap --batch

= Patch Organization
- The first patch improves the commit_rewrite_person() by restricting it 
  to traverse only through the header part of the commit object buffer.
  It also adds an argument called headers which the callers can pass. 
  The function will replace idents only on these  passed headers. 
  Thus, the caller won't have to make repeated calls to the function.
- The second patch moves commit_rewrite_person() to ident.c to expose it
  as a public function so that it can be used to replace idents in the
  headers of desired objects.
- The third patch renames commit_rewrite_person() to a name which
  describes its functionality clearly. It is renamed to
  apply_mailmap_to_header().
- The last patch adds mailmap support to the git cat-file command. It
  adds the required documentation and tests as well.
Changes in v3:
- The decl-after-statement warnings have been fixed in all the patches.
- In commit_rewrite_person(), the data type of linelen and i variables
  have been changed from int to size_t.
- The return type of replace_idents_using_mailmap() function, size_t,
  has been explicitly typecasted to unsigned long using the
  cast_size_t_to_ulong() helper method.
Siddharth Asthana (4):
  revision: improve commit_rewrite_person()
  ident: move commit_rewrite_person() to ident.c
  ident: rename commit_rewrite_person() to apply_mailmap_to_header()
  cat-file: add mailmap support
 Documentation/git-cat-file.txt |  6 +++
 builtin/cat-file.c             | 43 +++++++++++++++++++-
 cache.h                        |  6 +++
 ident.c                        | 72 ++++++++++++++++++++++++++++++++++
 revision.c                     | 50 ++---------------------
 t/t4203-mailmap.sh             | 54 +++++++++++++++++++++++++
 6 files changed, 183 insertions(+), 48 deletions(-)
Range-diff against v2:
1:  64e1f750e1 ! 1:  9e95326c58 revision: improve commit_rewrite_person()
    @@ Commit message
     
         The function, commit_rewrite_person(), is designed to find and replace
         an ident string in the header part, and the way it avoids a random
    -    occuranace of "author A U Thor <author@example.com" in the text is by
    +    occurrence of "author A U Thor <author@example.com" in the text is by
         insisting "author" to appear at the beginning of line by passing
         "\nauthor " as "what".
     
    @@ Commit message
         changed from int to void. This has been done because the caller of the
         function doesn't do anything with the return value of the function.
     
    -    By simplyfying the interface of the commit_rewrite_person(), we also
    +    By simplifying the interface of the commit_rewrite_person(), we also
         intend to expose it as a public function. We will also be renaming the
         function in a future commit to a different name which clearly tells that
         the function replaces idents in the header of the commit buffer.
     
         Mentored-by: Christian Couder <christian.couder@gmail.com>
         Mentored-by: John Cai <johncai86@gmail.com>
    +    Helped-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
         Signed-off-by: Siddharth Asthana <siddharthasthana31@gmail.com>
     
      ## revision.c ##
    @@ revision.c: static int commit_rewrite_person(struct strbuf *buf, const char *wha
     +		return;
     +
     +	for (;;) {
    -+		const char *person, *line = buf->buf + buf_offset;
    -+		int i, linelen = strchrnul(line, '\n') - line + 1;
    ++		const char *person, *line;
    ++		size_t i, linelen;
     +
    -+		if (!linelen || linelen == 1)
    ++		line = buf->buf + buf_offset;
    ++		linelen = strchrnul(line, '\n') - line + 1;
    ++
    ++		if (linelen <= 1)
     +			/* End of header */
     +			return;
     +
    @@ revision.c: static int commit_rewrite_person(struct strbuf *buf, const char *wha
      {
      	int retval;
     @@ revision.c: static int commit_match(struct commit *commit, struct rev_info *opt)
    + 		strbuf_addstr(&buf, message);
    + 
    + 	if (opt->grep_filter.header_list && opt->mailmap) {
    ++		const char *commit_headers[] = { "author ", "committer ", NULL };
    ++
      		if (!buf.len)
      			strbuf_addstr(&buf, message);
      
     -		commit_rewrite_person(&buf, "\nauthor ", opt->mailmap);
     -		commit_rewrite_person(&buf, "\ncommitter ", opt->mailmap);
    -+		const char *commit_headers[] = { "author ", "committer ", NULL };
     +		commit_rewrite_person(&buf, commit_headers, opt->mailmap);
      	}
      
2:  b18ced0ece ! 2:  d9395cb8b2 ident: move commit_rewrite_person() to ident.c
    @@ ident.c: int split_ident_line(struct ident_split *split, const char *line, int l
     +		return;
     +
     +	for (;;) {
    -+		const char *person, *line = buf->buf + buf_offset;
    -+		int i, linelen = strchrnul(line, '\n') - line + 1;
    ++		const char *person, *line;
    ++		size_t i, linelen;
     +
    -+		if (!linelen || linelen == 1)
    ++		line = buf->buf + buf_offset;
    ++		linelen = strchrnul(line, '\n') - line + 1;
    ++
    ++		if (linelen <= 1)
     +			/* End of header */
     +			return;
     +
    @@ revision.c: int rewrite_parents(struct rev_info *revs, struct commit *commit,
     -		return;
     -
     -	for (;;) {
    --		const char *person, *line = buf->buf + buf_offset;
    --		int i, linelen = strchrnul(line, '\n') - line + 1;
    +-		const char *person, *line;
    +-		size_t i, linelen;
    +-
    +-		line = buf->buf + buf_offset;
    +-		linelen = strchrnul(line, '\n') - line + 1;
     -
    --		if (!linelen || linelen == 1)
    +-		if (linelen <= 1)
     -			/* End of header */
     -			return;
     -
3:  2494ce1ed2 ! 3:  355bbda25e ident: rename commit_rewrite_person() to apply_mailmap_to_header()
    @@ ident.c: static ssize_t rewrite_ident_line(const char* person, struct strbuf *bu
     
      ## revision.c ##
     @@ revision.c: static int commit_match(struct commit *commit, struct rev_info *opt)
    + 		if (!buf.len)
      			strbuf_addstr(&buf, message);
      
    - 		const char *commit_headers[] = { "author ", "committer ", NULL };
     -		commit_rewrite_person(&buf, commit_headers, opt->mailmap);
     +		apply_mailmap_to_header(&buf, commit_headers, opt->mailmap);
      	}
4:  94838a2566 ! 4:  69b7ad898b cat-file: add mailmap support
    @@ Commit message
         Mentored-by: Christian Couder <christian.couder@gmail.com>
         Mentored-by: John Cai <johncai86@gmail.com>
         Helped-by: Phillip Wood <phillip.wood@dunelm.org.uk>
    +    Helped-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
         Signed-off-by: Siddharth Asthana <siddharthasthana31@gmail.com>
     
      ## Documentation/git-cat-file.txt ##
    @@ builtin/cat-file.c: struct batch_options {
     +static struct string_list mailmap = STRING_LIST_INIT_NODUP;
     +static int use_mailmap;
     +
    -+char *replace_idents_using_mailmap(char *object_buf, size_t *size)
    ++static char *replace_idents_using_mailmap(char *, size_t *);
    ++
    ++static char *replace_idents_using_mailmap(char *object_buf, size_t *size)
     +{
     +	struct strbuf sb = STRBUF_INIT;
    -+	strbuf_attach(&sb, object_buf, *size, *size + 1);
     +	const char *headers[] = { "author ", "committer ", "tagger ", NULL };
    ++
    ++	strbuf_attach(&sb, object_buf, *size, *size + 1);
     +	apply_mailmap_to_header(&sb, headers, &mailmap);
     +	*size = sb.len;
     +	return strbuf_detach(&sb, NULL);
    @@ builtin/cat-file.c: static int cat_one_file(int opt, const char *exp_type, const
      		if (!buf)
      			die("Cannot read object %s", obj_name);
      
    -+		if (use_mailmap)
    -+			buf = replace_idents_using_mailmap(buf, &size);
    ++		if (use_mailmap) {
    ++			size_t s = size;
    ++			buf = replace_idents_using_mailmap(buf, &s);
    ++			size = cast_size_t_to_ulong(s);
    ++		}
     +
      		/* otherwise just spit out the data */
      		break;
    @@ builtin/cat-file.c: static int cat_one_file(int opt, const char *exp_type, const
      		buf = read_object_with_reference(the_repository, &oid,
      						 exp_type_id, &size, NULL);
     +
    -+		if (use_mailmap)
    -+			buf = replace_idents_using_mailmap(buf, &size);
    ++		if (use_mailmap) {
    ++			size_t s = size;
    ++			buf = replace_idents_using_mailmap(buf, &s);
    ++			size = cast_size_t_to_ulong(s);
    ++		}
      		break;
      	}
      	default:
    @@ builtin/cat-file.c: static void print_object_or_die(struct batch_options *opt, s
      
      		contents = read_object_file(oid, &type, &size);
     +
    -+		if (use_mailmap)
    -+			contents = replace_idents_using_mailmap(contents, &size);
    ++		if (use_mailmap) {
    ++			size_t s = size;
    ++			contents = replace_idents_using_mailmap(contents, &s);
    ++			size = cast_size_t_to_ulong(s);
    ++		}
     +
      		if (!contents)
      			die("object %s disappeared", oid_to_hex(oid));
-- 
2.37.0.6.g69b7ad898b
Previous: Junio C HamanoNext: Siddharth Asthana
Message 31 of 68 in “Add support for mailmap in cat-file”
  1. 0/3 Add support for mailmap in cat-fileSiddharth Asthana, Jun 30, 2022
  2. 2/3 ident: rename commit_rewrite_person() to rewrite_ident_line()Siddharth Asthana, Jun 30, 2022
  3. Phillip WoodJun 30, 2022
  4. Christian CouderJun 30, 2022
  5. Junio C HamanoJun 30, 2022
  6. 1/3 ident: move commit_rewrite_person() to ident.cSiddharth Asthana, Jun 30, 2022
  7. Đoàn Trần Công DanhJun 30, 2022
  8. Junio C HamanoJun 30, 2022
  9. 3/3 cat-file: add mailmap supportSiddharth Asthana, Jun 30, 2022
  10. Phillip WoodJun 30, 2022
  11. Phillip WoodJun 30, 2022
  12. Christian CouderJun 30, 2022
  13. Junio C HamanoJun 30, 2022
  14. Christian CouderJul 7, 2022
  15. Ævar Arnfjörð BjarmasonJun 30, 2022
  16. Junio C HamanoJun 30, 2022
  17. Christian CouderJul 7, 2022
  18. Junio C HamanoJun 30, 2022
  19. Junio C HamanoJun 30, 2022
  20. 0/4 Add support for mailmap in cat-fileSiddharth Asthana, Jul 7, 2022
  21. 1/4 revision: improve commit_rewrite_person()Siddharth Asthana, Jul 7, 2022
  22. Junio C HamanoJul 7, 2022
  23. Đoàn Trần Công DanhJul 8, 2022
  24. 2/4 ident: move commit_rewrite_person() to ident.cSiddharth Asthana, Jul 7, 2022
  25. 3/4 ident: rename commit_rewrite_person() to apply_mailmap_to_header()Siddharth Asthana, Jul 7, 2022
  26. 4/4 cat-file: add mailmap supportSiddharth Asthana, Jul 7, 2022
  27. Junio C HamanoJul 7, 2022
  28. Johannes SchindelinJul 8, 2022
  29. Junio C HamanoJul 7, 2022
  30. Junio C HamanoJul 7, 2022
  31. 0/4 Add support for mailmap in cat-fileSiddharth Asthana, Jul 9, 2022
  32. 1/4 revision: improve commit_rewrite_person()Siddharth Asthana, Jul 9, 2022
  33. Johannes SchindelinJul 12, 2022
  34. 2/4 ident: move commit_rewrite_person() to ident.cSiddharth Asthana, Jul 9, 2022
  35. 3/4 ident: rename commit_rewrite_person() to apply_mailmap_to_header()Siddharth Asthana, Jul 9, 2022
  36. 4/4 cat-file: add mailmap supportSiddharth Asthana, Jul 9, 2022
  37. Junio C HamanoJul 10, 2022
  38. Johannes SchindelinJul 12, 2022
  39. Junio C HamanoJul 12, 2022
  40. Siddharth AsthanaJul 12, 2022
  41. Junio C HamanoJul 12, 2022
  42. 0/4 Add support for mailmap in cat-fileSiddharth Asthana, Jul 12, 2022
  43. 1/4 revision: improve commit_rewrite_person()Siddharth Asthana, Jul 12, 2022
  44. Ævar Arnfjörð BjarmasonJul 13, 2022
  45. Christian CouderJul 13, 2022
  46. Junio C HamanoJul 14, 2022
  47. 2/4 ident: move commit_rewrite_person() to ident.cSiddharth Asthana, Jul 12, 2022
  48. 3/4 ident: rename commit_rewrite_person() to apply_mailmap_to_header()Siddharth Asthana, Jul 12, 2022
  49. Ævar Arnfjörð BjarmasonJul 13, 2022
  50. Christian CouderJul 13, 2022
  51. 4/4 cat-file: add mailmap supportSiddharth Asthana, Jul 12, 2022
  52. 0/4 Add support for mailmap in cat-fileSiddharth Asthana, Jul 16, 2022
  53. 1/4 revision: improve commit_rewrite_person()Siddharth Asthana, Jul 16, 2022
  54. Junio C HamanoJul 17, 2022
  55. 2/4 ident: move commit_rewrite_person() to ident.cSiddharth Asthana, Jul 16, 2022
  56. 3/4 ident: rename commit_rewrite_person() to apply_mailmap_to_header()Siddharth Asthana, Jul 16, 2022
  57. 4/4 cat-file: add mailmap supportSiddharth Asthana, Jul 16, 2022
  58. 0/4 Add support for mailmap in cat-fileSiddharth Asthana, Jul 18, 2022
  59. 1/4 revision: improve commit_rewrite_person()Siddharth Asthana, Jul 18, 2022
  60. 2/4 ident: move commit_rewrite_person() to ident.cSiddharth Asthana, Jul 18, 2022
  61. 3/4 ident: rename commit_rewrite_person() to apply_mailmap_to_header()Siddharth Asthana, Jul 18, 2022
  62. 4/4 cat-file: add mailmap supportSiddharth Asthana, Jul 18, 2022
  63. Junio C HamanoJul 25, 2022
  64. Christian CouderJul 28, 2022
  65. Junio C HamanoJul 28, 2022
  66. Siddharth AsthanaJul 30, 2022
  67. Đoàn Trần Công DanhJul 9, 2022
  68. Christian CouderJul 9, 2022

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.