From: Phillip Wood <phillip.wood123@gmail.com>
To: Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>,
git@vger.kernel.org
Cc: Elijah Newren <newren@gmail.com>,
Kristoffer Haugsbakk <kristofferhaugsbakk@fastmail.com>
Subject: Re: [PATCH v4 0/2] merge-tree: add new --quiet option
Date: Mon, 19 May 2025 10:05:09 +0100 [thread overview]
Message-ID: <74bc8741-0a52-45d7-be2f-cc10b641c704@gmail.com> (raw)
In-Reply-To: <pull.1920.v4.git.1747425858.gitgitgadget@gmail.com>
Hi Elijah
On 16/05/2025 21:04, Elijah Newren via GitGitGadget wrote:
> Changes since v3:
>
> * Renamed --dry-run -> --quiet . Any further naming suggestions?
Thanks for re-rolling this version looks good to me.
Thanks
Phillip
> Changes since v2:
>
> * Converted locations missed in v1 in changing --mergeability-only ->
> --dry-run
>
> Changes since v1:
>
> * Renamed --mergeability-only flag to --dry-run, as per suggestion from
> Junio
> * added some commit message clarifications
>
> This adds a new flag, --dry-run, to git merge-tree, which suppresses all
> output and leaves only the exit status (reflecting successful merge or
> conflict). This is useful for Git Forges in cases where they are only
> interested in whether two branches can be merged, without needing the actual
> merge result or conflict details.
>
> The advantage of the flag is two fold:
>
> * The merge machinery can exit once it detects a conflict, instead of
> continuing to compute merge result information
> * The merge machinery can avoid writing merged blobs and trees to the
> object store when in the outer layer of the merging process (more details
> in the first commit message).
>
> Elijah Newren (2):
> merge-ort: add a new mergeability_only option
> merge-tree: add a new --quiet flag
>
> Documentation/git-merge-tree.adoc | 6 +++++
> builtin/merge-tree.c | 18 +++++++++++++++
> merge-ort.c | 38 +++++++++++++++++++++++++------
> merge-ort.h | 1 +
> t/t4301-merge-tree-write-tree.sh | 38 +++++++++++++++++++++++++++++++
> 5 files changed, 94 insertions(+), 7 deletions(-)
>
>
> base-commit: 6c0bd1fc70efaf053abe4e57c976afdc72d15377
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1920%2Fnewren%2Fmergeability-only-v4
> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1920/newren/mergeability-only-v4
> Pull-Request: https://github.com/gitgitgadget/git/pull/1920
>
> Range-diff vs v3:
>
> 1: 4757c4810d3 = 1: 4757c4810d3 merge-ort: add a new mergeability_only option
> 2: f11824317a8 ! 2: 7c40d3c9216 merge-tree: add a new --dry-run flag
> @@ Metadata
> Author: Elijah Newren <newren@gmail.com>
>
> ## Commit message ##
> - merge-tree: add a new --dry-run flag
> + merge-tree: add a new --quiet flag
>
> Git Forges may be interested in whether two branches can be merged while
> not being interested in what the resulting merge tree is nor which files
> - conflicted. For such cases, add a new --dry-run flag which
> + conflicted. For such cases, add a new --quiet flag which
> will make use of the new mergeability_only flag added to merge-ort in
> the previous commit. This option allows the merge machinery to, in the
> outer layer of the merge:
> @@ Documentation/git-merge-tree.adoc: OPTIONS
> default is to include these messages if there are merge
> conflicts, and to omit them otherwise.
>
> -+--dry-run::
> ++--quiet::
> + Disable all output from the program. Useful when you are only
> + interested in the exit status. Allows merge-tree to exit
> + early when it finds a conflict, and allows it to avoid writing
> @@ builtin/merge-tree.c: int cmd_merge_tree(int argc,
> int original_argc;
> const char *merge_base = NULL;
> int ret;
> -+ int dry_run = 0;
> ++ int quiet = 0;
>
> const char * const merge_tree_usage[] = {
> N_("git merge-tree [--write-tree] [<options>] <branch1> <branch2>"),
> @@ builtin/merge-tree.c: int cmd_merge_tree(int argc,
> N_("do a trivial merge only"), MODE_TRIVIAL),
> OPT_BOOL(0, "messages", &o.show_messages,
> N_("also show informational/conflict messages")),
> -+ OPT_BOOL_F(0, "dry-run",
> -+ &dry_run,
> ++ OPT_BOOL_F(0, "quiet",
> ++ &quiet,
> + N_("suppress all output; only exit status wanted"),
> + PARSE_OPT_NONEG),
> OPT_SET_INT('z', NULL, &line_termination,
> @@ builtin/merge-tree.c: int cmd_merge_tree(int argc,
> argc = parse_options(argc, argv, prefix, mt_options,
> merge_tree_usage, PARSE_OPT_STOP_AT_NON_OPTION);
>
> -+ if (dry_run && o.show_messages == -1)
> ++ if (quiet && o.show_messages == -1)
> + o.show_messages = 0;
> -+ o.merge_options.mergeability_only = dry_run;
> -+ die_for_incompatible_opt2(dry_run, "--dry-run",
> -+ o.show_messages, "--messages");
> -+ die_for_incompatible_opt2(dry_run, "--dry-run",
> -+ o.name_only, "--name-only");
> -+ die_for_incompatible_opt2(dry_run, "--dry-run",
> -+ o.use_stdin, "--stdin");
> -+ die_for_incompatible_opt2(dry_run, "--dry-run",
> -+ !line_termination, "-z");
> ++ o.merge_options.mergeability_only = quiet;
> ++ die_for_incompatible_opt2(quiet, "--quiet", o.show_messages, "--messages");
> ++ die_for_incompatible_opt2(quiet, "--quiet", o.name_only, "--name-only");
> ++ die_for_incompatible_opt2(quiet, "--quiet", o.use_stdin, "--stdin");
> ++ die_for_incompatible_opt2(quiet, "--quiet", !line_termination, "-z");
> +
> if (xopts.nr && o.mode == MODE_TRIVIAL)
> die(_("--trivial-merge is incompatible with all other options"));
> @@ t/t4301-merge-tree-write-tree.sh: test_expect_success setup '
> git commit -m first-commit
> '
>
> -+test_expect_success '--dry-run on clean merge' '
> ++test_expect_success '--quiet on clean merge' '
> + # Get rid of loose objects to start with
> + git gc &&
> + echo "0 objects, 0 kilobytes" >expect &&
> @@ t/t4301-merge-tree-write-tree.sh: test_expect_success setup '
> + test_cmp expect actual &&
> +
> + # Ensure merge is successful (exit code of 0)
> -+ git merge-tree --write-tree --dry-run side1 side3 >output &&
> ++ git merge-tree --write-tree --quiet side1 side3 >output &&
> +
> + # Ensure there is no output
> + test_must_be_empty output &&
> @@ t/t4301-merge-tree-write-tree.sh: test_expect_success 'Failed merge without rena
> grep "CONFLICT (modify/delete): numbers deleted" out
> '
>
> -+test_expect_success '--dry-run on conflicted merge' '
> ++test_expect_success '--quiet on conflicted merge' '
> + # Get rid of loose objects to start with
> + git gc &&
> + echo "0 objects, 0 kilobytes" >expect &&
> @@ t/t4301-merge-tree-write-tree.sh: test_expect_success 'Failed merge without rena
> + test_cmp expect actual &&
> +
> + # Ensure merge has conflict
> -+ test_expect_code 1 git merge-tree --write-tree --dry-run side1 side2 >output &&
> ++ test_expect_code 1 git merge-tree --write-tree --quiet side1 side2 >output &&
> +
> + # Ensure there is no output
> + test_must_be_empty output &&
>
next prev parent reply other threads:[~2025-05-19 9:05 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-10 22:02 [PATCH 0/2] merge-tree: add new --mergeability-only option Elijah Newren via GitGitGadget
2025-05-10 22:02 ` [PATCH 1/2] merge-ort: add a new mergeability_only option Elijah Newren via GitGitGadget
2025-05-10 22:02 ` [PATCH 2/2] merge-tree: add a new --mergeability-only flag Elijah Newren via GitGitGadget
2025-05-12 17:04 ` [PATCH 0/2] merge-tree: add new --mergeability-only option Junio C Hamano
2025-05-12 17:41 ` Elijah Newren
2025-05-12 18:27 ` Junio C Hamano
2025-05-12 18:37 ` Elijah Newren
2025-05-12 23:42 ` [PATCH v2 0/2] merge-tree: add new --dry-run option Elijah Newren via GitGitGadget
2025-05-12 23:42 ` [PATCH v2 1/2] merge-ort: add a new mergeability_only option Elijah Newren via GitGitGadget
2025-05-12 23:42 ` [PATCH v2 2/2] merge-tree: add a new --dry-run flag Elijah Newren via GitGitGadget
2025-05-13 7:15 ` Kristoffer Haugsbakk
2025-05-13 15:28 ` Elijah Newren
2025-05-13 13:24 ` Junio C Hamano
2025-05-13 15:30 ` Elijah Newren
2025-05-14 14:08 ` Junio C Hamano
2025-05-14 0:24 ` [PATCH v3 0/2] merge-tree: add new --dry-run option Elijah Newren via GitGitGadget
2025-05-14 0:24 ` [PATCH v3 1/2] merge-ort: add a new mergeability_only option Elijah Newren via GitGitGadget
2025-05-14 0:24 ` [PATCH v3 2/2] merge-tree: add a new --dry-run flag Elijah Newren via GitGitGadget
2025-05-15 13:07 ` Junio C Hamano
2025-05-16 13:18 ` Phillip Wood
2025-05-16 16:03 ` Elijah Newren
2025-05-14 15:34 ` [PATCH v3 0/2] merge-tree: add new --dry-run option Kristoffer Haugsbakk
2025-05-16 20:04 ` [PATCH v4 0/2] merge-tree: add new --quiet option Elijah Newren via GitGitGadget
2025-05-16 20:04 ` [PATCH v4 1/2] merge-ort: add a new mergeability_only option Elijah Newren via GitGitGadget
2025-05-16 20:04 ` [PATCH v4 2/2] merge-tree: add a new --quiet flag Elijah Newren via GitGitGadget
2025-05-17 19:52 ` Kristoffer Haugsbakk
2025-05-17 19:57 ` Kristoffer Haugsbakk
2025-05-19 9:05 ` Phillip Wood [this message]
2025-05-19 15:59 ` [PATCH v4 0/2] merge-tree: add new --quiet option Junio C Hamano
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=74bc8741-0a52-45d7-be2f-cc10b641c704@gmail.com \
--to=phillip.wood123@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=kristofferhaugsbakk@fastmail.com \
--cc=newren@gmail.com \
--cc=phillip.wood@dunelm.org.uk \
/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 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 NNTP newsgroup(s).