Re: [PATCH v5] Enable auto-merge for meld to follow the vim-diff beharior
- From
David Aguilar <davvid@gmail.com>
- Date
- Jul 1, 2020, 18:19 UTC
- Message-ID
- <20200701181947.GA16794@gmail.com>
- In-Reply-To
- <1514701d64f78$970ba180$c522e480$@zoom.us>
On Wed, Jul 01, 2020 at 03:23:56PM +0800, lin.sun@zoom.us wrote:
Show 18 quoted lines
> Hi Danh, > > The [PATH v5] is changed to following the comments from you, Junio, David. > Please review this newer version. Thank you. > The raw files is https://github.com/git/git/blob/344817d57970e3ac0910cdd8ad47bf97334ab2a6/mergetools/meld > > Regards > Lin > -----Original Message----- > From: sunlin via GitGitGadget <gitgitgadget@gmail.com> > Sent: Wednesday, July 1, 2020 15:07 > To: git@vger.kernel.org > Cc: sunlin <sunlin7@yahoo.com>; Lin Sun <lin.sun@zoom.us> > Subject: [PATCH v5] Enable auto-merge for meld to follow the vim-diff beharior > > From: Lin Sun <lin.sun@zoom.us> > > 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.
Please word-wrap commit messages to 72 chars or less.
Show 23 quoted lines
> > Signed-off-by: Lin Sun <lin.sun@zoom.us> > --- > Documentation/config/mergetool.txt | 8 ++++ > mergetools/meld | 72 +++++++++++++++++++++++------- > 2 files changed, 64 insertions(+), 16 deletions(-) > > 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 > + 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. > +
Now that we've decided that "false" should be the default behavior, the naming of this option don't make sense. "hasAutoMerge" doesn't really convey what this option does anymore. I would suggest calling it "mergetool.meld.automerge".
Perhaps something like this?
mergetool.meld.automerge:: Older versions of `meld` do not support the `--auto-merge` option. Setting `mergetool.meld.automerge` to `true` tells Git to unconditionally use the `--auto-merge` option with `meld`. Setting this value to `auto` makes git detect whether `--auto-merge` is supported and will only use `--auto-merge` when available. A value of `false` avoids using `--auto-merge` altogether, and is the default value.
Show 31 quoted lines
> @@ -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 () {This comment seems redundant when the function is called get_meld_help_msg().
Show 7 quoted lines
> + meld_path="$(git config mergetool.meld.path || echo meld)"
> + $meld_path --help 2>&1
> +}
>
> - if meld_has_output_option=$(git config --bool mergetool.meld.hasOutput)
> +# Check the features and set flags
> +check_meld_for_features () {Ditto for this comment.
Show 9 quoted lines
> + # 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" = falseDocumentation/CodingGuidelines mentions:
- We do not write our "test" command with "-a" and "-o" and use "&&" or "||" to concatenate multiple "test" commands instead, because the use of "-a/-o" is often error-prone. E.g.
This would be written as:
if test "$meld_has_output_option" = true || test "$meld_has_output_option" = false then ... fi
Instead of two checks, would it be better to instead just check: if test -n "$meld_has_output_option" ? git config --bool will only ever produce true/false, so we really only need to check that it's a non-empty value, perhaps?
Show 7 quoted lines
> + case "$meld_help_msg" in > + *"--output="* | *"[OPTION"???"]"*) > + # old ones mention --output and new ones just say OPTION... > + meld_has_output_option=true ;; > + *) > + meld_has_output_option=false ;; > + esac
We typically avoid the extra indentation level for the case labels. eg. this would be written like this (with ";;" on its own line):
case "$meld_help_msg" in *--output=*|*"[OPTION"???"]"*) # old ones mention --output and new ones just say OPTION... meld_has_output_option=true ;; *) meld_has_output_option=false ;; esac
Also, if you're matching [OPTION ...] would it work to just use a single-quoted value in the case label? eg: *'[OPTION...]'* ?
Show 13 quoted lines
> + 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
> + 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)"This can just be:
meld_help_msg=$(get_meld_help_msg)
and can do without the surrounding " " double quotes.
Show 7 quoted lines
> + case "$meld_help_msg" in > + *"--auto-merge"*) > + : old ones mention --output and new ones just say OPTION... > + meld_has_auto_merge_option=true ;; > + *) > + meld_has_auto_merge_option=false ;; > + esac
As above -- unindent the case statements, and put the ";;" case statement terminators on their own line.
cheers,
-- David