git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Elijah Newren <newren@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Ben Peart <peartben@gmail.com>,
	Git Mailing List <git@vger.kernel.org>,
	Kevin Willford <kewillf@microsoft.com>,
	Ben Peart <benpeart@microsoft.com>
Subject: Re: [BUG] merge-recursive overly aggressive when skipping updating the working tree
Date: Fri, 20 Jul 2018 16:02:01 -0700	[thread overview]
Message-ID: <CABPp-BGVtP4-_LYh7SjSSoTwcm+ZiKbCRSuK0MCo_wvUWBj3vg@mail.gmail.com> (raw)
In-Reply-To: <xmqqbmb1a7ga.fsf@gitster-ct.c.googlers.com>

On Fri, Jul 20, 2018 at 3:05 PM, Junio C Hamano <gitster@pobox.com> wrote:
> Elijah Newren <newren@gmail.com> writes:
>
>> Ah, okay, that's helpful.  So, if there are conflicts, it should be
>> free to clear the skip_worktree flag.  Since merge-recursive calls
>> add_cacheinfo() for all entries it needs to update, which deletes the
>> old cache entry and just makes new ones, we get that for free.
>
> Correct.
>
>> And conversely, if a file-level merge succeeds without conflicts then
>> it clearly doesn't "need to materialize a working tree file", so it
>> should NOT clear the skip_worktree flag for that path.
>
> That is not at all implied by what I wrote, though.
>
> If it can be done without too much effort, then it certainly is
> nicer to keep the sparseness when we do not have to materialize the
> working tree file.  But at least in my mind, if it needs too many
> special cases, hacks, and conditionals, then it is not worth the
> complexity---if it is easier to write a correct code by allowing Git
> to populate working tree files, it is perfectly fine to do so.
>
> In a sense, the sparse checkout "feature" itself is a hack by
> itself, and that is why I think this part should be "best effort" as
> well.

That's good to know, but I don't think we can back out easily:
  - Clearing the skip_worktree bit: no big deal, as you mention above
  - Avoiding working tree updates when merge doesn't change them: very
desirable[1]
  - Doing both: whoops

[1] https://public-inbox.org/git/CA+55aFzLZ3UkG5svqZwSnhNk75=fXJRkvU1m_RHBG54NOoaZPA@mail.gmail.com/


I don't want to regress the bug Linus reported, so to fix Ben's issue,
when we detect that a path's contents/mode won't be modified by the
merge, we can either:
  - Update the working tree file if the original cache entry had the
skip_worktree flag set
  - Mark the new cache entry as skip_worktree if the original cache
entry had the skip_worktree flag set

Both should be about the same amount of work; the first seems weird
and confusing for future readers of the code.  The second makes sense,
but probably should be accompanied with a note in the code about how
there are other codepaths that could consider skip_worktree too.

I'll see if I can put something together, but I have family flying in
tomorrow, and then am out on vacation Mon-Sat next week, so...

  reply	other threads:[~2018-07-20 23:02 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-20 19:53 [BUG] merge-recursive overly aggressive when skipping updating the working tree Ben Peart
2018-07-20 20:48 ` Elijah Newren
2018-07-20 21:13   ` Junio C Hamano
2018-07-20 21:42     ` Elijah Newren
2018-07-20 22:05       ` Junio C Hamano
2018-07-20 23:02         ` Elijah Newren [this message]
2018-07-23 12:49           ` Ben Peart
2018-07-21  6:34 ` [PATCH 0/2] Preserve skip_worktree bit in merges when necessary Elijah Newren
2018-07-21  6:34   ` [PATCH 1/2] t3507: add a testcase showing failure with sparse checkout Elijah Newren
2018-07-21  7:21     ` Eric Sunshine
2018-07-23 13:12       ` Ben Peart
2018-07-23 18:09         ` Eric Sunshine
2018-07-23 18:22           ` Ben Peart
2018-07-21 13:02     ` Ben Peart
2018-07-23 18:12       ` Junio C Hamano
2018-07-21  6:34   ` [PATCH 2/2] merge-recursive: preserve skip_worktree bit when necessary Elijah Newren
2018-07-23 14:14     ` Ben Peart
2018-07-27 12:59 ` [PATCH v2 0/2] Preserve skip_worktree bit in merges " Ben Peart
2018-07-27 12:59   ` [PATCH v2 1/2] t3507: add a testcase showing failure with sparse checkout Ben Peart
2018-07-27 12:59   ` [PATCH v2 2/2] merge-recursive: preserve skip_worktree bit when necessary Ben Peart
2018-07-27 18:14   ` [PATCH v2 0/2] Preserve skip_worktree bit in merges " Junio C Hamano
2018-07-31 16:11   ` Elijah Newren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CABPp-BGVtP4-_LYh7SjSSoTwcm+ZiKbCRSuK0MCo_wvUWBj3vg@mail.gmail.com \
    --to=newren@gmail.com \
    --cc=benpeart@microsoft.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=kewillf@microsoft.com \
    --cc=peartben@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).