git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Bert Wesarg <bert.wesarg@googlemail.com>
To: Pratyush Yadav <me@yadavpratyush.com>
Cc: Git Mailing List <git@vger.kernel.org>,
	Philip Oakley <philipoakley@iee.email>
Subject: Re: [PATCH 2/2] git-gui: support for diff3 conflict style
Date: Mon, 30 Sep 2019 14:17:04 +0200	[thread overview]
Message-ID: <CAKPyHN3nOL6qy4RhwwHrh2m3EJuJ1-rt-8+0+=z2oJi96Nigpw@mail.gmail.com> (raw)
In-Reply-To: <20190929150406.s57pmb3dggfbcqhr@yadavpratyush.com>

[-- Attachment #1: Type: text/plain, Size: 7133 bytes --]

Pratyush,

On Sun, Sep 29, 2019 at 5:04 PM Pratyush Yadav <me@yadavpratyush.com> wrote:
>
> Hi Philip, Bert,
>
> Is there any way I can test this change? Philip, I ran the rebase you
> mention in the GitHub issue [0], and I get that '9c8cba6862abe5ac821' is
> an unknown revision.
>
> Is there any quick way I can reproduce this (maybe on a sample repo)?

The easiest way to produce a merge conflict, is to change the same
line differently in two branches and try to merge them. I added a
fast-import file to demonstrate this for you.

$ git init foo
$ cd foo
$ git fast-import <../conflict-merge.fi
$ git reset --hard master
$ git merge branch

this gets you into the conflict, probably the usual style. Which looks
in liek this on the terminal:

@@@ -2,7 -2,7 +2,11 @@@ Lorem ipsum dolor sit amet, consectetu
  Sed feugiat nisl eget efficitur ultrices.
  Nunc cursus metus rutrum, mollis lorem vitae, hendrerit mi.
  Aenean vestibulum ante ac libero venenatis, non hendrerit orci pharetra.
++<<<<<<< HEAD
 +Proin bibendum purus ut est tristique, non pharetra dui consectetur.
++=======
+ Proin placerat leo malesuada lacinia lobortis.
++>>>>>>> branch
  Pellentesque aliquam libero et nisi scelerisque commodo.
  Quisque id velit sed magna molestie porttitor.
  Vivamus sed urna in risus molestie ultricies.

and this in git gui: https://kgab.selfhost.eu/s/gHHaQqowGp7mXEb

Git gui removes the '++' in front of the marker lines. It therefor
already 'changes' the 'diff'. Though git-apply cannot handle such
'diffs' anyway.

To get the diff3 style do:

$ git merge --abort
$ git -c merge.conflictStyle=diff3 merge branch

This is how it looks in the terminal now:

@@@ -2,7 -2,7 +2,13 @@@ Lorem ipsum dolor sit amet, consectetu
  Sed feugiat nisl eget efficitur ultrices.
  Nunc cursus metus rutrum, mollis lorem vitae, hendrerit mi.
  Aenean vestibulum ante ac libero venenatis, non hendrerit orci pharetra.
++<<<<<<< HEAD
 +Proin bibendum purus ut est tristique, non pharetra dui consectetur.
++||||||| merged common ancestors
++Proin in felis eu elit suscipit rhoncus vel ut metus.
++=======
+ Proin placerat leo malesuada lacinia lobortis.
++>>>>>>> branch
  Pellentesque aliquam libero et nisi scelerisque commodo.
  Quisque id velit sed magna molestie porttitor.
  Vivamus sed urna in risus molestie ultricies.

As you can see, there is not the usual 'I removed this, and added
that' experience, everything is 'added'. Thus I inverted the pre-image
to '--'. Here is how it looks in the gui:
https://kgab.selfhost.eu/s/5c8Tosra7WRfjwJ

> [0] https://github.com/git-for-windows/git/issues/2340
>
> On 25/09/19 10:38PM, Bert Wesarg wrote:
> > This adds highlight support for the diff3 conflict style.
> >
> > The common pre-image will be reversed to --, because it has been removed
> > and either replaced with ours or theirs side.
> >
> > Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>
> > ---
> >  git-gui.sh   |  3 +++
> >  lib/diff.tcl | 22 ++++++++++++++++++++++
> >  2 files changed, 25 insertions(+)
> >
> > diff --git a/git-gui.sh b/git-gui.sh
> > index fd476b6..6d80f82 100755
> > --- a/git-gui.sh
> > +++ b/git-gui.sh
> > @@ -3581,6 +3581,9 @@ $ui_diff tag conf d_s- \
> >  $ui_diff tag conf d< \
> >       -foreground orange \
> >       -font font_diffbold
> > +$ui_diff tag conf d| \
> > +     -foreground orange \
> > +     -font font_diffbold
> >  $ui_diff tag conf d= \
> >       -foreground orange \
> >       -font font_diffbold
> > diff --git a/lib/diff.tcl b/lib/diff.tcl
> > index 0fd4600..6caf4e7 100644
> > --- a/lib/diff.tcl
> > +++ b/lib/diff.tcl
> > @@ -347,6 +347,7 @@ proc start_show_diff {cont_info {add_opts {}}} {
> >       }
> >
> >       set ::current_diff_inheader 1
> > +     set ::conflict_state {CONTEXT}
> >       fconfigure $fd \
> >               -blocking 0 \
> >               -encoding [get_path_encoding $path] \
> > @@ -450,10 +451,28 @@ proc read_diff {fd conflict_size cont_info} {
> >                       {++} {
> >                               set regexp [string map [list %conflict_size $conflict_size]\
> >                                                               {^\+\+([<>=]){%conflict_size}(?: |$)}]
> > +                             set regexp_pre_image [string map [list %conflict_size $conflict_size]\
> > +                                                             {^\+\+\|{%conflict_size}(?: |$)}]
> >                               if {[regexp $regexp $line _g op]} {
> >                                       set is_conflict_diff 1
> >                                       set line [string replace $line 0 1 {  }]
> > +                                     set markup {}
> >                                       set tags d$op
> > +                                     switch -exact -- $op {
> > +                                     < { set ::conflict_state {OURS} }
> > +                                     = { set ::conflict_state {THEIRS} }
> > +                                     > { set ::conflict_state {CONTEXT} }
> > +                                     }
> > +                             } elseif {[regexp $regexp_pre_image $line]} {
> > +                                     set is_conflict_diff 1
> > +                                     set line [string replace $line 0 1 {  }]
> > +                                     set markup {}
> > +                                     set tags d|
> > +                                     set ::conflict_state {BASE}
> > +                             } elseif {$::conflict_state eq {BASE}} {
> > +                                     set line [string replace $line 0 1 {--}]
> > +                                     set markup {}
> > +                                     set tags d_--
>
> I'm afraid I don't follow what this hunk is supposed to do.
>
> You set the variable ::conflict_state to the values like OURS, THEIRS,
> CONTEXT, but I don't see those values being used anywhere. A quick
> search for these words shows me that you only set them, never read them.

the last elseif depends on it.

I actually only need to detect the pre-image lines, which starts with
the ||| conflict-marker and ends with the === conflict-marker, instead
of all possible states.

>
> Is there some extra code that you have and I don't?
>
> Also, this function is long and complicated already. A comment
> explaining what this code is doing would be nice, since it is not at all
> obvious at first read-through.

Will re-send.

Bert

>
> >                               } else {
> >                                       set tags d_++
> >                               }
> > @@ -505,6 +524,9 @@ proc read_diff {fd conflict_size cont_info} {
> >                       }
> >               }
> >               set mark [$ui_diff index "end - 1 line linestart"]
> > +             if {[llength $markup] > 0} {
> > +                     set tags {}
> > +             }
> >               $ui_diff insert end $line $tags
> >               if {[string index $line end] eq "\r"} {
> >                       $ui_diff tag add d_cr {end - 2c}
> > --
> > 2.21.0.789.ga095d9d866
> >
>
> --
> Regards,
> Pratyush Yadav

[-- Attachment #2: conflict-merge.fi --]
[-- Type: application/octet-stream, Size: 2023 bytes --]

blob
mark :1
data 436
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Sed feugiat nisl eget efficitur ultrices.
Nunc cursus metus rutrum, mollis lorem vitae, hendrerit mi.
Aenean vestibulum ante ac libero venenatis, non hendrerit orci pharetra.
Proin in felis eu elit suscipit rhoncus vel ut metus.
Pellentesque aliquam libero et nisi scelerisque commodo.
Quisque id velit sed magna molestie porttitor.
Vivamus sed urna in risus molestie ultricies.

reset refs/heads/branch
commit refs/heads/branch
mark :2
author Bert Wesarg <bert.wesarg@googlemail.com> 1569822514 +0200
committer Bert Wesarg <bert.wesarg@googlemail.com> 1569822891 +0200
data 5
init
M 100644 :1 lorem

blob
mark :3
data 451
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Sed feugiat nisl eget efficitur ultrices.
Nunc cursus metus rutrum, mollis lorem vitae, hendrerit mi.
Aenean vestibulum ante ac libero venenatis, non hendrerit orci pharetra.
Proin bibendum purus ut est tristique, non pharetra dui consectetur.
Pellentesque aliquam libero et nisi scelerisque commodo.
Quisque id velit sed magna molestie porttitor.
Vivamus sed urna in risus molestie ultricies.

commit refs/heads/master
mark :4
author Bert Wesarg <bert.wesarg@googlemail.com> 1569822667 +0200
committer Bert Wesarg <bert.wesarg@googlemail.com> 1569823044 +0200
data 8
changed
from :2
M 100644 :3 lorem

blob
mark :5
data 429
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Sed feugiat nisl eget efficitur ultrices.
Nunc cursus metus rutrum, mollis lorem vitae, hendrerit mi.
Aenean vestibulum ante ac libero venenatis, non hendrerit orci pharetra.
Proin placerat leo malesuada lacinia lobortis.
Pellentesque aliquam libero et nisi scelerisque commodo.
Quisque id velit sed magna molestie porttitor.
Vivamus sed urna in risus molestie ultricies.

commit refs/heads/branch
mark :6
author Bert Wesarg <bert.wesarg@googlemail.com> 1569823077 +0200
committer Bert Wesarg <bert.wesarg@googlemail.com> 1569823077 +0200
data 9
conflict
from :2
M 100644 :5 lorem


  reply	other threads:[~2019-09-30 12:17 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-25 20:38 [PATCH 1/2] git-gui: use existing interface to query a path's attribute Bert Wesarg
2019-09-25 20:38 ` [PATCH 2/2] git-gui: support for diff3 conflict style Bert Wesarg
2019-09-29 15:04   ` Pratyush Yadav
2019-09-30 12:17     ` Bert Wesarg [this message]
2019-09-30 12:20       ` [PATCH v2 1/2] git-gui: use existing interface to query a path's attribute Bert Wesarg
2019-09-30 12:20         ` [PATCH v2 2/2] git-gui: support for diff3 conflict style Bert Wesarg
2019-09-30 19:54           ` [PATCH v3 1/2] git-gui: use existing interface to query a path's attribute Bert Wesarg
2019-10-01 14:24             ` Pratyush Yadav
2019-10-01 15:22               ` Bert Wesarg
2019-10-01 17:31                 ` Pratyush Yadav
2019-10-02  7:35                   ` Bert Wesarg
2019-10-02  7:36             ` [PATCH v3 2/2] git-gui: support for diff3 conflict style Bert Wesarg
2019-10-02 23:54               ` Pratyush Yadav
2019-10-03 20:02       ` [PATCH " Philip Oakley
2019-10-03 20:54         ` Pratyush Yadav
2019-10-03 21:40           ` Philip Oakley
     [not found]             ` <CAKPyHN0_AUqLpPVDNJUZqNV8zRQzaDOMXJV4AbnK969AdtGpNg@mail.gmail.com>
2019-10-04 16:09               ` Philip Oakley
2019-09-27  5:27 ` [PATCH 1/2] git-gui: use existing interface to query a path's attribute Pratyush Yadav
  -- strict thread matches above, loose matches on Subject: below --
2011-03-30  6:44 [PATCH 1/2] git-gui: support for underline styles Bert Wesarg
2010-11-16  9:21 [PATCHv2 1/2] git-gui: respect conflict marker size Bert Wesarg
2010-11-16  9:26 ` [PATCH 2/2] git-gui: support for diff3 conflict style Bert Wesarg
2010-11-19 11:41   ` Pat Thoyts
2010-11-19 12:05     ` Bert Wesarg
2011-02-27 20:15     ` Bert Wesarg
2011-03-30  6:44       ` Bert Wesarg

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='CAKPyHN3nOL6qy4RhwwHrh2m3EJuJ1-rt-8+0+=z2oJi96Nigpw@mail.gmail.com' \
    --to=bert.wesarg@googlemail.com \
    --cc=git@vger.kernel.org \
    --cc=me@yadavpratyush.com \
    --cc=philipoakley@iee.email \
    /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).