All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Markos Chandras <Markos.Chandras@imgtec.com>
Cc: <git@vger.kernel.org>
Subject: Re: git rerere is confused with identical conflicts in multiple files
Date: Fri, 10 Jul 2015 07:13:28 -0700	[thread overview]
Message-ID: <xmqqvbdsksmv.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <559F7C81.50805@imgtec.com> (Markos Chandras's message of "Fri, 10 Jul 2015 09:04:17 +0100")

Markos Chandras <Markos.Chandras@imgtec.com> writes:

> $ cat .git/MERGE_RR
> 5563edc0fb427275a0ca5677c93c40def8b53258
> arch/mips/include/asm/cpu-type.hf175ff6228f624296b661664bce4ab4e84d712cc
>
> arch/mips/include/asm/cpu.h5563edc0fb427275a0ca5677c93c40def8b53258
>    arch/mips/kernel/idle.c5563edc0fb427275a0ca5677c93c40def8b53258
> arch/mips/kernel/spram.c5563edc0fb427275a0ca5677c93c40def8b53258
> arch/mips/kernel/traps.c5563edc0fb427275a0ca5677c93c40def8b53258
> arch/mips/mm/c-r4k.c
>
> so as you see, multiple files share the same hash. That's probably
> because the "conflicting context ( the part between >>> <<<<)" in every
> file but cpu.h is identical and git seems to calculate the hash purely
> on the conflicting context. That makes git rerere thinks that it only
> has to resolve 2 conflicts instead of 6.

Yes, that is by design, and should not change.  The thing is, you do
want to share the same resolution across files, regardless of the
path, when the recorded resolution replays cleanly [*1*].

> Does anyone have an idea how to resolve that? If my assumption is
> correct (I only looked at the git code briefly) I believe it would make
> sense to throw the filepath into the sha1 calculation as well in order
> to ensure it will not conflict with similar changes across different files.

Interesting coincidence, but I have been looking at this for the
past few weeks myself but when you are doing the maintainer of a
reasonably active project, time for your own development is hard
to come by X-<.

My current plan is to allow hashing exactly the same way, but
recording different preimage/postimage pairs as necessary.

Right now we do something like this:

    - See conflict; compute conflict ID.
    - Does rr-cache/$ID/ exist?
      - If not, record rr-cache/$ID/preimage
    - Add $ID to MERGE_RR.

And then for each $ID (and path) in MERGE_RR:

    - Does rr-cache/$ID/postimage exist?
      - If so, attempt three-way merge using preimage, postimage and
        thisimage.
        - Did three-way merge replay cleanly?  If so, be happy.
        - Did three-way merge conflict?  If so, punt.
    - Does path still have conflicts?
      - If not, record rr-cache/$ID/postimage.

The thing to fix is "did it conflict, if so punt" step.  Within the
same conflict ID, we would introduce the concept of "variant", and
allow you to keep rr_cache/$ID/{preimage,postimage}.$variant.  The
first part of the per MERGE_RR entry process would instead go like
so:

    - Does rr-cache/$ID/ has one or more postimages?
      - If so, for each variant, attempt three-way merge using
        preimage, postimage and thisimage.
      - Did one of the three-way merges replay cleanly?
        - If so, be happy.
        - If not, assign an unused variant to this path and change
          its MERGE_RR entry from $ID to $ID.$variant

    - Does path still have conflicts?
      - If not, record rr-cache/$ID/postimage for "variant".

The current "preimage", "postimage" will be kept as the first
variant in rr-cache/$ID/ directory.  The second variant will likely
be named (I don't have a code yet but have been slowly laying out
the fundation to allow us to do this) "preimage.0" and "postimage.0",
and the third one will have ".1" suffix.

This approach has the added benefit that existing rr-cache entries
will stay valid (in addition to being able to replay the same
resolution even after you renamed the path that conflict, unlike the
case when you hashed the pathname together to break the conflict ID
computtion).

A WIP has been published on jc/rerere topic in my repository for the
past few weeks, but I haven't reached the interesting "multi variant"
part yet, as I said.


[Footnote]

*1* My experience urges me to add "And most of the time, the same
resolution does apply cleanly even to multiple paths conflicted in
the same merge" to that sentence.

  reply	other threads:[~2015-07-10 14:13 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-10  8:04 git rerere is confused with identical conflicts in multiple files Markos Chandras
2015-07-10 14:13 ` Junio C Hamano [this message]
2015-07-10 15:21   ` Markos Chandras

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

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

  git send-email \
    --in-reply-to=xmqqvbdsksmv.fsf@gitster.dls.corp.google.com \
    --to=gitster@pobox.com \
    --cc=Markos.Chandras@imgtec.com \
    --cc=git@vger.kernel.org \
    /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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.