Re: [PATCH 0/3] Teach Git about the patience diff algorithm
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Jan 7, 2009, 20:38 UTC
- Message-ID
- <alpine.DEB.1.00.0901072121260.7496@intel-tinevez-2-302>
- In-Reply-To
- <1231359317.6011.12.camel@maia.lan>
Hi,
On Thu, 8 Jan 2009, Sam Vilain wrote:
Show 8 quoted lines
> On Tue, 2009-01-06 at 20:40 +0100, Johannes Schindelin wrote: > > Although I would like to see it in once it is fleshed out -- even if it > > does not meet our usefulness standard -- because people said Git is > > inferior for not providing a patience diff. If we have --patience, we can > > say "but we have it, it's just not useful, check for yourself". > > Whatever happens, the current deterministic diff algorithm needs to stay > for generating patch-id's... those really can't be allowed to change.
Oh, there is no discussion about replacing the diff algorithm we have right now.
Even if we never output patch-ids anywhere, so we always recalculate them, and therefore would be free to replace the diff algorithm with something else.
The thing why I do not want patience diff to replace the existing code is:
- patience diff is slower, - patience diff is often not worth it (produces the same, maybe even worse output), and - patience diff needs the existing code as a fallback anyway.
Where it could possibly help to change existing behavior is with merging.
So maybe somebody has some time to play with, and can apply this patch:
-- snip --
diff --git a/ll-merge.c b/ll-merge.c index fa2ca52..f731026 100644 --- a/ll-merge.c +++ b/ll-merge.c @@ -79,6 +79,8 @@ static int ll_xdl_merge(const struct ll_merge_driver *drv_unused, memset(&xpp, 0, sizeof(xpp)); if (git_xmerge_style >= 0) style = git_xmerge_style; + if (getenv("GIT_PATIENCE_MERGE")) + xpp.flags |= XDF_PATIENCE_DIFF; return xdl_merge(orig, src1, name1, src2, name2, -- snap -- After compiling and installing, something like this should be fun to watch: $ git rev-list --all --parents | \ grep " .* " | \ while read commit parent1 parent2 otherparents do test -z "$otherparents" || continue git checkout $parent1 && git merge $parent2 && git diff > without-patience.txt && git reset --hard $parent1 && GIT_PATIENCE_MERGE=1 git merge $parent2 && git diff > with-patience.txt && if ! cmp without-patience.txt with-patience.txt then echo '===============================' echo "differences found in merge $commit" echo "without patience: $(wc -l < without-patience.txt)" echo "with patience: $(wc -l < with-patience.txt)" echo '-------------------------------' echo 'without patience:' cat without-patience.txt echo '-------------------------------' echo 'with patience:' cat with-patience.txt fi || exit done | tee patience-merge.out Ciao, Dscho