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

Re: [PATCH v5 0/4] Better support for customising context lines in --patch commands

From
PWPhillip Wood <phillip.wood123@gmail.com>
Date
Jul 29, 2025, 15:21 UTC
Message-ID
<ec7481b5-5244-4a76-962f-d3bed9e4172a@gmail.com>
In-Reply-To
<pull.1915.v5.git.1753772511.gitgitgadget@gmail.com>
Hi Leon
The range-diff below looks good to me. Thanks for working on this
Phillip
On 29/07/2025 08:01, Leon Michalak via GitGitGadget wrote:
Show 216 quoted lines
> This series of patches attempt to give --interactive/--patch compatible
> builtins ("add", "commit", "checkout", "reset", "restore" and "stash")
> better support and nicer experience for configuring how many context lines
> are shown in diffs through a variety of ways.
> 
> Prior to these patches, the user could not choose how many context lines
> they saw in --patch commands (apart from one workaround by using
> GIT_DIFF_OPTS=-u<number> ..., however this isn't a good user experience or a
> persistent solution). Additionally, the behaviour around reading from the
> diff.context and diff.interHunkContext configs was also inconsistent with
> other diff generating commands such as "log -p".
> 
> The summarised changes below hopefully make this experience better and fix
> some inconsistencies:
> 
>   * diff.context and diff.interHunkContext configs are now respected by
>     --patch compatible commands
>   * --unified and --inter-hunk-context command line options have been added
>     to --patch compatible commands (which take prescendence over file
>     configs)
>   * "add" and "commit" in --interactive mode now expose a new "context"
>     subcommand which configures the amount of context lines you wish to see
>     in subsequent diffs generated from other subcommands such as "patch" or
>     "diff"
> 
> The original discussion for this can be read at:
> 
>   * https://lore.kernel.org/git/CAP9jKjGb-Rcr=RLJEzeFdtrekYM+qmHy+1T1fykU3n9cV4GhGw@mail.gmail.com/
> 
> Changes since v1:
> 
>   * Update commit descriptions
>   * Update tests to use the more modern and robust test_grep and test_config
>     utils
>   * Reword some documentation / user messages
>   * Ensure each commit is atomic and builds/passes tests on it's own
>   * Make new command line options DRY
>   * Add tests for interhunk context interaction
>   * Error if context config/command line options are negative
>   * Drop previous last commit to do with new subcommand for --interactive
>     add/commit. My motivations behind this patch series originally where
>     quite simple, just for add-patch commands to respect context configs.
>     This subcommand, after the discussion in v1, will require more thought
>     and a larger implementation that what I had anticipated. I would prefer
>     to leave this for another time as it's the least impactful but the most
>     time intensive and complicated idea.
> 
> Changes since v2:
> 
>   * Update tests to only test single command (following Philip's suggestion)
>   * Add negative option checks
>   * Minor commit re-wording
> 
> Changes since v3:
> 
>   * Update commit descriptions
>   * Read struct properties directly instead of assigning to variables first
>   * Simplify config setting / error checking
>   * Remove redundant tests in later commit as they were replaced with better
>     test(s)
>   * Change tests to use single quotes (this messes with the grep so was
>     unable to explicitly test single quotes in the error messages, so decided
>     to use regex . instead, which is what some other tests that have this
>     problem seem to use as well)
> 
> Changes since v4:
> 
>   * Add back tests to maintain good coverage and remove redundant tests
> 
> Leon Michalak (4):
>    t: use test_grep in t3701 and t4055
>    t: use test_config in t4055
>    add-patch: respect diff.context configuration
>    add-patch: add diff.context command line overrides
> 
>   Documentation/diff-context-options.adoc |  10 ++
>   Documentation/git-add.adoc              |   2 +
>   Documentation/git-checkout.adoc         |   2 +
>   Documentation/git-commit.adoc           |   2 +
>   Documentation/git-reset.adoc            |   2 +
>   Documentation/git-restore.adoc          |   2 +
>   Documentation/git-stash.adoc            |   2 +
>   add-interactive.c                       |  45 +++++++--
>   add-interactive.h                       |  17 +++-
>   add-patch.c                             |  14 ++-
>   builtin/add.c                           |  21 ++++-
>   builtin/checkout.c                      |  31 +++++-
>   builtin/commit.c                        |  16 +++-
>   builtin/reset.c                         |  17 +++-
>   builtin/stash.c                         |  56 ++++++++---
>   commit.h                                |   3 +-
>   parse-options.h                         |   2 +
>   t/t3701-add-interactive.sh              | 119 +++++++++++++++++++-----
>   t/t4055-diff-context.sh                 |  42 ++++-----
>   t/t9902-completion.sh                   |   2 +
>   20 files changed, 324 insertions(+), 83 deletions(-)
>   create mode 100644 Documentation/diff-context-options.adoc
> 
> 
> base-commit: cf6f63ea6bf35173e02e18bdc6a4ba41288acff9
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1915%2FNinjaInShade%2Finteractive-patch-context-v5
> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1915/NinjaInShade/interactive-patch-context-v5
> Pull-Request: https://github.com/gitgitgadget/git/pull/1915
> 
> Range-diff vs v4:
> 
>   1:  bbb2bc7082b = 1:  bbb2bc7082b t: use test_grep in t3701 and t4055
>   2:  feace2d3676 = 2:  feace2d3676 t: use test_config in t4055
>   3:  994029d6602 = 3:  994029d6602 add-patch: respect diff.context configuration
>   4:  2774b930406 ! 4:  9731e5b76fb add-patch: add diff.context command line overrides
>       @@ parse-options.h: int parse_opt_tracking_mode(const struct option *, const char *
>         	OPT_SET_INT_F('4', "ipv4", (v), N_("use IPv4 addresses only"), \
>        
>         ## t/t3701-add-interactive.sh ##
>       -@@ t/t3701-add-interactive.sh: test_expect_success 'hunk splitting works with diff.suppressBlankEmpty' '
>       - 	test_cmp expect actual
>       +@@ t/t3701-add-interactive.sh: test_expect_success 'add -p rejects negative diff.context' '
>       + 	test_grep "diff.context cannot be negative" output
>         '
>         
>       --test_expect_success 'add -p respects diff.context' '
>       --	test_write_lines a b c d e f g h i j k l m >file &&
>        +for cmd in add checkout restore 'commit -m file'
>        +do
>        +	test_expect_success "${cmd%% *} accepts -U and --inter-hunk-context" '
>       @@ t/t3701-add-interactive.sh: test_expect_success 'hunk splitting works with diff.
>        +	test_write_lines a b c d e f g h i j k l m n o p q r s t u v >file &&
>        +	git commit -m file file &&
>        +	test_write_lines a b c d e F g h i j k l m n o p Q r s t u v >file &&
>       - 	git add file &&
>       --	test_write_lines a b c d e f G h i j k l m >file &&
>       --	echo y | git -c diff.context=5 add -p >actual &&
>       --	test_grep "@@ -2,11 +2,11 @@" actual
>       ++	git add file &&
>        +	echo y | git -c diff.context=5 -c diff.interhunkcontext=1 \
>        +		reset -p -U 4 --inter-hunk-context 2 >actual &&
>        +	test_grep "@@ -2,20 +2,20 @@" actual
>       - '
>       -
>       --test_expect_success 'add -p respects diff.interHunkContext' '
>       --	test_write_lines a b c d e f g h i j k l m n o p q r s >file &&
>       --	git add file &&
>       --	test_write_lines a b c d E f g i i j k l m N o p q r s >file &&
>       --	echo y | git -c diff.interhunkcontext=2 add -p >actual &&
>       --	test_grep "@@ -2,16 +2,16 @@" actual
>       ++'
>       ++
>        +test_expect_success 'stash accepts -U and --inter-hunk-context' '
>        +	test_write_lines a b c d e F g h i j k l m n o p Q r s t u v >file &&
>        +	git commit -m file file &&
>       @@ t/t3701-add-interactive.sh: test_expect_success 'hunk splitting works with diff.
>        +	echo y | git -c diff.context=5 -c diff.interhunkcontext=1 \
>        +		stash -p -U 4 --inter-hunk-context 2 >actual &&
>        +	test_grep "@@ -2,20 +2,20 @@" actual
>       - '
>       -
>       --test_expect_success 'add -p rejects negative diff.context' '
>       --	test_config diff.context -1 &&
>       --	test_must_fail git add -p 2>output &&
>       --	test_grep "diff.context cannot be negative" output
>       --'
>       ++'
>       ++
>        +for cmd in add checkout commit reset restore "stash save" "stash push"
>        +do
>        +	test_expect_success "$cmd rejects invalid context options" '
>       @@ t/t3701-add-interactive.sh: test_expect_success 'hunk splitting works with diff.
>        +		test_grep -E ".--inter-hunk-context. requires .(--interactive/)?--patch." actual
>        +	'
>        +done
>       -
>       - test_done
>       -
>       - ## t/t4055-diff-context.sh ##
>       -@@ t/t4055-diff-context.sh: test_expect_success 'The -U option overrides diff.context' '
>       - 	test_grep ! "^ firstline" output
>       - '
>       -
>       -+test_expect_success 'The -U option overrides diff.context for "add"' '
>       -+	test_config diff.context 8 &&
>       -+	git add -U4 -p >output &&
>       -+	test_grep ! "^ firstline" output
>       -+'
>       -+
>       -+test_expect_success 'The -U option overrides diff.context for "commit"' '
>       -+	test_config diff.context 8 &&
>       -+	! git commit -U4 -p >output &&
>       -+	test_grep ! "^ firstline" output
>       -+'
>       -+
>       -+test_expect_success 'The -U option overrides diff.context for "checkout"' '
>       -+	test_config diff.context 8 &&
>       -+	git checkout -U4 -p >output &&
>       -+	test_grep ! "^ firstline" output
>       -+'
>        +
>       -+test_expect_success 'The -U option overrides diff.context for "stash"' '
>       -+	test_config diff.context 8 &&
>       -+	! git stash -U4 -p >output &&
>       -+	test_grep ! "^ firstline" output
>       -+'
>       -+
>       -+test_expect_success 'The -U option overrides diff.context for "restore"' '
>       -+	test_config diff.context 8 &&
>       -+	git restore -U4 -p >output &&
>       -+	test_grep ! "^ firstline" output
>       -+'
>       -+
>       - test_expect_success 'diff.context honored by "diff"' '
>       - 	test_config diff.context 8 &&
>       - 	git diff >output &&
>       + test_done
>        
>         ## t/t9902-completion.sh ##
>        @@ t/t9902-completion.sh: test_expect_success 'double dash "git checkout"' '
> 
Previous: Leon Michalak via GitGitGadgetNext: Junio C Hamano
Message 74 of 77 in “Better support for customising context lines in --patch commands”
  1. 0/3 Better support for customising context lines in --patch commandsLeon Michalak via GitGitGadget, May 5, 2025
  2. 1/3 add-patch: respect diff.context configurationLeon Michalak via GitGitGadget, May 5, 2025
  3. Eric SunshineMay 5, 2025
  4. Phillip WoodMay 6, 2025
  5. Junio C HamanoMay 6, 2025
  6. 3/3 add-interactive: add new "context" subcommandLeon Michalak via GitGitGadget, May 5, 2025
  7. Eric SunshineMay 6, 2025
  8. Leon MichalakMay 6, 2025
  9. Christian CouderMay 6, 2025
  10. Leon MichalakMay 6, 2025
  11. Junio C HamanoMay 6, 2025
  12. Leon MichalakMay 6, 2025
  13. Phillip WoodMay 7, 2025
  14. Junio C HamanoMay 7, 2025
  15. 2/3 add-patch: add diff.context command line overridesLeon Michalak via GitGitGadget, May 5, 2025
  16. Kristoffer HaugsbakkMay 5, 2025
  17. Phillip WoodMay 7, 2025
  18. Junio C HamanoMay 7, 2025
  19. Leon MichalakMay 7, 2025
  20. Junio C HamanoMay 7, 2025
  21. 0/4 Better support for customising context lines in --patch commandsLeon Michalak via GitGitGadget, May 10, 2025
  22. 1/4 test: refactor to use "test_grep"Leon Michalak via GitGitGadget, May 10, 2025
  23. Junio C HamanoMay 12, 2025
  24. Leon MichalakMay 12, 2025
  25. 2/4 test: refactor to use "test_config"Leon Michalak via GitGitGadget, May 10, 2025
  26. 3/4 add-patch: respect diff.context configurationLeon Michalak via GitGitGadget, May 10, 2025
  27. Phillip WoodMay 13, 2025
  28. Junio C HamanoMay 13, 2025
  29. Phillip WoodMay 14, 2025
  30. Junio C HamanoMay 15, 2025
  31. 4/4 add-patch: add diff.context command line overridesLeon Michalak via GitGitGadget, May 10, 2025
  32. Junio C HamanoMay 12, 2025
  33. Leon MichalakMay 12, 2025
  34. Phillip WoodMay 13, 2025
  35. Phillip WoodMay 13, 2025
  36. Leon MichalakMay 13, 2025
  37. phillip.wood123@gmail.comMay 14, 2025
  38. 0/4 Better support for customising context lines in --patch commandsLeon Michalak via GitGitGadget, Jun 28, 2025
  39. 1/4 test: use "test_grep"Leon Michalak via GitGitGadget, Jun 28, 2025
  40. Junio C HamanoJun 30, 2025
  41. 2/4 test: use "test_config"Leon Michalak via GitGitGadget, Jun 28, 2025
  42. Junio C HamanoJun 30, 2025
  43. 4/4 add-patch: add diff.context command line overridesLeon Michalak via GitGitGadget, Jun 28, 2025
  44. Junio C HamanoJun 30, 2025
  45. Phillip WoodJul 1, 2025
  46. Junio C HamanoJul 1, 2025
  47. Phillip WoodJul 2, 2025
  48. Junio C HamanoJul 2, 2025
  49. Phillip WoodJul 1, 2025
  50. 3/4 add-patch: respect diff.context configurationLeon Michalak via GitGitGadget, Jun 28, 2025
  51. Junio C HamanoJun 30, 2025
  52. Phillip WoodJul 1, 2025
  53. Junio C HamanoJun 30, 2025
  54. Junio C HamanoJul 9, 2025
  55. Leon MichalakJul 9, 2025
  56. Junio C HamanoJul 9, 2025
  57. 0/4 Better support for customising context lines in --patch commandsLeon Michalak via GitGitGadget, Jul 19, 2025
  58. 1/4 t: use test_grep in t3701 and t4055Leon Michalak via GitGitGadget, Jul 19, 2025
  59. 2/4 t: use test_config in t4055Leon Michalak via GitGitGadget, Jul 19, 2025
  60. 3/4 add-patch: respect diff.context configurationLeon Michalak via GitGitGadget, Jul 19, 2025
  61. 4/4 add-patch: add diff.context command line overridesLeon Michalak via GitGitGadget, Jul 19, 2025
  62. Phillip WoodJul 22, 2025
  63. Leon MichalakJul 22, 2025
  64. Leon MichalakJul 22, 2025
  65. Phillip WoodJul 23, 2025
  66. Junio C HamanoJul 21, 2025
  67. Phillip WoodJul 22, 2025
  68. Junio C HamanoJul 22, 2025
  69. 0/4 Better support for customising context lines in --patch commandsLeon Michalak via GitGitGadget, Jul 29, 2025
  70. 2/4 t: use test_config in t4055Leon Michalak via GitGitGadget, Jul 29, 2025
  71. 3/4 add-patch: respect diff.context configurationLeon Michalak via GitGitGadget, Jul 29, 2025
  72. 1/4 t: use test_grep in t3701 and t4055Leon Michalak via GitGitGadget, Jul 29, 2025
  73. 4/4 add-patch: add diff.context command line overridesLeon Michalak via GitGitGadget, Jul 29, 2025
  74. Phillip WoodJul 29, 2025
  75. Junio C HamanoJul 29, 2025
  76. Leon MichalakJul 29, 2025
  77. Leon MichalakMay 5, 2025

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.