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

[PATCH v4 0/1] range-diff: treat notes like `log`

From
Kristoffer Haugsbakk <code@khaugsbakk.name>
Date
Sep 19, 2023, 18:05 UTC
Message-ID
<cover.1695144790.git.code@khaugsbakk.name>
In-Reply-To
<cover.1694383247.git.code@khaugsbakk.name>
Hi
Same cover letter up until but not including “Changes ...”.
Cheers
🙛 🙙

Currently, `range-diff` shows the default notes if no notes-related arguments are given. This is also how `log` behaves. But unlike `range-diff`, `log` does *not* show the default notes if `--notes=<custom>` are given.

These changes are supposed to make `format-range` behave like `log` with regards to notes.

These changes also fixes an issue with notes being shared in the cover letter via `range-diff`, and that’s really the main motivation for making these changes.

§ How `log` works

`log` shows the default notes if no notes arguments are given. But if you give it specific notes to show then it forgets about the default notes. Further, there is the convenience `--notes` option which will show the default notes again. These options are cumulative. For example:

    git log --notes --notes=custom
Will show the default notes as well as the `custom` notes.
See discussion in: https://lore.kernel.org/git/20110329143357.GA10771@sigill.intra.peff.net/
§ How `range-format` works

`range-format` passes `--notes` to `log`, which means that it does not have the default behavior of `log` (forget the default logs if you say e.g. `--notes=custom`). However, the man page says that (under `--[no-]notes[=<ref>]`):

> This flag is passed to the git log program (see git-log(1)) that generates the patches.

This makes me (at least) think that `range-format` is supposed to work just like `log` with regards to notes.

§ `format-patch` and the difference between showing and sharing

`format-patch` has a different default: it shows no notes. This makes sense in my opinion since `format-patch` is meant to be used to share changes with others, and you might be surprised if your notes (which might have only been notes to yourself) are sent out in your emails (keep in mind that notes refs are *not* pushed by default).

But the slightly faulty behavior of `range-diff` bleeds through to `format-patch` since the latter calls the former; if you have default notes they can be shared in the range-diff on the cover letter, even though `format-patch` isn’t supposed to show them.

§ Changes since version 3
Dscho [rewrote] the fix: introduce a new option to pass to `git log`.
🔗 rewrote: https://lore.kernel.org/git/dd2958c5-58bf-86dd-b666-9033259a8e1a@gmx.de/
§ CI (WIP)
https://github.com/LemmingAvalanche/git/actions/runs/6238806624
Kristoffer Haugsbakk (1):
  range-diff: treat notes like `log`
 Documentation/pretty-options.txt |  4 ++++
 range-diff.c                     |  2 +-
 revision.c                       |  7 +++++++
 revision.h                       |  1 +
 t/t3206-range-diff.sh            | 28 ++++++++++++++++++++++++++++
 5 files changed, 41 insertions(+), 1 deletion(-)
Range-diff against v3:
1:  a37dfb3748 ! 1:  244e102cc4 range-diff: treat notes like `log`
    @@ Commit message
         to say about the changes to the default notes, since that will be shown
         in the cover letter.
    -    Remedy this by only conditionally passing in `--notes` to `range-diff`.
    +    Remedy this by introducing `--show-notes-by-default` that `range-diff` can
    +    use to tell the `log` subprocess what to do.
         § Root cause
    @@ Commit message
         Co-authored-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
         Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
    - ## range-diff.c ##
    -@@ range-diff.c: static int read_patches(const char *range, struct string_list *list,
    - 	struct child_process cp = CHILD_PROCESS_INIT;
    - 	struct strbuf buf = STRBUF_INIT, contents = STRBUF_INIT;
    - 	struct patch_util *util = NULL;
    --	int in_header = 1;
    -+	int i, implicit_notes_arg = 1, in_header = 1;
    - 	char *line, *current_filename = NULL;
    - 	ssize_t len;
    - 	size_t size;
    - 	int ret = -1;
    + ## Documentation/pretty-options.txt ##
    +@@ Documentation/pretty-options.txt: message by 4 spaces (i.e.  'medium', which is the default, 'full',
    + and 'fuller').
    -+	for (i = 0; other_arg && i < other_arg->nr; i++)
    -+		if (!strcmp(other_arg->v[i], "--notes") ||
    -+		    starts_with(other_arg->v[i], "--notes=") ||
    -+		    !strcmp(other_arg->v[i], "--no-notes")) {
    -+			implicit_notes_arg = 0;
    -+			break;
    -+		}
    + ifndef::git-rev-list[]
    ++--show-notes-by-default::
    ++	Show the default notes (see `--notes`) unless subsequent arguments
    ++	are used to display specific notes.
     +
    - 	strvec_pushl(&cp.args, "log", "--no-color", "-p", "--no-merges",
    - 		     "--reverse", "--date-order", "--decorate=no",
    - 		     "--no-prefix", "--submodule=short",
    + --notes[=<ref>]::
    + 	Show the notes (see linkgit:git-notes[1]) that annotate the
    + 	commit, when showing the commit log message.  This is the default
    +
    + ## range-diff.c ##
     @@ range-diff.c: static int read_patches(const char *range, struct string_list *list,
      		     "--output-indicator-context=#",
      		     "--no-abbrev-commit",
      		     "--pretty=medium",
     -		     "--notes",
    ++		     "--show-notes-by-default",
      		     NULL);
    -+	if (implicit_notes_arg)
    -+		     strvec_push(&cp.args, "--notes");
      	strvec_push(&cp.args, range);
      	if (other_arg)
    - 		strvec_pushv(&cp.args, other_arg->v);
    +
    + ## revision.c ##
    +@@ revision.c: static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
    + 		revs->break_bar = xstrdup(optarg);
    + 		revs->track_linear = 1;
    + 		revs->track_first_time = 1;
    ++	} else if (!strcmp(arg, "--show-notes-by-default")) {
    ++		revs->show_notes_by_default = 1;
    + 	} else if (skip_prefix(arg, "--show-notes=", &optarg) ||
    + 		   skip_prefix(arg, "--notes=", &optarg)) {
    + 		if (starts_with(arg, "--show-notes=") &&
    +@@ revision.c: int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
    + 	if (revs->expand_tabs_in_log < 0)
    + 		revs->expand_tabs_in_log = revs->expand_tabs_in_log_default;
    +
    ++	if (!revs->show_notes_given && revs->show_notes_by_default) {
    ++		enable_default_display_notes(&revs->notes_opt, &revs->show_notes);
    ++		revs->show_notes_given = 1;
    ++	}
    ++
    + 	return left;
    + }
    +
    +
    + ## revision.h ##
    +@@ revision.h: struct rev_info {
    + 			shown_dashes:1,
    + 			show_merge:1,
    + 			show_notes_given:1,
    ++			show_notes_by_default:1,
    + 			show_signature:1,
    + 			pretty_given:1,
    + 			abbrev_commit:1,
      ## t/t3206-range-diff.sh ##
     @@ t/t3206-range-diff.sh: test_expect_success 'range-diff with multiple --notes' '
--
2.42.0
Previous: Johannes SchindelinNext: Kristoffer Haugsbakk
Message 32 of 41 in “range-diff: treat notes like `log`”
  1. 0/3 range-diff: treat notes like `log`Kristoffer Haugsbakk, May 30, 2023
  2. 1/3 range-diff: treat notes like `log`Kristoffer Haugsbakk, May 30, 2023
  3. Jeff KingJun 1, 2023
  4. Kristoffer HaugsbakkJun 2, 2023
  5. 2/3 doc: pretty-options: remove documentation for deprecated optionsKristoffer Haugsbakk, May 30, 2023
  6. 3/3 revision: comment `--no-standard-notes` as deprecatedKristoffer Haugsbakk, May 30, 2023
  7. 0/3 range-diff: treat notes like `log`Kristoffer Haugsbakk, Jun 11, 2023
  8. 2/3 doc: pretty-options: remove documentation for deprecated optionsKristoffer Haugsbakk, Jun 11, 2023
  9. 3/3 revision: comment `--no-standard-notes` as deprecatedKristoffer Haugsbakk, Jun 11, 2023
  10. Junio C HamanoJun 12, 2023
  11. Kristoffer HaugsbakkJun 13, 2023
  12. 1/3 range-diff: treat notes like `log`Kristoffer Haugsbakk, Jun 11, 2023
  13. Junio C HamanoJun 12, 2023
  14. Kristoffer HaugsbakkJun 13, 2023
  15. 0/3 range-diff: treat notes like `log`Kristoffer Haugsbakk, Sep 1, 2023
  16. 1/3 range-diff: treat notes like `log`Kristoffer Haugsbakk, Sep 1, 2023
  17. Johannes SchindelinSep 3, 2023
  18. Kristoffer HaugsbakkSep 4, 2023
  19. Johannes SchindelinSep 5, 2023
  20. Junio C HamanoSep 5, 2023
  21. 2/3 doc: pretty-options: remove documentation for deprecated optionsKristoffer Haugsbakk, Sep 1, 2023
  22. 3/3 revision: comment `--no-standard-notes` as deprecatedKristoffer Haugsbakk, Sep 1, 2023
  23. 0/1 range-diff: treat notes like `log`Kristoffer Haugsbakk, Sep 10, 2023
  24. 1/1 range-diff: treat notes like `log`Kristoffer Haugsbakk, Sep 10, 2023
  25. Junio C HamanoSep 11, 2023
  26. Johannes SchindelinSep 14, 2023
  27. Junio C HamanoSep 14, 2023
  28. Kristoffer HaugsbakkSep 14, 2023
  29. Junio C HamanoSep 19, 2023
  30. Kristoffer HaugsbakkSep 19, 2023
  31. Johannes SchindelinSep 11, 2023
  32. 0/1 range-diff: treat notes like `log`Kristoffer Haugsbakk, Sep 19, 2023
  33. 1/1 range-diff: treat notes like `log`Kristoffer Haugsbakk, Sep 19, 2023
  34. Junio C HamanoSep 19, 2023
  35. Kristoffer HaugsbakkSep 19, 2023
  36. Junio C HamanoSep 19, 2023
  37. Kristoffer HaugsbakkSep 19, 2023
  38. Junio C HamanoSep 19, 2023
  39. 0/1 range-diff: treat notes like `log`Kristoffer Haugsbakk, Sep 19, 2023
  40. 1/1 range-diff: treat notes like `log`Kristoffer Haugsbakk, Sep 19, 2023
  41. Johannes SchindelinSep 21, 2023

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.