Re: [PATCH] The diff-raw format updates.
- From
Junio C Hamano <junkio@cox.net>
- Date
- May 23, 2005, 00:35 UTC
- Message-ID
- <7vu0kubwyg.fsf@assigned-by-dhcp.cox.net>
- In-Reply-To
- <Pine.LNX.4.58.0505221611020.2307@ppc970.osdl.org>
>>>>> "LT" == Linus Torvalds <torvalds@osdl.org> writes:
LT> You seem to think that it's a feature that you can't get the same output LT> out of git-diff-helper, and I think that's not a feature, but a total bug.
I do agree that it is a real problem.
And I think you've filled some holes in the idea I originally had while working on the following (the part you omitted from the quote):
... Unfortunately, the current diffcore interface does not
let the callers (diff-tree family) to tell it to keep the
"stay" entries in its output. I've been working on that
part this morning before this discussion started, so that
electively they can tell the diffcore layer not to do the
"stay" pruning ("stay pruning" will simply become another
diffcore transformation).The change I am making right now is essentially what the above paragraph says, with your "hole-filling", to do something like this:
(1) diff-tree family feeds unmodified entries to the diffcore,
in addition to changes. diffcore-rename matches and merges
them into rename/copy; diffcore-pickaxe filters; other
diffcore transformations may later be written (e.g
reordering the patch so that .h files come first before .c
files). The result of the sequence of these
transformations is fed to the diff_flush() for output.
Essentially this is the same architecture as we already
have. (2) diff_flush() currently prunes _all_ the unmodified entries
just before output happens. This is a _bug_ as you said.
To fix this, first, separate that pruning part (which is
currently embedded in diff_flush_one as the first
statement) out, so this pruning happens independently and
before diff_flush() happens; and make the pruning more
careful, not to prune entries that we _need_ to express
rename/copy distinction in diff-raw output. Namely, it
should keep the unmodified entry for a path _if_ the path
is to be used as the source of a rename or copy entry.
Also diff-patch output needs to be taught to take notice
and ignore such entries. Optionally, the callers may want to tell diffcore not to do
_any_ pruning, making diff-raw output similar to a merge of
ls-files --stage outputs of two trees.LT> I'm arguing that we should consider it a _requirement_ that "raw diffs" LT> can be translated into te same thing the "-p" flag internally does.
To this, I 100% agree, and I think it is doable. Give me a bit more time for testing and tweaking.