| #!/bin/bash |
| |
| # This script is used to produce git context diffs |
| |
| # Supplied parameters: |
| # $1 $2 $3 $4 $5 $6 $7 |
| # path old-file old-hash old-mode new-file new-hash new-mode |
| # 'path' is the git-tree-relative path of the file being diff'ed |
| |
| =comment |
| |
| This info is copied from the old wiki page on Working with git: |
| |
| Context diffs with Git |
| |
| Copy git-external-diff into libexec/git-core/ of your git installation |
| and configure git to use that wrapper with: |
| |
| git config [--global] diff.external git-external-diff |
| |
| --global makes the configuration global for your user - otherwise it is |
| just configured for the current repository. |
| |
| For every command which displays diffs in some way you can use the |
| parameter "--[no-]-ext-diff" to enable respectively disable using the |
| external diff command. |
| |
| For the git diff command --ext-diff is enabled by default - for any |
| other command like git log -p or git format-patch it is not! |
| |
| This method should work on all platforms supported by git. |
| |
| If you do not want to configure the external wrapper permanently or you |
| want to overwrite it you can also invoke git like: |
| |
| export GIT_EXTERNAL_DIFF=git-external-diff |
| git diff --[no-]ext-diff |
| |
| Alternatively, configure a git alias in ~/.gitconfig or .git/config: |
| |
| [alias] |
| cdiff = !GIT_EXTERNAL_DIFF=git-context-diff git diff |
| =cut |
| |
| old_hash="$3" |
| new_hash=$(git hash-object "$5") |
| |
| # no change? |
| [ "$old_hash" = "$new_hash" ] && exit 0 |
| |
| [ "$DIFF_OPTS" = "" ] && DIFF_OPTS='-pcd' |
| |
| echo "diff --git a/$1 b/$1" |
| echo "new file mode $7" |
| echo "index ${old_hash:0:7}..${new_hash:0:7}" |
| |
| diff --label a/"$1" --label b/"$1" $DIFF_OPTS "$2" "$5" |
| |
| exit 0 |