Re: [PATCHv2 1/2] git-gui: respect conflict marker size
- From
Pat Thoyts <patthoyts@users.sourceforge.net>
- Date
- Nov 19, 2010, 11:20 UTC
- Message-ID
- <87k4k9h858.fsf@fox.patthoyts.tk>
- In-Reply-To
- <1289899312-2732-1-git-send-email-bert.wesarg@googlemail.com>
Bert Wesarg <bert.wesarg@googlemail.com> writes:
Show 105 quoted lines
>Respect the conflict-marker-size attribute on paths when detecting merge
>conflicts.
>
>Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>
>
>---
>
>v2 fixes the tags selection and also the regexp to match always exactly the
>desired number of markers.
>
>Bert
>
> git-gui/git-gui.sh | 6 +++---
> git-gui/lib/diff.tcl | 22 ++++++++++++++++++----
> 2 files changed, 21 insertions(+), 7 deletions(-)
>
>diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh
>index d3acf0d..38362fa 100755
>--- a/git-gui/git-gui.sh
>+++ b/git-gui/git-gui.sh
>@@ -3351,13 +3351,13 @@ $ui_diff tag conf d_s- \
> -foreground red \
> -background ivory1
>
>-$ui_diff tag conf d<<<<<<< \
>+$ui_diff tag conf d< \
> -foreground orange \
> -font font_diffbold
>-$ui_diff tag conf d======= \
>+$ui_diff tag conf d= \
> -foreground orange \
> -font font_diffbold
>-$ui_diff tag conf d>>>>>>> \
>+$ui_diff tag conf d> \
> -foreground orange \
> -font font_diffbold
>
>diff --git a/git-gui/lib/diff.tcl b/git-gui/lib/diff.tcl
>index dcf0711..d4e2ce3 100644
>--- a/git-gui/lib/diff.tcl
>+++ b/git-gui/lib/diff.tcl
>@@ -253,6 +253,19 @@ proc show_other_diff {path w m cont_info} {
> }
> }
>
>+proc get_conflict_marker_size {path} {
>+ set size 7
>+ catch {
>+ set fd_rc [eval [list git_read check-attr "conflict-marker-size" -- $path]]
>+ set ret [gets $fd_rc line]
>+ close $fd_rc
>+ if {$ret > 0} {
>+ regexp {.*: conflict-marker-size: (\d+)$} $line line size
>+ }
>+ }
>+ return $size
>+}
>+
> proc start_show_diff {cont_info {add_opts {}}} {
> global file_states file_lists
> global is_3way_diff is_submodule_diff diff_active repo_config
>@@ -268,6 +281,7 @@ proc start_show_diff {cont_info {add_opts {}}} {
> set is_submodule_diff 0
> set diff_active 1
> set current_diff_header {}
>+ set conflict_size [get_conflict_marker_size $path]
>
> set cmd [list]
> if {$w eq $ui_index} {
>@@ -329,7 +343,7 @@ proc start_show_diff {cont_info {add_opts {}}} {
> -blocking 0 \
> -encoding [get_path_encoding $path] \
> -translation lf
>- fileevent $fd readable [list read_diff $fd $cont_info]
>+ fileevent $fd readable [list read_diff $fd $conflict_size $cont_info]
> }
>
> proc parse_color_line {line} {
>@@ -349,7 +363,7 @@ proc parse_color_line {line} {
> return [list $result $markup]
> }
>
>-proc read_diff {fd cont_info} {
>+proc read_diff {fd conflict_size cont_info} {
> global ui_diff diff_active is_submodule_diff
> global is_3way_diff is_conflict_diff current_diff_header
> global current_diff_queue
>@@ -402,7 +416,7 @@ proc read_diff {fd cont_info} {
> {- } {set tags d_-s}
> {--} {set tags d_--}
> {++} {
>- if {[regexp {^\+\+([<>]{7} |={7})} $line _g op]} {
>+ if {[regexp {^\+\+([<>=]){$conflict_size}(?: |$)} $line _g op]} {
> set is_conflict_diff 1
> set line [string replace $line 0 1 { }]
> set tags d$op
>@@ -441,7 +455,7 @@ proc read_diff {fd cont_info} {
> {@} {set tags d_@}
> {-} {set tags d_-}
> {+} {
>- if {[regexp {^\+([<>]{7} |={7})} $line _g op]} {
>+ if {[regexp {^\+([<>=]){$conflict_size}(?: |$)} $line _g op]} {
> set is_conflict_diff 1
> set tags d$op
> } else {Tcl doesn't expand variables in curly-braced expressions so the $conflict_size is left in there verbatim.
Either
set regexp [string map [list %conflict_size $conflict_size]\
{^\+([<>=]){%conflict_size}(?: |$)}]
which substitutes in the expanded value or double-quotes with care to
protect anything that Tcl would expand in the regexp. The string map
style is often easier to read.
regexp "^\\+(\[<>=\]){$conflict_size}(?: |\$)" $line _g opI've squashed in a fix using string map on this one. With that it appears to work fine. I never noticed this attribute before.
-- Pat Thoyts http://www.patthoyts.tk/ PGP fingerprint 2C 6E 98 07 2C 59 C8 97 10 CE 11 E6 04 E0 B9 DD