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

Re: git-mergetool reverse file ordering

From
David Aguilar <davvid@gmail.com>
Date
Aug 14, 2016, 03:42 UTC
Message-ID
<20160814034221.GB21057@gmail.com>
In-Reply-To
<CAD8hE_yzNZDPkxRy8s4Fy2_dZN5ppWzLM_2xc01C-VAdR1Pj_g@mail.gmail.com>
On Wed, Jul 27, 2016 at 11:14:28AM +0100, Luis Gutierrez wrote:
Show 19 quoted lines
> Hi,
> 
> Attached is a potential patch for reversing the order on which
> git-mergetool presents the files to merge.
> 
> Currently, when running git-mergetool, it performs a sort of the files
> to merge by alphabetical ordering. When working on C, this has the
> annoying effect of presenting the merge for a .c* files before the
> header files; which is always a bit harder to do. Reading the header
> first to figure out what the other dude changed is usually preferred.
> 
> The attach patch reverse the order (-r flag to sort) so *.h* are
> merged before  *.c* files
> 
> PS, given the simplicity of the patch, I have not tested it.
> 
> Regards
> 
> Luis

Thanks for the sug, this is an interesting idea and I definitely see why we would want something like this...

Show 17 quoted lines
> diff --git a/git-mergetool.sh b/git-mergetool.sh
> index bf86270..cce3b0d 100755
> --- a/git-mergetool.sh
> +++ b/git-mergetool.sh
> @@ -453,10 +453,10 @@ then
>  	then
>  		files=$(git rerere remaining)
>  	else
> -		files=$(git ls-files -u | sed -e 's/^[^	]*	//' | sort -u)
> +		files=$(git ls-files -u | sed -e 's/^[^	]*	//' | sort -u -r)
>  	fi
>  else
> -	files=$(git ls-files -u -- "$@" | sed -e 's/^[^	]*	//' | sort -u)
> +	files=$(git ls-files -u -- "$@" | sed -e 's/^[^	]*	//' | sort -u -r)
>  fi
>  
>  if test -z "$files"

While we won't take this patch as-is (please see Documentation/SubmittingPatches for details about the patch submission process), I am interested in the use case you've described.

This use case makes me wonder whether the sorting we do here is something that should be opened up a bit so that the it's not quite so set in stone.

For example, an extension to the approach taken by this patch would be to have `mergetool.reverseOrder` git config boolean option that would tell us whether or not to use the "-r" flag when calling sort.

But, IMO that is too rigid, and only addresses this narrow use case. What if users want a case-insensitive sort, or some other preferred ordering?

We can address these concerns, and your use case, by opening it up. Something like,

	sort=$(git config mergetool.sort || echo sort -u)

That preserves the existing behavior, and it opens it up so that we can accomplish the same result as this patch by doing:

	git config mergetool.sort "sort -u -r"

Then, if someone later writes a nicer C/C++-specific sort that sorts in the natural order but also keeps .h files before .c, .cpp, etc. files with the same basename, then they could do:

	git config mergetool.sort crescent-fresh-sort
...and it'll be totally crescent.

Thoughts? Would you be interested in helping work up a patch for this idea? At a minimum we should also write a test case in t/t7610-mergetool.sh to verify that it works as advertised.

Let me know if you have any questions.
cheers,
-- 
David
Previous: Luis GutierrezNext: John Keeping
Message 2 of 10 in “git-mergetool reverse file ordering”
  1. Luis GutierrezJul 27, 2016
  2. David AguilarAug 14, 2016
  3. John KeepingAug 14, 2016
  4. Luis GutierrezAug 15, 2016
  5. David AguilarAug 17, 2016
  6. Johannes SixtAug 17, 2016
  7. Johannes SixtAug 17, 2016
  8. David AguilarAug 17, 2016
  9. Johannes SixtAug 17, 2016
  10. David AguilarAug 17, 2016

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.