git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: What's cooking in git.git (Mar 2014, #04; Thu, 20)

From
Junio C Hamano <gitster@pobox.com>
Date
Mar 20, 2014, 22:31 UTC
Message-ID
<xmqqsiqcwlh4.fsf@gitster.dls.corp.google.com>
In-Reply-To
<xmqq4n2sy3ux.fsf@gitster.dls.corp.google.com>
Junio C Hamano <gitster@pobox.com> writes:
Show 34 quoted lines
> Quite a few topics are still outside 'pu' and I suspect some of the
> larger ones deserve deeper reviews to help moving them to 'next'.
> In principle, I'd prefer to keep any large topic that touch core
> part of the system cooking in 'next' for at least a full cycle, and
> the sooner they get merged to 'next', the better.  Help is greatly
> appreciated.
> ...
> * ks/tree-diff-nway (2014-03-04) 19 commits
>  - combine-diff: speed it up, by using multiparent diff tree-walker directly
>  - tree-diff: rework diff_tree() to generate diffs for multiparent cases as well
>  - Portable alloca for Git
>  - tree-diff: reuse base str(buf) memory on sub-tree recursion
>  - tree-diff: no need to call "full" diff_tree_sha1 from show_path()
>  - tree-diff: rework diff_tree interface to be sha1 based
>  - tree-diff: diff_tree() should now be static
>  - tree-diff: remove special-case diff-emitting code for empty-tree cases
>  - tree-diff: simplify tree_entry_pathcmp
>  - tree-diff: show_path prototype is not needed anymore
>  - tree-diff: rename compare_tree_entry -> tree_entry_pathcmp
>  - tree-diff: move all action-taking code out of compare_tree_entry()
>  - tree-diff: don't assume compare_tree_entry() returns -1,0,1
>  - tree-diff: consolidate code for emitting diffs and recursion in one place
>  - tree-diff: show_tree() is not needed
>  - tree-diff: no need to pass match to skip_uninteresting()
>  - tree-diff: no need to manually verify that there is no mode change for a path
>  - combine-diff: move changed-paths scanning logic into its own function
>  - combine-diff: move show_log_first logic/action out of paths scanning
>
>  Instead of running N pair-wise diff-trees when inspecting a
>  N-parent merge, find the set of paths that were touched by walking
>  N+1 trees in parallel.  These set of paths can then be turned into
>  N pair-wise diff-tree results to be processed through rename
>  detections and such.  And N=2 case nicely degenerates to the usual
>  2-way diff-tree, which is very nice.

So I started re-reading this series, and decided that it might be easier to advance the topic piece-by-piece. Will be merging up to "consolidate code for emitting diffs" to 'next', after tweaking that last commit a bit (see below).

Kirill Smelkov <kirr@mns.spb.ru> writes:
> Currently both compare_tree_entry() and show_path() invoke opt diff
s/show_path/show_entry/;
Show 18 quoted lines
> callbacks (opt->add_remove() and opt->change()), and also they both have
> code which decides whether to recurse into sub-tree, and whether to emit
> a tree as separate entry if DIFF_OPT_TREE_IN_RECURSIVE is set.
>
> I.e. we have code duplication and logic scattered on two places.
>
> Let's consolidate it...
> ...
> +/* convert path, t1/t2 -> opt->diff_*() callbacks */
> +static void emit_diff(struct diff_options *opt, struct strbuf *path,
> +		      struct tree_desc *t1, struct tree_desc *t2)
> +{
> +	unsigned int mode1 = t1 ? t1->entry.mode : 0;
> +	unsigned int mode2 = t2 ? t2->entry.mode : 0;
> +
> +	if (mode1 && mode2) {
> +		opt->change(opt, mode1, mode2, t1->entry.sha1, t2->entry.sha1,
> +			1, 1, path->buf, 0, 0);

This is not too bad per-se, but it would have been even better if this part was done as:

	if (t1 && t2) {
		opt->change(opt, t1->entry.mode1, t1->entry.mode2,
                	    t1->entry.sha1, t2->entry.sha1,
			    1, 1, path->buf, 0, 0);
	}

Then we do not have to rely on an extra convention, "'mode == 0' means the entry is missing", in addition to what we already have, i.e. "t == NULL means the entry is missing".

This is minor, so I will not squash such a change in while merging to 'next', but we may want to revisit and fix it up as a follow up patch once the series is settled.

> +	}
> +	else {
Style; I've merged these two lines into one, i.e.
	} else {

There was another instance of it in show_path(), which I also tweaked.

Thanks.
Previous: Junio C HamanoNext: kirr@navytux.spb.ru
Message 6 of 7 in “What's cooking in git.git (Mar 2014, #04; Thu, 20)”
  1. Junio C HamanoMar 20, 2014
  2. Torsten BögershausenMar 20, 2014
  3. Junio C HamanoMar 20, 2014
  4. Junio C HamanoMar 21, 2014
  5. Junio C HamanoMar 21, 2014
  6. Junio C HamanoMar 20, 2014
  7. kirr@navytux.spb.ruMar 21, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.