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

Re: [PATCH v2] difftool --dir-diff: always use identical working tree file

From
John Keeping <john@keeping.me.uk>
Date
May 28, 2013, 19:08 UTC
Message-ID
<20130528190829.GB17475@serenity.lan>
In-Reply-To
<7v7gij0w6z.fsf@alter.siamese.dyndns.org>
On Tue, May 28, 2013 at 11:57:08AM -0700, Junio C Hamano wrote:
Show 25 quoted lines
> John Keeping <john@keeping.me.uk> writes:
> 
> > Yeah, the commit message is still quite focused on the end effect of
> > copying files back.  But that's not what's being changed here.
> >
> > In my suggested commit message I tried to make it clear that we're
> > changing when we decide to copy a file across to the temporary tree.
> > This has the beneficial (side-)effect of changing the set of files we
> > consider for copying back into the working tree after the diff tool has
> > been run.
> 
> I actually think the effect of copying files back _is_ the primary
> motivation of this change, and stressing that end effect is a much
> better description.  After all, if the working tree files do not
> have any difference from the RHS of the comparison, copying from the
> working tree and stuffing the $rsha1 to the RHS temporary index and
> running "checkout -f" should produce identical temporary directory
> for the user to start viewing.
> 
> The _only_ difference in behaviour before and after this patch that
> matters to the end user is if that path is in @working_tree, which
> is returned to @worktree of dir_diff sub to be later copied back,
> no?  I would view this change as a mere means, an implementation
> detail, to achieve that end of stuffing more paths in the @worktree
> array.

I agree with this, but like you I found it confusing that the patch touched code seemingly unrelated to copying files back. I went toward describing the patch more literally and giving the motivation in the final paragraph. Your message below is better, but I think it needs to say that the set of files considered for copying back is the set that is copied across to begin with.

Show 38 quoted lines
> Perhaps
> 
> 	difftool --dir-diff: allow changing any clean working tree file
> 
> 	The temporary directory prepared by "difftool --dir-diff" to
> 	show the result of a change can be modified by the user via
> 	the tree diff program, and we try hard not to lose changes
> 	to them after tree diff program returns to us.
> 
>         However, the set of files to be copied back is computed
> 	differently between --symlinks and --no-symlinks modes.  The
> 	former checks all paths that start out as identical to the
> 	working tree file, while the latter checks paths that
> 	already had a local modification in the working tree,
> 	allowing changes made in the tree diff program to paths that
> 	did not have any local change to be lost.
> 
> or something.  This invites a few questions, though.
> 
>  - By allowing these files in the temporary directory to be
>    modified, aren't we making the user's life harder by forcing them
>    to handle "working tree file was already modified, made different
>    changes in the temporary directory, now these changes need to be
>    consolidated" case?
> 
>  - When comparing two revisions, e.g. "--dir-diff HEAD^^ HEAD^",
>    that checks out (via $rsha1 to "checkout -f" codepath) a blob
>    that does not match what is in the working tree of HEAD to the
>    temporary directory, we still allow modifications to the copy in
>    the temporary directory, but what can the user do with these
>    changes that are _not_ based on HEAD, short of checking out HEAD^
>    and apply the difference first?
> 
> I still cannot shake this nagging feeling that giving a writable
> temporary directory might have been a mistake in the first place.
> Perhaps it may be a better design to make the ones that the user
> shouldn't touch (or will lead to the above confusion) read-only,
> while the ones that match the working tree read-write?

My ideal scenario would be that we only allow users to edit files when they are comparing against the working tree, but that would require git-difftool to fully understand all git-diff options since it just passes through any it doesn't recognise. I don't think there's an easy way to do that, which leaves us with this confusing situation.

Previous: Junio C HamanoNext: Junio C Hamano
Message 7 of 10 in “difftool --dir-diff: copy back all files matching the working tree”
  1. difftool --dir-diff: copy back all files matching the working treeKenichi Saita, May 26, 2013
  2. John KeepingMay 26, 2013
  3. difftool --dir-diff: always use identical working tree fileKenichi Saita, May 27, 2013
  4. Junio C HamanoMay 28, 2013
  5. John KeepingMay 28, 2013
  6. Junio C HamanoMay 28, 2013
  7. John KeepingMay 28, 2013
  8. Junio C HamanoMay 28, 2013
  9. difftool --dir-diff: allow changing any clean working tree fileKenichi Saita, May 29, 2013
  10. Junio C HamanoMay 29, 2013

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.