From patchwork Wed Dec 8 14:57:48 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 12664541 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 178FFC433EF for ; Wed, 8 Dec 2021 14:58:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235567AbhLHPBi (ORCPT ); Wed, 8 Dec 2021 10:01:38 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48280 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229522AbhLHPBh (ORCPT ); Wed, 8 Dec 2021 10:01:37 -0500 Received: from mail-wr1-x431.google.com (mail-wr1-x431.google.com [IPv6:2a00:1450:4864:20::431]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8183DC061746 for ; Wed, 8 Dec 2021 06:58:05 -0800 (PST) Received: by mail-wr1-x431.google.com with SMTP id j3so4588472wrp.1 for ; Wed, 08 Dec 2021 06:58:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=ikYH1r6fCA0IM2JUoU9OQOizt046BswPyLilaHP+nmI=; b=Gy31vjjyEnG0BIVJJGbfbhbFgD/SJ4gUsfC6F9lqz62pEnkhYxltUgZ374j96U810J TxH0RztuJRHqtMwbv58Psxt4ZgGNkyhHJnd/eagKcw971HkyUVkv4e9dls+Fs7ywDSMI 8XdWMobNiAxJc8QkVou3d82IKDYOwo82sQGVi/4PZVRY9u4E65Ggaf1DQBFV92XQuxar +AIdA5/1jEWwpsCIZLkVZC7GTD07h2om9NNFufloISQWpM4vkP9m5YYTHrfSY3wZzjfL DQj3G8/SPO2WZoxgvTOPeLp0ZnWUonyhkS/EnNhPW3b2P1jyQw8JuCH0JUG1CU6L439f HeZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=ikYH1r6fCA0IM2JUoU9OQOizt046BswPyLilaHP+nmI=; b=R1fqacbsHNb/rxJtGF1BwQBxrMaKpvxYJ3Wu4/Z3bakqwemXdMVlviNMKGG9uerNT8 Kp39wkF9db28FwsMokSAdPz2NaH9Itzn2ZhBXjiUUWGhSpSxxxOc5lWS/Xr0pgSWEMh9 mHSlrwlb97gvznh378WFOJZ5F/WXT+z+TDv2+dYZA3fd2iA/TDumi1vijOsSiTnZ6cFS ip0Gyjb20DIzp+AKBPvcXSiJu6Fj0weiwSuWtQ8DtwnvCDyAAvb7xrjcbx9AmhtNtkG1 d83C+IlVhbRXp+Fge8yH96cqkLrzP/y0yHFfs+MJ1SdbtHJ4WS8EZwXzXGitTcKZL4Yh ZsJg== X-Gm-Message-State: AOAM531/JzXBcO4XqCjYlOFjnHHb2Ls2OBJ+hYiizvm2l5VleGyn99E6 fVpKjIyW2Mwkb6Dm3F8m3EbKmaWc0tM= X-Google-Smtp-Source: ABdhPJxGhWAryX2WJH5wF7bTRH/2/DVidvjZz+f2GErPLe/Lbsuh2kKZFbLN0JtwDyO0RvKct9PZMg== X-Received: by 2002:adf:f602:: with SMTP id t2mr60485251wrp.539.1638975483930; Wed, 08 Dec 2021 06:58:03 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id z6sm3725438wmp.9.2021.12.08.06.58.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Dec 2021 06:58:03 -0800 (PST) Message-Id: <0e84d00572ed9a99d68ec856b779f550b2a934de.1638975482.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 08 Dec 2021 14:57:48 +0000 Subject: [PATCH v2 01/14] rebase: factor out checkout for up to date branch Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Philippe Blain , Johannes Schindelin , Elijah Newren , Eric Sunshine , Phillip Wood , =?utf-8?b?UmVuw6k=?= Scharfe , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Phillip Wood , Phillip Wood Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Phillip Wood From: Phillip Wood This code is heavily indented and it will be convenient later in the series to have it in its own function. Signed-off-by: Phillip Wood --- builtin/rebase.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index 34b4744e5f3..f5c37b7d4a5 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -812,6 +812,23 @@ static int rebase_config(const char *var, const char *value, void *data) return git_default_config(var, value, data); } +static int checkout_up_to_date(struct rebase_options *options) +{ + struct strbuf buf = STRBUF_INIT; + int ret = 0; + + strbuf_addf(&buf, "%s: checkout %s", + getenv(GIT_REFLOG_ACTION_ENVIRONMENT), + options->switch_to); + if (reset_head(the_repository, &options->orig_head, "checkout", + options->head_name, RESET_HEAD_RUN_POST_CHECKOUT_HOOK, + NULL, buf.buf, DEFAULT_REFLOG_ACTION) < 0) + ret = error(_("could not switch to %s"), options->switch_to); + strbuf_release(&buf); + + return ret; +} + /* * Determines whether the commits in from..to are linear, i.e. contain * no merge commits. This function *expects* `from` to be an ancestor of @@ -1673,21 +1690,9 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) if (!(options.flags & REBASE_FORCE)) { /* Lazily switch to the target branch if needed... */ if (options.switch_to) { - strbuf_reset(&buf); - strbuf_addf(&buf, "%s: checkout %s", - getenv(GIT_REFLOG_ACTION_ENVIRONMENT), - options.switch_to); - if (reset_head(the_repository, - &options.orig_head, "checkout", - options.head_name, - RESET_HEAD_RUN_POST_CHECKOUT_HOOK, - NULL, buf.buf, - DEFAULT_REFLOG_ACTION) < 0) { - ret = error(_("could not switch to " - "%s"), - options.switch_to); + ret = checkout_up_to_date(&options); + if (ret) goto cleanup; - } } if (!(options.flags & REBASE_NO_QUIET)) From patchwork Wed Dec 8 14:57:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 12664543 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 EED2EC433EF for ; Wed, 8 Dec 2021 14:58:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235585AbhLHPBj (ORCPT ); Wed, 8 Dec 2021 10:01:39 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48290 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229522AbhLHPBi (ORCPT ); Wed, 8 Dec 2021 10:01:38 -0500 Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6B0AFC061746 for ; Wed, 8 Dec 2021 06:58:06 -0800 (PST) Received: by mail-wm1-x32b.google.com with SMTP id n33-20020a05600c502100b0032fb900951eso4342021wmr.4 for ; Wed, 08 Dec 2021 06:58:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=Lty5ZgHv/4ifEMj4n3iRiEVfuS0p7Kf8zkNE0EEf6nU=; b=mmL7lcqkiTfZg+bg7iIAcr5u0DIIsCNQdPdr6GNvRsG7rfdZ2BpcYI47xIq01VVQuY ZUedSN0tozcaTYYXXpKrjTWyQ++ouakdz4WdlmwGNptrd9EIEw8c8r4md7LRXrDkXZ3N +8MAS6Kz5IRdaoimQg+m1Kr9qCSbARCgmAXGjZbqXVx545CojzEmjTYaPwzKk5AtRQVV 8fxkiDfpCF20uQLV3dI1MhHLnx6qjrb07JPHJ3TiQ3W5pNnCsByNMj4r/lnHKcxj8FEt yoBnq3pPpy+Fkkzsr/1BlUEhWVHJ+yRxIIX9JYBxcElMRZ5u2wdC9Dkmhs4ec9AHDFyH C/HA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=Lty5ZgHv/4ifEMj4n3iRiEVfuS0p7Kf8zkNE0EEf6nU=; b=Hiv/9c4hJALLxV1GB1J7pcl/iFS8SkBKJn3Y2et6LkmifN+7lyNHxV559hFCQ+y7DA 8bRb1O2Z23zx6hP2NgIEttKcF8/lCrCI85K/XekF6oga2iN1DCvS4Gd7Sb9oe0MpZg4R TgrcKELYFc/47ZKL4mNc0uF0vBWxLl+qR+ek6mm8hxqwaOjeUeFyNEpEhu8CM2rxp5hW zt02SwYIJq5t09UAHL1gGaLiSaTLeT0xS83EFmrArM5bd4k3rKTqpNVcoTlbOXej6cY8 RjzsNDsyimrhaD2N4FYG4wbVeVmrgzvYYlvreVPXND85nG9XLhfXi21P0cOoSSPGYW0+ iHTQ== X-Gm-Message-State: AOAM532nW6yvtXftmY12gjLUAayChYdR83HpGNsqqxDKyyvTTHCzXGYy 6Kio+ABt7cuG3RrJKy5Its02wnuri9Y= X-Google-Smtp-Source: ABdhPJwe1XZLgLqUoNq1xTpeZgYtXEsB9AVejH/bHvPcS32gHlmoQa+9t2f04tLPG09ahggu9epipA== X-Received: by 2002:a05:600c:34c2:: with SMTP id d2mr17432925wmq.102.1638975484811; Wed, 08 Dec 2021 06:58:04 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id m17sm2833226wrz.22.2021.12.08.06.58.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Dec 2021 06:58:04 -0800 (PST) Message-Id: In-Reply-To: References: Date: Wed, 08 Dec 2021 14:57:49 +0000 Subject: [PATCH v2 02/14] t5403: refactor rebase post-checkout hook tests Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Philippe Blain , Johannes Schindelin , Elijah Newren , Eric Sunshine , Phillip Wood , =?utf-8?b?UmVuw6k=?= Scharfe , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Phillip Wood , Phillip Wood Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Phillip Wood From: Phillip Wood These tests only test the default backend and do not check that the arguments passed to the hook are correct. Fix this by running the tests with both backends and adding checks for the hook arguments. Signed-off-by: Phillip Wood --- t/t5403-post-checkout-hook.sh | 42 ++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh index 1ec9e23be75..272b02687ba 100755 --- a/t/t5403-post-checkout-hook.sh +++ b/t/t5403-post-checkout-hook.sh @@ -49,23 +49,33 @@ test_expect_success 'post-checkout receives the right args when not switching br test $old = $new && test $flag = 0 ' -test_expect_success 'post-checkout is triggered on rebase' ' - test_when_finished "rm -f .git/post-checkout.args" && - git checkout -b rebase-test main && - rm -f .git/post-checkout.args && - git rebase rebase-on-me && - read old new flag <.git/post-checkout.args && - test $old != $new && test $flag = 1 -' +test_rebase () { + args="$*" && + test_expect_success "post-checkout is triggered on rebase $args" ' + test_when_finished "rm -f .git/post-checkout.args" && + git checkout -B rebase-test main && + rm -f .git/post-checkout.args && + git rebase $args rebase-on-me && + read old new flag <.git/post-checkout.args && + test_cmp_rev main $old && + test_cmp_rev rebase-on-me $new && + test $flag = 1 + ' -test_expect_success 'post-checkout is triggered on rebase with fast-forward' ' - test_when_finished "rm -f .git/post-checkout.args" && - git checkout -b ff-rebase-test rebase-on-me^ && - rm -f .git/post-checkout.args && - git rebase rebase-on-me && - read old new flag <.git/post-checkout.args && - test $old != $new && test $flag = 1 -' + test_expect_success "post-checkout is triggered on rebase $args with fast-forward" ' + test_when_finished "rm -f .git/post-checkout.args" && + git checkout -B ff-rebase-test rebase-on-me^ && + rm -f .git/post-checkout.args && + git rebase $args rebase-on-me && + read old new flag <.git/post-checkout.args && + test_cmp_rev rebase-on-me^ $old && + test_cmp_rev rebase-on-me $new && + test $flag = 1 + ' +} + +test_rebase --apply && +test_rebase --merge test_expect_success 'post-checkout hook is triggered by clone' ' mkdir -p templates/hooks && From patchwork Wed Dec 8 14:57:50 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 12664547 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 C5995C433EF for ; Wed, 8 Dec 2021 14:58:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235589AbhLHPBk (ORCPT ); Wed, 8 Dec 2021 10:01:40 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48292 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235574AbhLHPBj (ORCPT ); Wed, 8 Dec 2021 10:01:39 -0500 Received: from mail-wr1-x430.google.com (mail-wr1-x430.google.com [IPv6:2a00:1450:4864:20::430]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 296BEC061746 for ; Wed, 8 Dec 2021 06:58:07 -0800 (PST) Received: by mail-wr1-x430.google.com with SMTP id u1so4487792wru.13 for ; Wed, 08 Dec 2021 06:58:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=Xd+ypywzVV3tFJRAOUFQPGA4Cg9J597K3h9Tvzl3Q3g=; b=e+/dm3INuaPkzd+dLxPMADsr4YZoXRxvD4rHtnzii+jc6F9NeR3322gYczDWz6/eGY dnY6qLDN+L4XaoBrFYdiyort5TajZVVNgHwKFaa65avj+4nvg4lUSjV/gUBkO4TwbwTx sUcS5pdFksFwk5uGomohIw3PeLqVdos9MaTH3NhvMFPhYESVaM5Rb3V91nOH2ZIzxBg5 cp5x6B31aRBY/Jg0FYw5GLN4+UW011QtGrfgMYqTm/PFMPBIaLoLkIt3ZiIUnMEeggDR aG7yofBER68VAXZ9WVWA5Mp1dM1D8yeWCEzugv6bEU7KkSw94DvZ3OQA0q17cZhN68RI jy0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=Xd+ypywzVV3tFJRAOUFQPGA4Cg9J597K3h9Tvzl3Q3g=; b=NyRnsDrknfjMXhmkV0D+1RL3x3S1Z7rrZzIXYk0sv5cX/MoL2A7wgF47jQ43O8mWCT MCOozWT718WbixqL2raBv9Rpgz3d5WKcI7KKmAT3o3Exg/rrV2PXMCZPKIFdTxjFb7FF 2JQtjKgQnEKTF6YwBa/Vr3iBIaIk0D+Cq47mIPTEv31Ql29vzrXzvSsyWbbNJ+Q0W9PE hdvnOMXRVb7bZqIceoLir2vYsUEhh9GQ/SiK227rDxsInt6C5LVE9Gtkf4tx5krwRiD0 t4omQBo0KWtWnvwVwEe+Y8RsbLEUxzram9I3qkceN3v5E6v1fs7cg0xImFvezLi+VgBa EXFw== X-Gm-Message-State: AOAM533mH2lqNffnovEh1mE5y75fxQ2LkVjyQisYS9uF8m8KDmsF81zl DCH55C+c4KIwp+GGYWlVZoemfbdoAuU= X-Google-Smtp-Source: ABdhPJxTgNss+J0Hf7dlQV0Y3+OEOwMZYaaPOdbIbb1o1fjKQy68lN8cwz6s9KLmhAWE5aHR5xAbUg== X-Received: by 2002:a5d:6d88:: with SMTP id l8mr59202846wrs.270.1638975485578; Wed, 08 Dec 2021 06:58:05 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id b10sm2895172wrt.36.2021.12.08.06.58.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Dec 2021 06:58:05 -0800 (PST) Message-Id: <07867760e68a6b28f718bdcb33094461592affaa.1638975482.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 08 Dec 2021 14:57:50 +0000 Subject: [PATCH v2 03/14] rebase: pass correct arguments to post-checkout hook Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Philippe Blain , Johannes Schindelin , Elijah Newren , Eric Sunshine , Phillip Wood , =?utf-8?b?UmVuw6k=?= Scharfe , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Phillip Wood , Phillip Wood Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Phillip Wood From: Phillip Wood If a rebase started with "rebase [--apply|--merge] " detects that is an ancestor of then it fast-forwards and checks out . Unfortunately in that case it passed the null oid as the first argument to the post-checkout hook rather than the oid of HEAD. A side effect of this change is that the call to update_ref() which updates HEAD now always receives the old value of HEAD. This provides protection against another process updating HEAD during the checkout. Signed-off-by: Phillip Wood --- reset.c | 18 +++++++++--------- t/t5403-post-checkout-hook.sh | 13 +++++++++++++ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/reset.c b/reset.c index f214df3d96c..315fef91d33 100644 --- a/reset.c +++ b/reset.c @@ -18,7 +18,7 @@ int reset_head(struct repository *r, struct object_id *oid, const char *action, unsigned run_hook = flags & RESET_HEAD_RUN_POST_CHECKOUT_HOOK; unsigned refs_only = flags & RESET_HEAD_REFS_ONLY; unsigned update_orig_head = flags & RESET_ORIG_HEAD; - struct object_id head_oid; + struct object_id *head = NULL, head_oid; struct tree_desc desc[2] = { { NULL }, { NULL } }; struct lock_file lock = LOCK_INIT; struct unpack_trees_options unpack_tree_opts = { 0 }; @@ -26,8 +26,7 @@ int reset_head(struct repository *r, struct object_id *oid, const char *action, const char *reflog_action; struct strbuf msg = STRBUF_INIT; size_t prefix_len; - struct object_id *orig = NULL, oid_orig, - *old_orig = NULL, oid_old_orig; + struct object_id *old_orig = NULL, oid_old_orig; int ret = 0, nr = 0; if (switch_to_branch && !starts_with(switch_to_branch, "refs/")) @@ -38,7 +37,9 @@ int reset_head(struct repository *r, struct object_id *oid, const char *action, goto leave_reset_head; } - if ((!oid || !reset_hard) && get_oid("HEAD", &head_oid)) { + if (!get_oid("HEAD", &head_oid)) { + head = &head_oid; + } else if (!oid || !reset_hard) { ret = error(_("could not determine HEAD revision")); goto leave_reset_head; } @@ -98,13 +99,12 @@ reset_head_refs: if (update_orig_head) { if (!get_oid("ORIG_HEAD", &oid_old_orig)) old_orig = &oid_old_orig; - if (!get_oid("HEAD", &oid_orig)) { - orig = &oid_orig; + if (head) { if (!reflog_orig_head) { strbuf_addstr(&msg, "updating ORIG_HEAD"); reflog_orig_head = msg.buf; } - update_ref(reflog_orig_head, "ORIG_HEAD", orig, + update_ref(reflog_orig_head, "ORIG_HEAD", head, old_orig, 0, UPDATE_REFS_MSG_ON_ERR); } else if (old_orig) delete_ref(NULL, "ORIG_HEAD", old_orig, 0); @@ -116,7 +116,7 @@ reset_head_refs: reflog_head = msg.buf; } if (!switch_to_branch) - ret = update_ref(reflog_head, "HEAD", oid, orig, + ret = update_ref(reflog_head, "HEAD", oid, head, detach_head ? REF_NO_DEREF : 0, UPDATE_REFS_MSG_ON_ERR); else { @@ -128,7 +128,7 @@ reset_head_refs: } if (run_hook) run_hook_le(NULL, "post-checkout", - oid_to_hex(orig ? orig : null_oid()), + oid_to_hex(head ? head : null_oid()), oid_to_hex(oid), "1", NULL); leave_reset_head: diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh index 272b02687ba..17ab518f268 100755 --- a/t/t5403-post-checkout-hook.sh +++ b/t/t5403-post-checkout-hook.sh @@ -72,6 +72,19 @@ test_rebase () { test_cmp_rev rebase-on-me $new && test $flag = 1 ' + + test_expect_success "rebase $args fast-forward branch checkout runs post-checkout hook" ' + test_when_finished "test_might_fail git rebase --abort" && + test_when_finished "rm -f .git/post-checkout.args" && + git update-ref refs/heads/rebase-fast-forward three && + git checkout two && + rm -f .git/post-checkout.args && + git rebase $args HEAD rebase-fast-forward && + read old new flag <.git/post-checkout.args && + test_cmp_rev two $old && + test_cmp_rev three $new && + test $flag = 1 + ' } test_rebase --apply && From patchwork Wed Dec 8 14:57:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 12664549 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 DA457C433FE for ; Wed, 8 Dec 2021 14:58:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235602AbhLHPBm (ORCPT ); Wed, 8 Dec 2021 10:01:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48294 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235579AbhLHPBj (ORCPT ); Wed, 8 Dec 2021 10:01:39 -0500 Received: from mail-wr1-x42e.google.com (mail-wr1-x42e.google.com [IPv6:2a00:1450:4864:20::42e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CDA72C061746 for ; Wed, 8 Dec 2021 06:58:07 -0800 (PST) Received: by mail-wr1-x42e.google.com with SMTP id c4so4516395wrd.9 for ; Wed, 08 Dec 2021 06:58:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=g18gxowLGlOAHdHgd0AVy0n2vqA1nu30Ytr4gA/Pvm4=; b=qhh6dOywKGDqrVW4DTEqzBg9bZ+HsiShcI68/P3/PE5HAJkvSXwuL5oj49QqpZSJIs XFmX0etRkY2URTohv0zDEUbIRqfNKPGiSoTcn3quTZEBDoGUL3YMgXOTfRqn6vOFz3NL q9u9Z6ivwIm7TPsfskkSzhtBhXKG3pimIXgy/jVuhr+o1/BpGyjIE/79exuDesl5zTPn iwhG/jfVkfaFgBxxoggfHtKcEDf7V5YpoN4lwIs4926b70Wo10Wxwkcr53m7S0uD8YoX NrPJqm67UM1/XBH/rzsqrwaCX1vOMK0cDP0qgl0Oa5wE3+yfGbrkQ4GVU2kiS1VBishH T5dA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=g18gxowLGlOAHdHgd0AVy0n2vqA1nu30Ytr4gA/Pvm4=; b=oaHtM1nNA9ewBPbOWa9V3qLLO2CWWbT4X7ehTmXUUkemrAdKkEdrJmDyiaDFqH37Mq zQmi1VtBRJ98oWsTF7jdR2lVj4EOsFYOrufAVOIWhMUqoFToToDkmNEA8bmMaAtmDZAJ vxFQWGBFFeIrQOmvgFZXcIpBJiKxHsVNAPwuRRDsPHBzq0fSq1PfyBX2z7DW+T87CbeN 9pAYUjdo/iKhj4LnT/50sf8JyvWGxwTkHVeTjQpDtFECFO6OBIhS03fTUQhr4jc25P8C Fz/xBoJ352aZSpmRr/zI1WfEVKkHsg1yGvRC5+4inQEy3ZCsifwrUNBhoP4FXQIb/K74 YLiQ== X-Gm-Message-State: AOAM533ebjDqGVZXpk4rEfFfNPr3/lUrcmTS1oqDYXFyhsvvHNEyTA64 C+vBfeJ31HOrrby/vKVud0txnhgGru0= X-Google-Smtp-Source: ABdhPJzoEhaGEqeV3yUdh6+F7Gl30mIjn/5b5LRPbTNDeFp64f8ldSuGjun4ZfSUYXdkqlU89RP2fg== X-Received: by 2002:a5d:64cc:: with SMTP id f12mr59308800wri.322.1638975486270; Wed, 08 Dec 2021 06:58:06 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id g13sm2882534wmk.37.2021.12.08.06.58.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Dec 2021 06:58:06 -0800 (PST) Message-Id: <2b499704c8f132f173c7328d5f020330481b24dc.1638975482.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 08 Dec 2021 14:57:51 +0000 Subject: [PATCH v2 04/14] rebase: do not remove untracked files on checkout Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Philippe Blain , Johannes Schindelin , Elijah Newren , Eric Sunshine , Phillip Wood , =?utf-8?b?UmVuw6k=?= Scharfe , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Phillip Wood , Phillip Wood Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Phillip Wood From: Phillip Wood If "git rebase [--apply|--merge] " detects that is an ancestor of then it will fast-forward and checkout . Normally a checkout or picking a commit during a rebase will refuse to overwrite untracked files, however rebase does overwrite untracked files when checking . The fix is to only set reset in `unpack_tree_opts` if flags contains `RESET_HEAD_HARD`. t5403 may seem like an odd home for the new test but it will be extended in the next commit to check that the post-checkout hook is not run when the checkout fails. The test for `!deatch_head` dates back to the original implementation of reset_head() in ac7f467fef ("builtin/rebase: support running "git rebase "", 2018-08-07) and was correct until e65123a71d ("builtin rebase: support `git rebase `", 2018-09-04) started using reset_head() to checkout when fast-forwarding. Note that 480d3d6bf9 ("Change unpack_trees' 'reset' flag into an enum", 2021-09-27) also fixes this bug as it changes reset_head() to never remove untracked files. I think this fix is still worthwhile as it makes it clear that the same settings are used for detached and non-detached checkouts. Signed-off-by: Phillip Wood --- reset.c | 2 +- t/t5403-post-checkout-hook.sh | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/reset.c b/reset.c index 315fef91d33..3e7b9e2e131 100644 --- a/reset.c +++ b/reset.c @@ -59,7 +59,7 @@ int reset_head(struct repository *r, struct object_id *oid, const char *action, unpack_tree_opts.merge = 1; unpack_tree_opts.preserve_ignored = 0; /* FIXME: !overwrite_ignore */ init_checkout_metadata(&unpack_tree_opts.meta, switch_to_branch, oid, NULL); - if (!detach_head) + if (reset_hard) unpack_tree_opts.reset = UNPACK_RESET_PROTECT_UNTRACKED; if (repo_read_index_unmerged(r) < 0) { diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh index 17ab518f268..fd2817b4068 100755 --- a/t/t5403-post-checkout-hook.sh +++ b/t/t5403-post-checkout-hook.sh @@ -85,6 +85,16 @@ test_rebase () { test_cmp_rev three $new && test $flag = 1 ' + + test_expect_success "rebase $args checkout does not remove untracked files" ' + test_when_finished "test_might_fail git rebase --abort" && + git update-ref refs/heads/rebase-fast-forward three && + git checkout two && + echo untracked >three.t && + test_when_finished "rm three.t" && + test_must_fail git rebase $args HEAD rebase-fast-forward 2>err && + grep "untracked working tree files would be overwritten by checkout" err +' } test_rebase --apply && From patchwork Wed Dec 8 14:57:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 12664551 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 715DCC433F5 for ; Wed, 8 Dec 2021 14:58:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235614AbhLHPBp (ORCPT ); Wed, 8 Dec 2021 10:01:45 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48304 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235586AbhLHPBk (ORCPT ); Wed, 8 Dec 2021 10:01:40 -0500 Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 71744C061746 for ; Wed, 8 Dec 2021 06:58:08 -0800 (PST) Received: by mail-wm1-x32b.google.com with SMTP id g191-20020a1c9dc8000000b0032fbf912885so1956148wme.4 for ; Wed, 08 Dec 2021 06:58:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=bcCGT7qWydoUuj2E6FQ1QbDM97Qqw7k8VFpmNeRqJyQ=; b=dWri/JMt2eg0M/dg4GJQ6BlWd3thBTMlEtWiRjsXX9551ijGKgbH8sQmdFkAQz+5Gb r5GPCRshxgBYO3TNHkzUzTSmUhoFauOi3h/A7DYYkKqIo5Y5oTiIy+RWNOKy0ZlPNAWC 9t2neavVX/ruNOJ1vMvjJYPFDiGpLLzeHK8Qu86BmbqKnxMHrKiLe8X69u9RgxEWeN7i AZhrUeDq7r1NwO12JPaYN3ZWQTaHmlU0wu4AU8iMmw/WRWfpm9oLjGuK2xj+dmirMqVk zMyn9VSt11PvJStlsYVlDwwEcMcU80QT9UNzWFfrG7yG95OrqrLLoLMTegcP2oq0oshx vspQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=bcCGT7qWydoUuj2E6FQ1QbDM97Qqw7k8VFpmNeRqJyQ=; b=Lbf7AZRTugX+JsdN4nzPwmGpMbKMxF/WsGKhUltxb5Cj0SH7EMXmNHinH/zeqohSYY PjOptTL1gI1bJXP8UDqhgzrlTt0dRPa3SFKoDsZNLtJAHnqCcb4kfqT+6E3QWmK1cQ68 8ZwZTQ08zlvtWADvPw/CZWBh53ZmMU51mli/7IGcTdRc1umBVF0+oP0VhpQMUVLqbZjG C8QjvTs13RV7NXa6Av+TrevCNFaumljtNziOf2CIwtMUm5s3/u1Xk81nLSAcpdtzW6Fy s1tt/ASav+vrS349Xyt7aZ8a17M5x+Iz0/XZ6aqOfBfnY2vaNaLmnJ5f8Ulv2E+VJUZH Bt/Q== X-Gm-Message-State: AOAM5316ebQIXGR1SYtSMwkx1vhnCLwU8ZfTyqhJNMaTAJYvqf0Uu1ux UHhjvFK7GmbInyK0T7sZWPfQvEs6KWw= X-Google-Smtp-Source: ABdhPJwKpFn+nPqm5MZ3vBu0pWYnqOPFaLLxPe0UPncPxuKDu39+4O/8s7Q27RJyvILaXvgdAsNAVg== X-Received: by 2002:a1c:287:: with SMTP id 129mr16833207wmc.49.1638975486911; Wed, 08 Dec 2021 06:58:06 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id r15sm5763356wmh.13.2021.12.08.06.58.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Dec 2021 06:58:06 -0800 (PST) Message-Id: <04e7340a7e7b9fe0193070e9b9c9fb99b60503fc.1638975482.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 08 Dec 2021 14:57:52 +0000 Subject: [PATCH v2 05/14] rebase --apply: don't run post-checkout hook if there is an error Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Philippe Blain , Johannes Schindelin , Elijah Newren , Eric Sunshine , Phillip Wood , =?utf-8?b?UmVuw6k=?= Scharfe , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Phillip Wood , Phillip Wood Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Phillip Wood From: Phillip Wood The hook should only be run if the worktree and refs were successfully updated. This primarily affects "rebase --apply" but also "rebase --merge" when it fast-forwards. Signed-off-by: Phillip Wood --- reset.c | 2 +- t/t5403-post-checkout-hook.sh | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/reset.c b/reset.c index 3e7b9e2e131..3537de91f65 100644 --- a/reset.c +++ b/reset.c @@ -126,7 +126,7 @@ reset_head_refs: ret = create_symref("HEAD", switch_to_branch, reflog_head); } - if (run_hook) + if (!ret && run_hook) run_hook_le(NULL, "post-checkout", oid_to_hex(head ? head : null_oid()), oid_to_hex(oid), "1", NULL); diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh index fd2817b4068..d1181816906 100755 --- a/t/t5403-post-checkout-hook.sh +++ b/t/t5403-post-checkout-hook.sh @@ -88,12 +88,16 @@ test_rebase () { test_expect_success "rebase $args checkout does not remove untracked files" ' test_when_finished "test_might_fail git rebase --abort" && + test_when_finished "rm -f .git/post-checkout.args" && git update-ref refs/heads/rebase-fast-forward three && git checkout two && + rm -f .git/post-checkout.args && echo untracked >three.t && test_when_finished "rm three.t" && test_must_fail git rebase $args HEAD rebase-fast-forward 2>err && - grep "untracked working tree files would be overwritten by checkout" err + grep "untracked working tree files would be overwritten by checkout" err && + test_path_is_missing .git/post-checkout.args + ' } From patchwork Wed Dec 8 14:57:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 12664553 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 8E865C433EF for ; Wed, 8 Dec 2021 14:58:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235579AbhLHPBr (ORCPT ); Wed, 8 Dec 2021 10:01:47 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48306 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235590AbhLHPBl (ORCPT ); Wed, 8 Dec 2021 10:01:41 -0500 Received: from mail-wr1-x433.google.com (mail-wr1-x433.google.com [IPv6:2a00:1450:4864:20::433]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 53D50C061746 for ; Wed, 8 Dec 2021 06:58:09 -0800 (PST) Received: by mail-wr1-x433.google.com with SMTP id t9so4543040wrx.7 for ; Wed, 08 Dec 2021 06:58:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=0i+OqEyIp2gUhDcYmneCi2OS4t/v4DnKLlcRCSms98Y=; b=R3En04CuYau5t2Rq2bF4gJTHLso294UqJ1oFQJmYW8gjiJ2OzKy1mMdOIaphVj4Kmd or5o1KMeTIJA1XScywu9S/e7+yQ4HU/Lq+qJteEUEbzmYwBeVFuKpHoysjh0ZmK2VJNj Axlk3yiShgsP3QYIuWuO5f/WCde2UOgKEbLwzWSq7NoqqXXSebdQDGqVU3RBOzPVuxXm o/O3s37o/IZ2wlXpksBhz44KRBEtJ5UZNkIX6xGmkAmNAfkxLs/hX78EqTLFwGP+VDaP P7gBs7zQ02HDyNgG7I9gbNFFSMghoaixC0H8wQ5RwCV9N9lxATO0XdPHoZRyTo7ojF2j LVKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=0i+OqEyIp2gUhDcYmneCi2OS4t/v4DnKLlcRCSms98Y=; b=HACN7gsbDywVyq7glw++iiHdX7LYFDc4Ik4W28FtQgBwlYbzW72zAEFQ6BXUfjYqWT 5umqjQVCA4zHHQg3HO4Rgxpu1UYv5/9Wb3aSUV2qyyqLo10Uv4rZQrGYMJSi2FpN6iRF A/O4QgedeC/c3gl3adLsAo9fA34T3zN9MPHHeaxgrljtvwxhXbkg4onGsg5qaT6/UvDk 7cmfo+h3Bk02eUEx7g7EA+1BGhJbOQ1pnjr16Jo/T4qTtzsxzk46+fJxoq4BTcUfd59a UADe2p2VdWLwTJAcoCmzg7RptPSjghX2AEOUR4vmMm0WZVYdKyNHg+o5/VlDsM77hRzc xAQQ== X-Gm-Message-State: AOAM532jmuJlhE6kn/wuUCAwdrIMbLLQ++tMA4/fdyL/3G48mVPBh+7i Uz1wcsSlr+Q30QQ0NWq5tGDnHWL97RM= X-Google-Smtp-Source: ABdhPJzlMUH0RwmA3/785ibybdnbzuCAxzl8nprjvHufW8yeSyoajd/Rj23xFqrv3MXHGfJpMynOgA== X-Received: by 2002:a05:6000:47:: with SMTP id k7mr58180542wrx.485.1638975487675; Wed, 08 Dec 2021 06:58:07 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id g5sm3802615wri.45.2021.12.08.06.58.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Dec 2021 06:58:07 -0800 (PST) Message-Id: <32ffa98c1bcc0350fbbf6ce8c1bec5827bcb2594.1638975482.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 08 Dec 2021 14:57:53 +0000 Subject: [PATCH v2 06/14] reset_head(): remove action parameter Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Philippe Blain , Johannes Schindelin , Elijah Newren , Eric Sunshine , Phillip Wood , =?utf-8?b?UmVuw6k=?= Scharfe , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Phillip Wood , Phillip Wood Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Phillip Wood From: Phillip Wood The only use of the action parameter is to setup the error messages for unpack_trees(). All but two cases pass either "checkout" or "reset". The case that passes "reset --hard" would be better passing "reset" so that the error messages match the builtin reset command like all the other callers that are doing a reset. The case that passes "Fast-forwarded" is only updating HEAD and so the parameter is unused in that case as it does not call unpack_trees(). The value to pass to setup_unpack_trees_porcelain() can be determined by checking whether flags contains RESET_HEAD_HARD without the caller having to specify it. Signed-off-by: Phillip Wood --- builtin/rebase.c | 14 +++++++------- reset.c | 5 +++-- reset.h | 2 +- sequencer.c | 3 +-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index f5c37b7d4a5..2e5a535b54e 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -583,7 +583,7 @@ static int move_to_original_branch(struct rebase_options *opts) opts->head_name, oid_to_hex(&opts->onto->object.oid)); strbuf_addf(&head_reflog, "rebase finished: returning to %s", opts->head_name); - ret = reset_head(the_repository, NULL, "", opts->head_name, + ret = reset_head(the_repository, NULL, opts->head_name, RESET_HEAD_REFS_ONLY, orig_head_reflog.buf, head_reflog.buf, DEFAULT_REFLOG_ACTION); @@ -674,7 +674,7 @@ static int run_am(struct rebase_options *opts) free(rebased_patches); strvec_clear(&am.args); - reset_head(the_repository, &opts->orig_head, "checkout", + reset_head(the_repository, &opts->orig_head, opts->head_name, 0, "HEAD", NULL, DEFAULT_REFLOG_ACTION); error(_("\ngit encountered an error while preparing the " @@ -820,7 +820,7 @@ static int checkout_up_to_date(struct rebase_options *options) strbuf_addf(&buf, "%s: checkout %s", getenv(GIT_REFLOG_ACTION_ENVIRONMENT), options->switch_to); - if (reset_head(the_repository, &options->orig_head, "checkout", + if (reset_head(the_repository, &options->orig_head, options->head_name, RESET_HEAD_RUN_POST_CHECKOUT_HOOK, NULL, buf.buf, DEFAULT_REFLOG_ACTION) < 0) ret = error(_("could not switch to %s"), options->switch_to); @@ -1272,7 +1272,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) rerere_clear(the_repository, &merge_rr); string_list_clear(&merge_rr, 1); - if (reset_head(the_repository, NULL, "reset", NULL, RESET_HEAD_HARD, + if (reset_head(the_repository, NULL, NULL, RESET_HEAD_HARD, NULL, NULL, DEFAULT_REFLOG_ACTION) < 0) die(_("could not discard worktree changes")); remove_branch_state(the_repository, 0); @@ -1290,7 +1290,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) if (read_basic_state(&options)) exit(1); - if (reset_head(the_repository, &options.orig_head, "reset", + if (reset_head(the_repository, &options.orig_head, options.head_name, RESET_HEAD_HARD, NULL, NULL, DEFAULT_REFLOG_ACTION) < 0) die(_("could not move back to %s"), @@ -1759,7 +1759,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) strbuf_addf(&msg, "%s: checkout %s", getenv(GIT_REFLOG_ACTION_ENVIRONMENT), options.onto_name); - if (reset_head(the_repository, &options.onto->object.oid, "checkout", NULL, + if (reset_head(the_repository, &options.onto->object.oid, NULL, RESET_HEAD_DETACH | RESET_ORIG_HEAD | RESET_HEAD_RUN_POST_CHECKOUT_HOOK, NULL, msg.buf, DEFAULT_REFLOG_ACTION)) @@ -1777,7 +1777,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) strbuf_addf(&msg, "rebase finished: %s onto %s", options.head_name ? options.head_name : "detached HEAD", oid_to_hex(&options.onto->object.oid)); - reset_head(the_repository, NULL, "Fast-forwarded", options.head_name, + reset_head(the_repository, NULL, options.head_name, RESET_HEAD_REFS_ONLY, "HEAD", msg.buf, DEFAULT_REFLOG_ACTION); strbuf_release(&msg); diff --git a/reset.c b/reset.c index 3537de91f65..7841b2b2a02 100644 --- a/reset.c +++ b/reset.c @@ -8,7 +8,7 @@ #include "tree.h" #include "unpack-trees.h" -int reset_head(struct repository *r, struct object_id *oid, const char *action, +int reset_head(struct repository *r, struct object_id *oid, const char *switch_to_branch, unsigned flags, const char *reflog_orig_head, const char *reflog_head, const char *default_reflog_action) @@ -23,7 +23,7 @@ int reset_head(struct repository *r, struct object_id *oid, const char *action, struct lock_file lock = LOCK_INIT; struct unpack_trees_options unpack_tree_opts = { 0 }; struct tree *tree; - const char *reflog_action; + const char *action, *reflog_action; struct strbuf msg = STRBUF_INIT; size_t prefix_len; struct object_id *old_orig = NULL, oid_old_orig; @@ -50,6 +50,7 @@ int reset_head(struct repository *r, struct object_id *oid, const char *action, if (refs_only) goto reset_head_refs; + action = reset_hard ? "reset" : "checkout"; setup_unpack_trees_porcelain(&unpack_tree_opts, action); unpack_tree_opts.head_idx = 1; unpack_tree_opts.src_index = r->index; diff --git a/reset.h b/reset.h index 12f83c78e28..2daec804259 100644 --- a/reset.h +++ b/reset.h @@ -12,7 +12,7 @@ #define RESET_HEAD_REFS_ONLY (1<<3) #define RESET_ORIG_HEAD (1<<4) -int reset_head(struct repository *r, struct object_id *oid, const char *action, +int reset_head(struct repository *r, struct object_id *oid, const char *switch_to_branch, unsigned flags, const char *reflog_orig_head, const char *reflog_head, const char *default_reflog_action); diff --git a/sequencer.c b/sequencer.c index ea96837cde3..3d3c3fbe305 100644 --- a/sequencer.c +++ b/sequencer.c @@ -4131,8 +4131,7 @@ void create_autostash(struct repository *r, const char *path, path); write_file(path, "%s", oid_to_hex(&oid)); printf(_("Created autostash: %s\n"), buf.buf); - if (reset_head(r, NULL, "reset --hard", - NULL, RESET_HEAD_HARD, NULL, NULL, + if (reset_head(r, NULL, NULL, RESET_HEAD_HARD, NULL, NULL, default_reflog_action) < 0) die(_("could not reset --hard")); From patchwork Wed Dec 8 14:57:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 12664555 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 92CFDC433FE for ; Wed, 8 Dec 2021 14:58:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235619AbhLHPBs (ORCPT ); Wed, 8 Dec 2021 10:01:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48310 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235592AbhLHPBm (ORCPT ); Wed, 8 Dec 2021 10:01:42 -0500 Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 12B4EC061A32 for ; Wed, 8 Dec 2021 06:58:10 -0800 (PST) Received: by mail-wm1-x330.google.com with SMTP id p18so1959807wmq.5 for ; Wed, 08 Dec 2021 06:58:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=oAz1BXO35jPyviQ4+93z2pC8F5URTOyYHE54QL5vpXg=; b=G4Hdc2Y6Hst/1wmeSZlsjpRJToFcXc5jaJoQe/tKu6xdQlW5CdDzXpsAoxG2jPpe9J z8i/y96DKMIXsdzEm6b4tPT5XlmtwiIwr9yel/3kyCb3YzHSifWBJTnpwEwKnf86wT7r 1FGJgwrz4Pn8m9VMF7O0gk0QAVET612x++H9jvVzT/FTO2S/9T6IMZRLcUzYsV8xadj3 esHAE86FDYeuGMpoAyQLo4p64KWzWorkSs3Cv9kCReYR3s+zMiC6iTpfPYJGCYsB3pVk /zBW1TRLzjqf0AJPhAfoqWLYiRY15FXph8BqbTAEA+/a5KO5kledHh0lzpFYeyMgpg6D Fhgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=oAz1BXO35jPyviQ4+93z2pC8F5URTOyYHE54QL5vpXg=; b=FNPwtIop/5/f3XHf0KhvxGcQA0CLBvEm3kaJ++4A7mQo5DWq/stGnRcJeeLsqewknA yGpU2ewnDm41HwjqF0/YuXfuIMJCTFIRFluIXywPP27/jGjSQfSJNGNUA/WdT/0XF4DB D/n1pmGFtt7+aovd9sciyipcKFwDw+ECNE9qzqaO4VTcxceKWNfRoVdd5rBO00YKEQeB Q6iO9B7YO6/0tEyHVpe+aQqqTU3TN9q9Jm3Rp/P0m4axUt1rDsno/kj0sDM4p+D2P+W/ wmO1zNlS+eQ8gp7Hc60rzGVRBbnrlrL9YkC5mGM1U/6AwKZLevhIsSEWWAryI1izouh4 iw5Q== X-Gm-Message-State: AOAM530WsCdsrGW3ueNjR/Ss2mZ57kIxJ4QgY1zfFOrXPWmLDmZzWdSI iLuJsL+3kzLsCu4vNetp5mpyVmk7vKw= X-Google-Smtp-Source: ABdhPJxjS77Ocmqnnw48udf3Vvq5Fdbc3W3W9diHF4uFh2QLC9Iyp68u89t90oa5zG3c5h7H7qI9MA== X-Received: by 2002:a1c:4d8:: with SMTP id 207mr16746266wme.23.1638975488465; Wed, 08 Dec 2021 06:58:08 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id b197sm2906225wmb.24.2021.12.08.06.58.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Dec 2021 06:58:08 -0800 (PST) Message-Id: <341fe183c18ee28b459ba26f2c8c369d9367c328.1638975482.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 08 Dec 2021 14:57:54 +0000 Subject: [PATCH v2 07/14] create_autostash(): remove unneeded parameter Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Philippe Blain , Johannes Schindelin , Elijah Newren , Eric Sunshine , Phillip Wood , =?utf-8?b?UmVuw6k=?= Scharfe , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Phillip Wood , Phillip Wood Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Phillip Wood From: Phillip Wood The default_reflog parameter of create_autostash() is passed to reset_head(). However as creating a stash does not involve updating any refs the parameter is not used by reset_head(). Removing the parameter from create_autostash() simplifies the callers. Signed-off-by: Phillip Wood --- builtin/merge.c | 6 ++---- builtin/rebase.c | 8 ++++---- sequencer.c | 5 ++--- sequencer.h | 3 +-- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/builtin/merge.c b/builtin/merge.c index ea3112e0c0b..cb0e4e22258 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -1565,8 +1565,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) if (autostash) create_autostash(the_repository, - git_path_merge_autostash(the_repository), - "merge"); + git_path_merge_autostash(the_repository)); if (checkout_fast_forward(the_repository, &head_commit->object.oid, &commit->object.oid, @@ -1637,8 +1636,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) if (autostash) create_autostash(the_repository, - git_path_merge_autostash(the_repository), - "merge"); + git_path_merge_autostash(the_repository)); /* We are going to make a new commit. */ git_committer_info(IDENT_STRICT); diff --git a/builtin/rebase.c b/builtin/rebase.c index 2e5a535b54e..832e6954827 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -1658,10 +1658,10 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) if (repo_read_index(the_repository) < 0) die(_("could not read index")); - if (options.autostash) { - create_autostash(the_repository, state_dir_path("autostash", &options), - DEFAULT_REFLOG_ACTION); - } + if (options.autostash) + create_autostash(the_repository, + state_dir_path("autostash", &options)); + if (require_clean_work_tree(the_repository, "rebase", _("Please commit or stash them."), 1, 1)) { diff --git a/sequencer.c b/sequencer.c index 3d3c3fbe305..5c65f5f1ac5 100644 --- a/sequencer.c +++ b/sequencer.c @@ -4094,8 +4094,7 @@ static enum todo_command peek_command(struct todo_list *todo_list, int offset) return -1; } -void create_autostash(struct repository *r, const char *path, - const char *default_reflog_action) +void create_autostash(struct repository *r, const char *path) { struct strbuf buf = STRBUF_INIT; struct lock_file lock_file = LOCK_INIT; @@ -4132,7 +4131,7 @@ void create_autostash(struct repository *r, const char *path, write_file(path, "%s", oid_to_hex(&oid)); printf(_("Created autostash: %s\n"), buf.buf); if (reset_head(r, NULL, NULL, RESET_HEAD_HARD, NULL, NULL, - default_reflog_action) < 0) + "") < 0) die(_("could not reset --hard")); if (discard_index(r->index) < 0 || diff --git a/sequencer.h b/sequencer.h index 05a7d2ba6b3..da64473636b 100644 --- a/sequencer.h +++ b/sequencer.h @@ -197,8 +197,7 @@ void commit_post_rewrite(struct repository *r, const struct commit *current_head, const struct object_id *new_head); -void create_autostash(struct repository *r, const char *path, - const char *default_reflog_action); +void create_autostash(struct repository *r, const char *path); int save_autostash(const char *path); int apply_autostash(const char *path); int apply_autostash_oid(const char *stash_oid); From patchwork Wed Dec 8 14:57:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 12664557 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 BEFBFC433EF for ; Wed, 8 Dec 2021 14:58:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235663AbhLHPBt (ORCPT ); Wed, 8 Dec 2021 10:01:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48324 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235607AbhLHPBn (ORCPT ); Wed, 8 Dec 2021 10:01:43 -0500 Received: from mail-wr1-x42c.google.com (mail-wr1-x42c.google.com [IPv6:2a00:1450:4864:20::42c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C6684C061D5E for ; Wed, 8 Dec 2021 06:58:10 -0800 (PST) Received: by mail-wr1-x42c.google.com with SMTP id d9so4561722wrw.4 for ; Wed, 08 Dec 2021 06:58:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=7frHrKSDoOqyYfdgR4JQWSleb705I+rDNQOnW/uiuno=; b=La7n4kxJOp/1UUEd8B9LGRFZKrEuy+8J7ebdcCXb1SHObEKt93/CexyaoCpQaz1s/o VXenijT+tKB5T9WZjDUCXdnlcMcB7D8R613z787/sunXbJ0xM3SlRlke/d79E19HD8WG oox9Kmro975ecOSIf7ENmJb0W13uAbaDksRaXDALk9n8PE3Uz4MZAHl+18Cgi3qm7jbo FxPFSwrY15FG1sQ7DNpH09XotkEyfibjqYckBh/ekgEjphmHyGLWQQKsfitaz7RCMP7I irqmZcp09bNnbh1z1jR7mdyN4taOxZuRaItrBcYCGBLS6GtQYeodpKrKKK1W5siOyDMQ Rd+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=7frHrKSDoOqyYfdgR4JQWSleb705I+rDNQOnW/uiuno=; b=pVecaxAmeBNIL/ljERBDP/BA3XzgyDeJj1ron0yYCLEVaZWMN0VIjVubcU0OVzv5gd vUsdIlmYaTNUHi6r4Z4cwciMAh011MkxPdXmp5M0w1Ntq73hCOLr2eqJNBxxDs877d9t zIk4f0bAX3Bj6n2ndEnGydyLFQMZ0gpgTKkd0BfCAwjByUYebgt3B7yDwUjYhy5qMpKb 33eODq426Muz3iFDySK1lNScFyXv0RjKwDNVdi/Z/S7xEV60iBiwgc41IeqLzoF2m2P+ e12HKCtMSGZZAz4Yzu+theMu+uxGuOBm6oecdMqxREKEzSKD2vULErtQmXfYj5rO5IkV ROaw== X-Gm-Message-State: AOAM533HZOqvznMJp7TZfCT39PpEH/OEh2ipwVm+mNuH6rolXlpEkoip lwMHldrAcqY7AEjnYfpi4ANKBicB/jc= X-Google-Smtp-Source: ABdhPJzISbj6dhzaF/4IVYnj6A1b04NGiGchKxwKVLfnlqQq12YH3CkN19FzfNH06ztXwIfckI1gGw== X-Received: by 2002:adf:fb4f:: with SMTP id c15mr60738339wrs.507.1638975489206; Wed, 08 Dec 2021 06:58:09 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id x1sm2941941wru.40.2021.12.08.06.58.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Dec 2021 06:58:08 -0800 (PST) Message-Id: <29e06e7d36de454da18de9fde871cbaf491cefc6.1638975482.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 08 Dec 2021 14:57:55 +0000 Subject: [PATCH v2 08/14] reset_head(): factor out ref updates Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Philippe Blain , Johannes Schindelin , Elijah Newren , Eric Sunshine , Phillip Wood , =?utf-8?b?UmVuw6k=?= Scharfe , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Phillip Wood , Phillip Wood Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Phillip Wood From: Phillip Wood In the next commit we will stop trying to update HEAD when we are removing uncommitted changes from the working tree. Move the code that updates the refs to its own function in preparation for that. Signed-off-by: Phillip Wood --- reset.c | 110 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 62 insertions(+), 48 deletions(-) diff --git a/reset.c b/reset.c index 7841b2b2a02..56d6e2a06d9 100644 --- a/reset.c +++ b/reset.c @@ -8,25 +8,75 @@ #include "tree.h" #include "unpack-trees.h" +static int update_refs(const struct object_id *oid, const char *switch_to_branch, + const struct object_id *head, const char *reflog_head, + const char *reflog_orig_head, + const char *default_reflog_action, unsigned flags) +{ + unsigned detach_head = flags & RESET_HEAD_DETACH; + unsigned run_hook = flags & RESET_HEAD_RUN_POST_CHECKOUT_HOOK; + unsigned update_orig_head = flags & RESET_ORIG_HEAD; + struct object_id *old_orig = NULL, oid_old_orig; + struct strbuf msg = STRBUF_INIT; + const char *reflog_action; + size_t prefix_len; + int ret; + + reflog_action = getenv(GIT_REFLOG_ACTION_ENVIRONMENT); + strbuf_addf(&msg, "%s: ", reflog_action ? reflog_action : default_reflog_action); + prefix_len = msg.len; + + if (update_orig_head) { + if (!get_oid("ORIG_HEAD", &oid_old_orig)) + old_orig = &oid_old_orig; + if (head) { + if (!reflog_orig_head) { + strbuf_addstr(&msg, "updating ORIG_HEAD"); + reflog_orig_head = msg.buf; + } + update_ref(reflog_orig_head, "ORIG_HEAD", head, + old_orig, 0, UPDATE_REFS_MSG_ON_ERR); + } else if (old_orig) + delete_ref(NULL, "ORIG_HEAD", old_orig, 0); + } + + if (!reflog_head) { + strbuf_setlen(&msg, prefix_len); + strbuf_addstr(&msg, "updating HEAD"); + reflog_head = msg.buf; + } + if (!switch_to_branch) + ret = update_ref(reflog_head, "HEAD", oid, head, + detach_head ? REF_NO_DEREF : 0, + UPDATE_REFS_MSG_ON_ERR); + else { + ret = update_ref(reflog_head, switch_to_branch, oid, + NULL, 0, UPDATE_REFS_MSG_ON_ERR); + if (!ret) + ret = create_symref("HEAD", switch_to_branch, + reflog_head); + } + if (!ret && run_hook) + run_hook_le(NULL, "post-checkout", + oid_to_hex(head ? head : null_oid()), + oid_to_hex(oid), "1", NULL); + strbuf_release(&msg); + return ret; +} + int reset_head(struct repository *r, struct object_id *oid, const char *switch_to_branch, unsigned flags, const char *reflog_orig_head, const char *reflog_head, const char *default_reflog_action) { - unsigned detach_head = flags & RESET_HEAD_DETACH; unsigned reset_hard = flags & RESET_HEAD_HARD; - unsigned run_hook = flags & RESET_HEAD_RUN_POST_CHECKOUT_HOOK; unsigned refs_only = flags & RESET_HEAD_REFS_ONLY; - unsigned update_orig_head = flags & RESET_ORIG_HEAD; struct object_id *head = NULL, head_oid; struct tree_desc desc[2] = { { NULL }, { NULL } }; struct lock_file lock = LOCK_INIT; struct unpack_trees_options unpack_tree_opts = { 0 }; struct tree *tree; - const char *action, *reflog_action; - struct strbuf msg = STRBUF_INIT; - size_t prefix_len; - struct object_id *old_orig = NULL, oid_old_orig; + const char *action; int ret = 0, nr = 0; if (switch_to_branch && !starts_with(switch_to_branch, "refs/")) @@ -48,7 +98,9 @@ int reset_head(struct repository *r, struct object_id *oid, oid = &head_oid; if (refs_only) - goto reset_head_refs; + return update_refs(oid, switch_to_branch, head, reflog_head, + reflog_orig_head, default_reflog_action, + flags); action = reset_hard ? "reset" : "checkout"; setup_unpack_trees_porcelain(&unpack_tree_opts, action); @@ -92,48 +144,10 @@ int reset_head(struct repository *r, struct object_id *oid, goto leave_reset_head; } -reset_head_refs: - reflog_action = getenv(GIT_REFLOG_ACTION_ENVIRONMENT); - strbuf_addf(&msg, "%s: ", reflog_action ? reflog_action : default_reflog_action); - prefix_len = msg.len; - - if (update_orig_head) { - if (!get_oid("ORIG_HEAD", &oid_old_orig)) - old_orig = &oid_old_orig; - if (head) { - if (!reflog_orig_head) { - strbuf_addstr(&msg, "updating ORIG_HEAD"); - reflog_orig_head = msg.buf; - } - update_ref(reflog_orig_head, "ORIG_HEAD", head, - old_orig, 0, UPDATE_REFS_MSG_ON_ERR); - } else if (old_orig) - delete_ref(NULL, "ORIG_HEAD", old_orig, 0); - } - - if (!reflog_head) { - strbuf_setlen(&msg, prefix_len); - strbuf_addstr(&msg, "updating HEAD"); - reflog_head = msg.buf; - } - if (!switch_to_branch) - ret = update_ref(reflog_head, "HEAD", oid, head, - detach_head ? REF_NO_DEREF : 0, - UPDATE_REFS_MSG_ON_ERR); - else { - ret = update_ref(reflog_head, switch_to_branch, oid, - NULL, 0, UPDATE_REFS_MSG_ON_ERR); - if (!ret) - ret = create_symref("HEAD", switch_to_branch, - reflog_head); - } - if (!ret && run_hook) - run_hook_le(NULL, "post-checkout", - oid_to_hex(head ? head : null_oid()), - oid_to_hex(oid), "1", NULL); + ret = update_refs(oid, switch_to_branch, head, reflog_head, + reflog_orig_head, default_reflog_action, flags); leave_reset_head: - strbuf_release(&msg); rollback_lock_file(&lock); clear_unpack_trees_porcelain(&unpack_tree_opts); while (nr) From patchwork Wed Dec 8 14:57:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 12664559 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 6D039C433F5 for ; Wed, 8 Dec 2021 14:58:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235668AbhLHPBv (ORCPT ); Wed, 8 Dec 2021 10:01:51 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48328 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235591AbhLHPBn (ORCPT ); Wed, 8 Dec 2021 10:01:43 -0500 Received: from mail-wr1-x42f.google.com (mail-wr1-x42f.google.com [IPv6:2a00:1450:4864:20::42f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 89961C0617A1 for ; Wed, 8 Dec 2021 06:58:11 -0800 (PST) Received: by mail-wr1-x42f.google.com with SMTP id d24so4660903wra.0 for ; Wed, 08 Dec 2021 06:58:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=iHqRyCmXb+qp8S8EUX8N/yQFZfDqd+mO2lKyBZHuzbc=; b=jZBoehAg7nT8iS0p1pRPtLO5cjY7grrF9GHtNNOnWxHNi6iSLyUvNniRF4F+/ceLMy 4Bp/2ApJ/w7F1uUcT3VmZf4Utth9lSOgrzBrg5nj5YGJPWmNIAJMY2ujB7O4tbIoYogv W7tMi13PakPwMOnrVleleeCeAYuDlHXGCZdoA6wONJZCT+3UR8kLEmyHteQfdQOavvKd PMLLyp2fM/JVkiOzCaBG4e12vN92D+jwQ8GU7Qn1trD1OWBbsuydnxpPFROnn9b5DK55 mcAK6mIo4cXY5Ahytx374C8p/IhrQu72JGL/hZMnzeAX07m9J/4zAi4dwNpE0iexcg3D wUWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=iHqRyCmXb+qp8S8EUX8N/yQFZfDqd+mO2lKyBZHuzbc=; b=nBB0ZJ95T402YlTp2tWGLWh/p4jFMny94BDxmNetoG8E7Ca1PhB7N27S4n3HXHPKCT +k12FV+x9+nJbWP/Oqp9OSQR4YlzOzqYnqZmY2FwbJPkEvCtoUjvyc5Inu/dheOR6MtP SQtkGs5bMvdfkCjeTDBMQ6+nHyDZrzrP/+yIdrhwiBTKqIptReys8Am664qVMLda1/fk fqWnkONAubN5dJfZrI1FeZCO0SIChTpbjd1Pe8TVrQqlf1SFvvrR17hPa89WCVi4cVLT gQnO98hs+YXGq/MbVOhHNwKP+9r19aYkXuJnsDWoyv29D8HgJ0pW4OG5t4908AwLf/dm G1Og== X-Gm-Message-State: AOAM530xIGL1KoRx0VBYc5jM/+/A3AjjMDKJxdnfx89BRobgcIugjseK GGKI7Ksgisp5/wmB8YrIwrUyl41kVRs= X-Google-Smtp-Source: ABdhPJx9w8+equIq2xeqgO1suf8sJmpLBIYODGTrvXLInoQXRI8FW8f2Yxp4v3F2uq1y+1azwKloeA== X-Received: by 2002:a5d:5272:: with SMTP id l18mr59626192wrc.208.1638975489895; Wed, 08 Dec 2021 06:58:09 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id b10sm2895336wrt.36.2021.12.08.06.58.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Dec 2021 06:58:09 -0800 (PST) Message-Id: <9d00a218daf68a86e5dfba0c0cd66d6aaa6706b3.1638975482.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 08 Dec 2021 14:57:56 +0000 Subject: [PATCH v2 09/14] reset_head(): make default_reflog_action optional Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Philippe Blain , Johannes Schindelin , Elijah Newren , Eric Sunshine , Phillip Wood , =?utf-8?b?UmVuw6k=?= Scharfe , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Phillip Wood , Phillip Wood Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Phillip Wood From: Phillip Wood This parameter is only needed when a ref is going to be updated and the caller does not pass an explicit reflog message. Callers that are only discarding uncommitted changes in the working tree such as such as "rebase --skip" or create_autostash() do not update any refs so should not have to worry about passing this parameter. This change is not intended to have any user visible changes. The pointer comparison between `oid` and `&head_oid` checks that the caller did not pass an oid to be checked out. As no callers pass RESET_HEAD_RUN_POST_CHECKOUT_HOOK without passing an oid there are no changes to when the post-checkout hook is run. As update_ref() only updates the ref if the oid passed to it differs from the current ref there are no changes to when HEAD is updated. Signed-off-by: Phillip Wood --- builtin/rebase.c | 10 ++++------ reset.c | 16 ++++++++++++---- sequencer.c | 2 +- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index 832e6954827..3d78b5c8bef 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -585,8 +585,7 @@ static int move_to_original_branch(struct rebase_options *opts) opts->head_name); ret = reset_head(the_repository, NULL, opts->head_name, RESET_HEAD_REFS_ONLY, - orig_head_reflog.buf, head_reflog.buf, - DEFAULT_REFLOG_ACTION); + orig_head_reflog.buf, head_reflog.buf, NULL); strbuf_release(&orig_head_reflog); strbuf_release(&head_reflog); @@ -822,7 +821,7 @@ static int checkout_up_to_date(struct rebase_options *options) options->switch_to); if (reset_head(the_repository, &options->orig_head, options->head_name, RESET_HEAD_RUN_POST_CHECKOUT_HOOK, - NULL, buf.buf, DEFAULT_REFLOG_ACTION) < 0) + NULL, buf.buf, NULL) < 0) ret = error(_("could not switch to %s"), options->switch_to); strbuf_release(&buf); @@ -1273,7 +1272,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) string_list_clear(&merge_rr, 1); if (reset_head(the_repository, NULL, NULL, RESET_HEAD_HARD, - NULL, NULL, DEFAULT_REFLOG_ACTION) < 0) + NULL, NULL, NULL) < 0) die(_("could not discard worktree changes")); remove_branch_state(the_repository, 0); if (read_basic_state(&options)) @@ -1778,8 +1777,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) options.head_name ? options.head_name : "detached HEAD", oid_to_hex(&options.onto->object.oid)); reset_head(the_repository, NULL, options.head_name, - RESET_HEAD_REFS_ONLY, "HEAD", msg.buf, - DEFAULT_REFLOG_ACTION); + RESET_HEAD_REFS_ONLY, "HEAD", msg.buf, NULL); strbuf_release(&msg); ret = finish_rebase(&options); goto cleanup; diff --git a/reset.c b/reset.c index 56d6e2a06d9..4a92e4bc30b 100644 --- a/reset.c +++ b/reset.c @@ -22,8 +22,13 @@ static int update_refs(const struct object_id *oid, const char *switch_to_branch size_t prefix_len; int ret; - reflog_action = getenv(GIT_REFLOG_ACTION_ENVIRONMENT); - strbuf_addf(&msg, "%s: ", reflog_action ? reflog_action : default_reflog_action); + if ((update_orig_head && !reflog_orig_head) || !reflog_head) { + if (!default_reflog_action) + BUG("default_reflog_action must be given when reflog messages are omitted"); + reflog_action = getenv(GIT_REFLOG_ACTION_ENVIRONMENT); + strbuf_addf(&msg, "%s: ", reflog_action ? reflog_action : + default_reflog_action); + } prefix_len = msg.len; if (update_orig_head) { @@ -71,6 +76,7 @@ int reset_head(struct repository *r, struct object_id *oid, { unsigned reset_hard = flags & RESET_HEAD_HARD; unsigned refs_only = flags & RESET_HEAD_REFS_ONLY; + unsigned update_orig_head = flags & RESET_ORIG_HEAD; struct object_id *head = NULL, head_oid; struct tree_desc desc[2] = { { NULL }, { NULL } }; struct lock_file lock = LOCK_INIT; @@ -144,8 +150,10 @@ int reset_head(struct repository *r, struct object_id *oid, goto leave_reset_head; } - ret = update_refs(oid, switch_to_branch, head, reflog_head, - reflog_orig_head, default_reflog_action, flags); + if (oid != &head_oid || update_orig_head || switch_to_branch) + ret = update_refs(oid, switch_to_branch, head, reflog_head, + reflog_orig_head, default_reflog_action, + flags); leave_reset_head: rollback_lock_file(&lock); diff --git a/sequencer.c b/sequencer.c index 5c65f5f1ac5..78d203dec47 100644 --- a/sequencer.c +++ b/sequencer.c @@ -4131,7 +4131,7 @@ void create_autostash(struct repository *r, const char *path) write_file(path, "%s", oid_to_hex(&oid)); printf(_("Created autostash: %s\n"), buf.buf); if (reset_head(r, NULL, NULL, RESET_HEAD_HARD, NULL, NULL, - "") < 0) + NULL) < 0) die(_("could not reset --hard")); if (discard_index(r->index) < 0 || From patchwork Wed Dec 8 14:57:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 12664561 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 9EAE5C433FE for ; Wed, 8 Dec 2021 14:58:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235690AbhLHPBw (ORCPT ); Wed, 8 Dec 2021 10:01:52 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48330 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235600AbhLHPBo (ORCPT ); Wed, 8 Dec 2021 10:01:44 -0500 Received: from mail-wr1-x431.google.com (mail-wr1-x431.google.com [IPv6:2a00:1450:4864:20::431]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3A045C0617A2 for ; Wed, 8 Dec 2021 06:58:12 -0800 (PST) Received: by mail-wr1-x431.google.com with SMTP id d9so4561851wrw.4 for ; Wed, 08 Dec 2021 06:58:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=JLawhKzB98kWAK0pprQ2YXV0nIvcqy4CJG8Vma3+0MU=; b=O6ek6qYGMCv32r1OsEFRFlcLLtJ1qxWF/6CMEJJP9ovOghXkxPjyXYSH3Yz6WU42ti zRbYNxBjDkBqAiDF+PCOJ8MCo3UCk2zXRNoWENwi7cZMs5GFcpAQxTt3DimsOKarLwnO c0NTk2jexc/nvjoqKsnvz+jYFPEr+2Y34gIkrgYQXFlFrWzkGdQQUXrn+6iyMV8ifVcA 0O+NxjXC/WnuymQu8rAQe/LljAoFT2xaMJXBJGbpUhP0+iSJFF5fWaQ+yiJjULh0extX qLPhklSgVl/5yFAZKWvr8CUHxsxbUE+FNk55g5BT4YpPzQE3ljjf2DLMpfhsfDYJtceF F2JA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=JLawhKzB98kWAK0pprQ2YXV0nIvcqy4CJG8Vma3+0MU=; b=6x2RB4lrlQngwMrdOhtGZpDamxz3nKDGjyxQz53PAXXHf0k6oBONPFC4aBas1aAHQD Z9VvoBpYX55WpHTAkuwbYnLpRq0aQNc3yfiC6ubU0GMjhbZXRu1TzuvdPsG3vWc0B1Yk M8s44O/W/z2BcgVjvoNMpEHtEsKkuzcsxTJPHdJ6RbHxSfdLHD1kYKKj5VVNnCtqkE+K 44hs2PyQT0y4EIyF45+kVWghFt/i+qw5RuGHfUgV8MTYWbL0fAEgKNyvlwVXLhg/3/I1 eWDpIL78oxvVUswTToiJOIy7faxQLCLYCBeBZzGqWbgbJ69xdfYjPHa/4+ouV+RUZyvO RNoQ== X-Gm-Message-State: AOAM531k+xK9OxU1OmkRQX+Wwc2cqF6bvh1RQBhWDe99ob4sfXn1X1y3 RW4HIj2bo8we4a/vTtjfHO5fxAKLIGg= X-Google-Smtp-Source: ABdhPJxQkfqe1aMotCGlaKuRyKUThQvgjw6EnisxtcGHLRp0k0KnXCT/PF+Wd4812AgKdjuIagIrYw== X-Received: by 2002:adf:f9d2:: with SMTP id w18mr59168356wrr.501.1638975490666; Wed, 08 Dec 2021 06:58:10 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id z5sm7598740wmp.26.2021.12.08.06.58.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Dec 2021 06:58:10 -0800 (PST) Message-Id: <5ea636009e7858e50357f0f6f8d8fa42e056db60.1638975482.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 08 Dec 2021 14:57:57 +0000 Subject: [PATCH v2 10/14] rebase: cleanup reset_head() calls Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Philippe Blain , Johannes Schindelin , Elijah Newren , Eric Sunshine , Phillip Wood , =?utf-8?b?UmVuw6k=?= Scharfe , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Phillip Wood , Phillip Wood Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Phillip Wood From: Phillip Wood If ORIG_HEAD is not set by passing RESET_ORIG_HEAD then there is no need to pass anything for reflog_orig_head. In addition to the callers fixed in this commit move_to_original_branch() also passes reflog_orig_head without setting ORIG_HEAD. That caller is mistakenly passing the message it wants to put in the branch reflog which is not currently possible so we delay fixing that caller until we can pass the message as the branch reflog. Signed-off-by: Phillip Wood --- builtin/rebase.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index 3d78b5c8bef..fdd822c470f 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -675,7 +675,7 @@ static int run_am(struct rebase_options *opts) reset_head(the_repository, &opts->orig_head, opts->head_name, 0, - "HEAD", NULL, DEFAULT_REFLOG_ACTION); + NULL, NULL, DEFAULT_REFLOG_ACTION); error(_("\ngit encountered an error while preparing the " "patches to replay\n" "these revisions:\n" @@ -1777,7 +1777,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) options.head_name ? options.head_name : "detached HEAD", oid_to_hex(&options.onto->object.oid)); reset_head(the_repository, NULL, options.head_name, - RESET_HEAD_REFS_ONLY, "HEAD", msg.buf, NULL); + RESET_HEAD_REFS_ONLY, NULL, msg.buf, NULL); strbuf_release(&msg); ret = finish_rebase(&options); goto cleanup; From patchwork Wed Dec 8 14:57:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 12664563 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 B869EC433EF for ; Wed, 8 Dec 2021 14:58:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235631AbhLHPBx (ORCPT ); Wed, 8 Dec 2021 10:01:53 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48346 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235620AbhLHPBp (ORCPT ); Wed, 8 Dec 2021 10:01:45 -0500 Received: from mail-wr1-x42f.google.com (mail-wr1-x42f.google.com [IPv6:2a00:1450:4864:20::42f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5F6D2C061D5E for ; Wed, 8 Dec 2021 06:58:13 -0800 (PST) Received: by mail-wr1-x42f.google.com with SMTP id a9so4534835wrr.8 for ; Wed, 08 Dec 2021 06:58:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=rUwtAM5n8PXdZ1ZzhiowLzizhW+rKmtt1++YkNmqdkM=; b=H8nnGVF15Pn5yiUElY+fymo8fKkpcZGzt5qQ747UqkmXIcxgyr5ClT8Ygk97ikQm79 HLaVX/jziOv4nId1/xy2Hmvp1gIgUstlB6xf1P3Pl2OvUMauDBfi2II+Y6j/p5563tQ4 +6YBaFlfToZF1wb59X54AiFvZtxRUgyIvwxy88vy41b2eLvQX/+TWYj+GhvT+df20KJc OTsgU59ANppvkaNmNtDpx8xYkB+YYJadlGK4ElCOlKuv9GUMvtrVscz0l5NoQIzNWI0w 5bl1sHs0CSYVuh9YT5RoZB/XQqAtudAF1xzPiZKIzd6AlPPqULtmI8nqSk3ci8iAzkEw IW/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=rUwtAM5n8PXdZ1ZzhiowLzizhW+rKmtt1++YkNmqdkM=; b=YdlXT6sW8vu9sjcp7gBoZ+6/6eiEaSZdi0fw7OT6iY+xLwL4YEuHQgzt7mi+0KOGOd mPM7Njm2DJHciqOWyUbV4Gc/j/jQtW/US8Vhghxp41cxi2fFQKF4mK1tZSv6LKjPQTzf QBdYmUs21gYwA4bkLsIkCR8U5cjN2m9LfotvLxQgnuhqZorHeyjmkfxjD9RBNkQKCYAx Wz1WAkIIVmLT0igeKEmIuj32nX7Qh+fPd240yy6F+klLZ1Fca/sAuM+ewMedAx6cUv9S taXrgAOFhays15cKETj3F0Yk7up/n8igEKqlXCADRI2i9cPG1uEtSjd+qHPFX3PYm3Hf yxTQ== X-Gm-Message-State: AOAM532FODo7g7KaHgj58T2wqZ9p07vKC/rA70//XSBeFZnDwdv4bCDz Z1AvvjXH3GXyAgAS+Z4CBzz/gF1R1YE= X-Google-Smtp-Source: ABdhPJxzu5tpId11ZTR/6pAg82p1i8rO1W75ivZPZrgpVGdt/d8X2dAfoWdozpytiOP8lELj2l74zQ== X-Received: by 2002:adf:fd4c:: with SMTP id h12mr61282487wrs.429.1638975491359; Wed, 08 Dec 2021 06:58:11 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id j11sm3017429wrt.3.2021.12.08.06.58.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Dec 2021 06:58:11 -0800 (PST) Message-Id: <24b0566aba5d8800d209261a14aca4d872af8027.1638975482.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 08 Dec 2021 14:57:58 +0000 Subject: [PATCH v2 11/14] reset_head(): take struct rebase_head_opts Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Philippe Blain , Johannes Schindelin , Elijah Newren , Eric Sunshine , Phillip Wood , =?utf-8?b?UmVuw6k=?= Scharfe , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Phillip Wood , Phillip Wood Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Phillip Wood From: Phillip Wood This function takes a confusingly large number of parameters which makes it difficult to remember which order to pass them in. The following commits will add a couple more parameters which makes the problem worse. To address this change the function to take a struct of options. Using a struct means that it is no longer necessary to remember which order to pass the parameters in and anyone reading the code can easily see which value is passed to each parameter. Signed-off-by: Phillip Wood --- builtin/rebase.c | 57 ++++++++++++++++++++++++++++++------------------ reset.c | 38 +++++++++++++++----------------- reset.h | 40 +++++++++++++++++++++++++++++---- sequencer.c | 5 ++--- 4 files changed, 92 insertions(+), 48 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index fdd822c470f..ecc368dd4f4 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -571,6 +571,7 @@ static int finish_rebase(struct rebase_options *opts) static int move_to_original_branch(struct rebase_options *opts) { struct strbuf orig_head_reflog = STRBUF_INIT, head_reflog = STRBUF_INIT; + struct reset_head_opts ropts = { 0 }; int ret; if (!opts->head_name) @@ -583,9 +584,11 @@ static int move_to_original_branch(struct rebase_options *opts) opts->head_name, oid_to_hex(&opts->onto->object.oid)); strbuf_addf(&head_reflog, "rebase finished: returning to %s", opts->head_name); - ret = reset_head(the_repository, NULL, opts->head_name, - RESET_HEAD_REFS_ONLY, - orig_head_reflog.buf, head_reflog.buf, NULL); + ropts.branch = opts->head_name; + ropts.flags = RESET_HEAD_REFS_ONLY; + ropts.orig_head_msg = orig_head_reflog.buf; + ropts.head_msg = head_reflog.buf; + ret = reset_head(the_repository, &ropts); strbuf_release(&orig_head_reflog); strbuf_release(&head_reflog); @@ -669,13 +672,15 @@ static int run_am(struct rebase_options *opts) status = run_command(&format_patch); if (status) { + struct reset_head_opts ropts = { 0 }; unlink(rebased_patches); free(rebased_patches); strvec_clear(&am.args); - reset_head(the_repository, &opts->orig_head, - opts->head_name, 0, - NULL, NULL, DEFAULT_REFLOG_ACTION); + ropts.oid = &opts->orig_head; + ropts.branch = opts->head_name; + ropts.default_reflog_action = DEFAULT_REFLOG_ACTION; + reset_head(the_repository, &ropts); error(_("\ngit encountered an error while preparing the " "patches to replay\n" "these revisions:\n" @@ -814,14 +819,17 @@ static int rebase_config(const char *var, const char *value, void *data) static int checkout_up_to_date(struct rebase_options *options) { struct strbuf buf = STRBUF_INIT; + struct reset_head_opts ropts = { 0 }; int ret = 0; strbuf_addf(&buf, "%s: checkout %s", getenv(GIT_REFLOG_ACTION_ENVIRONMENT), options->switch_to); - if (reset_head(the_repository, &options->orig_head, - options->head_name, RESET_HEAD_RUN_POST_CHECKOUT_HOOK, - NULL, buf.buf, NULL) < 0) + ropts.oid = &options->orig_head; + ropts.branch = options->head_name; + ropts.flags = RESET_HEAD_RUN_POST_CHECKOUT_HOOK; + ropts.head_msg = buf.buf; + if (reset_head(the_repository, &ropts) < 0) ret = error(_("could not switch to %s"), options->switch_to); strbuf_release(&buf); @@ -1033,6 +1041,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) int reschedule_failed_exec = -1; int allow_preemptive_ff = 1; int preserve_merges_selected = 0; + struct reset_head_opts ropts = { 0 }; struct option builtin_rebase_options[] = { OPT_STRING(0, "onto", &options.onto_name, N_("revision"), @@ -1270,9 +1279,8 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) rerere_clear(the_repository, &merge_rr); string_list_clear(&merge_rr, 1); - - if (reset_head(the_repository, NULL, NULL, RESET_HEAD_HARD, - NULL, NULL, NULL) < 0) + ropts.flags = RESET_HEAD_HARD; + if (reset_head(the_repository, &ropts) < 0) die(_("could not discard worktree changes")); remove_branch_state(the_repository, 0); if (read_basic_state(&options)) @@ -1289,9 +1297,11 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) if (read_basic_state(&options)) exit(1); - if (reset_head(the_repository, &options.orig_head, - options.head_name, RESET_HEAD_HARD, - NULL, NULL, DEFAULT_REFLOG_ACTION) < 0) + ropts.oid = &options.orig_head; + ropts.branch = options.head_name; + ropts.flags = RESET_HEAD_HARD; + ropts.default_reflog_action = DEFAULT_REFLOG_ACTION; + if (reset_head(the_repository, &ropts) < 0) die(_("could not move back to %s"), oid_to_hex(&options.orig_head)); remove_branch_state(the_repository, 0); @@ -1758,10 +1768,12 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) strbuf_addf(&msg, "%s: checkout %s", getenv(GIT_REFLOG_ACTION_ENVIRONMENT), options.onto_name); - if (reset_head(the_repository, &options.onto->object.oid, NULL, - RESET_HEAD_DETACH | RESET_ORIG_HEAD | - RESET_HEAD_RUN_POST_CHECKOUT_HOOK, - NULL, msg.buf, DEFAULT_REFLOG_ACTION)) + ropts.oid = &options.onto->object.oid; + ropts.flags = RESET_HEAD_DETACH | RESET_ORIG_HEAD | + RESET_HEAD_RUN_POST_CHECKOUT_HOOK; + ropts.head_msg = msg.buf; + ropts.default_reflog_action = DEFAULT_REFLOG_ACTION; + if (reset_head(the_repository, &ropts)) die(_("Could not detach HEAD")); strbuf_release(&msg); @@ -1776,8 +1788,11 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) strbuf_addf(&msg, "rebase finished: %s onto %s", options.head_name ? options.head_name : "detached HEAD", oid_to_hex(&options.onto->object.oid)); - reset_head(the_repository, NULL, options.head_name, - RESET_HEAD_REFS_ONLY, NULL, msg.buf, NULL); + memset(&ropts, 0, sizeof(ropts)); + ropts.branch = options.head_name; + ropts.flags = RESET_HEAD_REFS_ONLY; + ropts.head_msg = msg.buf; + reset_head(the_repository, &ropts); strbuf_release(&msg); ret = finish_rebase(&options); goto cleanup; diff --git a/reset.c b/reset.c index 4a92e4bc30b..78145d5c456 100644 --- a/reset.c +++ b/reset.c @@ -8,14 +8,17 @@ #include "tree.h" #include "unpack-trees.h" -static int update_refs(const struct object_id *oid, const char *switch_to_branch, - const struct object_id *head, const char *reflog_head, - const char *reflog_orig_head, - const char *default_reflog_action, unsigned flags) +static int update_refs(const struct reset_head_opts *opts, + const struct object_id *oid, + const struct object_id *head) { - unsigned detach_head = flags & RESET_HEAD_DETACH; - unsigned run_hook = flags & RESET_HEAD_RUN_POST_CHECKOUT_HOOK; - unsigned update_orig_head = flags & RESET_ORIG_HEAD; + unsigned detach_head = opts->flags & RESET_HEAD_DETACH; + unsigned run_hook = opts->flags & RESET_HEAD_RUN_POST_CHECKOUT_HOOK; + unsigned update_orig_head = opts->flags & RESET_ORIG_HEAD; + const char *switch_to_branch = opts->branch; + const char *reflog_head = opts->head_msg; + const char *reflog_orig_head = opts->orig_head_msg; + const char *default_reflog_action = opts->default_reflog_action; struct object_id *old_orig = NULL, oid_old_orig; struct strbuf msg = STRBUF_INIT; const char *reflog_action; @@ -69,14 +72,13 @@ static int update_refs(const struct object_id *oid, const char *switch_to_branch return ret; } -int reset_head(struct repository *r, struct object_id *oid, - const char *switch_to_branch, unsigned flags, - const char *reflog_orig_head, const char *reflog_head, - const char *default_reflog_action) +int reset_head(struct repository *r, const struct reset_head_opts *opts) { - unsigned reset_hard = flags & RESET_HEAD_HARD; - unsigned refs_only = flags & RESET_HEAD_REFS_ONLY; - unsigned update_orig_head = flags & RESET_ORIG_HEAD; + const struct object_id *oid = opts->oid; + const char *switch_to_branch = opts->branch; + unsigned reset_hard = opts->flags & RESET_HEAD_HARD; + unsigned refs_only = opts->flags & RESET_HEAD_REFS_ONLY; + unsigned update_orig_head = opts->flags & RESET_ORIG_HEAD; struct object_id *head = NULL, head_oid; struct tree_desc desc[2] = { { NULL }, { NULL } }; struct lock_file lock = LOCK_INIT; @@ -104,9 +106,7 @@ int reset_head(struct repository *r, struct object_id *oid, oid = &head_oid; if (refs_only) - return update_refs(oid, switch_to_branch, head, reflog_head, - reflog_orig_head, default_reflog_action, - flags); + return update_refs(opts, oid, head); action = reset_hard ? "reset" : "checkout"; setup_unpack_trees_porcelain(&unpack_tree_opts, action); @@ -151,9 +151,7 @@ int reset_head(struct repository *r, struct object_id *oid, } if (oid != &head_oid || update_orig_head || switch_to_branch) - ret = update_refs(oid, switch_to_branch, head, reflog_head, - reflog_orig_head, default_reflog_action, - flags); + ret = update_refs(opts, oid, head); leave_reset_head: rollback_lock_file(&lock); diff --git a/reset.h b/reset.h index 2daec804259..a205be2fb85 100644 --- a/reset.h +++ b/reset.h @@ -6,15 +6,47 @@ #define GIT_REFLOG_ACTION_ENVIRONMENT "GIT_REFLOG_ACTION" +/* Request a detached checkout */ #define RESET_HEAD_DETACH (1<<0) +/* Request a reset rather than a checkout */ #define RESET_HEAD_HARD (1<<1) +/* Run the post-checkout hook */ #define RESET_HEAD_RUN_POST_CHECKOUT_HOOK (1<<2) +/* Only update refs, do not touch the worktree */ #define RESET_HEAD_REFS_ONLY (1<<3) +/* Update ORIG_HEAD as well as HEAD */ #define RESET_ORIG_HEAD (1<<4) -int reset_head(struct repository *r, struct object_id *oid, - const char *switch_to_branch, unsigned flags, - const char *reflog_orig_head, const char *reflog_head, - const char *default_reflog_action); +struct reset_head_opts { + /* + * The commit to checkout/reset to. Defaults to HEAD. + */ + const struct object_id *oid; + /* + * Optional branch to switch to. + */ + const char *branch; + /* + * Flags defined above. + */ + unsigned flags; + /* + * Optional reflog message for HEAD, if this omitted but oid or branch + * are given then default_reflog_action must be given. + */ + const char *head_msg; + /* + * Optional reflog message for ORIG_HEAD, if this omitted and flags + * contains RESET_ORIG_HEAD then default_reflog_action must be given. + */ + const char *orig_head_msg; + /* + * Action to use in default reflog messages, only required if a ref is + * being updated and the reflog messages above are omitted. + */ + const char *default_reflog_action; +}; + +int reset_head(struct repository *r, const struct reset_head_opts *opts); #endif diff --git a/sequencer.c b/sequencer.c index 78d203dec47..a62ea9d0e05 100644 --- a/sequencer.c +++ b/sequencer.c @@ -4109,6 +4109,7 @@ void create_autostash(struct repository *r, const char *path) if (has_unstaged_changes(r, 1) || has_uncommitted_changes(r, 1)) { struct child_process stash = CHILD_PROCESS_INIT; + struct reset_head_opts ropts = { .flags = RESET_HEAD_HARD }; struct object_id oid; strvec_pushl(&stash.args, @@ -4130,10 +4131,8 @@ void create_autostash(struct repository *r, const char *path) path); write_file(path, "%s", oid_to_hex(&oid)); printf(_("Created autostash: %s\n"), buf.buf); - if (reset_head(r, NULL, NULL, RESET_HEAD_HARD, NULL, NULL, - NULL) < 0) + if (reset_head(r, &ropts) < 0) die(_("could not reset --hard")); - if (discard_index(r->index) < 0 || repo_read_index(r) < 0) die(_("could not read index")); From patchwork Wed Dec 8 14:57:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 12664565 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 A45F8C4332F for ; Wed, 8 Dec 2021 14:58:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235652AbhLHPBy (ORCPT ); Wed, 8 Dec 2021 10:01:54 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48354 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235629AbhLHPBq (ORCPT ); Wed, 8 Dec 2021 10:01:46 -0500 Received: from mail-wm1-x329.google.com (mail-wm1-x329.google.com [IPv6:2a00:1450:4864:20::329]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DA901C061A72 for ; Wed, 8 Dec 2021 06:58:13 -0800 (PST) Received: by mail-wm1-x329.google.com with SMTP id p27-20020a05600c1d9b00b0033bf8532855so1963002wms.3 for ; Wed, 08 Dec 2021 06:58:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=EH+9PPT/YqzgF/M/po1DbJcl4pDjiNsu6hqRdVAbWOQ=; b=L5I8lTM6iqXdj9ZkJNvXpBtOTt/noYCzI3rKacyPjUf3So2yC8GRh9q30CjTF3UmbL ybfcFGnXGM6gE1P7kytO6kiTVahcWkQpK6IrfIqNWmh7rPLL69d3ARnEECbV/cvMAqgY wMkJkiac7XJxFVbHzNA4HAo6oA7aQbwNETf5xaPUULCxNKxQ3uUsNc+OxOMIgnthh7+/ lH83Tjv2mumoE/LWlvwwzWB+YaNM7ob1TSUak/T+dON11oNW1l1QSh/Cg9z2TLbTNxuU U9W+HExzqOr/PRPqJyVrcDYayL4DvJiU6MSxgot2PHwli7XivwjTSIYEm6ihhWJw7UM+ Lp7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=EH+9PPT/YqzgF/M/po1DbJcl4pDjiNsu6hqRdVAbWOQ=; b=MHNFJR9bu4KxbPjLfS4VrMmTx5MW7gfc7yRtY+wjzah3VNBOKQaJqbMDl1VYpD6+4a KGEWXRzBCMV69xLdYsbCUfraQyB5N0y363ca8pDKyVqPpDSonDs3dtpCeNNLU5faMsGM 23ppJe8JrdpNLPqv6QeT4v8BHU8zXyVFdKfZTzH5O4F1hM/AaHwTomQUjerKJxeP56vO lVOlo5LuJRbQemrvZKhGX4v7lABP6YxwNB3r0Zvz30YtGKbSRHyCZCdiGfFO0CLUpWLR tyzpMXyMaNUBOaEq//+a+ej3atBuA8wanJOFhdisUvgjLBOT+bScL4z0ZKTT2v2+wyga ZY6Q== X-Gm-Message-State: AOAM533Mv46ccEvSAaTZA8MRVMjnDaXgptpOVURG2BLlG9i2kg6K0lv+ U/X0Yk5VpikXcbh4b0T/H0Pxmy7vWwY= X-Google-Smtp-Source: ABdhPJxrybx+x/7K56ov15/hrWKd3zCymWcZO7FX9ZuaN28V/vOiNPobs8ImsKkb9G20f8G7ELwExw== X-Received: by 2002:a05:600c:19c8:: with SMTP id u8mr16403981wmq.155.1638975492207; Wed, 08 Dec 2021 06:58:12 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id g18sm2994216wrv.42.2021.12.08.06.58.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Dec 2021 06:58:11 -0800 (PST) Message-Id: In-Reply-To: References: Date: Wed, 08 Dec 2021 14:57:59 +0000 Subject: [PATCH v2 12/14] rebase --apply: fix reflog Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Philippe Blain , Johannes Schindelin , Elijah Newren , Eric Sunshine , Phillip Wood , =?utf-8?b?UmVuw6k=?= Scharfe , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Phillip Wood , Phillip Wood Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Phillip Wood From: Phillip Wood move_to_original_branch() passes the message intended for the branch reflog as `orig_head_msg`. Fix this by adding a `branch_msg` member to struct reset_head_opts and add a regression test. Note that these reflog messages do not respect GIT_REFLOG_ACTION. They are not alone in that and will be fixed in a future series. The "merge" backend already has tests that check both the branch and HEAD reflogs. Signed-off-by: Phillip Wood --- builtin/rebase.c | 8 ++++---- reset.c | 12 ++++++++++-- reset.h | 4 ++++ t/t3406-rebase-message.sh | 23 +++++++++++++++++++++++ 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index ecc368dd4f4..b55a9cff05d 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -570,7 +570,7 @@ static int finish_rebase(struct rebase_options *opts) static int move_to_original_branch(struct rebase_options *opts) { - struct strbuf orig_head_reflog = STRBUF_INIT, head_reflog = STRBUF_INIT; + struct strbuf branch_reflog = STRBUF_INIT, head_reflog = STRBUF_INIT; struct reset_head_opts ropts = { 0 }; int ret; @@ -580,17 +580,17 @@ static int move_to_original_branch(struct rebase_options *opts) if (!opts->onto) BUG("move_to_original_branch without onto"); - strbuf_addf(&orig_head_reflog, "rebase finished: %s onto %s", + strbuf_addf(&branch_reflog, "rebase finished: %s onto %s", opts->head_name, oid_to_hex(&opts->onto->object.oid)); strbuf_addf(&head_reflog, "rebase finished: returning to %s", opts->head_name); ropts.branch = opts->head_name; ropts.flags = RESET_HEAD_REFS_ONLY; - ropts.orig_head_msg = orig_head_reflog.buf; + ropts.branch_msg = branch_reflog.buf; ropts.head_msg = head_reflog.buf; ret = reset_head(the_repository, &ropts); - strbuf_release(&orig_head_reflog); + strbuf_release(&branch_reflog); strbuf_release(&head_reflog); return ret; } diff --git a/reset.c b/reset.c index 78145d5c456..e02915c0f65 100644 --- a/reset.c +++ b/reset.c @@ -16,6 +16,7 @@ static int update_refs(const struct reset_head_opts *opts, unsigned run_hook = opts->flags & RESET_HEAD_RUN_POST_CHECKOUT_HOOK; unsigned update_orig_head = opts->flags & RESET_ORIG_HEAD; const char *switch_to_branch = opts->branch; + const char *reflog_branch = opts->branch_msg; const char *reflog_head = opts->head_msg; const char *reflog_orig_head = opts->orig_head_msg; const char *default_reflog_action = opts->default_reflog_action; @@ -58,8 +59,9 @@ static int update_refs(const struct reset_head_opts *opts, detach_head ? REF_NO_DEREF : 0, UPDATE_REFS_MSG_ON_ERR); else { - ret = update_ref(reflog_head, switch_to_branch, oid, - NULL, 0, UPDATE_REFS_MSG_ON_ERR); + ret = update_ref(reflog_branch ? reflog_branch : reflog_head, + switch_to_branch, oid, NULL, 0, + UPDATE_REFS_MSG_ON_ERR); if (!ret) ret = create_symref("HEAD", switch_to_branch, reflog_head); @@ -90,6 +92,12 @@ int reset_head(struct repository *r, const struct reset_head_opts *opts) if (switch_to_branch && !starts_with(switch_to_branch, "refs/")) BUG("Not a fully qualified branch: '%s'", switch_to_branch); + if (opts->orig_head_msg && !update_orig_head) + BUG("ORIG_HEAD reflog message given without updating ORIG_HEAD"); + + if (opts->branch_msg && !opts->branch) + BUG("branch reflog message given without a branch"); + if (!refs_only && repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0) { ret = -1; goto leave_reset_head; diff --git a/reset.h b/reset.h index a205be2fb85..7ef7e43ea8c 100644 --- a/reset.h +++ b/reset.h @@ -30,6 +30,10 @@ struct reset_head_opts { * Flags defined above. */ unsigned flags; + /* + * Optional reflog message for branch, defaults to head_msg. + */ + const char *branch_msg; /* * Optional reflog message for HEAD, if this omitted but oid or branch * are given then default_reflog_action must be given. diff --git a/t/t3406-rebase-message.sh b/t/t3406-rebase-message.sh index 77a313f62eb..d17b450e811 100755 --- a/t/t3406-rebase-message.sh +++ b/t/t3406-rebase-message.sh @@ -105,6 +105,29 @@ test_expect_success 'GIT_REFLOG_ACTION' ' test_cmp expect actual ' +test_expect_success 'rebase --apply reflog' ' + git checkout -b reflog-apply start && + old_head_reflog="$(git log -g --format=%gs -1 HEAD)" && + + git rebase --apply Y && + + git log -g --format=%gs -4 HEAD >actual && + cat >expect <<-EOF && + rebase finished: returning to refs/heads/reflog-apply + rebase: Z + rebase: checkout Y + $old_head_reflog + EOF + test_cmp expect actual && + + git log -g --format=%gs -2 reflog-apply >actual && + cat >expect <<-EOF && + rebase finished: refs/heads/reflog-apply onto $(git rev-parse Y) + branch: Created from start + EOF + test_cmp expect actual +' + test_expect_success 'rebase -i onto unrelated history' ' git init unrelated && test_commit -C unrelated 1 && From patchwork Wed Dec 8 14:58:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 12664567 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 DC003C433F5 for ; Wed, 8 Dec 2021 14:58:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235591AbhLHPBz (ORCPT ); Wed, 8 Dec 2021 10:01:55 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48342 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235643AbhLHPBs (ORCPT ); Wed, 8 Dec 2021 10:01:48 -0500 Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B6D14C0698C8 for ; Wed, 8 Dec 2021 06:58:14 -0800 (PST) Received: by mail-wm1-x32b.google.com with SMTP id p27-20020a05600c1d9b00b0033bf8532855so1963038wms.3 for ; Wed, 08 Dec 2021 06:58:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=y1F0Z9ZyXB7v6sv+xBbDv42cBFlKUUJgK4IDOV/SYXM=; b=M2664nQwx9GT0TXYabDOzF569igvrLjMNZ30AkbY9hnD+ScHr8XpdVPLI4vbmBN6JB nMobNi30m78Twu3WlJKjgOx1YJcgdIH2g+LQZjEVyBkKuxuWrbXX7BTYr4yBXLx9ZYmR Su9LdhaBfqodUhH7WoJjOKQ+qb0/jH2EVADU97615Oa9qp31aHKK0XGMlrQClNndZ2Oo TqUvXHgykv15MOBsj4miIcZ6bcpWeNa2NYu6O3SGj4sai/upRc4gE5Ec5AwdmebahAUh Pv/TWu03EwMeXqvRQeW3SWyFdCkxqTq3BONbXk+XHOfv9slWxUNbJUe+FknPNBq5r6uu ebwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=y1F0Z9ZyXB7v6sv+xBbDv42cBFlKUUJgK4IDOV/SYXM=; b=avznC64wtiVgGnMB9nRrDCNmV8uqb4+7dL1YT4KfY+lyQ/lhRZ50RlLoNY/jJsTnuk 6ngc/mMoEwHYOD/aXBUuTUpJkLUK45WgRIF/65ddu/tEV6qz2bUg0y+FeDQLWpHDWeD6 rMp1tpvmk01tDnQcQ7KY6IxQL0gXqtqeC2IkoXm+mW1tlRWcSEZceax4h7hv5FxeF2cV 6DzidzG9d67JHVE/xwnw8A/zqNlFqHgojC0I4HDYIvUhn94CvHlXNh8Uo1wUkdDnC+Gq +d0E4dkJFTUWmeNUoRqGK2Njn6vu9rTTQKS+2IEh9jpznYzrPAnYIEKhRzybT/vxLyin wbGA== X-Gm-Message-State: AOAM531vTiUaunIyvlvZTFMPP0o9F0FJPitvLVCJs1IcVtLj3S3JuczJ KvnLJTLvTwwVLvo0DGHWofQa8UHfQGI= X-Google-Smtp-Source: ABdhPJxI8TL5NDsny/4SOnAYzf7Q/U9EF/eVLmwLm3m0bWe6AF1kvpzayGuFGFPvQvMfcyBNzrCawQ== X-Received: by 2002:a1c:2:: with SMTP id 2mr16935180wma.41.1638975493070; Wed, 08 Dec 2021 06:58:13 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id m20sm6703773wmq.11.2021.12.08.06.58.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Dec 2021 06:58:12 -0800 (PST) Message-Id: <45a5b5e981804c540991a63675909c4155b86b5e.1638975482.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 08 Dec 2021 14:58:00 +0000 Subject: [PATCH v2 13/14] rebase --apply: set ORIG_HEAD correctly Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Philippe Blain , Johannes Schindelin , Elijah Newren , Eric Sunshine , Phillip Wood , =?utf-8?b?UmVuw6k=?= Scharfe , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Phillip Wood , Phillip Wood Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Phillip Wood From: Phillip Wood At the start of a rebase ORIG_HEAD is updated to tip of the branch being rebased. Unfortunately reset_head() always uses the current value of HEAD for this which is incorrect if the rebase is started with "git rebase " as in that case ORIG_HEAD should be updated to . This only affects the "apply" backend as the "merge" backend does not yet use reset_head() for the initial checkout. Fix this by passing in orig_head when calling reset_head() and add some regression tests. Signed-off-by: Phillip Wood --- builtin/rebase.c | 1 + reset.c | 4 +++- reset.h | 4 ++++ t/t3418-rebase-continue.sh | 26 ++++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index b55a9cff05d..e942c300f8c 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -1769,6 +1769,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) strbuf_addf(&msg, "%s: checkout %s", getenv(GIT_REFLOG_ACTION_ENVIRONMENT), options.onto_name); ropts.oid = &options.onto->object.oid; + ropts.orig_head = &options.orig_head, ropts.flags = RESET_HEAD_DETACH | RESET_ORIG_HEAD | RESET_HEAD_RUN_POST_CHECKOUT_HOOK; ropts.head_msg = msg.buf; diff --git a/reset.c b/reset.c index e02915c0f65..448cb3fd785 100644 --- a/reset.c +++ b/reset.c @@ -15,6 +15,7 @@ static int update_refs(const struct reset_head_opts *opts, unsigned detach_head = opts->flags & RESET_HEAD_DETACH; unsigned run_hook = opts->flags & RESET_HEAD_RUN_POST_CHECKOUT_HOOK; unsigned update_orig_head = opts->flags & RESET_ORIG_HEAD; + const struct object_id *orig_head = opts->orig_head; const char *switch_to_branch = opts->branch; const char *reflog_branch = opts->branch_msg; const char *reflog_head = opts->head_msg; @@ -43,7 +44,8 @@ static int update_refs(const struct reset_head_opts *opts, strbuf_addstr(&msg, "updating ORIG_HEAD"); reflog_orig_head = msg.buf; } - update_ref(reflog_orig_head, "ORIG_HEAD", head, + update_ref(reflog_orig_head, "ORIG_HEAD", + orig_head ? orig_head : head, old_orig, 0, UPDATE_REFS_MSG_ON_ERR); } else if (old_orig) delete_ref(NULL, "ORIG_HEAD", old_orig, 0); diff --git a/reset.h b/reset.h index 7ef7e43ea8c..a28f81829d8 100644 --- a/reset.h +++ b/reset.h @@ -22,6 +22,10 @@ struct reset_head_opts { * The commit to checkout/reset to. Defaults to HEAD. */ const struct object_id *oid; + /* + * Optional value to set ORIG_HEAD. Defaults to HEAD. + */ + const struct object_id *orig_head; /* * Optional branch to switch to. */ diff --git a/t/t3418-rebase-continue.sh b/t/t3418-rebase-continue.sh index 22eca73aa3e..130e2f9b553 100755 --- a/t/t3418-rebase-continue.sh +++ b/t/t3418-rebase-continue.sh @@ -308,4 +308,30 @@ test_expect_success 'there is no --no-reschedule-failed-exec in an ongoing rebas test_expect_code 129 git rebase --edit-todo --no-reschedule-failed-exec ' +test_orig_head_helper () { + test_when_finished 'git rebase --abort && + git checkout topic && + git reset --hard commit-new-file-F2-on-topic-branch' && + git update-ref -d ORIG_HEAD && + test_must_fail git rebase "$@" && + test_cmp_rev ORIG_HEAD commit-new-file-F2-on-topic-branch +} + +test_orig_head () { + type=$1 + test_expect_success "rebase $type sets ORIG_HEAD correctly" ' + git checkout topic && + git reset --hard commit-new-file-F2-on-topic-branch && + test_orig_head_helper $type main + ' + + test_expect_success "rebase $type sets ORIG_HEAD correctly" ' + git checkout main && + test_orig_head_helper $type main topic + ' +} + +test_orig_head --apply +test_orig_head --merge + test_done From patchwork Wed Dec 8 14:58:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 12664593 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 AF177C433F5 for ; Wed, 8 Dec 2021 14:59:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235728AbhLHPB4 (ORCPT ); Wed, 8 Dec 2021 10:01:56 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48376 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235656AbhLHPBs (ORCPT ); Wed, 8 Dec 2021 10:01:48 -0500 Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CFCB6C0698CD for ; Wed, 8 Dec 2021 06:58:15 -0800 (PST) Received: by mail-wm1-x330.google.com with SMTP id c6-20020a05600c0ac600b0033c3aedd30aso1952155wmr.5 for ; Wed, 08 Dec 2021 06:58:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=ieTmdmFrQ3TWBhksR7eaDCc6S5DicVx4i30sMnKFuC4=; b=COVPc2c7d39yuu0NSZMl/XtSYmSlmcY8hMnlCpv1GlWmmR0WGJcPltNZlH/VwS7UOg NDpPxG3Q1V5h7eM3FLCBcC4sB7e+h6FLVxUfrpQrL3pQ0+qSvle4xGO4athFlns4AltO ymgYhsmB7LF7iM3yZOqb89GjAhYt4gvXnVFBiBeQ+KDSU+GRj5d3Oq1Rr0223+hsxGwU O8xU3vVtY7kuTkuq7Pz8ChbOxs7qumGweZ6Q2oJPYc4YjN/eG6CLygyaQZlBt9EHcpMV hUu3zaJJkwpmAAkL6r4SEEnV+w0SfH44Auc/3fSOTBwJwAIsBnamXneV9HFNUAUMRduy yt+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=ieTmdmFrQ3TWBhksR7eaDCc6S5DicVx4i30sMnKFuC4=; b=mvc3p2pWVDFBkyv53S9nit58Bt3o3e2tg35ut/yKv3fOiJAQRyraTQc8R0kdGuoURu 6X2+swvE6rYX4v/YrLPmmTo6BLKVeEajaNIS9zFvlClH7MBeq/axdv8uK1xv626ShqkM ihfXLYxG5xch0uNpwXDEY+lVsKFsKkifCBNlkqhCj4x9XtocY7nnwfsyBMUotLqRyNSQ ScBPa+KXpRCoNc6KYQF7mN/YF8jsfjdz+KBtsfChrah4ZxTrNf5gsloZjlaei7UwMm3O 7BI7JTou06wawh2EyNY42rmhX35VG9OVhmX6+Lk2pgHLtwju3Na0TEsMbdCZBxgCU3xw BpAw== X-Gm-Message-State: AOAM532jdnrGFDHhhWHoeZYT8EYOhN8BM1LRLoKWUuhNmcGpfYoDSceM b6J/04hQbelnMUjaoXvZRwEAJ7AtuZM= X-Google-Smtp-Source: ABdhPJzFcctQZR6QuSWpsduYYcbs+x4xdY6lPUOAMmMNAxk3pCwmNte4aNK5R4ilXze8KlONC+8Hrg== X-Received: by 2002:a05:600c:3647:: with SMTP id y7mr16628632wmq.39.1638975494242; Wed, 08 Dec 2021 06:58:14 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id p8sm2876017wrx.25.2021.12.08.06.58.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Dec 2021 06:58:13 -0800 (PST) Message-Id: <3f64b9274b5580d14ea9cac916be5077b5eebdd2.1638975482.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 08 Dec 2021 14:58:01 +0000 Subject: [PATCH v2 14/14] rebase -m: don't fork git checkout Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Philippe Blain , Johannes Schindelin , Elijah Newren , Eric Sunshine , Phillip Wood , =?utf-8?b?UmVuw6k=?= Scharfe , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Phillip Wood , Phillip Wood Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Phillip Wood From: Phillip Wood Now that reset_head() can handle the initial checkout of onto correctly use it in the "merge" backend instead of forking "git checkout". This opens the way for us to stop calling the post-checkout hook in the future. Not running "git checkout" means that "rebase -i/m" no longer recurse submodules when checking out "onto" (thanks to Philippe Blain for pointing this out). As the rest of rebase does not know what to do with submodules this is probably a good thing. When using merge-ort rebase ought be able to handle submodules correctly if it parsed the submodule config, such a change is left for a future patch series. The "apply" based rebase has avoided forking git checkout since ac7f467fef ("builtin/rebase: support running "git rebase "", 2018-08-07). The code that handles the checkout was moved into libgit by b309a97108 ("reset: extract reset_head() from rebase", 2020-04-07). Signed-off-by: Phillip Wood --- sequencer.c | 38 +++++++++++--------------------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/sequencer.c b/sequencer.c index a62ea9d0e05..19082aa6c9b 100644 --- a/sequencer.c +++ b/sequencer.c @@ -4217,42 +4217,26 @@ int apply_autostash_oid(const char *stash_oid) return apply_save_autostash_oid(stash_oid, 1); } -static int run_git_checkout(struct repository *r, struct replay_opts *opts, - const char *commit, const char *action) -{ - struct child_process cmd = CHILD_PROCESS_INIT; - int ret; - - cmd.git_cmd = 1; - - strvec_push(&cmd.args, "checkout"); - strvec_push(&cmd.args, commit); - strvec_pushf(&cmd.env_array, GIT_REFLOG_ACTION "=%s", action); - - if (opts->verbose) - ret = run_command(&cmd); - else - ret = run_command_silent_on_success(&cmd); - - if (!ret) - discard_index(r->index); - - return ret; -} - static int checkout_onto(struct repository *r, struct replay_opts *opts, const char *onto_name, const struct object_id *onto, const struct object_id *orig_head) { - const char *action = reflog_message(opts, "start", "checkout %s", onto_name); - - if (run_git_checkout(r, opts, oid_to_hex(onto), action)) { + struct reset_head_opts ropts = { + .oid = onto, + .orig_head = orig_head, + .flags = RESET_HEAD_DETACH | RESET_ORIG_HEAD | + RESET_HEAD_RUN_POST_CHECKOUT_HOOK, + .head_msg = reflog_message(opts, "start", "checkout %s", + onto_name), + .default_reflog_action = "rebase" + }; + if (reset_head(r, &ropts)) { apply_autostash(rebase_path_autostash()); sequencer_remove_state(opts); return error(_("could not detach HEAD")); } - return update_ref(NULL, "ORIG_HEAD", orig_head, NULL, 0, UPDATE_REFS_MSG_ON_ERR); + return 0; } static int stopped_at_head(struct repository *r)