From patchwork Thu Feb 23 05:34:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Henrie X-Patchwork-Id: 13149868 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0399FC636D7 for ; Thu, 23 Feb 2023 05:34:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233125AbjBWFes (ORCPT ); Thu, 23 Feb 2023 00:34:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50584 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229461AbjBWFer (ORCPT ); Thu, 23 Feb 2023 00:34:47 -0500 Received: from mail-pj1-x1030.google.com (mail-pj1-x1030.google.com [IPv6:2607:f8b0:4864:20::1030]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1CAD2271D for ; Wed, 22 Feb 2023 21:34:46 -0800 (PST) Received: by mail-pj1-x1030.google.com with SMTP id gi3-20020a17090b110300b0023762f642dcso769978pjb.4 for ; Wed, 22 Feb 2023 21:34:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=GHTt+xM4pLLZG/70hEfCPK1rPwktY7yMt7HIUXYsp9E=; b=LUTCU0h1VPP4P7Fuazrpz1ZpclAgeYe1WQ6Co/Wgky9krAJrYehx3KWI2blR8pbV1m i2GVjqqZRF2BgbtmMetxucac3yafb1K19cDSTRn8r5T7GyMlzakoKH4+iH9IqcdlFbPz esImIFAGBk80hVsgAxtvydAlHMeseWb0D0Uud1WvkCguTwvp+IvlW2XeZkfFSZSMBvJF jV9DndCwu+Q3ojBDBJ60DWtl1vLEbiFg741OJbsjfasw6+MzqSSgAa9cBsFxG+25Q47O AULXGP2S+xIDReTb8OLXxJM1185VW8Rf3toMhC0RjGEB+djiTKhGK6KWPzC9yVu/V23r Q8fQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=GHTt+xM4pLLZG/70hEfCPK1rPwktY7yMt7HIUXYsp9E=; b=F6zqInd/BVjaSWzWBtmn13uJNo6Dmn0rnqJW+JtEzyPvB5EIrQHghvq9NNfbNoXbft nj5OMIaZVFld5D0tVFopPtomk79XXM6NHAQs1jDe6xcY9ubgltJKQgUNJEhxvWFpJrPC F1Q9zIccqnB6V5qoZlH7BVYoODRmFsya+81+Fkiv7Y8QpoMKlah5NHKuvp4x8gpsaaFq i43JXBNupFc7ejjiUHrKJjw+sqndJEefQRlMg5QS0ZcAPYUj0+tLa7A44rPRAhrm8flS nBvN2oSS8DcAtfS10HWqV/LAuSaVGrNZztvloDRgXxq85Zmip/YN8zesD73LE4TS4705 DxVA== X-Gm-Message-State: AO0yUKVZWXRBaPA3lg+Y99AqJnv/8PQJplo5A8SiZZ/dU1m/5y1/QPkM 75I5YWxYcZL+WmW3jatINKDsOuw+qsI= X-Google-Smtp-Source: AK7set/Ao3ss31mJPAC4flqgh0vHFh1Q9cNuYXwiOaTqdKUbyVJP4YEt67tQeTQndoJ99kbrXaliXQ== X-Received: by 2002:a17:90b:3e86:b0:234:28ac:ec57 with SMTP id rj6-20020a17090b3e8600b0023428acec57mr12921315pjb.21.1677130484732; Wed, 22 Feb 2023 21:34:44 -0800 (PST) Received: from xavier.lan ([2607:fa18:92fe:92b::2a2]) by smtp.gmail.com with ESMTPSA id e13-20020a17090a728d00b00233aacab89esm3943608pjg.48.2023.02.22.21.34.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Feb 2023 21:34:44 -0800 (PST) From: Alex Henrie To: git@vger.kernel.org, tao@klerks.biz, gitster@pobox.com, newren@gmail.com, phillip.wood123@gmail.com, Johannes.Schindelin@gmx.de, sorganov@gmail.com Cc: Alex Henrie Subject: [PATCH v4 1/3] rebase: add documentation and test for --no-rebase-merges Date: Wed, 22 Feb 2023 22:34:08 -0700 Message-Id: <20230223053410.644503-1-alexhenrie24@gmail.com> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Signed-off-by: Alex Henrie --- Documentation/git-rebase.txt | 4 +++- t/t3430-rebase-merges.sh | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index 9a295bcee4..c98784a0d2 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -529,13 +529,15 @@ See also INCOMPATIBLE OPTIONS below. -r:: --rebase-merges[=(rebase-cousins|no-rebase-cousins)]:: +--no-rebase-merges:: By default, a rebase will simply drop merge commits from the todo list, and put the rebased commits into a single, linear branch. With `--rebase-merges`, the rebase will instead try to preserve the branching structure within the commits that are to be rebased, by recreating the merge commits. Any resolved merge conflicts or manual amendments in these merge commits will have to be - resolved/re-applied manually. + resolved/re-applied manually. `--no-rebase-merges` can be used to + countermand a previous `--rebase-merges`. + By default, or when `no-rebase-cousins` was specified, commits which do not have `` as direct ancestor will keep their original branch point, diff --git a/t/t3430-rebase-merges.sh b/t/t3430-rebase-merges.sh index fa2a06c19f..d46d9545f2 100755 --- a/t/t3430-rebase-merges.sh +++ b/t/t3430-rebase-merges.sh @@ -250,6 +250,16 @@ test_expect_success 'with a branch tip that was cherry-picked already' ' EOF ' +test_expect_success '--no-rebase-merges countermands --rebase-merges' ' + git checkout -b no-rebase-merges E && + git rebase --rebase-merges --no-rebase-merges C && + test_cmp_graph C.. <<-\EOF + * B + * D + o C + EOF +' + test_expect_success 'do not rebase cousins unless asked for' ' git checkout -b cousins main && before="$(git rev-parse --verify HEAD)" && From patchwork Thu Feb 23 05:34:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Henrie X-Patchwork-Id: 13149869 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 66CDEC61DA4 for ; Thu, 23 Feb 2023 05:34:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233136AbjBWFeu (ORCPT ); Thu, 23 Feb 2023 00:34:50 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50586 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233048AbjBWFer (ORCPT ); Thu, 23 Feb 2023 00:34:47 -0500 Received: from mail-pj1-x102a.google.com (mail-pj1-x102a.google.com [IPv6:2607:f8b0:4864:20::102a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D47A3E04F for ; Wed, 22 Feb 2023 21:34:46 -0800 (PST) Received: by mail-pj1-x102a.google.com with SMTP id pt11so12226374pjb.1 for ; Wed, 22 Feb 2023 21:34:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=BL04JieBI0gvtYFp0bggEsvKDI2A3ibBIjkSWhu7dSA=; b=GBFUf4XUhvWczxsIgt7u6DxkixdvLbsfGyQ2K4WIS/12RwdXxhQhTqNqrDIawU2g1U ukIzyusv0OFWSA7FTQAqNRVuQHvTHsy3DyJgRN1g+0Jumu81yvuZhRRZw2CfUa1fAFa2 GO/d9tnpR4ctIv4FVMwXjjb8M0Pr4tjJlRE1WjS3jj4Dv6nCU/edOtNmFNFxnVCYa3+3 A1FBLtev70L/lPqSyKAniB05/EK2HZrn/tMBOALPp43xvk/FT1LB3stqDYlURl810O4x p07S+X5LXEjremfGxUXxgbX4CdW57Ev/NysR7BBlUrd3LYzTUkkO3HYh00XRoQ/Dt9+v wATQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BL04JieBI0gvtYFp0bggEsvKDI2A3ibBIjkSWhu7dSA=; b=rW5IY1NPFU7I+QMMbDb+97L63srJMjgAAtAF8VPpeD6MAaM3CDySp07cXFFTNEndFW KduZuA5Ho+uKVEZjQ+g9Ohr4o6Qm8Ue+B82sPIfTX3ipQ3TYoI5fGVUUmFQA1JjlFBJE jC5BEJhJw3EA4yxvI30jlde8a4lWyM7aEG+Xkx28vKfbNho3JL1AenzrjGgV17LYejfA iPe4hnQ9gT4PYFagxUJobWlxpWfGX3sHj3BIHIaJWZ2UE6v3z6cGdeF/FsNjlNZ1mKC9 LFiqKdDDmMKAli7vjh27C7BhqyY92r33+OnF+4VRMhrSYAI/PHQOB33DBRycpJaQ/Qvh MfNg== X-Gm-Message-State: AO0yUKX/lQPYuvcgnflTYetQg8tswVE+LkTX7mQmjGp50YZlfyHhp/yp HJBDyVJOBc4oS9dMCqLOtYbK2rlUiEI= X-Google-Smtp-Source: AK7set+ookBsR2Nb3kn+Kbhr15couLW/XpSvt8YKrMeVfQVtOtjOhMkCKY+ll0PsOw8u7vN11r3Efg== X-Received: by 2002:a17:90a:15:b0:237:161e:33bc with SMTP id 21-20020a17090a001500b00237161e33bcmr9480084pja.16.1677130485921; Wed, 22 Feb 2023 21:34:45 -0800 (PST) Received: from xavier.lan ([2607:fa18:92fe:92b::2a2]) by smtp.gmail.com with ESMTPSA id e13-20020a17090a728d00b00233aacab89esm3943608pjg.48.2023.02.22.21.34.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Feb 2023 21:34:45 -0800 (PST) From: Alex Henrie To: git@vger.kernel.org, tao@klerks.biz, gitster@pobox.com, newren@gmail.com, phillip.wood123@gmail.com, Johannes.Schindelin@gmx.de, sorganov@gmail.com Cc: Alex Henrie Subject: [PATCH v4 2/3] rebase: stop accepting --rebase-merges="" Date: Wed, 22 Feb 2023 22:34:09 -0700 Message-Id: <20230223053410.644503-2-alexhenrie24@gmail.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230223053410.644503-1-alexhenrie24@gmail.com> References: <20230223053410.644503-1-alexhenrie24@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org The unusual syntax --rebase-merges="" (that is, --rebase-merges with an empty string argument) has been an undocumented synonym of --rebase-merges=no-rebase-cousins. Stop accepting that syntax to avoid confusion when a rebase.merges config option is introduced, where rebase.merges="" will be equivalent to not passing --rebase-merges. Signed-off-by: Alex Henrie --- builtin/rebase.c | 6 ++---- t/t3430-rebase-merges.sh | 6 ++++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index 6635f10d52..b68fc2fbb7 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -1140,7 +1140,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) {OPTION_STRING, 'r', "rebase-merges", &rebase_merges, N_("mode"), N_("try to rebase merges instead of skipping them"), - PARSE_OPT_OPTARG, NULL, (intptr_t)""}, + PARSE_OPT_OPTARG, NULL, (intptr_t)"no-rebase-cousins"}, OPT_BOOL(0, "fork-point", &options.fork_point, N_("use 'merge-base --fork-point' to refine upstream")), OPT_STRING('s', "strategy", &options.strategy, @@ -1437,9 +1437,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) imply_merge(&options, "--exec"); if (rebase_merges) { - if (!*rebase_merges) - ; /* default mode; do nothing */ - else if (!strcmp("rebase-cousins", rebase_merges)) + if (!strcmp("rebase-cousins", rebase_merges)) options.rebase_cousins = 1; else if (strcmp("no-rebase-cousins", rebase_merges)) die(_("Unknown mode: %s"), rebase_merges); diff --git a/t/t3430-rebase-merges.sh b/t/t3430-rebase-merges.sh index d46d9545f2..c73949df18 100755 --- a/t/t3430-rebase-merges.sh +++ b/t/t3430-rebase-merges.sh @@ -278,6 +278,12 @@ test_expect_success 'do not rebase cousins unless asked for' ' EOF ' +test_expect_success '--rebase-merges="" is invalid syntax' ' + echo "fatal: Unknown mode: " >expect && + test_must_fail git rebase --rebase-merges="" HEAD^ 2>actual && + test_cmp expect actual +' + test_expect_success 'refs/rewritten/* is worktree-local' ' git worktree add wt && cat >wt/script-from-scratch <<-\EOF && From patchwork Thu Feb 23 05:34:10 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Henrie X-Patchwork-Id: 13149870 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4F2D0C61DA4 for ; Thu, 23 Feb 2023 05:34:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233192AbjBWFe4 (ORCPT ); Thu, 23 Feb 2023 00:34:56 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50592 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233132AbjBWFet (ORCPT ); Thu, 23 Feb 2023 00:34:49 -0500 Received: from mail-pl1-x635.google.com (mail-pl1-x635.google.com [IPv6:2607:f8b0:4864:20::635]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1C857271D for ; Wed, 22 Feb 2023 21:34:48 -0800 (PST) Received: by mail-pl1-x635.google.com with SMTP id z2so11664749plf.12 for ; Wed, 22 Feb 2023 21:34:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JLEMVH9RTBoP6j0fkKOr1RGoJg5q2GIkRVjMHaZlDpA=; b=BsX1Mf8lq3R0y8mbxN23DlD8Qcpjsxn2Dfkhbkb9iZFxK1Pfm/sDsOn3ferKul/3HE OBUkn1U6gZhzeLPZn8UdDFZvF7rsu7E5wAuS9Dr6zr+7kGoS8N/QRJtI9ZOFGW6VOcHw rEF/jEcs5r/yz+YGFQynhTTGHY4JzQGznF5WhdtuoL0Csdh8OJN+NZ9WIwYY8793LO0X 5ENucUHgeXyuRw3EEr0ymE/eS0GrQq91LCRqGgSIcg7ppzBMNNESlIermhNMTKm/xZ6l tAfn7xqzO0oeGGpIzge1/VdqFnw/D4VIsoDFnklA3S1INPpGba+RR42wtiJcWIna5mYn aDOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JLEMVH9RTBoP6j0fkKOr1RGoJg5q2GIkRVjMHaZlDpA=; b=m6HKYWjLX6zNMMu6XaLy/GgtAbhIFVgcEy+NA1I/Q1WeoPFM/ntFoM2mq0O9d7DMf3 efKoq4sGG098CNgYG/kc9Gei1wqGWhG1bUYZCEpapd2GiH/u9nckdTbSiLORd9+gv6iG bL30lw6rsavL1YS94Yqtwg9VM5LLSoYRFe8o6e2JIb6S7RhplESTkGDJVhW5acvL6vzn lpbzoGnWL8iwpXGRNUO8ZABLnT7sVSyazULOtgIJaLFIcpOXEUzLTiFdLaM4PCZKfST/ Os0OOEWnf2bG7TK7UozXEk7TTkLIN+G0f6TOrTyVWlGdC74OGyfGZeHpsfkw0/g/B9dV g9pA== X-Gm-Message-State: AO0yUKVEgXNn4tESX5KHVmbBSysri9cMgVXR4y5f8DbvDJVekGixoGg/ UEvh7wBwUlHw7RLmubekKgFJJtaPP/I= X-Google-Smtp-Source: AK7set9Xj6vXWl5+Yxtj/v17hHfzi3+saGMPMBEp6jOVL6xVSl6K3nhe3vhondN5SWkf9xv74HeWbw== X-Received: by 2002:a17:90b:4d0b:b0:22b:efa5:d05 with SMTP id mw11-20020a17090b4d0b00b0022befa50d05mr12918708pjb.40.1677130487074; Wed, 22 Feb 2023 21:34:47 -0800 (PST) Received: from xavier.lan ([2607:fa18:92fe:92b::2a2]) by smtp.gmail.com with ESMTPSA id e13-20020a17090a728d00b00233aacab89esm3943608pjg.48.2023.02.22.21.34.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Feb 2023 21:34:46 -0800 (PST) From: Alex Henrie To: git@vger.kernel.org, tao@klerks.biz, gitster@pobox.com, newren@gmail.com, phillip.wood123@gmail.com, Johannes.Schindelin@gmx.de, sorganov@gmail.com Cc: Alex Henrie Subject: [PATCH v4 3/3] rebase: add a config option for --rebase-merges Date: Wed, 22 Feb 2023 22:34:10 -0700 Message-Id: <20230223053410.644503-3-alexhenrie24@gmail.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230223053410.644503-1-alexhenrie24@gmail.com> References: <20230223053410.644503-1-alexhenrie24@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org The purpose of the new option is to accommodate users who would like --rebase-merges to be on by default and to facilitate possibly turning on --rebase-merges by default without configuration in a future version of Git. Signed-off-by: Alex Henrie --- Documentation/config/rebase.txt | 10 ++++ Documentation/git-rebase.txt | 3 +- builtin/rebase.c | 47 ++++++++++++---- t/t3430-rebase-merges.sh | 96 +++++++++++++++++++++++++++++++++ 4 files changed, 144 insertions(+), 12 deletions(-) diff --git a/Documentation/config/rebase.txt b/Documentation/config/rebase.txt index f19bd0e040..308baa9dbb 100644 --- a/Documentation/config/rebase.txt +++ b/Documentation/config/rebase.txt @@ -67,3 +67,13 @@ rebase.rescheduleFailedExec:: rebase.forkPoint:: If set to false set `--no-fork-point` option by default. + +rebase.merges:: + Whether and how to set the `--rebase-merges` option by default. Can + be `rebase-cousins`, `no-rebase-cousins`, or a boolean. Setting to + true is equivalent to `--rebase-merges` without an argument, setting to + `rebase-cousins` or `no-rebase-cousins` is equivalent to + `--rebase-merges` with that value as its argument, and setting to false + is equivalent to `--no-rebase-merges`. Passing `--rebase-merges` on the + command line without an argument overrides a `rebase.merges=false` + configuration but does not override other values of `rebase.merge`. diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index c98784a0d2..b02f9cbb8c 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -537,7 +537,8 @@ See also INCOMPATIBLE OPTIONS below. by recreating the merge commits. Any resolved merge conflicts or manual amendments in these merge commits will have to be resolved/re-applied manually. `--no-rebase-merges` can be used to - countermand a previous `--rebase-merges`. + countermand both the `rebase.merges` config option and a previous + `--rebase-merges`. + By default, or when `no-rebase-cousins` was specified, commits which do not have `` as direct ancestor will keep their original branch point, diff --git a/builtin/rebase.c b/builtin/rebase.c index b68fc2fbb7..45cf445d42 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -771,6 +771,20 @@ static int run_specific_rebase(struct rebase_options *opts) return status ? -1 : 0; } +static void parse_merges_value(struct rebase_options *options, const char *value) +{ + if (value) { + if (!strcmp("no-rebase-cousins", value)) + options->rebase_cousins = 0; + else if (!strcmp("rebase-cousins", value)) + options->rebase_cousins = 1; + else + die(_("Unknown mode: %s"), value); + } + + options->rebase_merges = 1; +} + static int rebase_config(const char *var, const char *value, void *data) { struct rebase_options *opts = data; @@ -815,6 +829,13 @@ static int rebase_config(const char *var, const char *value, void *data) return 0; } + if (!strcmp(var, "rebase.merges") && value && *value) { + opts->rebase_merges = git_parse_maybe_bool(value); + if (opts->rebase_merges < 0) + parse_merges_value(opts, value); + return 0; + } + if (!strcmp(var, "rebase.backend")) { return git_config_string(&opts->default_backend, var, value); } @@ -980,6 +1001,18 @@ static int parse_opt_empty(const struct option *opt, const char *arg, int unset) return 0; } +static int parse_opt_merges(const struct option *opt, const char *arg, int unset) +{ + struct rebase_options *options = opt->value; + + if (unset) + options->rebase_merges = 0; + else + parse_merges_value(options, arg); + + return 0; +} + static void NORETURN error_on_missing_default_upstream(void) { struct branch *current_branch = branch_get(NULL); @@ -1035,7 +1068,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) struct object_id branch_base; int ignore_whitespace = 0; const char *gpg_sign = NULL; - const char *rebase_merges = NULL; struct string_list strategy_options = STRING_LIST_INIT_NODUP; struct object_id squash_onto; char *squash_onto_name = NULL; @@ -1137,10 +1169,9 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) &options.allow_empty_message, N_("allow rebasing commits with empty messages"), PARSE_OPT_HIDDEN), - {OPTION_STRING, 'r', "rebase-merges", &rebase_merges, - N_("mode"), + OPT_CALLBACK_F('r', "rebase-merges", &options, N_("mode"), N_("try to rebase merges instead of skipping them"), - PARSE_OPT_OPTARG, NULL, (intptr_t)"no-rebase-cousins"}, + PARSE_OPT_OPTARG, parse_opt_merges), OPT_BOOL(0, "fork-point", &options.fork_point, N_("use 'merge-base --fork-point' to refine upstream")), OPT_STRING('s', "strategy", &options.strategy, @@ -1436,14 +1467,8 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) if (options.exec.nr) imply_merge(&options, "--exec"); - if (rebase_merges) { - if (!strcmp("rebase-cousins", rebase_merges)) - options.rebase_cousins = 1; - else if (strcmp("no-rebase-cousins", rebase_merges)) - die(_("Unknown mode: %s"), rebase_merges); - options.rebase_merges = 1; + if (options.rebase_merges) imply_merge(&options, "--rebase-merges"); - } if (options.type == REBASE_APPLY) { if (ignore_whitespace) diff --git a/t/t3430-rebase-merges.sh b/t/t3430-rebase-merges.sh index c73949df18..d4b0e8fd49 100755 --- a/t/t3430-rebase-merges.sh +++ b/t/t3430-rebase-merges.sh @@ -284,6 +284,102 @@ test_expect_success '--rebase-merges="" is invalid syntax' ' test_cmp expect actual ' +test_expect_success 'rebase.merges="" is equivalent to not passing --rebase-merges' ' + test_config rebase.merges "" && + git checkout -b config-merges-blank E && + git rebase C && + test_cmp_graph C.. <<-\EOF + * B + * D + o C + EOF +' + +test_expect_success 'rebase.merges=rebase-cousins is equivalent to --rebase-merges=rebase-cousins' ' + test_config rebase.merges rebase-cousins && + git checkout -b config-rebase-cousins main && + git rebase HEAD^ && + test_cmp_graph HEAD^.. <<-\EOF + * Merge the topic branch '\''onebranch'\'' + |\ + | * D + | * G + |/ + o H + EOF +' + +test_expect_success '--no-rebase-merges overrides rebase.merges=no-rebase-cousins' ' + test_config rebase.merges no-rebase-cousins && + git checkout -b override-config-no-rebase-cousins E && + git rebase --no-rebase-merges C && + test_cmp_graph C.. <<-\EOF + * B + * D + o C + EOF +' + +test_expect_success '--rebase-merges=no-rebase-cousins overrides rebase.merges=rebase-cousins' ' + test_config rebase.merges rebase-cousins && + git checkout -b override-config-rebase-cousins main && + git rebase --rebase-merges=no-rebase-cousins HEAD^ && + test_cmp_graph HEAD^.. <<-\EOF + * Merge the topic branch '\''onebranch'\'' + |\ + | * D + | * G + o | H + |/ + o A + EOF +' + +test_expect_success '--rebase-merges overrides rebase.merges=false' ' + test_config rebase.merges false && + git checkout -b override-config-merges-false E && + before="$(git rev-parse --verify HEAD)" && + test_tick && + git rebase --rebase-merges C && + test_cmp_rev HEAD $before +' + +test_expect_success '--rebase-merges does not override rebase.merges=rebase-cousins' ' + test_config rebase.merges rebase-cousins && + git checkout -b no-override-config-rebase-cousins main && + git rebase --rebase-merges HEAD^ && + test_cmp_graph HEAD^.. <<-\EOF + * Merge the topic branch '\''onebranch'\'' + |\ + | * D + | * G + |/ + o H + EOF +' + +test_expect_success 'local rebase.merges=false overrides global rebase.merges=true' ' + test_config_global rebase.merges true && + test_config rebase.merges false && + git checkout -b override-global-config E && + git rebase C && + test_cmp_graph C.. <<-\EOF + * B + * D + o C + EOF +' + +test_expect_success 'local rebase.merges="" does not override global rebase.merges=true' ' + test_config_global rebase.merges no-rebase-cousins && + test_config rebase.merges "" && + git checkout -b no-override-global-config E && + before="$(git rev-parse --verify HEAD)" && + test_tick && + git rebase C && + test_cmp_rev HEAD $before +' + test_expect_success 'refs/rewritten/* is worktree-local' ' git worktree add wt && cat >wt/script-from-scratch <<-\EOF &&