From 0d17c0c99a95180f2877404d20a26f4388a06f64 Mon Sep 17 00:00:00 2001 From: Wolfgang Müller Date: Wed, 11 Aug 2021 16:42:36 +0200 Subject: content: Add new post: "Better hunk headers with gitattributes(5)" --- content/11/index.md | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 content/11/index.md diff --git a/content/11/index.md b/content/11/index.md new file mode 100644 index 0000000..e356ee5 --- /dev/null +++ b/content/11/index.md @@ -0,0 +1,50 @@ ++++ +date = 2021-08-11T16:41:49+02:00 +title = "Better hunk headers with gitattributes(5)" + +[taxonomies] +tags = ["git", "TIL"] ++++ + +Yesterday whilst catching up on the Git mailing list I stumbled upon this +[patch](https://public-inbox.org/git/20210810190937.305765-1-tsdh@gnu.org/) +proposing to improve the hunk header regex for Java. I had never paid much +attention to how [`git-diff(1)`](https://git-scm.com/docs/git-diff) finds the +right method signature to show in the headers though I was vaguely aware of a +bunch of regexes for different languages. + +Turns out that by default, as explained in the manual for +[`gitattributes(5)`](https://git-scm.com/docs/gitattributes#_defining_a_custom_hunk_header), +`git-diff(1)` emulates the behaviour of GNU `diff -p` and does **not** consult +any of the language-specific regular expressions. This came as a bit of a +surprise to me, as Git usually has relatively sane and extensive defaults. Why +define all these regexes and then not use them by default? + +Perhaps one reason is that it is hard to tell when to use which. Git can only +look at the filename, and not all shell scripts share the `.sh` ending, for +example. Surely it would not be too invasive, however, to define sensible +defaults for, say, files ending in `.py` or `.rs`. + +In any case I updated my `~/.config/git/attributes` with the following, and am +now enjoying better hunk headers across the board: + +``` +*.c diff=cpp +*.cpp diff=cpp +*.go diff=go +*.md diff=markdown +*.pl diff=perl +*.py diff=python +*.rs diff=rust +*.sh diff=bash +*.tex diff=tex +``` + +The markdown setting is especially neat since it will now display the nearest +section right in the diff, like so: + +```diff +--- a/posts/weltschmerz.md ++++ b/posts/weltschmerz.md +@@ -24,6 +24,10 @@ ## Download +``` -- cgit v1.2.3-2-gb3c3