Hi Danh, I'll push the patch to GitGitGadget so that it's will sending from the system mail. Sorry for this noise. Regards Lin -----Original Message----- From: lin.sun@xxxxxxx <lin.sun@xxxxxxx> Sent: Wednesday, July 1, 2020 23:32 To: 'Đoàn Trần Công Danh' <congdanhqx@xxxxxxxxx>; 'sunlin via GitGitGadget' <gitgitgadget@xxxxxxxxx> Cc: git@xxxxxxxxxxxxxxx; 'Lin Sun' <lin.sun@xxxxxxx> Subject: RE: [PATCH v5] Enable auto-merge for meld to follow the vim-diff beharior Hi Danh, Thank you for your comments, and changes apply to the last patch with your suggestions. Please refer the attachment for [PATH v6]. Thank you. Regards Lin -----Original Message----- From: Đoàn Trần Công Danh <congdanhqx@xxxxxxxxx> Sent: Wednesday, July 1, 2020 22:18 To: sunlin via GitGitGadget <gitgitgadget@xxxxxxxxx> Cc: git@xxxxxxxxxxxxxxx; sunlin <sunlin7@xxxxxxxxx>; Lin Sun <lin.sun@xxxxxxx> Subject: Re: [PATCH v5] Enable auto-merge for meld to follow the vim-diff beharior On 2020-07-01 07:06:46+0000, sunlin via GitGitGadget <gitgitgadget@xxxxxxxxx> wrote: > From: Lin Sun <lin.sun@xxxxxxx> > > Make the mergetool used with "meld" backend behave similarly to how > "vimdiff" behavior by telling it to auto-merge parts without conflicts > and highlight the parts with conflicts when configuring > `mergetool.meld.hasAutoMerge` with `true`, or `auto` for automatically > detecting the option. > > Signed-off-by: Lin Sun <lin.sun@xxxxxxx> > --- > diff --git a/Documentation/config/mergetool.txt > b/Documentation/config/mergetool.txt > index 09ed31dbfa..9a74bd98dc 100644 > --- a/Documentation/config/mergetool.txt > +++ b/Documentation/config/mergetool.txt > @@ -30,6 +30,14 @@ mergetool.meld.hasOutput:: > to `true` tells Git to unconditionally use the `--output` option, > and `false` avoids using `--output`. > > +mergetool.meld.hasAutoMerge:: > + Older versions of `meld` do not support the `--auto-merge` option. > + Setting `mergetool.meld.hasOutput` to `true` tells Git to s/hasOutput/hasAutoMerge/ Bikeshed opinion: I don't know if hasAutoMerge is a good name :) > + unconditionally use the `--auto-merge` option, and `false` avoids using > + `--auto-merge`, and `auto` detect whether `meld` supports `--auto-merge` > + by inspecting the output of `meld --help`, otherwise, follow meld's > + default behavior. > + > mergetool.keepBackup:: > After performing a merge, the original file with conflict markers > can be saved as a file with a `.orig` extension. If this variable > diff --git a/mergetools/meld b/mergetools/meld index > 7a08470f88..9ee835b1e5 100644 > --- a/mergetools/meld > +++ b/mergetools/meld > @@ -3,34 +3,74 @@ diff_cmd () { > } > > merge_cmd () { > - if test -z "${meld_has_output_option:+set}" > + check_meld_for_features > + > + option_auto_merge= > + if test "$meld_has_auto_merge_option" = true > then > - check_meld_for_output_version > + option_auto_merge="--auto-merge" > fi > > if test "$meld_has_output_option" = true > then > - "$merge_tool_path" --output="$MERGED" \ > + "$merge_tool_path" $option_auto_merge --output="$MERGED" \ > "$LOCAL" "$BASE" "$REMOTE" > else > - "$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE" > + "$merge_tool_path" $option_auto_merge "$LOCAL" "$MERGED" "$REMOTE" > fi > } > > -# Check whether we should use 'meld --output <file>' > -check_meld_for_output_version () { > - meld_path="$(git config mergetool.meld.path)" > - meld_path="${meld_path:-meld}" > +# Get meld help message > +get_meld_help_msg () { > + meld_path="$(git config mergetool.meld.path || echo meld)" > + $meld_path --help 2>&1 > +} I'm actually prefer this change in 2 separated patches to reduce noise. But given that mergetool/meld doesn't attract much attention, I don't know. > > - if meld_has_output_option=$(git config --bool mergetool.meld.hasOutput) > +# Check the features and set flags > +check_meld_for_features () { > + # Check whether we should use 'meld --output <file>' > + if test -z "${meld_has_output_option:+set}" > then > - : use configured value > - elif "$meld_path" --help 2>&1 | > - grep -e '--output=' -e '\[OPTION\.\.\.\]' >/dev/null > + meld_has_output_option=$(git config --bool mergetool.meld.hasOutput) > + if test "$meld_has_output_option" = true -o \ > + "$meld_has_output_option" = false The coding guideline seems to not like "test -o". I think it's acceptable in this case since we control its input. The output is comming out of "git config --bool" anyway, so meld_has_output_option must be either "", "true", or "false" I think we're better to do this instead: if test -n "$meld_has_output_option" then : use configured output else : messing with help fi > + then > + : use configured value > + else > + # treat meld_has_output_option as "auto" > + if test -z "$meld_help_msg" > + then > + meld_help_msg="$(get_meld_help_msg)" > + fi If I were writing this patch, I probably changed get_meld_help_msg to init_meld_help_msg () { if test -z "$meld_help_msg" then meld_path="$(git config mergetool.meld.path || echo meld)" meld_help_msg=$($meld_path --help 2>&1) fi } And call init_meld_help_msg unconditionally here, (and in --auto-merge arm below, maybe other arms in the future). I'm writing without much thought into this, please take my word with a grain of salt :) > +} > + > + case "$meld_help_msg" in > + *"--output="* | *"[OPTION"???"]"*) I think Git project prefer aligning case arm with case, IOW, move left 1 TAB. > + # old ones mention --output and new ones just say OPTION... > + meld_has_output_option=true ;; It's nice to see this update, good. The comment is no longer correct, though. The version 3.20.2 has --output but not OPTIONS. It's not introduced by your change, but I think it's better to say: # All versions that has [OPTIONS???] supports --output > + *) > + meld_has_output_option=false ;; > + esac > + fi > + fi > + # Check whether we should use 'meld --auto-merge ...' > + if test -z "${meld_has_auto_merge_option:+set}" > then > - : old ones mention --output and new ones just say OPTION... > - meld_has_output_option=true > - else > - meld_has_output_option=false > + meld_has_auto_merge_option=$(git config mergetool.meld.hasAutoMerge) > + if test "$meld_has_auto_merge_option" = auto Since we don't canonicallise to bool output of mergetool.meld.hasAutoMerge, I think we would need: case "$meld_has_auto_merge_option" in [Tt]rue|[Yy]es|[Oo]n) meld_has_auto_merge_option=true ;; auto) : this shenanigan ;; esac But, that's a bit messy. Let's see other's opinions. > + then > + # testing the "--auto-merge" option only if config is "auto" > + if test -z "$meld_help_msg" > + then > + meld_help_msg="$(get_meld_help_msg)" > + fi > + > + case "$meld_help_msg" in > + *"--auto-merge"*) > + : old ones mention --output and new ones just say OPTION... This comment doesn't apply here. > + meld_has_auto_merge_option=true ;; > + *) > + meld_has_auto_merge_option=false ;; > + esac > + fi > fi > } > > base-commit: 07d8ea56f2ecb64b75b92264770c0a664231ce17 > -- > gitgitgadget -- Danh