Skip to content

Instantly share code, notes, and snippets.

@ruediger
Last active September 2, 2024 17:28
Show Gist options
  • Save ruediger/5647207 to your computer and use it in GitHub Desktop.
Save ruediger/5647207 to your computer and use it in GitHub Desktop.
A collection of additional "custom hunk header" patterns for .gitattributes. This provides better context in the diff hunk header.
*.tex diff=tex
*.bib diff=bibtex
*.c diff=cpp
*.h diff=cpp
*.c++ diff=cpp
*.h++ diff=cpp
*.cpp diff=cpp
*.hpp diff=cpp
*.cc diff=cpp
*.hh diff=cpp
*.m diff=matlab
*.py diff=python
*.rb diff=ruby
*.php diff=php
*.pl diff=perl
*.html diff=html
*.xhtml diff=html
*.f diff=fortran
*.lisp diff=lisp
*.el diff=lisp
*.r diff=rstats
*.texi* diff=texinfo
*.org diff=orgmode
*.rs diff=rust
*.pdf diff=pdf
*.png diff=exif
*.jpg diff=exif
*.jpeg diff=exif
*.gif diff=exif
[diff "lisp"]
xfuncname = "^(\\(.*)$"
# xfuncname = "^(\\((cl-)?def(un|macro|method).*)$"
[diff "rstats"]
xfuncname = "^([a-zA-z.]+ <- function.*)$"
[diff "texinfo"]
# from http://git.savannah.gnu.org/gitweb/?p=coreutils.git;a=blob;f=.gitattributes;h=c3b2926c78c939d94358cc63d051a70d38cfea5d;hb=HEAD
xfuncname = "^@node[ \t][ \t]*\\([^,][^,]*\\)"
[diff "orgmode"]
xfuncname = "^(\\*+.*)$"
#[diff "css"]
# xfuncname = "^([a-zA-Z#.@][^\\}]*)$"
# xfuncname = "^(.*\\{)$"
[diff "rust"] # Thanks to csabahenk
xfuncname = "^[ \t]*(pub|)[ \t]*((fn|struct|enum|impl|trait|mod)[^;]*)$"
[diff "exif"]
binary = true
# sudo apt-get install libimage-exiftool-perl
textconv = exiftool
[diff "pdf"]
textconv = pdftotext-stdout
# sudo apt-get install pdftotext
# copy the following to a script pdftotext-stdout somehwere in $PATH
# #!/bin/bash
# pdftotext "$@" -
@DamienCassou
Copy link

For javascript:

[diff "ecmascript"]
        xfuncname = "^((.*function.*)|([ \t]+it\\(.*))$"

@baiwfg2
Copy link

baiwfg2 commented Mar 29, 2020

Is there c++ xfuncname ?

@Konfekt
Copy link

Konfekt commented Jul 22, 2021

Further set up for diffing binary documents.

@SuperSandro2000
Copy link

I am searching for patterns for haskell or nix. Can anyone help?

@mdeweerd
Copy link

mdeweerd commented Aug 13, 2024

The built-in filter for php did not work well for me.
This works better.

[diff "php"]
        xfuncname = "^.*(\\b(((public|protected|private|static)\\s+){1,4}function\\s+[_A-Za-z][_A-Za-z0-9]+\\b\\s*\\()).*$"

@eloyesp
Copy link

eloyesp commented Sep 2, 2024

Sadly I have minified files on some repos, and the only interesting stuff there is the size:

# .gitattributes
*.min.*       diff=minified
[diff "minified"]
        textconv = size
#!/bin/bash

file=$1

bits=$(du -b "$file" | cut -f1)
size=$(du -h "$file" | cut -f1)
compressed_size=$( < "$file" gzip | wc -c - | cut -d' ' -f 1 | numfmt --to=iec )

printf "%10sb -> %5s (%4s gziped)\n" "$bits" "$size" "$compressed_size"

Outputs something like:

diff --git c/assets/app.min.js w/assets/app.min.js
index 0c9178d..077b550 100644
--- c/assets/app.min.js
+++ w/assets/app.min.js
@@ -1 +1 @@
-     41907b ->   44K ( 11K gziped)
+     43031b ->   44K ( 12K gziped)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment