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

Re: [sort-of-BUG] merge-resolve cannot resolve "content/mode" conflict

From
Jeff King <peff@peff.net>
Date
May 19, 2016, 01:03 UTC
Message-ID
<20160519010318.GA23155@sigill.intra.peff.net>
In-Reply-To
<xmqqh9fh5lcl.fsf@gitster.mtv.corp.google.com>
On Mon, Apr 04, 2016 at 10:34:34AM -0700, Junio C Hamano wrote:
Show 28 quoted lines
> Jeff King <peff@peff.net> writes:
> 
> > Imagine a merge where one side changes the content of a path and the
> > other changes the mode. Here's a minimal reproduction:
> >
> >   git init repo && cd repo &&
> >
> >   echo base >file &&
> >   git add file &&
> >   git commit -m base &&
> >
> >   echo changed >file &&
> >   git commit -am content &&
> >
> >   git checkout -b side HEAD^
> >   chmod +x file &&
> >   git commit -am mode
> > ...
> > This is a leftover from my experiments with merge-resolve versus
> > merge-recursive last fall, which resulted in a few actual bug-fixes. I
> > looked into fixing this case, too, at that time. It seemed possible, but
> > a little more involved than you might think (because the logic is driven
> > by a bunch of case statements, and this adds a multiplicative layer to
> > the cases; we might need to resolve the permissions, and _then_ see if
> > the content can be resolved).
> 
> Perhaps I am missing some other codepath in the "multiplicative"
> layer, but is this not sufficient?

Sorry for the super-slow reply; just cleaning out my "to respond to" pile, which has gotten pretty deep.

Looking at it again, I think you are right. I seemed to recall that there were multiple case arms where we dealt with the permissions, but I cannot find such a spot now. So I think the solution you outlined looks good.

Show 13 quoted lines
> -	if test "$6" != "$7"
> +	# Three-way merge of the permissions
> +	perm= ;# assume the result is the same from stage #2, i.e. $6
> +	if test "$6" = "$7" || test "$5" = "$7"
> +	then
> +		: nothing
> +	elif test "$5" = "$6"
>  	then
> +		case "$7" in
> +		100644)	perm=-x ;;
> +		100755) perm=+x ;;
> +		*) echo "ERROR: $7: funny filemode not handled." >&2 ;;
> +		esac

We reject symlinks and submodules earlier, so I think this "funny filemode" error really should only be truly-funny entries. Good.

-Peff
Previous: Junio C Hamano
Message 3 of 3 in “[sort-of-BUG] merge-resolve cannot resolve "content/mode" conflict”
  1. Jeff KingApr 3, 2016
  2. Junio C HamanoApr 4, 2016
  3. Jeff KingMay 19, 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.