From patchwork Fri Jun 21 09:17:56 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rohit Ashiwal X-Patchwork-Id: 11009037 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5DDDB186E for ; Fri, 21 Jun 2019 09:20:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4DA5C27528 for ; Fri, 21 Jun 2019 09:20:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4150F27CF9; Fri, 21 Jun 2019 09:20:29 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CFDDA27CF9 for ; Fri, 21 Jun 2019 09:20:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726442AbfFUJU0 (ORCPT ); Fri, 21 Jun 2019 05:20:26 -0400 Received: from mail-pg1-f195.google.com ([209.85.215.195]:43506 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726210AbfFUJU0 (ORCPT ); Fri, 21 Jun 2019 05:20:26 -0400 Received: by mail-pg1-f195.google.com with SMTP id f25so3063939pgv.10 for ; Fri, 21 Jun 2019 02:20:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Fv2/e3T5aX9EN1/FCoKHc+hGcL1Rz+Nul1DYvV3s688=; b=ptlnxlnna5P7Ef37RFMGieOVkMvm/0bHy9BqMjLjzgiu11KNvscKFkL2rftWV963hx ucmabo2pb13V2s15KM7H8Y16k8n3ySF4bA1C6AgRjmqlJtEmd85Q4KSPDqS+ONKiNem6 VCypuK1V945GXO6qjH8+o+Y/JtI2etTtD9rxv7ir6Tw1rxBXhRdhEWbG+cxG5EGfu+Qw BFeGElXgx1xdzFVxM+g+tbp1AO7thtp1y5YNiHmrw6IUnesoGua+OPLhjJ7x4Q7EyWEM r4BV+DaIVM6DSLdTYEcQt4VEHefAXDFpUcBXqJFwaUQDOqbvwX/xwRpVAGwy0QMesg6W P3wA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Fv2/e3T5aX9EN1/FCoKHc+hGcL1Rz+Nul1DYvV3s688=; b=KoLwwnZNvv1ICyQProQ/a1awV+21lTwn8LQeyL1mbxq46vjAsgGoHw9DNcDY3PCdct Kn0BXxF2fsgKOwUTX9Fu/wdhFt2tvZToLKMpxljH54xXbCKice5ESDtY8N9ildB8uVHl PrIjRsU+LN2YhGPHjx/EsxL/MQ+0BeMB43L6TC13AAA94nQHTJuH/1OE4ALRm1Jaaeys xi36ZSpjGIo4M3O3IKRuyMeeQhiEABazpYDRQAupK9IV0AlWN93jumh3v2l+B7Kv5xug FUvGPGTse8cKED/2quFMO5qjY2o7/HcsTFa6g2HBrfD4V00lIqaoBSb5nJyyLaLzoqaV QDIQ== X-Gm-Message-State: APjAAAX9gVc0cFOvuVIR7sqN0S8tNVWbF8GUU7Pp9dAvQ5okCZ+/u6CR YX6undw63A8PcYX9140fD418E7rB/MC1Nw== X-Google-Smtp-Source: APXvYqygajOCsXNBOtWADuXzKD1EA6Yc+muZGSqGFG0GNcY4sYx/BFYicSuOiSn5U31/LmmD/4ldDA== X-Received: by 2002:a65:5347:: with SMTP id w7mr17232397pgr.375.1561108825631; Fri, 21 Jun 2019 02:20:25 -0700 (PDT) Received: from ar135.iitr.local ([103.37.200.216]) by smtp.gmail.com with ESMTPSA id i133sm4380220pfe.75.2019.06.21.02.20.21 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Fri, 21 Jun 2019 02:20:24 -0700 (PDT) From: Rohit Ashiwal To: rohit.ashiwal265@gmail.com Cc: git@vger.kernel.org, newren@gmail.com, t.gummerer@gmail.com, phillip.wood123@gmail.com, gitster@pobox.com, jrnieder@gmail.com, martin.agren@gmail.com Subject: [GSoC][PATCH v6 1/5] sequencer: add advice for revert Date: Fri, 21 Jun 2019 14:47:56 +0530 Message-Id: <20190621091800.17686-2-rohit.ashiwal265@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190621091800.17686-1-rohit.ashiwal265@gmail.com> References: <20190608191958.4593-1-rohit.ashiwal265@gmail.com> <20190621091800.17686-1-rohit.ashiwal265@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP In the case of merge conflicts, while performing a revert, we are currently advised to use `git cherry-pick --` of which --continue is incompatible for continuing the revert. Introduce a separate advice message for `git revert`. Also change the signature of `create_seq_dir` to handle which advice to display selectively. Signed-off-by: Rohit Ashiwal --- sequencer.c | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/sequencer.c b/sequencer.c index f88a97fb10..c644368b54 100644 --- a/sequencer.c +++ b/sequencer.c @@ -2650,15 +2650,37 @@ static int walk_revs_populate_todo(struct todo_list *todo_list, return 0; } -static int create_seq_dir(void) +static int create_seq_dir(struct repository *r) { - if (file_exists(git_path_seq_dir())) { - error(_("a cherry-pick or revert is already in progress")); - advise(_("try \"git cherry-pick (--continue | --quit | --abort)\"")); + enum replay_action action; + const char *in_progress_error = NULL; + const char *in_progress_advice = NULL; + + if (!sequencer_get_last_command(r, &action)) { + switch (action) { + case REPLAY_REVERT: + in_progress_error = _("revert is already in progress"); + in_progress_advice = + _("try \"git revert (--continue | --abort | --quit)\""); + break; + case REPLAY_PICK: + in_progress_error = _("cherry-pick is already in progress"); + in_progress_advice = + _("try \"git cherry-pick (--continue | --abort | --quit)\""); + break; + default: + BUG("unexpected action in create_seq_dir"); + } + } + if (in_progress_error) { + error("%s", in_progress_error); + advise("%s", in_progress_advice); return -1; - } else if (mkdir(git_path_seq_dir(), 0777) < 0) + } + if (mkdir(git_path_seq_dir(), 0777) < 0) return error_errno(_("could not create sequencer directory '%s'"), git_path_seq_dir()); + return 0; } @@ -4237,7 +4259,7 @@ int sequencer_pick_revisions(struct repository *r, */ if (walk_revs_populate_todo(&todo_list, opts) || - create_seq_dir() < 0) + create_seq_dir(r) < 0) return -1; if (get_oid("HEAD", &oid) && (opts->action == REPLAY_REVERT)) return error(_("can't revert as initial commit")); From patchwork Fri Jun 21 09:17:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rohit Ashiwal X-Patchwork-Id: 11009043 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5E68D186E for ; Fri, 21 Jun 2019 09:20:32 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 493B427528 for ; Fri, 21 Jun 2019 09:20:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3C21927F8C; Fri, 21 Jun 2019 09:20:32 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DB85F27528 for ; Fri, 21 Jun 2019 09:20:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726439AbfFUJUb (ORCPT ); Fri, 21 Jun 2019 05:20:31 -0400 Received: from mail-pl1-f193.google.com ([209.85.214.193]:35023 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726210AbfFUJUa (ORCPT ); Fri, 21 Jun 2019 05:20:30 -0400 Received: by mail-pl1-f193.google.com with SMTP id p1so2710860plo.2 for ; Fri, 21 Jun 2019 02:20:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=E0tDpwlg+OKRkVbD+oy1LwC7tE5sbq/gpCxskU0uUP0=; b=glSAk8TeHSMQANOR11duSKa0OWu28GIQ834sLWE+f8Bwd+QB/t6+81Vi3zXpHr0Yq4 dF5Gje8NWw9uYOlKMDzWFEA0r+73VSueRCsc9UoeirjP14nEEH/1dts2NRGAS6kXO4eM +rJ7Sf+xEvcKFJOIjHEjcFIH2PgatCIXGop3BkGaKttdIhfPIOOnm+/7YyjBLwivu8YI eK5k2HG3uAYmqlQAy301nIMFPb+KQ9idIQbItRX2DpGv8TzZKsd07SWv/v/sB/XZ9LvB LOnwOjrd3IqXPIV0NgHOzedfthIvr+NnbbhtQ0GBBBKpmUGOZZka+LZ/veiB0MWJ7Duf jlTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=E0tDpwlg+OKRkVbD+oy1LwC7tE5sbq/gpCxskU0uUP0=; b=j2iBPtCo3CHgj3tC2q8PcT6hoWz942B4Ild7uHhShbOiYb8NTCrMYmvWzIsj4EsRcP CplCgKK3RyH/HH9W7YVxbSqAB28QHaD3eEkAL5qDzCLb+++P4OStG9hQ4T7e8Xdptpka sx/crhT/9FZqps2M3lWYGcZmJTrUr1swdusvxA5+PFiQ+DJ0IHmDXtCshK4OP/EoBIwm nj9FaBQpjeSiO9exeSG2aLZlHd3lsu/QmnB2cy9mA59LYjtAwPrYOqZ8ZheZxXNsLXFT DBmgolrNyOcVC3tLUNf8jQ9hXMNg1FvWdrZRr3N8tTlqPuGK0sveM08TxkYQ6VcVoc2q 1nyQ== X-Gm-Message-State: APjAAAUQrs1VGFUtRxjfBuJiAi8LUl0d408EwiwkcpXXw8Pdpo/WrqdT iqhNQzYrG+l3zUCJ801gDaugbiI8P/I= X-Google-Smtp-Source: APXvYqwNk7iNmIDGFEOjjdu6UX7iRvoDz3yO5j68uLzIXsBlLYqfyPYRnCdxTJQCxYFmohnd3xJ+LA== X-Received: by 2002:a17:902:ba8b:: with SMTP id k11mr28546696pls.107.1561108829980; Fri, 21 Jun 2019 02:20:29 -0700 (PDT) Received: from ar135.iitr.local ([103.37.200.216]) by smtp.gmail.com with ESMTPSA id i133sm4380220pfe.75.2019.06.21.02.20.26 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Fri, 21 Jun 2019 02:20:29 -0700 (PDT) From: Rohit Ashiwal To: rohit.ashiwal265@gmail.com Cc: git@vger.kernel.org, newren@gmail.com, t.gummerer@gmail.com, phillip.wood123@gmail.com, gitster@pobox.com, jrnieder@gmail.com, martin.agren@gmail.com Subject: [GSoC][PATCH v6 2/5] sequencer: rename reset_for_rollback to reset_merge Date: Fri, 21 Jun 2019 14:47:57 +0530 Message-Id: <20190621091800.17686-3-rohit.ashiwal265@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190621091800.17686-1-rohit.ashiwal265@gmail.com> References: <20190608191958.4593-1-rohit.ashiwal265@gmail.com> <20190621091800.17686-1-rohit.ashiwal265@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP We are on a path to teach cherry-pick/revert how to skip commits. To achieve this, we could really make use of existing functions. reset_for_rollback is one such function, but the name does not intuitively suggest to use it to reset a merge, which it was born to perform see 539047c ("revert: introduce --abort to cancel a failed cherry-pick", 2011-11-23). Change the name to reset_merge to make it more intuitive. Signed-off-by: Rohit Ashiwal --- sequencer.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sequencer.c b/sequencer.c index c644368b54..12f2605ded 100644 --- a/sequencer.c +++ b/sequencer.c @@ -2731,7 +2731,7 @@ static int rollback_is_safe(void) return oideq(&actual_head, &expected_head); } -static int reset_for_rollback(const struct object_id *oid) +static int reset_merge(const struct object_id *oid) { const char *argv[4]; /* reset --merge + NULL */ @@ -2753,7 +2753,7 @@ static int rollback_single_pick(struct repository *r) return error(_("cannot resolve HEAD")); if (is_null_oid(&head_oid)) return error(_("cannot abort from a branch yet to be born")); - return reset_for_rollback(&head_oid); + return reset_merge(&head_oid); } int sequencer_rollback(struct repository *r, struct replay_opts *opts) @@ -2796,7 +2796,7 @@ int sequencer_rollback(struct repository *r, struct replay_opts *opts) warning(_("You seem to have moved HEAD. " "Not rewinding, check your HEAD!")); } else - if (reset_for_rollback(&oid)) + if (reset_merge(&oid)) goto fail; strbuf_release(&buf); return sequencer_remove_state(opts); From patchwork Fri Jun 21 09:17:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rohit Ashiwal X-Patchwork-Id: 11009045 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 882CB186E for ; Fri, 21 Jun 2019 09:20:36 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7282627CF9 for ; Fri, 21 Jun 2019 09:20:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 66DED27F8C; Fri, 21 Jun 2019 09:20:36 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1ACAC27528 for ; Fri, 21 Jun 2019 09:20:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726455AbfFUJUf (ORCPT ); Fri, 21 Jun 2019 05:20:35 -0400 Received: from mail-pg1-f196.google.com ([209.85.215.196]:43519 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726210AbfFUJUf (ORCPT ); Fri, 21 Jun 2019 05:20:35 -0400 Received: by mail-pg1-f196.google.com with SMTP id f25so3064129pgv.10 for ; Fri, 21 Jun 2019 02:20:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=fbylS04N0kpHs/7vKPXmotnmDYuGwmyACsWWpHPf3xQ=; b=VCDQ/vmCTJF8teKs3Rh2W7APSy3qe6XkWWE8dFSSVWhhcSTkk/WGYGumbsH1IyovvT o1u9tio4obNHUkgwLhcqGBZsLj9X5J4WPyX/LFxxP6/VMR7yKLHrqmsS/FPS+f2yTQ3p Ne6EG+2yTm9MXACEQDsYpOk7JK70rh9CAy94ys8v1GnlWutHhIU89nieB7MdYFhvkQM4 no6UVWYCOilSL3HAAJPaUxU7eKcrXc8+1NQ9YMbJb24/eDoNcwl18EmCV0QNIgJucdrf DRF31n8CMDIkpEENoJ3fYoGlWJ90dvmNlQBXHFKQnNEJwt0ojUhY+MujxItfxlh1UbHP jB5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=fbylS04N0kpHs/7vKPXmotnmDYuGwmyACsWWpHPf3xQ=; b=ZYTJ6ZP+WO2bufKDttRCAGaym0MQnd7C/HfsOUr+i/WzUNzdTwxK7mvKTzi18AcpHE nJwEC3StwGANgbMxFAEIDYPTVepMVU2jFUYVZnX/z/UPKpUJbP2plop1lKtm2HgoQ6kU 5rnFgUpWDSUnX/eFDC9kLn6hWaPvbuajrR794cr2suPma3bCY0HqUsOMlObgOk7jGRIQ 5T0E5D1NUDv8fiH5CtVceyCyNJ9ISQH/JdX/Vy+I4Q7XgR2TDnujlzczrAKaSckKR2WF rTG6pLSAdbAfHLmS1y9//QUlsgw9Y5ieIQZVjAWnWaCzOkLejp6ZwDREIvmtdI1VOx0P ZMGg== X-Gm-Message-State: APjAAAU+kBEon+a00k7Llo0yPo3z7kjCmKkSPRHwCIMgebCu4exAixb5 3IiP++JUAWsLHFFPkRh4CLY= X-Google-Smtp-Source: APXvYqxvw7IeXi8YuArMJ1Ch3IuXBt1LBj2oVajRjd5GgXV9hxclMtWH3VyfvKXDkLmHklFanIDVlA== X-Received: by 2002:a63:8041:: with SMTP id j62mr5730788pgd.414.1561108834242; Fri, 21 Jun 2019 02:20:34 -0700 (PDT) Received: from ar135.iitr.local ([103.37.200.216]) by smtp.gmail.com with ESMTPSA id i133sm4380220pfe.75.2019.06.21.02.20.30 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Fri, 21 Jun 2019 02:20:33 -0700 (PDT) From: Rohit Ashiwal To: rohit.ashiwal265@gmail.com Cc: git@vger.kernel.org, newren@gmail.com, t.gummerer@gmail.com, phillip.wood123@gmail.com, gitster@pobox.com, jrnieder@gmail.com, martin.agren@gmail.com Subject: [GSoC][PATCH v6 3/5] sequencer: use argv_array in reset_merge Date: Fri, 21 Jun 2019 14:47:58 +0530 Message-Id: <20190621091800.17686-4-rohit.ashiwal265@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190621091800.17686-1-rohit.ashiwal265@gmail.com> References: <20190608191958.4593-1-rohit.ashiwal265@gmail.com> <20190621091800.17686-1-rohit.ashiwal265@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Avoid using magic numbers for array size and index under `reset_merge` function. Use `argv_array` instead. This will make code shorter and easier to extend. Signed-off-by: Rohit Ashiwal --- sequencer.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/sequencer.c b/sequencer.c index 12f2605ded..6762a5f485 100644 --- a/sequencer.c +++ b/sequencer.c @@ -2733,13 +2733,18 @@ static int rollback_is_safe(void) static int reset_merge(const struct object_id *oid) { - const char *argv[4]; /* reset --merge + NULL */ + int ret; + struct argv_array argv = ARGV_ARRAY_INIT; - argv[0] = "reset"; - argv[1] = "--merge"; - argv[2] = oid_to_hex(oid); - argv[3] = NULL; - return run_command_v_opt(argv, RUN_GIT_CMD); + argv_array_pushl(&argv, "reset", "--merge", NULL); + + if (!is_null_oid(oid)) + argv_array_push(&argv, oid_to_hex(oid)); + + ret = run_command_v_opt(argv.argv, RUN_GIT_CMD); + argv_array_clear(&argv); + + return ret; } static int rollback_single_pick(struct repository *r) From patchwork Fri Jun 21 09:17:59 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rohit Ashiwal X-Patchwork-Id: 11009047 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D09EB14E5 for ; Fri, 21 Jun 2019 09:20:41 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BEEE727528 for ; Fri, 21 Jun 2019 09:20:41 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B2FA927F8C; Fri, 21 Jun 2019 09:20:41 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D197627528 for ; Fri, 21 Jun 2019 09:20:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726480AbfFUJUk (ORCPT ); Fri, 21 Jun 2019 05:20:40 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:37114 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726210AbfFUJUj (ORCPT ); Fri, 21 Jun 2019 05:20:39 -0400 Received: by mail-pf1-f196.google.com with SMTP id 19so3285269pfa.4 for ; Fri, 21 Jun 2019 02:20:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=/kkBohKBupV1dck5bPdb1nLD4fwA0Haq1k/MF7ZcsOA=; b=rKc6yBeXoCszsqNaSxv9VoA0wO5PVFsgcZUcpgg0uu0J8fJzED9VUcgR/ZhGx1nbp8 Nig5JtWoN6zo/ztvbcDZzFBF+dRS6zQlarxCj7FYgOf+7Sv5ZIDGO7Bizd6gpyjTmA+8 ra5VGn17Uigv6Ml3ciVuV2X93RBJ5FxHgW7P6jxOYMSOambzOAPkjh+4bwo81ZppmNzU wUU/168gGiKCtJpuJSBNBC56JjeRfUdPTmFQJAApu2M5ZwBKcrE13hLtOlwJlYrho2Kw 3RG55tkyXt52gy14oljYLUZcjdQb2OSvLhfb8DLIN+atnD2sdm6yeV4wWF6a+WwGUbd9 wcmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=/kkBohKBupV1dck5bPdb1nLD4fwA0Haq1k/MF7ZcsOA=; b=r45XWx2wizaA0LfNTvCCcXrC9aUpTgrhH/1ePNJPY/dkdps9Xp8QNUFumAhdd3d3js 63s7+nvrTq2IHjtvppQn74thELg7KlYN/Fs4zZP3BQR57uwM65eOwmCT9iIMnq4htFgM CyZmX9oR4VfnRUwn+hUelgsZOp5IIdyYbF7lZiOhVBrvlg6aX6CWM8XfAHpDLLDCbQXg A15uc3MCONWGYRMPpKCsfe16taoFJOwvVYasY1FugFiAu8lKMnZXKq4zxxQ9r1sSCtBW bjpRk27TMREUW/PSVPe2vR480JgFNcs4S6kFMe3lgOaOAmhd+/l44Ui6NhT/gpzx4+mL 1B+g== X-Gm-Message-State: APjAAAVVZwn2sVF4EnunK2S3Nt7Q/Ja7wayTt4G8KJWweYpLZ7m40O+E ncaF9kCYa3FXpxOIObyYa1vS6hXmXt4= X-Google-Smtp-Source: APXvYqyWH8lTTW+GBlx2JuO2gvAruanFcoSdOdODgfQrAm7lmeyAizYuqwq4yG7eH1XPRDilA9Unzg== X-Received: by 2002:a17:90a:1d8:: with SMTP id 24mr5413818pjd.70.1561108838803; Fri, 21 Jun 2019 02:20:38 -0700 (PDT) Received: from ar135.iitr.local ([103.37.200.216]) by smtp.gmail.com with ESMTPSA id i133sm4380220pfe.75.2019.06.21.02.20.34 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Fri, 21 Jun 2019 02:20:38 -0700 (PDT) From: Rohit Ashiwal To: rohit.ashiwal265@gmail.com Cc: git@vger.kernel.org, newren@gmail.com, t.gummerer@gmail.com, phillip.wood123@gmail.com, gitster@pobox.com, jrnieder@gmail.com, martin.agren@gmail.com Subject: [GSoC][PATCH v6 4/5] cherry-pick/revert: add --skip option Date: Fri, 21 Jun 2019 14:47:59 +0530 Message-Id: <20190621091800.17686-5-rohit.ashiwal265@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190621091800.17686-1-rohit.ashiwal265@gmail.com> References: <20190608191958.4593-1-rohit.ashiwal265@gmail.com> <20190621091800.17686-1-rohit.ashiwal265@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP git am or rebase have a --skip flag to skip the current commit if the user wishes to do so. During a cherry-pick or revert a user could likewise skip a commit, but needs to use 'git reset' (or in the case of conflicts 'git reset --merge'), followed by 'git (cherry-pick | revert) --continue' to skip the commit. This is more annoying and sometimes confusing on the users' part. Add a `--skip` option to make skipping commits easier for the user and to make the commands more consistent. In the next commit, we will change the advice messages hence finishing the process of teaching revert and cherry-pick "how to skip commits". Signed-off-by: Rohit Ashiwal --- Documentation/git-cherry-pick.txt | 4 +- Documentation/git-revert.txt | 4 +- Documentation/sequencer.txt | 4 ++ builtin/revert.c | 5 ++ sequencer.c | 73 +++++++++++++++++++++ sequencer.h | 1 + t/t3510-cherry-pick-sequence.sh | 102 ++++++++++++++++++++++++++++++ 7 files changed, 187 insertions(+), 6 deletions(-) diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt index 754b16ce0c..83ce51aedf 100644 --- a/Documentation/git-cherry-pick.txt +++ b/Documentation/git-cherry-pick.txt @@ -10,9 +10,7 @@ SYNOPSIS [verse] 'git cherry-pick' [--edit] [-n] [-m parent-number] [-s] [-x] [--ff] [-S[]] ... -'git cherry-pick' --continue -'git cherry-pick' --quit -'git cherry-pick' --abort +'git cherry-pick' (--continue | --skip | --abort | --quit) DESCRIPTION ----------- diff --git a/Documentation/git-revert.txt b/Documentation/git-revert.txt index 0c82ca5bc0..665e065ee3 100644 --- a/Documentation/git-revert.txt +++ b/Documentation/git-revert.txt @@ -9,9 +9,7 @@ SYNOPSIS -------- [verse] 'git revert' [--[no-]edit] [-n] [-m parent-number] [-s] [-S[]] ... -'git revert' --continue -'git revert' --quit -'git revert' --abort +'git revert' (--continue | --skip | --abort | --quit) DESCRIPTION ----------- diff --git a/Documentation/sequencer.txt b/Documentation/sequencer.txt index 5a57c4a407..3bceb56474 100644 --- a/Documentation/sequencer.txt +++ b/Documentation/sequencer.txt @@ -3,6 +3,10 @@ `.git/sequencer`. Can be used to continue after resolving conflicts in a failed cherry-pick or revert. +--skip:: + Skip the current commit and continue with the rest of the + sequence. + --quit:: Forget about the current operation in progress. Can be used to clear the sequencer state after a failed cherry-pick or diff --git a/builtin/revert.c b/builtin/revert.c index d4dcedbdc6..5dc5891ea2 100644 --- a/builtin/revert.c +++ b/builtin/revert.c @@ -102,6 +102,7 @@ static int run_sequencer(int argc, const char **argv, struct replay_opts *opts) OPT_CMDMODE(0, "quit", &cmd, N_("end revert or cherry-pick sequence"), 'q'), OPT_CMDMODE(0, "continue", &cmd, N_("resume revert or cherry-pick sequence"), 'c'), OPT_CMDMODE(0, "abort", &cmd, N_("cancel revert or cherry-pick sequence"), 'a'), + OPT_CMDMODE(0, "skip", &cmd, N_("skip current commit and continue"), 's'), OPT_CLEANUP(&cleanup_arg), OPT_BOOL('n', "no-commit", &opts->no_commit, N_("don't automatically commit")), OPT_BOOL('e', "edit", &opts->edit, N_("edit the commit message")), @@ -151,6 +152,8 @@ static int run_sequencer(int argc, const char **argv, struct replay_opts *opts) this_operation = "--quit"; else if (cmd == 'c') this_operation = "--continue"; + else if (cmd == 's') + this_operation = "--skip"; else { assert(cmd == 'a'); this_operation = "--abort"; @@ -210,6 +213,8 @@ static int run_sequencer(int argc, const char **argv, struct replay_opts *opts) return sequencer_continue(the_repository, opts); if (cmd == 'a') return sequencer_rollback(the_repository, opts); + if (cmd == 's') + return sequencer_skip(the_repository, opts); return sequencer_pick_revisions(the_repository, opts); } diff --git a/sequencer.c b/sequencer.c index 6762a5f485..c62f7a33aa 100644 --- a/sequencer.c +++ b/sequencer.c @@ -2761,6 +2761,15 @@ static int rollback_single_pick(struct repository *r) return reset_merge(&head_oid); } +static int skip_single_pick(void) +{ + struct object_id head; + + if (read_ref_full("HEAD", 0, &head, NULL)) + return error(_("cannot resolve HEAD")); + return reset_merge(&head); +} + int sequencer_rollback(struct repository *r, struct replay_opts *opts) { FILE *f; @@ -2810,6 +2819,70 @@ int sequencer_rollback(struct repository *r, struct replay_opts *opts) return -1; } +int sequencer_skip(struct repository *r, struct replay_opts *opts) +{ + enum replay_action action = -1; + sequencer_get_last_command(r, &action); + + /* + * Check whether the subcommand requested to skip the commit is actually + * in progress and that it's safe to skip the commit. + * + * opts->action tells us which subcommand requested to skip the commit. + * If the corresponding .git/_HEAD exists, we know that the + * action is in progress and we can skip the commit. + * + * Otherwise we check that the last instruction was related to the + * particular subcommand we're trying to execute and barf if that's not + * the case. + * + * Finally we check that the rollback is "safe", i.e., has the HEAD + * moved? In this case, it doesn't make sense to "reset the merge" and + * "skip the commit" as the user already handled this by committing. But + * we'd not want to barf here, instead give advice on how to proceed. We + * only need to check that when .git/_HEAD doesn't exist because + * it gets removed when the user commits, so if it still exists we're + * sure the user can't have committed before. + */ + switch (opts->action) { + case REPLAY_REVERT: + if (!file_exists(git_path_revert_head(r))) { + if (action != REPLAY_REVERT) + return error(_("no revert in progress")); + if (!rollback_is_safe()) + goto give_advice; + } + break; + case REPLAY_PICK: + if (!file_exists(git_path_cherry_pick_head(r))) { + if (action != REPLAY_PICK) + return error(_("no cherry-pick in progress")); + if (!rollback_is_safe()) + goto give_advice; + } + break; + default: + BUG("unexpected action in sequencer_skip"); + } + + if (skip_single_pick()) + return error(_("failed to skip the commit")); + if (!is_directory(git_path_seq_dir())) + return 0; + + return sequencer_continue(r, opts); + +give_advice: + error(_("there is nothing to skip")); + + if (advice_resolve_conflict) { + advise(_("have you committed already?\n" + "try \"git %s --continue\""), + action == REPLAY_REVERT ? "revert" : "cherry-pick"); + } + return -1; +} + static int save_todo(struct todo_list *todo_list, struct replay_opts *opts) { struct lock_file todo_lock = LOCK_INIT; diff --git a/sequencer.h b/sequencer.h index 0c494b83d4..731b9853eb 100644 --- a/sequencer.h +++ b/sequencer.h @@ -129,6 +129,7 @@ int sequencer_pick_revisions(struct repository *repo, struct replay_opts *opts); int sequencer_continue(struct repository *repo, struct replay_opts *opts); int sequencer_rollback(struct repository *repo, struct replay_opts *opts); +int sequencer_skip(struct repository *repo, struct replay_opts *opts); int sequencer_remove_state(struct replay_opts *opts); #define TODO_LIST_KEEP_EMPTY (1U << 0) diff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh index 941d5026da..20515ea37b 100755 --- a/t/t3510-cherry-pick-sequence.sh +++ b/t/t3510-cherry-pick-sequence.sh @@ -93,6 +93,108 @@ test_expect_success 'cherry-pick cleans up sequencer state upon success' ' test_path_is_missing .git/sequencer ' +test_expect_success 'cherry-pick --skip requires cherry-pick in progress' ' + pristine_detach initial && + test_must_fail git cherry-pick --skip +' + +test_expect_success 'revert --skip requires revert in progress' ' + pristine_detach initial && + test_must_fail git revert --skip +' + +test_expect_success 'cherry-pick --skip to skip commit' ' + pristine_detach initial && + test_must_fail git cherry-pick anotherpick && + test_must_fail git revert --skip && + git cherry-pick --skip && + test_cmp_rev initial HEAD && + test_path_is_missing .git/CHERRY_PICK_HEAD +' + +test_expect_success 'revert --skip to skip commit' ' + pristine_detach anotherpick && + test_must_fail git revert anotherpick~1 && + test_must_fail git cherry-pick --skip && + git revert --skip && + test_cmp_rev anotherpick HEAD +' + +test_expect_success 'skip "empty" commit' ' + pristine_detach picked && + test_commit dummy foo d && + test_must_fail git cherry-pick anotherpick && + git cherry-pick --skip && + test_cmp_rev dummy HEAD +' + +test_expect_success 'skip a commit and check if rest of sequence is correct' ' + pristine_detach initial && + echo e >expect && + cat >expect.log <<-EOF && + OBJID + :100644 100644 OBJID OBJID M foo + OBJID + :100644 100644 OBJID OBJID M foo + OBJID + :100644 100644 OBJID OBJID M unrelated + OBJID + :000000 100644 OBJID OBJID A foo + :000000 100644 OBJID OBJID A unrelated + EOF + test_must_fail git cherry-pick base..yetanotherpick && + test_must_fail git cherry-pick --skip && + echo d >foo && + git add foo && + git cherry-pick --continue && + { + git rev-list HEAD | + git diff-tree --root --stdin | + sed "s/$OID_REGEX/OBJID/g" + } >actual.log && + test_cmp expect foo && + test_cmp expect.log actual.log +' + +test_expect_success 'check advice when we move HEAD by committing' ' + pristine_detach initial && + cat >expect <<-EOF && + error: there is nothing to skip + hint: have you committed already? + hint: try "git cherry-pick --continue" + fatal: cherry-pick failed + EOF + test_must_fail git cherry-pick base..yetanotherpick && + echo c >foo && + git commit -a && + test_path_is_missing .git/CHERRY_PICK_HEAD && + test_must_fail git cherry-pick --skip 2>advice && + test_i18ncmp expect advice +' + +test_expect_success 'allow skipping commit but not abort for a new history' ' + pristine_detach initial && + cat >expect <<-EOF && + error: cannot abort from a branch yet to be born + fatal: cherry-pick failed + EOF + git checkout --orphan new_disconnected && + git reset --hard && + test_must_fail git cherry-pick anotherpick && + test_must_fail git cherry-pick --abort 2>advice && + git cherry-pick --skip && + test_i18ncmp expect advice +' + +test_expect_success 'allow skipping stopped cherry-pick because of untracked file modifications' ' + pristine_detach initial && + git rm --cached unrelated && + git commit -m "untrack unrelated" && + test_must_fail git cherry-pick initial base && + test_path_is_missing .git/CHERRY_PICK_HEAD && + git cherry-pick --skip +' + test_expect_success '--quit does not complain when no cherry-pick is in progress' ' pristine_detach initial && git cherry-pick --quit From patchwork Fri Jun 21 09:18:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rohit Ashiwal X-Patchwork-Id: 11009049 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7887014E5 for ; Fri, 21 Jun 2019 09:20:45 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 67CE227CF9 for ; Fri, 21 Jun 2019 09:20:45 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5BE5528474; Fri, 21 Jun 2019 09:20:45 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E0A6627CF9 for ; Fri, 21 Jun 2019 09:20:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726481AbfFUJUo (ORCPT ); Fri, 21 Jun 2019 05:20:44 -0400 Received: from mail-pl1-f193.google.com ([209.85.214.193]:44472 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726210AbfFUJUo (ORCPT ); Fri, 21 Jun 2019 05:20:44 -0400 Received: by mail-pl1-f193.google.com with SMTP id t7so2690076plr.11 for ; Fri, 21 Jun 2019 02:20:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Wi/5p1dB0D0dQabo92pB0NPIwpQWRxmKRG8cIupQ1B8=; b=mGFqfGXL0vs61MQ88hSFXOo2Cg0UlPqp8ML09GANkyAN/hePi6/FtiKfE/HNm+nBfU QsTZGBnXHQjOucJlrxM8FZb8EcaZaaxZv1dD26ChtJVa/pmxjSJgUyAcj2Pd5yhP6kdb PpaYg2rNBYo/tCEKqNNQ3DG3jb3vQmIadyVgKAeTHYVOwSPh2RTQ5dwv58hpjLs8P4TG lqpDz5POVAQ9yG9XvjvM6hO9u3Thk2q82rgRKhzPuOit6w2eiszZE7zKxtHQflXE5Agg 3zZ0THSb2sgLVqx3E6pm/97+oilvods3hy0eSxQ2ueo/STFOQPmh6ZPdBvxJOi03DPJX fI8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Wi/5p1dB0D0dQabo92pB0NPIwpQWRxmKRG8cIupQ1B8=; b=KsZOwbMgUuWmwTDExlqPGZLGPtSmq6s4/nvOEJXstP+HW7wrUkQP82aDo29KI14ZMH sX5n5CV5zgO4P37iGP1An1NkPmJ4cLFLdqEoRmsTgz7XQhpxiMnkNYg9/W70dhoUx5/C iOO+J/7sU5FjwlHW4dQwwQOoyfdWbxRmM49pEU8hsGOdjksSkmQkc62UIi9D63yJO7oE Q+8E1EU+G4MYbPvl8KfPzpF5f8Scc3W2bvV7I0cIHfAVOH2ZomOdtJHg/79ccJBEeJuH eDtX/arq0fRkdfoH1Xc9OPSy4zj3kXyGXmKr0VAwgTXhva+6ndeTLK9O7xxDS+VYbRm/ PzMw== X-Gm-Message-State: APjAAAXXjeolxpPG8LwmC2oedXmO892USj3HE6FOhYsYrmPIUAphybrn 3smd8YTw8vI2vevbV6WkUnY= X-Google-Smtp-Source: APXvYqws/3dEsPNXGBPI0zNN8Shnk8rxLzPs23Ya+/xBeISDcqBM2uVtWmfjCQtXLecxV1TG5ILR8g== X-Received: by 2002:a17:902:b603:: with SMTP id b3mr70765746pls.72.1561108842965; Fri, 21 Jun 2019 02:20:42 -0700 (PDT) Received: from ar135.iitr.local ([103.37.200.216]) by smtp.gmail.com with ESMTPSA id i133sm4380220pfe.75.2019.06.21.02.20.39 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Fri, 21 Jun 2019 02:20:42 -0700 (PDT) From: Rohit Ashiwal To: rohit.ashiwal265@gmail.com Cc: git@vger.kernel.org, newren@gmail.com, t.gummerer@gmail.com, phillip.wood123@gmail.com, gitster@pobox.com, jrnieder@gmail.com, martin.agren@gmail.com Subject: [GSoC][PATCH v6 5/5] cherry-pick/revert: advise using --skip Date: Fri, 21 Jun 2019 14:48:00 +0530 Message-Id: <20190621091800.17686-6-rohit.ashiwal265@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190621091800.17686-1-rohit.ashiwal265@gmail.com> References: <20190608191958.4593-1-rohit.ashiwal265@gmail.com> <20190621091800.17686-1-rohit.ashiwal265@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The previous commit introduced a --skip flag for cherry-pick and revert. Update the advice messages, to tell users about this less cumbersome way of skipping commits. Also add tests to ensure everything is working fine. Signed-off-by: Rohit Ashiwal --- builtin/commit.c | 13 ++++++++----- sequencer.c | 11 ++++++++--- t/t3510-cherry-pick-sequence.sh | 20 ++++++++++++++++++++ 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/builtin/commit.c b/builtin/commit.c index 1c9e8e2228..1f47c51bdc 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -60,15 +60,18 @@ N_("The previous cherry-pick is now empty, possibly due to conflict resolution.\ "\n"); static const char empty_cherry_pick_advice_single[] = -N_("Otherwise, please use 'git reset'\n"); +N_("Otherwise, please use 'git cherry-pick --skip'\n"); static const char empty_cherry_pick_advice_multi[] = -N_("If you wish to skip this commit, use:\n" +N_("and then use:\n" "\n" -" git reset\n" +" git cherry-pick --continue\n" "\n" -"Then \"git cherry-pick --continue\" will resume cherry-picking\n" -"the remaining commits.\n"); +"to resume cherry-picking the remaining commits.\n" +"If you wish to skip this commit, use:\n" +"\n" +" git cherry-pick --skip\n" +"\n"); static const char *color_status_slots[] = { [WT_STATUS_HEADER] = "header", diff --git a/sequencer.c b/sequencer.c index c62f7a33aa..98f3537dfc 100644 --- a/sequencer.c +++ b/sequencer.c @@ -2655,18 +2655,20 @@ static int create_seq_dir(struct repository *r) enum replay_action action; const char *in_progress_error = NULL; const char *in_progress_advice = NULL; + unsigned int advise_skip = file_exists(git_path_revert_head(r)) || + file_exists(git_path_cherry_pick_head(r)); if (!sequencer_get_last_command(r, &action)) { switch (action) { case REPLAY_REVERT: in_progress_error = _("revert is already in progress"); in_progress_advice = - _("try \"git revert (--continue | --abort | --quit)\""); + _("try \"git revert (--continue | %s--abort | --quit)\""); break; case REPLAY_PICK: in_progress_error = _("cherry-pick is already in progress"); in_progress_advice = - _("try \"git cherry-pick (--continue | --abort | --quit)\""); + _("try \"git cherry-pick (--continue | %s--abort | --quit)\""); break; default: BUG("unexpected action in create_seq_dir"); @@ -2674,7 +2676,10 @@ static int create_seq_dir(struct repository *r) } if (in_progress_error) { error("%s", in_progress_error); - advise("%s", in_progress_advice); + if (advise_skip) + advise(in_progress_advice, "--skip | "); + else + advise(in_progress_advice, ""); return -1; } if (mkdir(git_path_seq_dir(), 0777) < 0) diff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh index 20515ea37b..793bcc7fe3 100755 --- a/t/t3510-cherry-pick-sequence.sh +++ b/t/t3510-cherry-pick-sequence.sh @@ -172,6 +172,26 @@ test_expect_success 'check advice when we move HEAD by committing' ' test_i18ncmp expect advice ' +test_expect_success 'selectively advise --skip while launching another sequence' ' + pristine_detach initial && + cat >expect <<-EOF && + error: cherry-pick is already in progress + hint: try "git cherry-pick (--continue | --skip | --abort | --quit)" + fatal: cherry-pick failed + EOF + test_must_fail git cherry-pick picked..yetanotherpick && + test_must_fail git cherry-pick picked..yetanotherpick 2>advice && + test_i18ncmp expect advice && + cat >expect <<-EOF && + error: cherry-pick is already in progress + hint: try "git cherry-pick (--continue | --abort | --quit)" + fatal: cherry-pick failed + EOF + git reset --merge && + test_must_fail git cherry-pick picked..yetanotherpick 2>advice && + test_i18ncmp expect advice +' + test_expect_success 'allow skipping commit but not abort for a new history' ' pristine_detach initial && cat >expect <<-EOF &&