From: Junio C Hamano Date: Tue, 26 Apr 2005 07:39:59 GMT Subject: Re: [PATCH 0/2] diff-tree/diff-cache helper Message-ID: <7vll76ouk0.fsf@assigned-by-dhcp.cox.net> In-Reply-To: >>>>> "LT" == Linus Torvalds writes: LT> Good, applied. LT> This also makes me think that we should just make "show-diff" show the LT> same format, at which point show-diff actually matches all the other LT> tools, and it is likely to make show-diff more useful to boot. Matching is good, ... LT> Maybe rename the "show-diff" command to be "cache-diff", and if somebody LT> wants the old "show-diff" thing, just have a script that does LT> #!/bin/sh LT> cache-diff | diff-tree-helper LT> and nothing more. Well, great minds do not think alike ;-) I was actually going in quite the opposite way for the same goal of "matching". My plan was to rewrite the external diff interface once more to make it more generic. Then to add -p (patch) flag to diff-tree and diff-cache, so that we do not need diff-tree-helper anymore. My ultimate motive for all of this is to make the core GIT useful enough to render Cogito or any other wrapper layer more or less irrelevant ;-). Well type ^W a couple of times and rephrase that to make things easier for the wrapper layer. Jokes aside, I have updated the external diff interface and will be sending you a patch in a separate message. The existing external diff interface had a horrible interface to the callers, and it had a hardcoded knowledge of how to call diff and what parameters to pass in which order, so the customization the end user or the scripts could make was quite limited. The updated interface allows pretty much arbitrary formatting, so "git diff" can put SHA1 instead of short-and-sweet 'a' or 'b' as directory prefix in the patch output, for example. When an environment variable GIT_EXTERNAL_DIFF exists, it names a script that takes 7 parameters: name file1 sha1-1 mode1 file2 sha1-2 mode2 This is essentially the same idea you used for merge-cache. Then the named command can use these information to generate and format the diff any way it wants. See how it interfaces using the examples like this: GIT_EXTERNAL_DIFF=echo show-diff diff-cache $(cat .git/HEAD) | \ GIT_EXTERNAL_DIFF=./jit-external-diff-script diff-tree-helper The patch comes with a sample script, jit-external-diff-script, but it is not much better than the built-in one; I do not expect it to be used for anything other than starting point for wrapper writers. Without the environment variable, it uses a built-in implementation that behaves exactly like the traditional show-diff, and it can be customized via GIT_DIFF_CMD and GIT_DIFF_OPTS as before.