From patchwork Tue Mar 19 19:03:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10860273 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 B7D976C2 for ; Tue, 19 Mar 2019 19:04:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9AFD529715 for ; Tue, 19 Mar 2019 19:04:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8F1C629858; Tue, 19 Mar 2019 19:04:06 +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 1084A29715 for ; Tue, 19 Mar 2019 19:04:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727237AbfCSTD7 (ORCPT ); Tue, 19 Mar 2019 15:03:59 -0400 Received: from mail-wr1-f65.google.com ([209.85.221.65]:45715 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727054AbfCSTD6 (ORCPT ); Tue, 19 Mar 2019 15:03:58 -0400 Received: by mail-wr1-f65.google.com with SMTP id s15so27830wra.12 for ; Tue, 19 Mar 2019 12:03:57 -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:reply-to :mime-version:content-transfer-encoding; bh=Er5e6FusaGd1w83UJSHBRvaHOVh/8y4EJKYSOvT3/qE=; b=EgR8+5NAYqxLlQTJDa/jpPWdOBfDsp3fzno3MWC0t6SuiPXPpUe/JECrgP3nHDZ6ov +r9XUv3RRW+RHDa/uEGSXTNaiktZUTLSdzpCjsSXiy7SLvmhgFkznWDuC9LWKlLIVsl/ xA6KvgcOZJ59ipHoR31E1rpAAaR9z0R4hiJFur/bpnTWI3hxz2mtBj5N0AshDM2BGx0B ozl3lJKV0h/2OBrLBd3ccrRxwaxzZtt3m79ywpTexBK5dR2slES723aQFsW+CDrbhkYH wPY8iAx30sTY+XjRh38ESVPPtPbqN+eALic+AARw+lDczcx2d7cMm7/pkjVxqUkRUfUx uujg== 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:reply-to:mime-version:content-transfer-encoding; bh=Er5e6FusaGd1w83UJSHBRvaHOVh/8y4EJKYSOvT3/qE=; b=tWSdZh+G9AcVqXmJeBH4HoqLyszWPpdP7XtdjZL0VVHGB2/EREP+3Li3Q3gliIAbfM o3QXVYtUzPz7pbuutUq/U0GXaOOgNHdskvFHWk+XzBEsZ0b0RWliTyfpEZjD65BeusTu GPF+/2WSBaTVYco8KZnpXPMYNgwafwROLE2SbbWAXABhM3l7/fQB+Gca0lbskTyyI83U DXfkCZs0kxZrD7Z4MeauqC5w8ZU5I+iMkL/DAdmzUrN0m0MqKxtWUyO1hu13xpxzCsWq qFnxj4pS5ZalMB34yrsXnLGgl4JUTPYDQr0WJCe6YJprrbhiym/SauYz0Qy+PsXamjwm GMzw== X-Gm-Message-State: APjAAAUHdmNg2QyniThGrOHapqn6msHZPrPblYhjVY5gxBiL6oLF5Yq4 gq8mC1GkWBA8LzbFgBN8iPJU3tfQBDQ= X-Google-Smtp-Source: APXvYqwpS+L1a8Amv5eQphYrhWke4n6qpNm1E1iCGHZIEs5yZFMhEK5qrFNh+H9sVpNFQ8bSY19rBg== X-Received: by 2002:adf:eb89:: with SMTP id t9mr17898583wrn.21.1553022236408; Tue, 19 Mar 2019 12:03:56 -0700 (PDT) Received: from lindisfarne.localdomain (host-89-242-184-133.as13285.net. [89.242.184.133]) by smtp.gmail.com with ESMTPSA id s187sm6253853wms.7.2019.03.19.12.03.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Mar 2019 12:03:55 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Phillip Wood Subject: [RFC PATCH 01/11] sequencer: always discard index after checkout Date: Tue, 19 Mar 2019 19:03:07 +0000 Message-Id: <20190319190317.6632-2-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190319190317.6632-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> Reply-To: Phillip Wood 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 From: Phillip Wood As the checkout runs in a separate process our index will be out of date so it should be discarded. The existing callers are not doing this consistently so do it here to avoid the callers having to worry about it. This fixes some test failures that happen if do_interactive_rebase() is called without forking rebase--interactive which we will implement shortly. Running git rebase -i master topic starting on master created empty todo lists because all the commits in topic were marked as cherry-picks. After topic was checked out in prepare_branch_to_be_rebased() the working tree contained the contents from topic but the index contained master and the cache entries were still valid. This meant that diff_populate_filespec() which loads the blobs when calculating patch-id's ended up reading the contents for master from the working tree which actually contained topic. Signed-off-by: Phillip Wood --- Notes: It would perhaps be better to pass around the_index rather than the_repository builtin/rebase--interactive.c | 2 +- sequencer.c | 27 +++++++++++++++++---------- sequencer.h | 3 ++- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/builtin/rebase--interactive.c b/builtin/rebase--interactive.c index 4535523bf5..d1a4ac1b84 100644 --- a/builtin/rebase--interactive.c +++ b/builtin/rebase--interactive.c @@ -171,7 +171,7 @@ static int do_interactive_rebase(struct replay_opts *opts, unsigned flags, struct argv_array make_script_args = ARGV_ARRAY_INIT; struct todo_list todo_list = TODO_LIST_INIT; - if (prepare_branch_to_be_rebased(opts, switch_to)) + if (prepare_branch_to_be_rebased(the_repository, opts, switch_to)) return -1; if (get_revision_ranges(upstream, onto, &head_hash, diff --git a/sequencer.c b/sequencer.c index 281a8ade19..ccc0160800 100644 --- a/sequencer.c +++ b/sequencer.c @@ -3418,10 +3418,11 @@ static const char *reflog_message(struct replay_opts *opts, return buf.buf; } -static int run_git_checkout(struct replay_opts *opts, const char *commit, - const char *action) +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; @@ -3430,25 +3431,31 @@ static int run_git_checkout(struct replay_opts *opts, const char *commit, argv_array_pushf(&cmd.env_array, GIT_REFLOG_ACTION "=%s", action); if (opts->verbose) - return run_command(&cmd); + ret = run_command(&cmd); else - return run_command_silent_on_success(&cmd); + ret = run_command_silent_on_success(&cmd); + + if (!ret) + discard_index(r->index); + + return ret; } -int prepare_branch_to_be_rebased(struct replay_opts *opts, const char *commit) +int prepare_branch_to_be_rebased(struct repository *r, struct replay_opts *opts, + const char *commit) { const char *action; if (commit && *commit) { action = reflog_message(opts, "start", "checkout %s", commit); - if (run_git_checkout(opts, commit, action)) + if (run_git_checkout(r, opts, commit, action)) return error(_("could not checkout %s"), commit); } return 0; } -static int checkout_onto(struct replay_opts *opts, +static int checkout_onto(struct repository *r, struct replay_opts *opts, const char *onto_name, const char *onto, const char *orig_head) { @@ -3458,7 +3465,7 @@ static int checkout_onto(struct replay_opts *opts, if (get_oid(orig_head, &oid)) return error(_("%s: not a valid OID"), orig_head); - if (run_git_checkout(opts, onto, action)) { + if (run_git_checkout(r, opts, onto, action)) { apply_autostash(opts); sequencer_remove_state(opts); return error(_("could not detach HEAD")); @@ -4786,7 +4793,7 @@ int complete_action(struct repository *r, struct replay_opts *opts, unsigned fla if (todo_list_parse_insn_buffer(r, new_todo.buf.buf, &new_todo) || todo_list_check(todo_list, &new_todo)) { fprintf(stderr, _(edit_todo_list_advice)); - checkout_onto(opts, onto_name, onto, orig_head); + checkout_onto(r, opts, onto_name, onto, orig_head); todo_list_release(&new_todo); return -1; @@ -4805,7 +4812,7 @@ int complete_action(struct repository *r, struct replay_opts *opts, unsigned fla todo_list_release(&new_todo); - if (checkout_onto(opts, onto_name, oid_to_hex(&oid), orig_head)) + if (checkout_onto(r, opts, onto_name, oid_to_hex(&oid), orig_head)) return -1; if (require_clean_work_tree(r, "rebase", "", 1, 1)) diff --git a/sequencer.h b/sequencer.h index a515ee4457..6c55aa4200 100644 --- a/sequencer.h +++ b/sequencer.h @@ -175,7 +175,8 @@ void commit_post_rewrite(struct repository *r, const struct commit *current_head, const struct object_id *new_head); -int prepare_branch_to_be_rebased(struct replay_opts *opts, const char *commit); +int prepare_branch_to_be_rebased(struct repository *r, struct replay_opts *opts, + const char *commit); #define SUMMARY_INITIAL_COMMIT (1 << 0) #define SUMMARY_SHOW_AUTHOR_DATE (1 << 1) From patchwork Tue Mar 19 19:03:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10860271 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 3019417EF for ; Tue, 19 Mar 2019 19:04:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1084529857 for ; Tue, 19 Mar 2019 19:04:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 04BB529858; Tue, 19 Mar 2019 19:04:05 +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 A23992985D for ; Tue, 19 Mar 2019 19:04:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727276AbfCSTD7 (ORCPT ); Tue, 19 Mar 2019 15:03:59 -0400 Received: from mail-wr1-f68.google.com ([209.85.221.68]:36263 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726939AbfCSTD7 (ORCPT ); Tue, 19 Mar 2019 15:03:59 -0400 Received: by mail-wr1-f68.google.com with SMTP id y13so77855wrd.3 for ; Tue, 19 Mar 2019 12:03:58 -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:reply-to :mime-version:content-transfer-encoding; bh=HkPIJ3yLvj5KCd8MPgI6UYz23Hx72UDZ9ZecGFrVWUg=; b=onH4Jb8VKx36p9t8dvnmHIhsWv+dFkI2ypDO3t65G8KEBT3Wa7VRxxSoDlw/m3Cg7M 7Me0YXheIktBlXvIT5bBtJ2kM4jLuCPl9a6EAe9F+GO8W2gHt5O5l/HOQ3bY40RdntsK So+5ZOnbxlO/GEldrrID3Aolfp4P0zqwJqvr7Mw2Y2dA9jPiuFhBHPMU9LPZAVgZdjl4 I++1VXd5XCyjCO5W0Q/uDe8omM4e3n0yhkmvvArK3aDDrVPU1WnWONVoq3icvmG7K2Kx kSnVmkr1JqRfA2qiSQxt2DBqpsG6bv+lviNe4sWVXT4ceScNOq9elGL2gjRt1UrHfEN/ KFSQ== 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:reply-to:mime-version:content-transfer-encoding; bh=HkPIJ3yLvj5KCd8MPgI6UYz23Hx72UDZ9ZecGFrVWUg=; b=dqWxqSn8O5L2Cdj2Qce8FbeRH5XmegFUEqCmweUL5za14B4LHGCcf+RADJ42vnCeFE LITPlwVK87HLr730AuFnkc2HrVH397fc3zpTxj0c0PUdu7YYEnxSP3tpGCFEgv9uFMtS /lewHe6Yupoojxf9Htv/HJWvUfc26udzoRI5HmRyMEOrrLahW4Qbwlq3s0M+M/Ol05jn dayyVm3W3YE81pCv667kBaEXWia+ir2Q/Md65n7oclbOF14qw6+3/YBJSXrYE5X9u/CM kbtLT/s3stZirVCU4gZyI48F1EpBcVhMjGf6rJDYxGvxvCh8KdpT9VravtyveWpSdNmd oRDg== X-Gm-Message-State: APjAAAUbo6vVnTBFs1wyvPyPoCwjIhMobcwCrOgo00aBcTOshelLEWF2 /yWTlAAcXv0t+wOpWAtmEKgaRlNddhI= X-Google-Smtp-Source: APXvYqzliyWQezC6zfrF0eREnnbBuQGaYTtDmseWe7uybbnrEKfUgzKwxaivzE5VLQkW1PP2fBclGg== X-Received: by 2002:a5d:468d:: with SMTP id u13mr18172772wrq.132.1553022237344; Tue, 19 Mar 2019 12:03:57 -0700 (PDT) Received: from lindisfarne.localdomain (host-89-242-184-133.as13285.net. [89.242.184.133]) by smtp.gmail.com with ESMTPSA id s187sm6253853wms.7.2019.03.19.12.03.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Mar 2019 12:03:56 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Phillip Wood Subject: [RFC PATCH 02/11] rebase: rename write_basic_state() Date: Tue, 19 Mar 2019 19:03:08 +0000 Message-Id: <20190319190317.6632-3-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190319190317.6632-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> Reply-To: Phillip Wood 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 From: Phillip Wood This clashes with a function in sequencer.c 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 52114cbf0d..b634879c5b 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -245,7 +245,7 @@ static int read_basic_state(struct rebase_options *opts) return 0; } -static int write_basic_state(struct rebase_options *opts) +static int rebase_write_basic_state(struct rebase_options *opts) { write_file(state_dir_path("head-name", opts), "%s", opts->head_name ? opts->head_name : "detached HEAD"); @@ -640,7 +640,7 @@ static int run_am(struct rebase_options *opts) } if (is_directory(opts->state_dir)) - write_basic_state(opts); + rebase_write_basic_state(opts); return status; } From patchwork Tue Mar 19 19:03:09 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10860275 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 40CC46C2 for ; Tue, 19 Mar 2019 19:04:08 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 25D8D2945E for ; Tue, 19 Mar 2019 19:04:08 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1A45529463; Tue, 19 Mar 2019 19:04:08 +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 AE64D29859 for ; Tue, 19 Mar 2019 19:04:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727359AbfCSTEB (ORCPT ); Tue, 19 Mar 2019 15:04:01 -0400 Received: from mail-wr1-f67.google.com ([209.85.221.67]:37540 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727054AbfCSTEB (ORCPT ); Tue, 19 Mar 2019 15:04:01 -0400 Received: by mail-wr1-f67.google.com with SMTP id y15so70634wro.4 for ; Tue, 19 Mar 2019 12:03:59 -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:reply-to :mime-version:content-transfer-encoding; bh=rWGh19B4fp21dviG2WNKTXCkWsG4gng0mLhkJ5wH/m0=; b=EaVuEv1Xb++kjPyBJmINgRK4W66uyrRY7XQwhgXgzL70NTYewWuAnNapvlK4IgWLBU LvKp5nO2XbbikpmnQEtg2pRf9kE5rlm/knWovEMEh4UukzFMTnQ6G7OiRSimK9dLa5b9 ofyBi20wnSSYk6T4WdL0DzQwZz04wMq6C76ZTNC03me/csIqYUH6lrQ+CGW4vH2+EOfb uwwNztX9n2nxMAFQIoMr+BJbkHe/qUKXXNnL+FNZMy327CAv2K6WSsnjqLUzYBijnFfJ n/z0NNoYRKNVI9Es6HI2tuxI62+8Dx8vbheCQG1g2k8pEJrhWZKhqYv2mPZC2IMoZR1f ofNQ== 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:reply-to:mime-version:content-transfer-encoding; bh=rWGh19B4fp21dviG2WNKTXCkWsG4gng0mLhkJ5wH/m0=; b=TACSMtkf/k64b0nOlj9dlH3xFP7K9PMTTeygB0iKBsS73e12NiCQ3cUl2MxdNH19nX VN2XDazmjNdkpZhi1dU4EipCpXP6iNOiS3mClvu1Y5QCnEClBje5at3b3e7O5MrGg8X9 QHa2I9YzbIBwDTqr7bATevHXFNEgPKDyTYXTmoIHoXuWRoKPiDZfYjxRPTEhLEstewtS od0K1x6EbeAeweEVis6wFxDsxKFNH0leqKhTqFZ+ya68iu1T2L2G7E52GqqlaRs6JTct D1C62CKnfPZyfW0+QDqNavAelDlho9OkcPi6VUl15my/l2havcrBxsfqqMh8Bnss24fu klJw== X-Gm-Message-State: APjAAAWMN1G2reRxBWIBg1jdO8I9TR/dSVR0XD12UCx5pz2F/rnFU6SY yogrJ7dmOcAcc0cXkbE3sHb0GHjfQPA= X-Google-Smtp-Source: APXvYqzMd0l75xR9a6UPWDAhJaffcQndK7fbOqrHN9J1RIMm4cz+F2KTExYSVM+MnnfKnUQH2sWI7Q== X-Received: by 2002:adf:b651:: with SMTP id i17mr17241491wre.108.1553022238286; Tue, 19 Mar 2019 12:03:58 -0700 (PDT) Received: from lindisfarne.localdomain (host-89-242-184-133.as13285.net. [89.242.184.133]) by smtp.gmail.com with ESMTPSA id s187sm6253853wms.7.2019.03.19.12.03.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Mar 2019 12:03:57 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Phillip Wood Subject: [RFC PATCH 03/11] rebase: use OPT_RERERE_AUTOUPDATE() Date: Tue, 19 Mar 2019 19:03:09 +0000 Message-Id: <20190319190317.6632-4-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190319190317.6632-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> Reply-To: Phillip Wood 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 From: Phillip Wood As we have a macro for this it makes sense to use it. Having cmd_rebase() and cmd_rebase__interactive() use the same values for this option will be helpful when we start running interactive rebases without forking rebase--interactive. Signed-off-by: Phillip Wood --- builtin/rebase.c | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index b634879c5b..ccf178326c 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -206,14 +206,13 @@ static int read_basic_state(struct rebase_options *opts) &buf)) return -1; if (!strcmp(buf.buf, "--rerere-autoupdate")) - opts->allow_rerere_autoupdate = 1; + opts->allow_rerere_autoupdate = RERERE_AUTOUPDATE; else if (!strcmp(buf.buf, "--no-rerere-autoupdate")) - opts->allow_rerere_autoupdate = 0; + opts->allow_rerere_autoupdate = RERERE_NOAUTOUPDATE; else warning(_("ignoring invalid allow_rerere_autoupdate: " "'%s'"), buf.buf); - } else - opts->allow_rerere_autoupdate = -1; + } if (file_exists(state_dir_path("gpg_sign_opt", opts))) { strbuf_reset(&buf); @@ -263,10 +262,11 @@ static int rebase_write_basic_state(struct rebase_options *opts) if (opts->strategy_opts) write_file(state_dir_path("strategy_opts", opts), "%s", opts->strategy_opts); - if (opts->allow_rerere_autoupdate >= 0) + if (opts->allow_rerere_autoupdate > 0) write_file(state_dir_path("allow_rerere_autoupdate", opts), "-%s-rerere-autoupdate", - opts->allow_rerere_autoupdate ? "" : "-no"); + opts->allow_rerere_autoupdate == RERERE_AUTOUPDATE ? + "" : "-no"); if (opts->gpg_sign_opt) write_file(state_dir_path("gpg_sign_opt", opts), "%s", opts->gpg_sign_opt); @@ -625,9 +625,9 @@ static int run_am(struct rebase_options *opts) argv_array_push(&am.args, "--rebasing"); argv_array_pushf(&am.args, "--resolvemsg=%s", resolvemsg); argv_array_push(&am.args, "--patch-format=mboxrd"); - if (opts->allow_rerere_autoupdate > 0) + if (opts->allow_rerere_autoupdate == RERERE_AUTOUPDATE) argv_array_push(&am.args, "--rerere-autoupdate"); - else if (opts->allow_rerere_autoupdate == 0) + else if (opts->allow_rerere_autoupdate == RERERE_NOAUTOUPDATE) argv_array_push(&am.args, "--no-rerere-autoupdate"); if (opts->gpg_sign_opt) argv_array_push(&am.args, opts->gpg_sign_opt); @@ -713,9 +713,9 @@ static int run_specific_rebase(struct rebase_options *opts) argv_array_pushf(&child.args, "--cmd=%s", opts->cmd); if (opts->allow_empty_message) argv_array_push(&child.args, "--allow-empty-message"); - if (opts->allow_rerere_autoupdate > 0) + if (opts->allow_rerere_autoupdate == RERERE_AUTOUPDATE) argv_array_push(&child.args, "--rerere-autoupdate"); - else if (opts->allow_rerere_autoupdate == 0) + else if (opts->allow_rerere_autoupdate == RERERE_NOAUTOUPDATE) argv_array_push(&child.args, "--no-rerere-autoupdate"); if (opts->gpg_sign_opt) argv_array_push(&child.args, opts->gpg_sign_opt); @@ -764,9 +764,9 @@ static int run_specific_rebase(struct rebase_options *opts) add_var(&script_snippet, "action", opts->action ? opts->action : ""); add_var(&script_snippet, "signoff", opts->signoff ? "--signoff" : ""); add_var(&script_snippet, "allow_rerere_autoupdate", - opts->allow_rerere_autoupdate < 0 ? "" : opts->allow_rerere_autoupdate ? - "--rerere-autoupdate" : "--no-rerere-autoupdate"); + opts->allow_rerere_autoupdate == RERERE_AUTOUPDATE ? + "--rerere-autoupdate" : "--no-rerere-autoupdate" : ""); add_var(&script_snippet, "keep_empty", opts->keep_empty ? "yes" : ""); add_var(&script_snippet, "autosquash", opts->autosquash ? "t" : ""); add_var(&script_snippet, "gpg_sign_opt", opts->gpg_sign_opt); @@ -1007,7 +1007,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) .type = REBASE_UNSPECIFIED, .flags = REBASE_NO_QUIET, .git_am_opts = ARGV_ARRAY_INIT, - .allow_rerere_autoupdate = -1, .allow_empty_message = 1, .git_format_patch_opt = STRBUF_INIT, }; @@ -1102,10 +1101,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) OPT_SET_INT('p', "preserve-merges", &options.type, N_("try to recreate merges instead of ignoring " "them"), REBASE_PRESERVE_MERGES), - OPT_BOOL(0, "rerere-autoupdate", - &options.allow_rerere_autoupdate, - N_("allow rerere to update index with resolved " - "conflict")), + OPT_RERERE_AUTOUPDATE(&options.allow_rerere_autoupdate), OPT_BOOL('k', "keep-empty", &options.keep_empty, N_("preserve empty commits during rebase")), OPT_BOOL(0, "autosquash", &options.autosquash, From patchwork Tue Mar 19 19:03:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10860281 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 307AA6C2 for ; Tue, 19 Mar 2019 19:04:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 11C8429480 for ; Tue, 19 Mar 2019 19:04:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 060FE296D3; Tue, 19 Mar 2019 19:04:12 +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 6661A29480 for ; Tue, 19 Mar 2019 19:04:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727397AbfCSTED (ORCPT ); Tue, 19 Mar 2019 15:04:03 -0400 Received: from mail-wr1-f65.google.com ([209.85.221.65]:37543 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726627AbfCSTEC (ORCPT ); Tue, 19 Mar 2019 15:04:02 -0400 Received: by mail-wr1-f65.google.com with SMTP id y15so70734wro.4 for ; Tue, 19 Mar 2019 12:04:01 -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:reply-to :mime-version:content-transfer-encoding; bh=JILyI1/oZ+AfFVt4MZf7L4rzVylozfU44HcJI81C0lY=; b=Kqj5wrQ9N0/9KDicvcdxJ3ZmghiOm712jspknJGlid6i8Tvn5HQ7+WXfOUlV8Y3gEs uEgFBe9wuJIAh5aReo3GNCcD+85ou8Z5m58mgyjhgzjk95E7uYJrdXjH09Pygu3VbNHd HkUvLrQ5FCc8fya711NK/+vqpCftCIPTFuXXv9NRwJ/zkYabhazK9gL6eBCfJbe4H1vs FS/weMxLEoWDtSdWytPVhDN7OgIWwEmJUT/KVUofBo+KYldRRXUEBAB1Ps4gBaCy0yzd JYoP1pv2qmFlQykc9jIQj3cRCrYebQnWDYKw0rv0isNiUospuILNUgAqAnIhWIeMwCu8 xJdA== 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:reply-to:mime-version:content-transfer-encoding; bh=JILyI1/oZ+AfFVt4MZf7L4rzVylozfU44HcJI81C0lY=; b=PhLNLHZVObwryLF3tAdlT6dbC+SObL7mjx0e1Q6BxO4iPRW27vdF2FY6zHZiPolbUL ivP3A5N86/JK+yT5pc9evROabwpL07iMbcXiX6yVhjK+9JUb4Fou5AlXDT1SRGBwHIP1 W7KWCAWInabmN6lbUpjrQU2gmF1GrLiytI7tAD0/iSTiHv2/MYCk2d7NHK7/649xheJ0 cuPMabRkF8HOeoHHRFCS5sPNWDvF8PpzlEpAshRMGJKEw/wYnbXF8/C+BMAb8Gvd1nQt xDKs5whnG8KSoH4PtHJ1Vv73oOVtwMxcdT2jESucKOAccPepAmgTdiwxYGo5VuplCXBW EF5Q== X-Gm-Message-State: APjAAAV1Jlx4su0qUGXg0RKAVhs6FzR1aqzaYD5+74LWI4ePZ4QaHvmE GP1+ZzItycZu87uvyKWdTATHyukyBVw= X-Google-Smtp-Source: APXvYqx/pGexFvrTOw6ht8tubUSCvLNoYWHIgx21MbjOMBGWTbCtNQ09NeiEFTgRsl7kQdzmEAc6SQ== X-Received: by 2002:adf:eac6:: with SMTP id o6mr17663930wrn.77.1553022239959; Tue, 19 Mar 2019 12:03:59 -0700 (PDT) Received: from lindisfarne.localdomain (host-89-242-184-133.as13285.net. [89.242.184.133]) by smtp.gmail.com with ESMTPSA id s187sm6253853wms.7.2019.03.19.12.03.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Mar 2019 12:03:59 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Phillip Wood Subject: [RFC PATCH 04/11] rebase -i: combine rebase--interactive.c with rebase.c Date: Tue, 19 Mar 2019 19:03:10 +0000 Message-Id: <20190319190317.6632-5-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190319190317.6632-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> Reply-To: Phillip Wood 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 From: Phillip Wood In order to run `rebase -i` without forking `rebase--interactive` it will be convenient to have all the code from rebase--interactive.c in rebase.c. This is a straight forward copy of the code from rebase--interactive.c, it will be simplified slightly in the next commit. Signed-off-by: Phillip Wood --- Makefile | 1 - builtin/rebase--interactive.c | 377 ---------------------------------- builtin/rebase.c | 367 +++++++++++++++++++++++++++++++++ 3 files changed, 367 insertions(+), 378 deletions(-) delete mode 100644 builtin/rebase--interactive.c diff --git a/Makefile b/Makefile index 537493822b..c644089244 100644 --- a/Makefile +++ b/Makefile @@ -1130,7 +1130,6 @@ BUILTIN_OBJS += builtin/push.o BUILTIN_OBJS += builtin/range-diff.o BUILTIN_OBJS += builtin/read-tree.o BUILTIN_OBJS += builtin/rebase.o -BUILTIN_OBJS += builtin/rebase--interactive.o BUILTIN_OBJS += builtin/receive-pack.o BUILTIN_OBJS += builtin/reflog.o BUILTIN_OBJS += builtin/remote.o diff --git a/builtin/rebase--interactive.c b/builtin/rebase--interactive.c deleted file mode 100644 index d1a4ac1b84..0000000000 --- a/builtin/rebase--interactive.c +++ /dev/null @@ -1,377 +0,0 @@ -#define USE_THE_INDEX_COMPATIBILITY_MACROS -#include "builtin.h" -#include "cache.h" -#include "config.h" -#include "parse-options.h" -#include "sequencer.h" -#include "rebase-interactive.h" -#include "argv-array.h" -#include "refs.h" -#include "rerere.h" -#include "run-command.h" - -static GIT_PATH_FUNC(path_state_dir, "rebase-merge/") -static GIT_PATH_FUNC(path_squash_onto, "rebase-merge/squash-onto") -static GIT_PATH_FUNC(path_interactive, "rebase-merge/interactive") - -static int add_exec_commands(struct string_list *commands) -{ - const char *todo_file = rebase_path_todo(); - struct todo_list todo_list = TODO_LIST_INIT; - int res; - - if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0) - return error_errno(_("could not read '%s'."), todo_file); - - if (todo_list_parse_insn_buffer(the_repository, todo_list.buf.buf, - &todo_list)) { - todo_list_release(&todo_list); - return error(_("unusable todo list: '%s'"), todo_file); - } - - todo_list_add_exec_commands(&todo_list, commands); - res = todo_list_write_to_file(the_repository, &todo_list, - todo_file, NULL, NULL, -1, 0); - todo_list_release(&todo_list); - - if (res) - return error_errno(_("could not write '%s'."), todo_file); - return 0; -} - -static int rearrange_squash_in_todo_file(void) -{ - const char *todo_file = rebase_path_todo(); - struct todo_list todo_list = TODO_LIST_INIT; - int res = 0; - - if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0) - return error_errno(_("could not read '%s'."), todo_file); - if (todo_list_parse_insn_buffer(the_repository, todo_list.buf.buf, - &todo_list)) { - todo_list_release(&todo_list); - return error(_("unusable todo list: '%s'"), todo_file); - } - - res = todo_list_rearrange_squash(&todo_list); - if (!res) - res = todo_list_write_to_file(the_repository, &todo_list, - todo_file, NULL, NULL, -1, 0); - - todo_list_release(&todo_list); - - if (res) - return error_errno(_("could not write '%s'."), todo_file); - return 0; -} - -static int transform_todo_file(unsigned flags) -{ - const char *todo_file = rebase_path_todo(); - struct todo_list todo_list = TODO_LIST_INIT; - int res; - - if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0) - return error_errno(_("could not read '%s'."), todo_file); - - if (todo_list_parse_insn_buffer(the_repository, todo_list.buf.buf, - &todo_list)) { - todo_list_release(&todo_list); - return error(_("unusable todo list: '%s'"), todo_file); - } - - res = todo_list_write_to_file(the_repository, &todo_list, todo_file, - NULL, NULL, -1, flags); - todo_list_release(&todo_list); - - if (res) - return error_errno(_("could not write '%s'."), todo_file); - return 0; -} - -static int edit_todo_file(unsigned flags) -{ - const char *todo_file = rebase_path_todo(); - struct todo_list todo_list = TODO_LIST_INIT, - new_todo = TODO_LIST_INIT; - int res = 0; - - if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0) - return error_errno(_("could not read '%s'."), todo_file); - - strbuf_stripspace(&todo_list.buf, 1); - res = edit_todo_list(the_repository, &todo_list, &new_todo, NULL, NULL, flags); - if (!res && todo_list_write_to_file(the_repository, &new_todo, todo_file, - NULL, NULL, -1, flags & ~(TODO_LIST_SHORTEN_IDS))) - res = error_errno(_("could not write '%s'"), todo_file); - - todo_list_release(&todo_list); - todo_list_release(&new_todo); - - return res; -} - -static int get_revision_ranges(const char *upstream, const char *onto, - const char **head_hash, - char **revisions, char **shortrevisions) -{ - const char *base_rev = upstream ? upstream : onto, *shorthead; - struct object_id orig_head; - - if (get_oid("HEAD", &orig_head)) - return error(_("no HEAD?")); - - *head_hash = find_unique_abbrev(&orig_head, GIT_MAX_HEXSZ); - *revisions = xstrfmt("%s...%s", base_rev, *head_hash); - - shorthead = find_unique_abbrev(&orig_head, DEFAULT_ABBREV); - - if (upstream) { - const char *shortrev; - struct object_id rev_oid; - - get_oid(base_rev, &rev_oid); - shortrev = find_unique_abbrev(&rev_oid, DEFAULT_ABBREV); - - *shortrevisions = xstrfmt("%s..%s", shortrev, shorthead); - } else - *shortrevisions = xstrdup(shorthead); - - return 0; -} - -static int init_basic_state(struct replay_opts *opts, const char *head_name, - const char *onto, const char *orig_head) -{ - FILE *interactive; - - if (!is_directory(path_state_dir()) && mkdir_in_gitdir(path_state_dir())) - return error_errno(_("could not create temporary %s"), path_state_dir()); - - delete_reflog("REBASE_HEAD"); - - interactive = fopen(path_interactive(), "w"); - if (!interactive) - return error_errno(_("could not mark as interactive")); - fclose(interactive); - - return write_basic_state(opts, head_name, onto, orig_head); -} - -static int do_interactive_rebase(struct replay_opts *opts, unsigned flags, - const char *switch_to, const char *upstream, - const char *onto, const char *onto_name, - const char *squash_onto, const char *head_name, - const char *restrict_revision, char *raw_strategies, - struct string_list *commands, unsigned autosquash) -{ - int ret; - const char *head_hash = NULL; - char *revisions = NULL, *shortrevisions = NULL; - struct argv_array make_script_args = ARGV_ARRAY_INIT; - struct todo_list todo_list = TODO_LIST_INIT; - - if (prepare_branch_to_be_rebased(the_repository, opts, switch_to)) - return -1; - - if (get_revision_ranges(upstream, onto, &head_hash, - &revisions, &shortrevisions)) - return -1; - - if (raw_strategies) - parse_strategy_opts(opts, raw_strategies); - - if (init_basic_state(opts, head_name, onto, head_hash)) { - free(revisions); - free(shortrevisions); - - return -1; - } - - if (!upstream && squash_onto) - write_file(path_squash_onto(), "%s\n", squash_onto); - - argv_array_pushl(&make_script_args, "", revisions, NULL); - if (restrict_revision) - argv_array_push(&make_script_args, restrict_revision); - - ret = sequencer_make_script(the_repository, &todo_list.buf, - make_script_args.argc, make_script_args.argv, - flags); - - if (ret) - error(_("could not generate todo list")); - else { - discard_cache(); - if (todo_list_parse_insn_buffer(the_repository, todo_list.buf.buf, - &todo_list)) - BUG("unusable todo list"); - - ret = complete_action(the_repository, opts, flags, shortrevisions, onto_name, - onto, head_hash, commands, autosquash, &todo_list); - } - - free(revisions); - free(shortrevisions); - todo_list_release(&todo_list); - argv_array_clear(&make_script_args); - - return ret; -} - -static const char * const builtin_rebase_interactive_usage[] = { - N_("git rebase--interactive []"), - NULL -}; - -int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) -{ - struct replay_opts opts = REPLAY_OPTS_INIT; - unsigned flags = 0, keep_empty = 0, rebase_merges = 0, autosquash = 0; - int abbreviate_commands = 0, rebase_cousins = -1, ret = 0; - const char *onto = NULL, *onto_name = NULL, *restrict_revision = NULL, - *squash_onto = NULL, *upstream = NULL, *head_name = NULL, - *switch_to = NULL, *cmd = NULL; - struct string_list commands = STRING_LIST_INIT_DUP; - char *raw_strategies = NULL; - enum { - NONE = 0, CONTINUE, SKIP, EDIT_TODO, SHOW_CURRENT_PATCH, - SHORTEN_OIDS, EXPAND_OIDS, CHECK_TODO_LIST, REARRANGE_SQUASH, ADD_EXEC - } command = 0; - struct option options[] = { - OPT_BOOL(0, "ff", &opts.allow_ff, N_("allow fast-forward")), - OPT_BOOL(0, "keep-empty", &keep_empty, N_("keep empty commits")), - OPT_BOOL(0, "allow-empty-message", &opts.allow_empty_message, - N_("allow commits with empty messages")), - OPT_BOOL(0, "rebase-merges", &rebase_merges, N_("rebase merge commits")), - OPT_BOOL(0, "rebase-cousins", &rebase_cousins, - N_("keep original branch points of cousins")), - OPT_BOOL(0, "autosquash", &autosquash, - N_("move commits that begin with squash!/fixup!")), - OPT_BOOL(0, "signoff", &opts.signoff, N_("sign commits")), - OPT__VERBOSE(&opts.verbose, N_("be verbose")), - OPT_CMDMODE(0, "continue", &command, N_("continue rebase"), - CONTINUE), - OPT_CMDMODE(0, "skip", &command, N_("skip commit"), SKIP), - OPT_CMDMODE(0, "edit-todo", &command, N_("edit the todo list"), - EDIT_TODO), - OPT_CMDMODE(0, "show-current-patch", &command, N_("show the current patch"), - SHOW_CURRENT_PATCH), - OPT_CMDMODE(0, "shorten-ids", &command, - N_("shorten commit ids in the todo list"), SHORTEN_OIDS), - OPT_CMDMODE(0, "expand-ids", &command, - N_("expand commit ids in the todo list"), EXPAND_OIDS), - OPT_CMDMODE(0, "check-todo-list", &command, - N_("check the todo list"), CHECK_TODO_LIST), - OPT_CMDMODE(0, "rearrange-squash", &command, - N_("rearrange fixup/squash lines"), REARRANGE_SQUASH), - OPT_CMDMODE(0, "add-exec-commands", &command, - N_("insert exec commands in todo list"), ADD_EXEC), - OPT_STRING(0, "onto", &onto, N_("onto"), N_("onto")), - OPT_STRING(0, "restrict-revision", &restrict_revision, - N_("restrict-revision"), N_("restrict revision")), - OPT_STRING(0, "squash-onto", &squash_onto, N_("squash-onto"), - N_("squash onto")), - OPT_STRING(0, "upstream", &upstream, N_("upstream"), - N_("the upstream commit")), - OPT_STRING(0, "head-name", &head_name, N_("head-name"), N_("head name")), - { OPTION_STRING, 'S', "gpg-sign", &opts.gpg_sign, N_("key-id"), - N_("GPG-sign commits"), - PARSE_OPT_OPTARG, NULL, (intptr_t) "" }, - OPT_STRING(0, "strategy", &opts.strategy, N_("strategy"), - N_("rebase strategy")), - OPT_STRING(0, "strategy-opts", &raw_strategies, N_("strategy-opts"), - N_("strategy options")), - OPT_STRING(0, "switch-to", &switch_to, N_("switch-to"), - N_("the branch or commit to checkout")), - OPT_STRING(0, "onto-name", &onto_name, N_("onto-name"), N_("onto name")), - OPT_STRING(0, "cmd", &cmd, N_("cmd"), N_("the command to run")), - OPT_RERERE_AUTOUPDATE(&opts.allow_rerere_auto), - OPT_BOOL(0, "reschedule-failed-exec", &opts.reschedule_failed_exec, - N_("automatically re-schedule any `exec` that fails")), - OPT_END() - }; - - sequencer_init_config(&opts); - git_config_get_bool("rebase.abbreviatecommands", &abbreviate_commands); - - opts.action = REPLAY_INTERACTIVE_REBASE; - opts.allow_ff = 1; - opts.allow_empty = 1; - - if (argc == 1) - usage_with_options(builtin_rebase_interactive_usage, options); - - argc = parse_options(argc, argv, NULL, options, - builtin_rebase_interactive_usage, PARSE_OPT_KEEP_ARGV0); - - opts.gpg_sign = xstrdup_or_null(opts.gpg_sign); - - flags |= keep_empty ? TODO_LIST_KEEP_EMPTY : 0; - flags |= abbreviate_commands ? TODO_LIST_ABBREVIATE_CMDS : 0; - flags |= rebase_merges ? TODO_LIST_REBASE_MERGES : 0; - flags |= rebase_cousins > 0 ? TODO_LIST_REBASE_COUSINS : 0; - flags |= command == SHORTEN_OIDS ? TODO_LIST_SHORTEN_IDS : 0; - - if (rebase_cousins >= 0 && !rebase_merges) - warning(_("--[no-]rebase-cousins has no effect without " - "--rebase-merges")); - - if (cmd && *cmd) { - string_list_split(&commands, cmd, '\n', -1); - - /* rebase.c adds a new line to cmd after every command, - * so here the last command is always empty */ - string_list_remove_empty_items(&commands, 0); - } - - switch (command) { - case NONE: - if (!onto && !upstream) - die(_("a base commit must be provided with --upstream or --onto")); - - ret = do_interactive_rebase(&opts, flags, switch_to, upstream, onto, - onto_name, squash_onto, head_name, restrict_revision, - raw_strategies, &commands, autosquash); - break; - case SKIP: { - struct string_list merge_rr = STRING_LIST_INIT_DUP; - - rerere_clear(the_repository, &merge_rr); - /* fallthrough */ - case CONTINUE: - ret = sequencer_continue(the_repository, &opts); - break; - } - case EDIT_TODO: - ret = edit_todo_file(flags); - break; - case SHOW_CURRENT_PATCH: { - struct child_process cmd = CHILD_PROCESS_INIT; - - cmd.git_cmd = 1; - argv_array_pushl(&cmd.args, "show", "REBASE_HEAD", "--", NULL); - ret = run_command(&cmd); - - break; - } - case SHORTEN_OIDS: - case EXPAND_OIDS: - ret = transform_todo_file(flags); - break; - case CHECK_TODO_LIST: - ret = check_todo_list_from_file(the_repository); - break; - case REARRANGE_SQUASH: - ret = rearrange_squash_in_todo_file(); - break; - case ADD_EXEC: - ret = add_exec_commands(&commands); - break; - default: - BUG("invalid command '%d'", command); - } - - string_list_clear(&commands, 0); - return !!ret; -} diff --git a/builtin/rebase.c b/builtin/rebase.c index ccf178326c..80252d72df 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -25,6 +25,8 @@ #include "commit-reach.h" #include "rerere.h" #include "branch.h" +#include "sequencer.h" +#include "rebase-interactive.h" static char const * const builtin_rebase_usage[] = { N_("git rebase [-i] [options] [--exec ] [--onto ] " @@ -35,6 +37,9 @@ static char const * const builtin_rebase_usage[] = { NULL }; +static GIT_PATH_FUNC(path_state_dir, "rebase-merge/") +static GIT_PATH_FUNC(path_squash_onto, "rebase-merge/squash-onto") +static GIT_PATH_FUNC(path_interactive, "rebase-merge/interactive") static GIT_PATH_FUNC(apply_dir, "rebase-apply") static GIT_PATH_FUNC(merge_dir, "rebase-merge") @@ -46,6 +51,368 @@ enum rebase_type { REBASE_PRESERVE_MERGES }; +static int add_exec_commands(struct string_list *commands) +{ + const char *todo_file = rebase_path_todo(); + struct todo_list todo_list = TODO_LIST_INIT; + int res; + + if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0) + return error_errno(_("could not read '%s'."), todo_file); + + if (todo_list_parse_insn_buffer(the_repository, todo_list.buf.buf, + &todo_list)) { + todo_list_release(&todo_list); + return error(_("unusable todo list: '%s'"), todo_file); + } + + todo_list_add_exec_commands(&todo_list, commands); + res = todo_list_write_to_file(the_repository, &todo_list, + todo_file, NULL, NULL, -1, 0); + todo_list_release(&todo_list); + + if (res) + return error_errno(_("could not write '%s'."), todo_file); + return 0; +} + +static int rearrange_squash_in_todo_file(void) +{ + const char *todo_file = rebase_path_todo(); + struct todo_list todo_list = TODO_LIST_INIT; + int res = 0; + + if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0) + return error_errno(_("could not read '%s'."), todo_file); + if (todo_list_parse_insn_buffer(the_repository, todo_list.buf.buf, + &todo_list)) { + todo_list_release(&todo_list); + return error(_("unusable todo list: '%s'"), todo_file); + } + + res = todo_list_rearrange_squash(&todo_list); + if (!res) + res = todo_list_write_to_file(the_repository, &todo_list, + todo_file, NULL, NULL, -1, 0); + + todo_list_release(&todo_list); + + if (res) + return error_errno(_("could not write '%s'."), todo_file); + return 0; +} + +static int transform_todo_file(unsigned flags) +{ + const char *todo_file = rebase_path_todo(); + struct todo_list todo_list = TODO_LIST_INIT; + int res; + + if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0) + return error_errno(_("could not read '%s'."), todo_file); + + if (todo_list_parse_insn_buffer(the_repository, todo_list.buf.buf, + &todo_list)) { + todo_list_release(&todo_list); + return error(_("unusable todo list: '%s'"), todo_file); + } + + res = todo_list_write_to_file(the_repository, &todo_list, todo_file, + NULL, NULL, -1, flags); + todo_list_release(&todo_list); + + if (res) + return error_errno(_("could not write '%s'."), todo_file); + return 0; +} + +static int edit_todo_file(unsigned flags) +{ + const char *todo_file = rebase_path_todo(); + struct todo_list todo_list = TODO_LIST_INIT, + new_todo = TODO_LIST_INIT; + int res = 0; + + if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0) + return error_errno(_("could not read '%s'."), todo_file); + + strbuf_stripspace(&todo_list.buf, 1); + res = edit_todo_list(the_repository, &todo_list, &new_todo, NULL, NULL, flags); + if (!res && todo_list_write_to_file(the_repository, &new_todo, todo_file, + NULL, NULL, -1, flags & ~(TODO_LIST_SHORTEN_IDS))) + res = error_errno(_("could not write '%s'"), todo_file); + + todo_list_release(&todo_list); + todo_list_release(&new_todo); + + return res; +} + +static int get_revision_ranges(const char *upstream, const char *onto, + const char **head_hash, + char **revisions, char **shortrevisions) +{ + const char *base_rev = upstream ? upstream : onto, *shorthead; + struct object_id orig_head; + + if (get_oid("HEAD", &orig_head)) + return error(_("no HEAD?")); + + *head_hash = find_unique_abbrev(&orig_head, GIT_MAX_HEXSZ); + *revisions = xstrfmt("%s...%s", base_rev, *head_hash); + + shorthead = find_unique_abbrev(&orig_head, DEFAULT_ABBREV); + + if (upstream) { + const char *shortrev; + struct object_id rev_oid; + + get_oid(base_rev, &rev_oid); + shortrev = find_unique_abbrev(&rev_oid, DEFAULT_ABBREV); + + *shortrevisions = xstrfmt("%s..%s", shortrev, shorthead); + } else + *shortrevisions = xstrdup(shorthead); + + return 0; +} + +static int init_basic_state(struct replay_opts *opts, const char *head_name, + const char *onto, const char *orig_head) +{ + FILE *interactive; + + if (!is_directory(path_state_dir()) && mkdir_in_gitdir(path_state_dir())) + return error_errno(_("could not create temporary %s"), path_state_dir()); + + delete_reflog("REBASE_HEAD"); + + interactive = fopen(path_interactive(), "w"); + if (!interactive) + return error_errno(_("could not mark as interactive")); + fclose(interactive); + + return write_basic_state(opts, head_name, onto, orig_head); +} + +static int do_interactive_rebase(struct replay_opts *opts, unsigned flags, + const char *switch_to, const char *upstream, + const char *onto, const char *onto_name, + const char *squash_onto, const char *head_name, + const char *restrict_revision, char *raw_strategies, + struct string_list *commands, unsigned autosquash) +{ + int ret; + const char *head_hash = NULL; + char *revisions = NULL, *shortrevisions = NULL; + struct argv_array make_script_args = ARGV_ARRAY_INIT; + struct todo_list todo_list = TODO_LIST_INIT; + + if (prepare_branch_to_be_rebased(the_repository, opts, switch_to)) + return -1; + + if (get_revision_ranges(upstream, onto, &head_hash, + &revisions, &shortrevisions)) + return -1; + + if (raw_strategies) + parse_strategy_opts(opts, raw_strategies); + + if (init_basic_state(opts, head_name, onto, head_hash)) { + free(revisions); + free(shortrevisions); + + return -1; + } + + if (!upstream && squash_onto) + write_file(path_squash_onto(), "%s\n", squash_onto); + + argv_array_pushl(&make_script_args, "", revisions, NULL); + if (restrict_revision) + argv_array_push(&make_script_args, restrict_revision); + + ret = sequencer_make_script(the_repository, &todo_list.buf, + make_script_args.argc, make_script_args.argv, + flags); + + if (ret) + error(_("could not generate todo list")); + else { + discard_cache(); + if (todo_list_parse_insn_buffer(the_repository, todo_list.buf.buf, + &todo_list)) + BUG("unusable todo list"); + + ret = complete_action(the_repository, opts, flags, shortrevisions, onto_name, + onto, head_hash, commands, autosquash, &todo_list); + } + + free(revisions); + free(shortrevisions); + todo_list_release(&todo_list); + argv_array_clear(&make_script_args); + + return ret; +} + +static const char * const builtin_rebase_interactive_usage[] = { + N_("git rebase--interactive []"), + NULL +}; + +int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) +{ + struct replay_opts opts = REPLAY_OPTS_INIT; + unsigned flags = 0, keep_empty = 0, rebase_merges = 0, autosquash = 0; + int abbreviate_commands = 0, rebase_cousins = -1, ret = 0; + const char *onto = NULL, *onto_name = NULL, *restrict_revision = NULL, + *squash_onto = NULL, *upstream = NULL, *head_name = NULL, + *switch_to = NULL, *cmd = NULL; + struct string_list commands = STRING_LIST_INIT_DUP; + char *raw_strategies = NULL; + enum { + NONE = 0, CONTINUE, SKIP, EDIT_TODO, SHOW_CURRENT_PATCH, + SHORTEN_OIDS, EXPAND_OIDS, CHECK_TODO_LIST, REARRANGE_SQUASH, ADD_EXEC + } command = 0; + struct option options[] = { + OPT_BOOL(0, "ff", &opts.allow_ff, N_("allow fast-forward")), + OPT_BOOL(0, "keep-empty", &keep_empty, N_("keep empty commits")), + OPT_BOOL(0, "allow-empty-message", &opts.allow_empty_message, + N_("allow commits with empty messages")), + OPT_BOOL(0, "rebase-merges", &rebase_merges, N_("rebase merge commits")), + OPT_BOOL(0, "rebase-cousins", &rebase_cousins, + N_("keep original branch points of cousins")), + OPT_BOOL(0, "autosquash", &autosquash, + N_("move commits that begin with squash!/fixup!")), + OPT_BOOL(0, "signoff", &opts.signoff, N_("sign commits")), + OPT__VERBOSE(&opts.verbose, N_("be verbose")), + OPT_CMDMODE(0, "continue", &command, N_("continue rebase"), + CONTINUE), + OPT_CMDMODE(0, "skip", &command, N_("skip commit"), SKIP), + OPT_CMDMODE(0, "edit-todo", &command, N_("edit the todo list"), + EDIT_TODO), + OPT_CMDMODE(0, "show-current-patch", &command, N_("show the current patch"), + SHOW_CURRENT_PATCH), + OPT_CMDMODE(0, "shorten-ids", &command, + N_("shorten commit ids in the todo list"), SHORTEN_OIDS), + OPT_CMDMODE(0, "expand-ids", &command, + N_("expand commit ids in the todo list"), EXPAND_OIDS), + OPT_CMDMODE(0, "check-todo-list", &command, + N_("check the todo list"), CHECK_TODO_LIST), + OPT_CMDMODE(0, "rearrange-squash", &command, + N_("rearrange fixup/squash lines"), REARRANGE_SQUASH), + OPT_CMDMODE(0, "add-exec-commands", &command, + N_("insert exec commands in todo list"), ADD_EXEC), + OPT_STRING(0, "onto", &onto, N_("onto"), N_("onto")), + OPT_STRING(0, "restrict-revision", &restrict_revision, + N_("restrict-revision"), N_("restrict revision")), + OPT_STRING(0, "squash-onto", &squash_onto, N_("squash-onto"), + N_("squash onto")), + OPT_STRING(0, "upstream", &upstream, N_("upstream"), + N_("the upstream commit")), + OPT_STRING(0, "head-name", &head_name, N_("head-name"), N_("head name")), + { OPTION_STRING, 'S', "gpg-sign", &opts.gpg_sign, N_("key-id"), + N_("GPG-sign commits"), + PARSE_OPT_OPTARG, NULL, (intptr_t) "" }, + OPT_STRING(0, "strategy", &opts.strategy, N_("strategy"), + N_("rebase strategy")), + OPT_STRING(0, "strategy-opts", &raw_strategies, N_("strategy-opts"), + N_("strategy options")), + OPT_STRING(0, "switch-to", &switch_to, N_("switch-to"), + N_("the branch or commit to checkout")), + OPT_STRING(0, "onto-name", &onto_name, N_("onto-name"), N_("onto name")), + OPT_STRING(0, "cmd", &cmd, N_("cmd"), N_("the command to run")), + OPT_RERERE_AUTOUPDATE(&opts.allow_rerere_auto), + OPT_BOOL(0, "reschedule-failed-exec", &opts.reschedule_failed_exec, + N_("automatically re-schedule any `exec` that fails")), + OPT_END() + }; + + sequencer_init_config(&opts); + git_config_get_bool("rebase.abbreviatecommands", &abbreviate_commands); + + opts.action = REPLAY_INTERACTIVE_REBASE; + opts.allow_ff = 1; + opts.allow_empty = 1; + + if (argc == 1) + usage_with_options(builtin_rebase_interactive_usage, options); + + argc = parse_options(argc, argv, NULL, options, + builtin_rebase_interactive_usage, PARSE_OPT_KEEP_ARGV0); + + opts.gpg_sign = xstrdup_or_null(opts.gpg_sign); + + flags |= keep_empty ? TODO_LIST_KEEP_EMPTY : 0; + flags |= abbreviate_commands ? TODO_LIST_ABBREVIATE_CMDS : 0; + flags |= rebase_merges ? TODO_LIST_REBASE_MERGES : 0; + flags |= rebase_cousins > 0 ? TODO_LIST_REBASE_COUSINS : 0; + flags |= command == SHORTEN_OIDS ? TODO_LIST_SHORTEN_IDS : 0; + + if (rebase_cousins >= 0 && !rebase_merges) + warning(_("--[no-]rebase-cousins has no effect without " + "--rebase-merges")); + + if (cmd && *cmd) { + string_list_split(&commands, cmd, '\n', -1); + + /* rebase.c adds a new line to cmd after every command, + * so here the last command is always empty */ + string_list_remove_empty_items(&commands, 0); + } + + switch (command) { + case NONE: + if (!onto && !upstream) + die(_("a base commit must be provided with --upstream or --onto")); + + ret = do_interactive_rebase(&opts, flags, switch_to, upstream, onto, + onto_name, squash_onto, head_name, restrict_revision, + raw_strategies, &commands, autosquash); + break; + case SKIP: { + struct string_list merge_rr = STRING_LIST_INIT_DUP; + + rerere_clear(the_repository, &merge_rr); + /* fallthrough */ + case CONTINUE: + ret = sequencer_continue(the_repository, &opts); + break; + } + case EDIT_TODO: + ret = edit_todo_file(flags); + break; + case SHOW_CURRENT_PATCH: { + struct child_process cmd = CHILD_PROCESS_INIT; + + cmd.git_cmd = 1; + argv_array_pushl(&cmd.args, "show", "REBASE_HEAD", "--", NULL); + ret = run_command(&cmd); + + break; + } + case SHORTEN_OIDS: + case EXPAND_OIDS: + ret = transform_todo_file(flags); + break; + case CHECK_TODO_LIST: + ret = check_todo_list_from_file(the_repository); + break; + case REARRANGE_SQUASH: + ret = rearrange_squash_in_todo_file(); + break; + case ADD_EXEC: + ret = add_exec_commands(&commands); + break; + default: + BUG("invalid command '%d'", command); + } + + string_list_clear(&commands, 0); + return !!ret; +} + static int use_builtin_rebase(void) { struct child_process cp = CHILD_PROCESS_INIT; From patchwork Tue Mar 19 19:03:11 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10860277 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 435861515 for ; Tue, 19 Mar 2019 19:04:10 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1F0052959C for ; Tue, 19 Mar 2019 19:04:10 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 135EF295F1; Tue, 19 Mar 2019 19:04:10 +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 AB6D4296C2 for ; Tue, 19 Mar 2019 19:04:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727451AbfCSTEE (ORCPT ); Tue, 19 Mar 2019 15:04:04 -0400 Received: from mail-wr1-f66.google.com ([209.85.221.66]:38608 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727319AbfCSTED (ORCPT ); Tue, 19 Mar 2019 15:04:03 -0400 Received: by mail-wr1-f66.google.com with SMTP id g12so67677wrm.5 for ; Tue, 19 Mar 2019 12:04:01 -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:reply-to :mime-version:content-transfer-encoding; bh=2TgUbW+qlY3Ve+/t/hfaznxNICgzHWByEi6CzkHCxCA=; b=dpMVtfqeuTMehaqUN+vczCIdOQpC7OwDHLfA2L6ElVg0VVbDncDEqOmgDQEtUImXM2 xtLxeP4h7p0J//5o4P5Vakm0a7cBZyl41p8xpNS0eERfjS65plR7ERr6/c1QYjq0dZN3 Ike35V0s4oYuDg23E6lNBApiKRz9Shr58kouiqc8yAmyPmX8utr2/E1nr+kOpJZ8qntw ePZ2cy6KL0AdYLOUC0Gjkhv9dUDoIdjOm+Omz5Kp/xJud6JUBXDRNNt9m7OFY7vSI8oL S+7Pu0WJ/o/IdwNrulFo/0T0cFxTWrK3r983IBs7+lEQ7SqVsECuqRv0rP2NJT2qAhSs IRBw== 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:reply-to:mime-version:content-transfer-encoding; bh=2TgUbW+qlY3Ve+/t/hfaznxNICgzHWByEi6CzkHCxCA=; b=aGu7Umu4/8/c604oDT+NgMMd9T+0pAOvjVyS4LfIQAqs68TrAse6iPo/RipgxeqWDB d6kn111teXAdz+4Noda78Am+WzAW512VRhbz3BLJeL8CZ++nLe9X72swj0k+MbwXIGgK 9Vn0bdCJmydwkIjQpgY2YjOgxsIatTtk6rQjZOTB0gD4TiP6kIqUuUFumRIgiYzNMCyw NZw6ZQjqmCL37OruLQHGm1CvtkDbrataxg9QGFBhKFHvx1w8Ka0w2WGPtbc4vOCd0wmd F7c9YfV9iHL4bE5IjZLqxubjGhJHyGEUB15DTmqUp84itIuZbDDdl98c9dZ40NgLghrq 88wg== X-Gm-Message-State: APjAAAX3CGTBBMgZgIKNGfkqBtRl+ZLZtHumUUx05CmYHEa61n6/zv8I 0ObTUcC+GgPj2ol0aMUzhCJGcfhCDcM= X-Google-Smtp-Source: APXvYqy8AswF7qcQCvFy0CtGOQOIsjuMn4hlzHjb4Yk4aSKzQ2UyMm/Llc6WiT3dS7bg+NWuYwkAGA== X-Received: by 2002:adf:a147:: with SMTP id r7mr17716511wrr.5.1553022240950; Tue, 19 Mar 2019 12:04:00 -0700 (PDT) Received: from lindisfarne.localdomain (host-89-242-184-133.as13285.net. [89.242.184.133]) by smtp.gmail.com with ESMTPSA id s187sm6253853wms.7.2019.03.19.12.04.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Mar 2019 12:04:00 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Phillip Wood Subject: [RFC PATCH 05/11] rebase -i: remove duplication Date: Tue, 19 Mar 2019 19:03:11 +0000 Message-Id: <20190319190317.6632-6-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190319190317.6632-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> Reply-To: Phillip Wood 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 From: Phillip Wood path_state_dir() and merge_dir() refer to the same path so remove one of them. Signed-off-by: Phillip Wood --- builtin/rebase.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index 80252d72df..e55bd0348a 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -37,7 +37,6 @@ static char const * const builtin_rebase_usage[] = { NULL }; -static GIT_PATH_FUNC(path_state_dir, "rebase-merge/") static GIT_PATH_FUNC(path_squash_onto, "rebase-merge/squash-onto") static GIT_PATH_FUNC(path_interactive, "rebase-merge/interactive") static GIT_PATH_FUNC(apply_dir, "rebase-apply") @@ -182,8 +181,8 @@ static int init_basic_state(struct replay_opts *opts, const char *head_name, { FILE *interactive; - if (!is_directory(path_state_dir()) && mkdir_in_gitdir(path_state_dir())) - return error_errno(_("could not create temporary %s"), path_state_dir()); + if (!is_directory(merge_dir()) && mkdir_in_gitdir(merge_dir())) + return error_errno(_("could not create temporary %s"), merge_dir()); delete_reflog("REBASE_HEAD"); From patchwork Tue Mar 19 19:03:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10860279 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 3B19B1515 for ; Tue, 19 Mar 2019 19:04:11 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 10637295F1 for ; Tue, 19 Mar 2019 19:04:11 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 02FEA296C2; Tue, 19 Mar 2019 19:04:10 +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 8453C29856 for ; Tue, 19 Mar 2019 19:04:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727492AbfCSTEF (ORCPT ); Tue, 19 Mar 2019 15:04:05 -0400 Received: from mail-wm1-f67.google.com ([209.85.128.67]:34785 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727054AbfCSTEE (ORCPT ); Tue, 19 Mar 2019 15:04:04 -0400 Received: by mail-wm1-f67.google.com with SMTP id o10so17385122wmc.1 for ; Tue, 19 Mar 2019 12:04:03 -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:reply-to :mime-version:content-transfer-encoding; bh=XpoqFgKKnMe+l2bSolUYuxAi0+tQ0b4loA5Ly4MNhWk=; b=qp67vm7v1OGCgzBecck7Z49Lo72/WOBSWI+RiUtM+F1OYzkPsn1zVCBIC6g0Y6PjAm iiI3tz7llxAloXZsPSNQp1DotcPRMfoUQ1PpH5wyXfN1AeRTh92kJg6BUGAcEG5rF9ZL hRFRwhNZF0uUO8ddaJT4OrShv/QkjvcMqqknVEsizGl616VZMrOjvhZ+vPBr/7v6sGV4 e8phADQe8GBDmUyFebJhmR6P15ay8irWcAm/mI9F1uJ1HBVSG9ziEH6NJvAlOXenGP8X 0SC6jiup2BGRHVymHo7GQSAqrVQH7+EVqtdssx4yklZYHU2u0G2RNspSc/5811JggDBa VUhg== 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:reply-to:mime-version:content-transfer-encoding; bh=XpoqFgKKnMe+l2bSolUYuxAi0+tQ0b4loA5Ly4MNhWk=; b=sQKxrSbVdRLHFrR4H8DNQSWs0RkTcptm8o2SbJa6St7BeGSTy3qumfIupIfY7XVZgx Xc7xEOzfz0Veoh/S/YurRTfQcGHfJUJMqSh2L6OpXd4PlXYgmg5bwUcOqTUkUCQGAbqF 05fGkV0QHnerb2gN6u4gkBlask0FVTAvuV+yQy2drf9heY8Ma0ZHslC+czSxYD4PGWo2 s8Y5a/lv+o8nXMkhcJSasiZIlg8eyN4/vlWNBvuG516AsFwH9jmHABgrwEJJFx08gcV2 8hYdo8jmaYF/x7/U3SKN169vXet8Lddf3y+w7sFZURX5+4kyDsZQCLPsrn7HhDi0Facz yvnA== X-Gm-Message-State: APjAAAXr56TmCmzd+O2UPsUwbXL+dNVdVuG3HZLSICN8smA1VElBhLp5 BLGHlyGXPSZkbvzbf0z3nndbHECFYjI= X-Google-Smtp-Source: APXvYqyhLsgMy2ECjAA9wAEnZLGMTMcbbPC8OF/BuUHyCAdzF6w/GdQgtriCIkJZYNeznvHBoHI5Lw== X-Received: by 2002:a1c:f70c:: with SMTP id v12mr4805223wmh.19.1553022242108; Tue, 19 Mar 2019 12:04:02 -0700 (PDT) Received: from lindisfarne.localdomain (host-89-242-184-133.as13285.net. [89.242.184.133]) by smtp.gmail.com with ESMTPSA id s187sm6253853wms.7.2019.03.19.12.04.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Mar 2019 12:04:01 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Phillip Wood Subject: [RFC PATCH 06/11] rebase -i: use struct commit when parsing options Date: Tue, 19 Mar 2019 19:03:12 +0000 Message-Id: <20190319190317.6632-7-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190319190317.6632-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> Reply-To: Phillip Wood 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 From: Phillip Wood This is in preparation for using `struct rebase_options` when parsing options in cmd_rebase__interactive(). Using a string for onto, restrict_revision and upstream, was a hangover from the scripted version of rebase. The functions that use these variables are updated to take a `struct commit`. Signed-off-by: Phillip Wood --- Notes: I'm not sure if parse_opt_commit() should be in parse-options-cb.c or not, it depends if it is going to be useful elsewhere. builtin/rebase.c | 42 ++++++++++++++++++++++++------------------ parse-options-cb.c | 17 +++++++++++++++++ parse-options.h | 1 + sequencer.c | 21 +++++++++++---------- sequencer.h | 4 ++-- 5 files changed, 55 insertions(+), 30 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index e55bd0348a..0584b331bf 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -147,27 +147,28 @@ static int edit_todo_file(unsigned flags) return res; } -static int get_revision_ranges(const char *upstream, const char *onto, +static int get_revision_ranges(struct commit *upstream, struct commit *onto, const char **head_hash, char **revisions, char **shortrevisions) { - const char *base_rev = upstream ? upstream : onto, *shorthead; + struct commit *base_rev = upstream ? upstream : onto; + const char *shorthead; struct object_id orig_head; if (get_oid("HEAD", &orig_head)) return error(_("no HEAD?")); *head_hash = find_unique_abbrev(&orig_head, GIT_MAX_HEXSZ); - *revisions = xstrfmt("%s...%s", base_rev, *head_hash); + *revisions = xstrfmt("%s...%s", oid_to_hex(&base_rev->object.oid), + *head_hash); shorthead = find_unique_abbrev(&orig_head, DEFAULT_ABBREV); if (upstream) { const char *shortrev; - struct object_id rev_oid; - get_oid(base_rev, &rev_oid); - shortrev = find_unique_abbrev(&rev_oid, DEFAULT_ABBREV); + shortrev = find_unique_abbrev(&base_rev->object.oid, + DEFAULT_ABBREV); *shortrevisions = xstrfmt("%s..%s", shortrev, shorthead); } else @@ -177,7 +178,7 @@ static int get_revision_ranges(const char *upstream, const char *onto, } static int init_basic_state(struct replay_opts *opts, const char *head_name, - const char *onto, const char *orig_head) + struct commit *onto, const char *orig_head) { FILE *interactive; @@ -195,10 +196,10 @@ static int init_basic_state(struct replay_opts *opts, const char *head_name, } static int do_interactive_rebase(struct replay_opts *opts, unsigned flags, - const char *switch_to, const char *upstream, - const char *onto, const char *onto_name, + const char *switch_to, struct commit *upstream, + struct commit *onto, const char *onto_name, const char *squash_onto, const char *head_name, - const char *restrict_revision, char *raw_strategies, + struct commit *restrict_revision, char *raw_strategies, struct string_list *commands, unsigned autosquash) { int ret; @@ -229,7 +230,8 @@ static int do_interactive_rebase(struct replay_opts *opts, unsigned flags, argv_array_pushl(&make_script_args, "", revisions, NULL); if (restrict_revision) - argv_array_push(&make_script_args, restrict_revision); + argv_array_push(&make_script_args, + oid_to_hex(&restrict_revision->object.oid)); ret = sequencer_make_script(the_repository, &todo_list.buf, make_script_args.argc, make_script_args.argv, @@ -265,9 +267,10 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) struct replay_opts opts = REPLAY_OPTS_INIT; unsigned flags = 0, keep_empty = 0, rebase_merges = 0, autosquash = 0; int abbreviate_commands = 0, rebase_cousins = -1, ret = 0; - const char *onto = NULL, *onto_name = NULL, *restrict_revision = NULL, - *squash_onto = NULL, *upstream = NULL, *head_name = NULL, + const char *onto_name = NULL, + *squash_onto = NULL, *head_name = NULL, *switch_to = NULL, *cmd = NULL; + struct commit *onto = NULL, *upstream = NULL, *restrict_revision = NULL; struct string_list commands = STRING_LIST_INIT_DUP; char *raw_strategies = NULL; enum { @@ -303,13 +306,16 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) N_("rearrange fixup/squash lines"), REARRANGE_SQUASH), OPT_CMDMODE(0, "add-exec-commands", &command, N_("insert exec commands in todo list"), ADD_EXEC), - OPT_STRING(0, "onto", &onto, N_("onto"), N_("onto")), - OPT_STRING(0, "restrict-revision", &restrict_revision, - N_("restrict-revision"), N_("restrict revision")), + { OPTION_CALLBACK, 0, "onto", &onto, N_("onto"), N_("onto"), + PARSE_OPT_NONEG, parse_opt_commit, 0 }, + { OPTION_CALLBACK, 0, "restrict-revision", &restrict_revision, + N_("restrict-revision"), N_("restrict revision"), + PARSE_OPT_NONEG, parse_opt_commit, 0 }, OPT_STRING(0, "squash-onto", &squash_onto, N_("squash-onto"), N_("squash onto")), - OPT_STRING(0, "upstream", &upstream, N_("upstream"), - N_("the upstream commit")), + { OPTION_CALLBACK, 0, "upstream", &upstream, N_("upstream"), + N_("the upstream commit"), PARSE_OPT_NONEG, parse_opt_commit, + 0 }, OPT_STRING(0, "head-name", &head_name, N_("head-name"), N_("head name")), { OPTION_STRING, 'S', "gpg-sign", &opts.gpg_sign, N_("key-id"), N_("GPG-sign commits"), diff --git a/parse-options-cb.c b/parse-options-cb.c index 2733393546..2206eb763c 100644 --- a/parse-options-cb.c +++ b/parse-options-cb.c @@ -96,6 +96,23 @@ int parse_opt_commits(const struct option *opt, const char *arg, int unset) return 0; } +int parse_opt_commit(const struct option *opt, const char *arg, int unset) +{ + struct object_id oid; + struct commit *commit; + struct commit **target = opt->value; + + if (!arg) + return -1; + if (get_oid(arg, &oid)) + return error("malformed object name %s", arg); + commit = lookup_commit_reference(the_repository, &oid); + if (!commit) + return error("no such commit %s", arg); + *target = commit; + return 0; +} + int parse_opt_object_name(const struct option *opt, const char *arg, int unset) { struct object_id oid; diff --git a/parse-options.h b/parse-options.h index 7d83e2971d..5a75646618 100644 --- a/parse-options.h +++ b/parse-options.h @@ -266,6 +266,7 @@ int parse_opt_color_flag_cb(const struct option *, const char *, int); int parse_opt_verbosity_cb(const struct option *, const char *, int); int parse_opt_object_name(const struct option *, const char *, int); int parse_opt_commits(const struct option *, const char *, int); +int parse_opt_commit(const struct option *, const char *, int); int parse_opt_tertiary(const struct option *, const char *, int); int parse_opt_string_list(const struct option *, const char *, int); int parse_opt_noop_cb(const struct option *, const char *, int); diff --git a/sequencer.c b/sequencer.c index ccc0160800..610b7ece14 100644 --- a/sequencer.c +++ b/sequencer.c @@ -2418,14 +2418,15 @@ static void write_strategy_opts(struct replay_opts *opts) } int write_basic_state(struct replay_opts *opts, const char *head_name, - const char *onto, const char *orig_head) + struct commit *onto, const char *orig_head) { const char *quiet = getenv("GIT_QUIET"); if (head_name) write_file(rebase_path_head_name(), "%s\n", head_name); if (onto) - write_file(rebase_path_onto(), "%s\n", onto); + write_file(rebase_path_onto(), "%s\n", + oid_to_hex(&onto->object.oid)); if (orig_head) write_file(rebase_path_orig_head(), "%s\n", orig_head); @@ -3456,7 +3457,7 @@ int prepare_branch_to_be_rebased(struct repository *r, struct replay_opts *opts, } static int checkout_onto(struct repository *r, struct replay_opts *opts, - const char *onto_name, const char *onto, + const char *onto_name, const struct object_id *onto, const char *orig_head) { struct object_id oid; @@ -3465,7 +3466,7 @@ static int checkout_onto(struct repository *r, struct replay_opts *opts, if (get_oid(orig_head, &oid)) return error(_("%s: not a valid OID"), orig_head); - if (run_git_checkout(r, opts, onto, action)) { + if (run_git_checkout(r, opts, oid_to_hex(onto), action)) { apply_autostash(opts); sequencer_remove_state(opts); return error(_("could not detach HEAD")); @@ -4741,16 +4742,16 @@ static int skip_unnecessary_picks(struct repository *r, int complete_action(struct repository *r, struct replay_opts *opts, unsigned flags, const char *shortrevisions, const char *onto_name, - const char *onto, const char *orig_head, struct string_list *commands, - unsigned autosquash, struct todo_list *todo_list) + struct commit *onto, const char *orig_head, + struct string_list *commands, unsigned autosquash, + struct todo_list *todo_list) { const char *shortonto, *todo_file = rebase_path_todo(); struct todo_list new_todo = TODO_LIST_INIT; struct strbuf *buf = &todo_list->buf; - struct object_id oid; + struct object_id oid = onto->object.oid; int res; - get_oid(onto, &oid); shortonto = find_unique_abbrev(&oid, DEFAULT_ABBREV); if (buf->len == 0) { @@ -4793,7 +4794,7 @@ int complete_action(struct repository *r, struct replay_opts *opts, unsigned fla if (todo_list_parse_insn_buffer(r, new_todo.buf.buf, &new_todo) || todo_list_check(todo_list, &new_todo)) { fprintf(stderr, _(edit_todo_list_advice)); - checkout_onto(r, opts, onto_name, onto, orig_head); + checkout_onto(r, opts, onto_name, &onto->object.oid, orig_head); todo_list_release(&new_todo); return -1; @@ -4812,7 +4813,7 @@ int complete_action(struct repository *r, struct replay_opts *opts, unsigned fla todo_list_release(&new_todo); - if (checkout_onto(r, opts, onto_name, oid_to_hex(&oid), orig_head)) + if (checkout_onto(r, opts, onto_name, &oid, orig_head)) return -1; if (require_clean_work_tree(r, "rebase", "", 1, 1)) diff --git a/sequencer.h b/sequencer.h index 6c55aa4200..e640ca21f2 100644 --- a/sequencer.h +++ b/sequencer.h @@ -150,7 +150,7 @@ void todo_list_add_exec_commands(struct todo_list *todo_list, int check_todo_list_from_file(struct repository *r); int complete_action(struct repository *r, struct replay_opts *opts, unsigned flags, const char *shortrevisions, const char *onto_name, - const char *onto, const char *orig_head, struct string_list *commands, + struct commit *onto, const char *orig_head, struct string_list *commands, unsigned autosquash, struct todo_list *todo_list); int todo_list_rearrange_squash(struct todo_list *todo_list); @@ -191,4 +191,4 @@ int read_author_script(const char *path, char **name, char **email, char **date, void parse_strategy_opts(struct replay_opts *opts, char *raw_opts); int write_basic_state(struct replay_opts *opts, const char *head_name, - const char *onto, const char *orig_head); + struct commit *onto, const char *orig_head); From patchwork Tue Mar 19 19:03:13 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10860283 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 2B39C1515 for ; Tue, 19 Mar 2019 19:04:14 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0B32029463 for ; Tue, 19 Mar 2019 19:04:14 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id F39A9295F1; Tue, 19 Mar 2019 19:04:13 +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 213A42966F for ; Tue, 19 Mar 2019 19:04:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727534AbfCSTEH (ORCPT ); Tue, 19 Mar 2019 15:04:07 -0400 Received: from mail-wm1-f66.google.com ([209.85.128.66]:33344 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727406AbfCSTEF (ORCPT ); Tue, 19 Mar 2019 15:04:05 -0400 Received: by mail-wm1-f66.google.com with SMTP id z6so5202637wmi.0 for ; Tue, 19 Mar 2019 12:04:03 -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:reply-to :mime-version:content-transfer-encoding; bh=A81anqiIfEXoWwIG3c3DvWeFfjccWOE71q+HbqCzQys=; b=qympBAqwWwgd5z0reFRZCXeEFy6ggvFJITfaZ+qX/K3Y6XDawA48obyxIjAVyrFcB8 Eq+z2ycXHhTA2HkLQw9dUgw4IdiaWJe9cWNXRQdQOoNhVpufq05Q0SzHUYWtoc6Fz23O z/oz3eLy1mS4CDRb82CmEeuBBFmvoA89kaLTOl7rpbvWY5KjdaU/S2YemPu00MthyUbl Jv1Y5vaJazCNqDJAyuTugFWaWDesL3E42Wy1WUGlH6vh2FZj27IFGnp6IVglu2oCYwwy JrUl96T3WmayxAUYx9MjHDueNyYEXJJcYYc6bn8nZ8oUGkfFElI2HSAzknBiXdgAOyBu yZww== 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:reply-to:mime-version:content-transfer-encoding; bh=A81anqiIfEXoWwIG3c3DvWeFfjccWOE71q+HbqCzQys=; b=HbW+VgtmjD79jqPk+H6NmEXz1tkphb+UAMk0UP5UgNYeUxH6+/mpotzjuAqqkvpmN0 etbmxvJFfXsM+EB0jm+sCtsyCf4krld6jfC8EFHaSEyZaRB8N0f9N0zSWN4Ck1K0dGBt 0yrTAffAtITr0vyNlXTM5VaTeTzfg0nJ64qcDtYcXkH/du38WEHuZ+wbqCRqIXpKSBSi frU+N6NuI9m2wW6V+raPHGVHw7Ib43TW2Y5RXplcf92pcqZ9ZYpeIDo7NDInF/vBqGUk fDdWsfZuIDxmTSP+l++J39nGfTXClWhw8//npgXNoa30zqH2TyCtUhasNgruRquxHIfj tucw== X-Gm-Message-State: APjAAAV9Ga7n99vjqsA/lWd/wakzfO6iG68u7wbyW6pECl74zg4FyznL pEFpnvU+w1EZuasIzI6eMavsJHaeqWk= X-Google-Smtp-Source: APXvYqz/ERtrG9dMlCHFQL5N9enOCn87WlrDDoZsPXPG/DRLCd9cf1yr+NSXGf0EXqgIMftQDS3MpQ== X-Received: by 2002:a1c:f510:: with SMTP id t16mr4803215wmh.105.1553022242999; Tue, 19 Mar 2019 12:04:02 -0700 (PDT) Received: from lindisfarne.localdomain (host-89-242-184-133.as13285.net. [89.242.184.133]) by smtp.gmail.com with ESMTPSA id s187sm6253853wms.7.2019.03.19.12.04.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Mar 2019 12:04:02 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Phillip Wood Subject: [RFC PATCH 07/11] rebase -i: use struct object_id for squash_onto Date: Tue, 19 Mar 2019 19:03:13 +0000 Message-Id: <20190319190317.6632-8-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190319190317.6632-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> Reply-To: Phillip Wood 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 From: Phillip Wood More preparation for using `struct rebase_options` in cmd_rebase__interactive(). Using a string was a hangover from the scripted version of rebase, update the functions that use `squash_onto` to take a `sturct object_id`. Signed-off-by: Phillip Wood --- builtin/rebase.c | 21 +++++++++++++-------- parse-options-cb.c | 17 +++++++++++++++++ parse-options.h | 3 +++ 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index 0584b331bf..c93f2aa629 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -198,7 +198,7 @@ static int init_basic_state(struct replay_opts *opts, const char *head_name, static int do_interactive_rebase(struct replay_opts *opts, unsigned flags, const char *switch_to, struct commit *upstream, struct commit *onto, const char *onto_name, - const char *squash_onto, const char *head_name, + struct object_id *squash_onto, const char *head_name, struct commit *restrict_revision, char *raw_strategies, struct string_list *commands, unsigned autosquash) { @@ -226,7 +226,8 @@ static int do_interactive_rebase(struct replay_opts *opts, unsigned flags, } if (!upstream && squash_onto) - write_file(path_squash_onto(), "%s\n", squash_onto); + write_file(path_squash_onto(), "%s\n", + oid_to_hex(squash_onto)); argv_array_pushl(&make_script_args, "", revisions, NULL); if (restrict_revision) @@ -267,10 +268,11 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) struct replay_opts opts = REPLAY_OPTS_INIT; unsigned flags = 0, keep_empty = 0, rebase_merges = 0, autosquash = 0; int abbreviate_commands = 0, rebase_cousins = -1, ret = 0; - const char *onto_name = NULL, - *squash_onto = NULL, *head_name = NULL, - *switch_to = NULL, *cmd = NULL; + const char *onto_name = NULL, *head_name = NULL, *switch_to = NULL, + *cmd = NULL; struct commit *onto = NULL, *upstream = NULL, *restrict_revision = NULL; + struct object_id squash_onto = null_oid; + struct object_id *squash_onto_opt = NULL; struct string_list commands = STRING_LIST_INIT_DUP; char *raw_strategies = NULL; enum { @@ -311,8 +313,8 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) { OPTION_CALLBACK, 0, "restrict-revision", &restrict_revision, N_("restrict-revision"), N_("restrict revision"), PARSE_OPT_NONEG, parse_opt_commit, 0 }, - OPT_STRING(0, "squash-onto", &squash_onto, N_("squash-onto"), - N_("squash onto")), + { OPTION_CALLBACK, 0, "squash-onto", &squash_onto, N_("squash-onto"), + N_("squash onto"), PARSE_OPT_NONEG, parse_opt_object_id, 0 }, { OPTION_CALLBACK, 0, "upstream", &upstream, N_("upstream"), N_("the upstream commit"), PARSE_OPT_NONEG, parse_opt_commit, 0 }, @@ -349,6 +351,9 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) opts.gpg_sign = xstrdup_or_null(opts.gpg_sign); + if (!is_null_oid(&squash_onto)) + squash_onto_opt = &squash_onto; + flags |= keep_empty ? TODO_LIST_KEEP_EMPTY : 0; flags |= abbreviate_commands ? TODO_LIST_ABBREVIATE_CMDS : 0; flags |= rebase_merges ? TODO_LIST_REBASE_MERGES : 0; @@ -373,7 +378,7 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) die(_("a base commit must be provided with --upstream or --onto")); ret = do_interactive_rebase(&opts, flags, switch_to, upstream, onto, - onto_name, squash_onto, head_name, restrict_revision, + onto_name, squash_onto_opt, head_name, restrict_revision, raw_strategies, &commands, autosquash); break; case SKIP: { diff --git a/parse-options-cb.c b/parse-options-cb.c index 2206eb763c..28ad5cd94b 100644 --- a/parse-options-cb.c +++ b/parse-options-cb.c @@ -129,6 +129,23 @@ int parse_opt_object_name(const struct option *opt, const char *arg, int unset) return 0; } +int parse_opt_object_id(const struct option *opt, const char *arg, int unset) +{ + struct object_id oid; + struct object_id *target = opt->value; + + if (unset) { + *target = null_oid; + return 0; + } + if (!arg) + return -1; + if (get_oid(arg, &oid)) + return error(_("malformed object name '%s'"), arg); + *target = oid; + return 0; +} + int parse_opt_tertiary(const struct option *opt, const char *arg, int unset) { int *target = opt->value; diff --git a/parse-options.h b/parse-options.h index 5a75646618..0ab1103bc7 100644 --- a/parse-options.h +++ b/parse-options.h @@ -264,7 +264,10 @@ int parse_opt_abbrev_cb(const struct option *, const char *, int); int parse_opt_expiry_date_cb(const struct option *, const char *, int); int parse_opt_color_flag_cb(const struct option *, const char *, int); int parse_opt_verbosity_cb(const struct option *, const char *, int); +/* value is struct oid_array* */ int parse_opt_object_name(const struct option *, const char *, int); +/* value is struct object_id* */ +int parse_opt_object_id(const struct option *, const char *, int); int parse_opt_commits(const struct option *, const char *, int); int parse_opt_commit(const struct option *, const char *, int); int parse_opt_tertiary(const struct option *, const char *, int); From patchwork Tue Mar 19 19:03:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10860285 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 A9ADE1515 for ; Tue, 19 Mar 2019 19:04:15 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8A64A2870E for ; Tue, 19 Mar 2019 19:04:15 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7E9EF2966F; Tue, 19 Mar 2019 19:04:15 +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 029DF29674 for ; Tue, 19 Mar 2019 19:04:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727553AbfCSTEK (ORCPT ); Tue, 19 Mar 2019 15:04:10 -0400 Received: from mail-wm1-f66.google.com ([209.85.128.66]:50385 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727508AbfCSTEH (ORCPT ); Tue, 19 Mar 2019 15:04:07 -0400 Received: by mail-wm1-f66.google.com with SMTP id z11so9580030wmi.0 for ; Tue, 19 Mar 2019 12:04:05 -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:reply-to :mime-version:content-transfer-encoding; bh=W6xycFlSlcOqSn91aIjFVvRI7W0T9IFSEbN6hXT8Q9s=; b=I7TLIFuew6T5d0kjo3TWUEYZ7jqVZWG72WfV+azH4RUc7sbVCmDZJWuIebNWajiJ+F iSSYIl1xS2ucD2qgjNiDezBzZihPCa4bA22y53ibQ2vjgqKhkTUKeTyHtnFKFUoLtYG8 kBES6KC1wN3YB0JIcM1Ea4Wz08YhjL0eN9hsCq1pFGGfe8rja4d1PcPNh6SHN1fZlF+h 5iUiDVG7kXWI4xtmj/d05IX4u4XpKC0dQ49G/rCsdwzYwK+XVioTfZmEj0AIB379n4d8 wznx1Dc0dqGLtX8BACv+5X3QTfkfe2UHgUhLXhgyW8AzUM8oUIOCGh8PjSy3URe/MVz8 k3dw== 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:reply-to:mime-version:content-transfer-encoding; bh=W6xycFlSlcOqSn91aIjFVvRI7W0T9IFSEbN6hXT8Q9s=; b=hcqMToHGUm8WDs+GVplMOU08dYKLDUNeX20wNMThj9+tlnDjLGMyCL9LnCHRtL7pf9 HKvt2z5obUQMK8Yp6LaRtFhp9jI/8m12ONt3wjbyWFvxo0WZf4dSAVyoL5akbJU2CXOq x1z4TEwKDRqQi1RwgFKjZgfL6DKljy7BcyQAgy7IeQ/BN6I4eQ4EVBADefw/rjGEs5rB hD/GixsNatAkQ6N5k36GTX6C1fRRn63Lud/knYjl/hW9L5zAhCmK4zEtZNCU9e6Hwwpn Ramsp/DCYQyF132SLBxNzZ1de3sFCXbx1IZZ6ZwePjMUR6PoFQX5+iN4aEZ4tZRAktd1 tBzA== X-Gm-Message-State: APjAAAWETRGkEF+8LtIuUUynWHDcE2qJ9i1W9BvNTRofHUOOGrIkfBTE dvgWJ5HvWTGyamrfKoQDQz/+4od8xgg= X-Google-Smtp-Source: APXvYqyaLqXcHmfdOyaojE512J1AeDcLzG0kJaxO9jOP6Uzb7U2lqP6CaRnRh1xufJWY/a8DD2TByA== X-Received: by 2002:a1c:14e:: with SMTP id 75mr4777840wmb.48.1553022244358; Tue, 19 Mar 2019 12:04:04 -0700 (PDT) Received: from lindisfarne.localdomain (host-89-242-184-133.as13285.net. [89.242.184.133]) by smtp.gmail.com with ESMTPSA id s187sm6253853wms.7.2019.03.19.12.04.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Mar 2019 12:04:03 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Phillip Wood Subject: [RFC PATCH 08/11] rebase -i: use struct rebase_options to parse args Date: Tue, 19 Mar 2019 19:03:14 +0000 Message-Id: <20190319190317.6632-9-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190319190317.6632-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> Reply-To: Phillip Wood 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 From: Phillip Wood In order to run `rebase -i` without forking `rebase--interactive` it will be convenient to use the same structure when parsing the options in cmd_rebase() and cmd_rebase__interactive(). Signed-off-by: Phillip Wood --- builtin/rebase.c | 203 ++++++++++++++++++++++++++--------------------- 1 file changed, 112 insertions(+), 91 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index c93f2aa629..33a2495032 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -50,6 +50,73 @@ enum rebase_type { REBASE_PRESERVE_MERGES }; +struct rebase_options { + enum rebase_type type; + const char *state_dir; + struct commit *upstream; + const char *upstream_name; + const char *upstream_arg; + char *head_name; + struct object_id orig_head; + struct commit *onto; + const char *onto_name; + const char *revisions; + const char *switch_to; + int root; + struct object_id *squash_onto; + struct commit *restrict_revision; + int dont_finish_rebase; + enum { + REBASE_NO_QUIET = 1<<0, + REBASE_VERBOSE = 1<<1, + REBASE_DIFFSTAT = 1<<2, + REBASE_FORCE = 1<<3, + REBASE_INTERACTIVE_EXPLICIT = 1<<4, + } flags; + struct argv_array git_am_opts; + const char *action; + int signoff; + int allow_rerere_autoupdate; + int keep_empty; + int autosquash; + char *gpg_sign_opt; + int autostash; + char *cmd; + int allow_empty_message; + int rebase_merges, rebase_cousins; + char *strategy, *strategy_opts; + struct strbuf git_format_patch_opt; + int reschedule_failed_exec; +}; + +#define REBASE_OPTIONS_INIT { \ + .type = REBASE_UNSPECIFIED, \ + .flags = REBASE_NO_QUIET, \ + .git_am_opts = ARGV_ARRAY_INIT, \ + .git_format_patch_opt = STRBUF_INIT \ + } + +static struct replay_opts get_replay_opts(const struct rebase_options *opts) +{ + struct replay_opts replay = REPLAY_OPTS_INIT; + + sequencer_init_config(&replay); + + replay.action = REPLAY_INTERACTIVE_REBASE; + replay.signoff = opts->signoff; + replay.allow_ff = !(opts->flags & REBASE_FORCE); + if (opts->allow_rerere_autoupdate) + replay.allow_rerere_auto = opts->allow_rerere_autoupdate; + replay.allow_empty = 1; + replay.allow_empty_message = opts->allow_empty_message; + replay.verbose = opts->flags & REBASE_VERBOSE; + replay.reschedule_failed_exec = opts->reschedule_failed_exec; + replay.gpg_sign = xstrdup_or_null(opts->gpg_sign_opt); + replay.strategy = opts->strategy; + + return replay; +} + static int add_exec_commands(struct string_list *commands) { const char *todo_file = rebase_path_todo(); @@ -265,32 +332,30 @@ static const char * const builtin_rebase_interactive_usage[] = { int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) { - struct replay_opts opts = REPLAY_OPTS_INIT; - unsigned flags = 0, keep_empty = 0, rebase_merges = 0, autosquash = 0; - int abbreviate_commands = 0, rebase_cousins = -1, ret = 0; - const char *onto_name = NULL, *head_name = NULL, *switch_to = NULL, - *cmd = NULL; - struct commit *onto = NULL, *upstream = NULL, *restrict_revision = NULL; + struct rebase_options opts = REBASE_OPTIONS_INIT; + unsigned flags = 0; + int abbreviate_commands = 0, ret = 0; struct object_id squash_onto = null_oid; - struct object_id *squash_onto_opt = NULL; struct string_list commands = STRING_LIST_INIT_DUP; - char *raw_strategies = NULL; enum { NONE = 0, CONTINUE, SKIP, EDIT_TODO, SHOW_CURRENT_PATCH, SHORTEN_OIDS, EXPAND_OIDS, CHECK_TODO_LIST, REARRANGE_SQUASH, ADD_EXEC } command = 0; struct option options[] = { - OPT_BOOL(0, "ff", &opts.allow_ff, N_("allow fast-forward")), - OPT_BOOL(0, "keep-empty", &keep_empty, N_("keep empty commits")), + OPT_NEGBIT(0, "ff", &opts.flags, N_("allow fast-forward"), + REBASE_FORCE), + OPT_BOOL(0, "keep-empty", &opts.keep_empty, N_("keep empty commits")), OPT_BOOL(0, "allow-empty-message", &opts.allow_empty_message, N_("allow commits with empty messages")), - OPT_BOOL(0, "rebase-merges", &rebase_merges, N_("rebase merge commits")), - OPT_BOOL(0, "rebase-cousins", &rebase_cousins, + OPT_BOOL(0, "rebase-merges", &opts.rebase_merges, N_("rebase merge commits")), + OPT_BOOL(0, "rebase-cousins", &opts.rebase_cousins, N_("keep original branch points of cousins")), - OPT_BOOL(0, "autosquash", &autosquash, + OPT_BOOL(0, "autosquash", &opts.autosquash, N_("move commits that begin with squash!/fixup!")), OPT_BOOL(0, "signoff", &opts.signoff, N_("sign commits")), - OPT__VERBOSE(&opts.verbose, N_("be verbose")), + OPT_BIT('v', "verbose", &opts.flags, + N_("display a diffstat of what changed upstream"), + REBASE_NO_QUIET | REBASE_VERBOSE | REBASE_DIFFSTAT), OPT_CMDMODE(0, "continue", &command, N_("continue rebase"), CONTINUE), OPT_CMDMODE(0, "skip", &command, N_("skip commit"), SKIP), @@ -308,86 +373,86 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) N_("rearrange fixup/squash lines"), REARRANGE_SQUASH), OPT_CMDMODE(0, "add-exec-commands", &command, N_("insert exec commands in todo list"), ADD_EXEC), - { OPTION_CALLBACK, 0, "onto", &onto, N_("onto"), N_("onto"), + { OPTION_CALLBACK, 0, "onto", &opts.onto, N_("onto"), N_("onto"), PARSE_OPT_NONEG, parse_opt_commit, 0 }, - { OPTION_CALLBACK, 0, "restrict-revision", &restrict_revision, + { OPTION_CALLBACK, 0, "restrict-revision", &opts.restrict_revision, N_("restrict-revision"), N_("restrict revision"), PARSE_OPT_NONEG, parse_opt_commit, 0 }, { OPTION_CALLBACK, 0, "squash-onto", &squash_onto, N_("squash-onto"), N_("squash onto"), PARSE_OPT_NONEG, parse_opt_object_id, 0 }, - { OPTION_CALLBACK, 0, "upstream", &upstream, N_("upstream"), + { OPTION_CALLBACK, 0, "upstream", &opts.upstream, N_("upstream"), N_("the upstream commit"), PARSE_OPT_NONEG, parse_opt_commit, 0 }, - OPT_STRING(0, "head-name", &head_name, N_("head-name"), N_("head name")), - { OPTION_STRING, 'S', "gpg-sign", &opts.gpg_sign, N_("key-id"), + OPT_STRING(0, "head-name", &opts.head_name, N_("head-name"), N_("head name")), + { OPTION_STRING, 'S', "gpg-sign", &opts.gpg_sign_opt, N_("key-id"), N_("GPG-sign commits"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" }, OPT_STRING(0, "strategy", &opts.strategy, N_("strategy"), N_("rebase strategy")), - OPT_STRING(0, "strategy-opts", &raw_strategies, N_("strategy-opts"), + OPT_STRING(0, "strategy-opts", &opts.strategy_opts, N_("strategy-opts"), N_("strategy options")), - OPT_STRING(0, "switch-to", &switch_to, N_("switch-to"), + OPT_STRING(0, "switch-to", &opts.switch_to, N_("switch-to"), N_("the branch or commit to checkout")), - OPT_STRING(0, "onto-name", &onto_name, N_("onto-name"), N_("onto name")), - OPT_STRING(0, "cmd", &cmd, N_("cmd"), N_("the command to run")), - OPT_RERERE_AUTOUPDATE(&opts.allow_rerere_auto), + OPT_STRING(0, "onto-name", &opts.onto_name, N_("onto-name"), N_("onto name")), + OPT_STRING(0, "cmd", &opts.cmd, N_("cmd"), N_("the command to run")), + OPT_RERERE_AUTOUPDATE(&opts.allow_rerere_autoupdate), OPT_BOOL(0, "reschedule-failed-exec", &opts.reschedule_failed_exec, N_("automatically re-schedule any `exec` that fails")), OPT_END() }; - sequencer_init_config(&opts); + opts.rebase_cousins = -1; + git_config_get_bool("rebase.abbreviatecommands", &abbreviate_commands); - opts.action = REPLAY_INTERACTIVE_REBASE; - opts.allow_ff = 1; - opts.allow_empty = 1; - if (argc == 1) usage_with_options(builtin_rebase_interactive_usage, options); argc = parse_options(argc, argv, NULL, options, builtin_rebase_interactive_usage, PARSE_OPT_KEEP_ARGV0); - opts.gpg_sign = xstrdup_or_null(opts.gpg_sign); - if (!is_null_oid(&squash_onto)) - squash_onto_opt = &squash_onto; + opts.squash_onto = &squash_onto; - flags |= keep_empty ? TODO_LIST_KEEP_EMPTY : 0; + flags |= opts.keep_empty ? TODO_LIST_KEEP_EMPTY : 0; flags |= abbreviate_commands ? TODO_LIST_ABBREVIATE_CMDS : 0; - flags |= rebase_merges ? TODO_LIST_REBASE_MERGES : 0; - flags |= rebase_cousins > 0 ? TODO_LIST_REBASE_COUSINS : 0; + flags |= opts.rebase_merges ? TODO_LIST_REBASE_MERGES : 0; + flags |= opts.rebase_cousins > 0 ? TODO_LIST_REBASE_COUSINS : 0; flags |= command == SHORTEN_OIDS ? TODO_LIST_SHORTEN_IDS : 0; - if (rebase_cousins >= 0 && !rebase_merges) + if (opts.rebase_cousins >= 0 && !opts.rebase_merges) warning(_("--[no-]rebase-cousins has no effect without " "--rebase-merges")); - if (cmd && *cmd) { - string_list_split(&commands, cmd, '\n', -1); + if (opts.cmd && *opts.cmd) { + string_list_split(&commands, opts.cmd, '\n', -1); /* rebase.c adds a new line to cmd after every command, * so here the last command is always empty */ string_list_remove_empty_items(&commands, 0); } switch (command) { - case NONE: - if (!onto && !upstream) + case NONE: { + struct replay_opts replay_opts = get_replay_opts(&opts); + if (!opts.onto && !opts.upstream) die(_("a base commit must be provided with --upstream or --onto")); - ret = do_interactive_rebase(&opts, flags, switch_to, upstream, onto, - onto_name, squash_onto_opt, head_name, restrict_revision, - raw_strategies, &commands, autosquash); + ret = do_interactive_rebase(&replay_opts, flags, opts.switch_to, opts.upstream, opts.onto, + opts.onto_name, opts.squash_onto, opts.head_name, opts.restrict_revision, + opts.strategy_opts, &commands, opts.autosquash); break; + } case SKIP: { struct string_list merge_rr = STRING_LIST_INIT_DUP; rerere_clear(the_repository, &merge_rr); + } /* fallthrough */ - case CONTINUE: - ret = sequencer_continue(the_repository, &opts); + case CONTINUE: { + struct replay_opts replay_opts = get_replay_opts(&opts); + + ret = sequencer_continue(the_repository, &replay_opts); break; } case EDIT_TODO: @@ -446,45 +511,6 @@ static int use_builtin_rebase(void) return ret; } -struct rebase_options { - enum rebase_type type; - const char *state_dir; - struct commit *upstream; - const char *upstream_name; - const char *upstream_arg; - char *head_name; - struct object_id orig_head; - struct commit *onto; - const char *onto_name; - const char *revisions; - const char *switch_to; - int root; - struct object_id *squash_onto; - struct commit *restrict_revision; - int dont_finish_rebase; - enum { - REBASE_NO_QUIET = 1<<0, - REBASE_VERBOSE = 1<<1, - REBASE_DIFFSTAT = 1<<2, - REBASE_FORCE = 1<<3, - REBASE_INTERACTIVE_EXPLICIT = 1<<4, - } flags; - struct argv_array git_am_opts; - const char *action; - int signoff; - int allow_rerere_autoupdate; - int keep_empty; - int autosquash; - char *gpg_sign_opt; - int autostash; - char *cmd; - int allow_empty_message; - int rebase_merges, rebase_cousins; - char *strategy, *strategy_opts; - struct strbuf git_format_patch_opt; - int reschedule_failed_exec; -}; - static int is_interactive(struct rebase_options *opts) { return opts->type == REBASE_INTERACTIVE || @@ -1380,13 +1406,7 @@ static int check_exec_cmd(const char *cmd) int cmd_rebase(int argc, const char **argv, const char *prefix) { - struct rebase_options options = { - .type = REBASE_UNSPECIFIED, - .flags = REBASE_NO_QUIET, - .git_am_opts = ARGV_ARRAY_INIT, - .allow_empty_message = 1, - .git_format_patch_opt = STRBUF_INIT, - }; + struct rebase_options options = REBASE_OPTIONS_INIT; const char *branch_name; int ret, flags, total_argc, in_progress = 0; int ok_to_skip_pre_rebase = 0; @@ -1540,6 +1560,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) trace_repo_setup(prefix); setup_work_tree(); + options.allow_empty_message = 1; git_config(rebase_config, &options); strbuf_reset(&buf); From patchwork Tue Mar 19 19:03:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10860289 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 167DF1515 for ; Tue, 19 Mar 2019 19:04:18 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EFBFB2870E for ; Tue, 19 Mar 2019 19:04:17 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E42CB29674; Tue, 19 Mar 2019 19:04:17 +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 7D0582945E for ; Tue, 19 Mar 2019 19:04:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727546AbfCSTEJ (ORCPT ); Tue, 19 Mar 2019 15:04:09 -0400 Received: from mail-wr1-f65.google.com ([209.85.221.65]:41063 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727054AbfCSTEI (ORCPT ); Tue, 19 Mar 2019 15:04:08 -0400 Received: by mail-wr1-f65.google.com with SMTP id p1so51051wrs.8 for ; Tue, 19 Mar 2019 12:04:06 -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:reply-to :mime-version:content-transfer-encoding; bh=jIl4H+lKKrQtHhb2PKniBl2p8pklzxxLHEYedkNC4PY=; b=jIubcVt6uStG2G6rNILWZNRvkhDUUM/Yv+qf92Df2PYGmZ9w6WpgwuNqqpv057iDxX SrXU2MjbBMZFXEhcxinNXYiOFbCRsTC5nTlwk851FFai8KFFcEwEmAN1e4gP1+MUJyoj N/ZxKyPaJmGwLNpny4J/oYWLQa+O6GiY6xV8a5I9jUjKxxyl4sdpSRj2ECjLVvfbM0iq qDu3Lo1SKGyjzdRj5Z40LGiSPDwI548lCuxHd2Zn5siNZb1/3F9STY7GqDwAGRzzJMHa UBa92sfRFdMLnDJPiNXIo5blEDGmRJgv/ynqjpTU+QdZD2WB4T/qMDJAFpWu4ih6ZPUt ZexA== 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:reply-to:mime-version:content-transfer-encoding; bh=jIl4H+lKKrQtHhb2PKniBl2p8pklzxxLHEYedkNC4PY=; b=I5gteFiLW1aqWeliGPb4wM2elvV2TywkLBmqN6SLemOfAEBXJ3U0L2nIvC03aEzMeE 3r3Q115sW+v2Rn9sVDjLBDEanNvC0VcRKDGvLYTjK/l6va3lMhQZvP6Aa/arHr+h2asV 6smG+QR5EgVQeB35Lr1Tci2rvvE1513cilfIoTTX7nUD6lxYmKrahY/ypkc50CltUf1a Br4zM3OKsRBUFM6MmRXtwt59wwXCTwaF3ISQvtk5k30PpvRu08yR9JbDwRChupst9wwi t5z9WCK2YvW+Xwr3ZJj8mEj2A+UIRZdOeHolYXJcoEsXWtyPlNuBX/nFfB+OUQMG0jxz QZVw== X-Gm-Message-State: APjAAAW7n5n5QorhsgeqUFoFifuqFqu+WwfG7hSek3WlRClD4WBIMC5y UYBGgkGFW1KF8QSdZMqc+NzSzSBF5HE= X-Google-Smtp-Source: APXvYqwuSpqezKzUbZLDDTN2HHAFIISDt28xtOeXItbKCtXVOfy0Yzw7l2v1di4YkfZze319G1FW6Q== X-Received: by 2002:a5d:468d:: with SMTP id u13mr18173268wrq.132.1553022245647; Tue, 19 Mar 2019 12:04:05 -0700 (PDT) Received: from lindisfarne.localdomain (host-89-242-184-133.as13285.net. [89.242.184.133]) by smtp.gmail.com with ESMTPSA id s187sm6253853wms.7.2019.03.19.12.04.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Mar 2019 12:04:05 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Phillip Wood Subject: [RFC PATCH 09/11] rebase -i: use struct rebase_options in do_interactive_rebase() Date: Tue, 19 Mar 2019 19:03:15 +0000 Message-Id: <20190319190317.6632-10-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190319190317.6632-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> Reply-To: Phillip Wood 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 From: Phillip Wood All the parameters that are passed to do_interactive_rebase() apart from `flags` are already in `struct rebase_options` so there is no need to pass them separately. Signed-off-by: Phillip Wood --- builtin/rebase.c | 69 +++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index 33a2495032..21ccb6495e 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -113,6 +113,8 @@ static struct replay_opts get_replay_opts(const struct rebase_options *opts) replay.reschedule_failed_exec = opts->reschedule_failed_exec; replay.gpg_sign = xstrdup_or_null(opts->gpg_sign_opt); replay.strategy = opts->strategy; + if (opts->strategy_opts) + parse_strategy_opts(&replay, opts->strategy_opts); return replay; } @@ -262,44 +264,50 @@ static int init_basic_state(struct replay_opts *opts, const char *head_name, return write_basic_state(opts, head_name, onto, orig_head); } -static int do_interactive_rebase(struct replay_opts *opts, unsigned flags, - const char *switch_to, struct commit *upstream, - struct commit *onto, const char *onto_name, - struct object_id *squash_onto, const char *head_name, - struct commit *restrict_revision, char *raw_strategies, - struct string_list *commands, unsigned autosquash) +static void split_exec_commands(const char *cmd, struct string_list *commands) +{ + if (cmd && *cmd) { + string_list_split(commands, cmd, '\n', -1); + + /* rebase.c adds a new line to cmd after every command, + * so here the last command is always empty */ + string_list_remove_empty_items(commands, 0); + } +} + +static int do_interactive_rebase(struct rebase_options *opts, unsigned flags) { int ret; const char *head_hash = NULL; char *revisions = NULL, *shortrevisions = NULL; struct argv_array make_script_args = ARGV_ARRAY_INIT; struct todo_list todo_list = TODO_LIST_INIT; + struct replay_opts replay = get_replay_opts(opts); + struct string_list commands = STRING_LIST_INIT_DUP; - if (prepare_branch_to_be_rebased(the_repository, opts, switch_to)) + if (prepare_branch_to_be_rebased(the_repository, &replay, + opts->switch_to)) return -1; - if (get_revision_ranges(upstream, onto, &head_hash, + if (get_revision_ranges(opts->upstream, opts->onto, &head_hash, &revisions, &shortrevisions)) return -1; - if (raw_strategies) - parse_strategy_opts(opts, raw_strategies); - - if (init_basic_state(opts, head_name, onto, head_hash)) { + if (init_basic_state(&replay, opts->head_name, opts->onto, head_hash)) { free(revisions); free(shortrevisions); return -1; } - if (!upstream && squash_onto) + if (!opts->upstream && opts->squash_onto) write_file(path_squash_onto(), "%s\n", - oid_to_hex(squash_onto)); + oid_to_hex(opts->squash_onto)); argv_array_pushl(&make_script_args, "", revisions, NULL); - if (restrict_revision) + if (opts->restrict_revision) argv_array_push(&make_script_args, - oid_to_hex(&restrict_revision->object.oid)); + oid_to_hex(&opts->restrict_revision->object.oid)); ret = sequencer_make_script(the_repository, &todo_list.buf, make_script_args.argc, make_script_args.argv, @@ -313,10 +321,13 @@ static int do_interactive_rebase(struct replay_opts *opts, unsigned flags, &todo_list)) BUG("unusable todo list"); - ret = complete_action(the_repository, opts, flags, shortrevisions, onto_name, - onto, head_hash, commands, autosquash, &todo_list); + split_exec_commands(opts->cmd, &commands); + ret = complete_action(the_repository, &replay, flags, + shortrevisions, opts->onto_name, opts->onto, head_hash, + &commands, opts->autosquash, &todo_list); } + string_list_clear(&commands, 0); free(revisions); free(shortrevisions); todo_list_release(&todo_list); @@ -336,7 +347,6 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) unsigned flags = 0; int abbreviate_commands = 0, ret = 0; struct object_id squash_onto = null_oid; - struct string_list commands = STRING_LIST_INIT_DUP; enum { NONE = 0, CONTINUE, SKIP, EDIT_TODO, SHOW_CURRENT_PATCH, SHORTEN_OIDS, EXPAND_OIDS, CHECK_TODO_LIST, REARRANGE_SQUASH, ADD_EXEC @@ -424,23 +434,12 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) warning(_("--[no-]rebase-cousins has no effect without " "--rebase-merges")); - if (opts.cmd && *opts.cmd) { - string_list_split(&commands, opts.cmd, '\n', -1); - - /* rebase.c adds a new line to cmd after every command, - * so here the last command is always empty */ - string_list_remove_empty_items(&commands, 0); - } - switch (command) { case NONE: { - struct replay_opts replay_opts = get_replay_opts(&opts); if (!opts.onto && !opts.upstream) die(_("a base commit must be provided with --upstream or --onto")); - ret = do_interactive_rebase(&replay_opts, flags, opts.switch_to, opts.upstream, opts.onto, - opts.onto_name, opts.squash_onto, opts.head_name, opts.restrict_revision, - opts.strategy_opts, &commands, opts.autosquash); + ret = do_interactive_rebase(&opts, flags); break; } case SKIP: { @@ -477,14 +476,18 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) case REARRANGE_SQUASH: ret = rearrange_squash_in_todo_file(); break; - case ADD_EXEC: + case ADD_EXEC: { + struct string_list commands = STRING_LIST_INIT_DUP; + + split_exec_commands(opts.cmd, &commands); ret = add_exec_commands(&commands); + string_list_clear(&commands, 0); break; + } default: BUG("invalid command '%d'", command); } - string_list_clear(&commands, 0); return !!ret; } From patchwork Tue Mar 19 19:03:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10860287 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 65DB16C2 for ; Tue, 19 Mar 2019 19:04:16 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4AA392966F for ; Tue, 19 Mar 2019 19:04:16 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3F15429674; Tue, 19 Mar 2019 19:04:16 +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 C5EF5296C2 for ; Tue, 19 Mar 2019 19:04:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727572AbfCSTEK (ORCPT ); Tue, 19 Mar 2019 15:04:10 -0400 Received: from mail-wr1-f68.google.com ([209.85.221.68]:34206 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727406AbfCSTEJ (ORCPT ); Tue, 19 Mar 2019 15:04:09 -0400 Received: by mail-wr1-f68.google.com with SMTP id p10so90576wrq.1 for ; Tue, 19 Mar 2019 12:04:07 -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:reply-to :mime-version:content-transfer-encoding; bh=ModWTVyyoFbiyUfy0+qQZ72Egc9jWQgys97YCumSHTM=; b=BkRlahVm6I3jSjJJyNkGRE8QP8s9xoVK6fpvWAZpl/8ble6JW/TV50DsgFVQntuA8k G+tl1k6Qr4+/w7KlGVjv7kHvVZQqoS2hIH8E91kyvRNbJW0nIoCvklCC+LFdFluzszWE I6ZeiuHrvGiaxpdrxaP9+u3xLX7bWiNGnRiiWzsl1PWAiBz6ZoEs98OmfxTN9I43JuB9 vBd6yqp8Cp6yL5eTSbO3fTKjJVkQ1GvDrajZuOzl4iSDbm9RWyFzlIeO58kq1fgpcaL6 +MK8vfn3QFF1aTumU3uXDpGcxw/S+GlVz3X73OTZw6QjwEL9aWVi6so7NjsfzqgqOv05 75yg== 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:reply-to:mime-version:content-transfer-encoding; bh=ModWTVyyoFbiyUfy0+qQZ72Egc9jWQgys97YCumSHTM=; b=Hso6oG1mdWs6KHSqOovdnPIEaPeGnQknJlG0aCuuSzy3ctC/X4Onw4C1QvOm58pH/Z oizWTgN4mTQX9DliTK5D0Un/LO/KcP0BCJVMEX8gc3oatpx85GQXXGeraDsq0V6Ywwn0 uBom9VEMYF1uq8GzRs6dDjkPuv/xgyoqeBkASWkx3PpI9mQxkrTUBk+9EJXQtC7oPVDz KN4Bx1BA4MN15VcXSjDZT7u8ToNVkG3VKRze1A6UUXFssNz25uHVv6AwYHRsdkxFdDZx H9DVixhoBVUTgkQ2RKgxJM1Jkc8jq+fQebiDZtLkrHsKF9FBD+tdg07ruHiDiZGFQhyb l9ng== X-Gm-Message-State: APjAAAVNwQonFqi+QEBOWbHaGDY4s5ro5tnZzKw/j/2IuxEPwmLy9P9t IEAq9LDit5+u8xNu5lhJ4PZ2v2vCjq4= X-Google-Smtp-Source: APXvYqyaobHqTNgJ5ab3gb3d79uALhjwptnXEq5KI2mj/1kRyFsv/YIel7YN4cxE2F50TspjT8ayHA== X-Received: by 2002:a5d:6947:: with SMTP id r7mr14124891wrw.167.1553022246584; Tue, 19 Mar 2019 12:04:06 -0700 (PDT) Received: from lindisfarne.localdomain (host-89-242-184-133.as13285.net. [89.242.184.133]) by smtp.gmail.com with ESMTPSA id s187sm6253853wms.7.2019.03.19.12.04.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Mar 2019 12:04:06 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Phillip Wood Subject: [RFC PATCH 10/11] rebase: use a common action enum Date: Tue, 19 Mar 2019 19:03:16 +0000 Message-Id: <20190319190317.6632-11-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190319190317.6632-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> Reply-To: Phillip Wood 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 From: Phillip Wood cmd_rebase() and cmd_rebase__interactive() used different enums to hold the current action. Change to using a common enum so the values are the same when we change `rebase -i` to avoid forking `rebase--interactive`. Signed-off-by: Phillip Wood --- Notes: I'm not sure what to do with action_names, I moved it to keep it near the definition of the enum. The extra commands in the enum are not traced so they don't need to be in action_names but it looks odd to leave them out. Also I don't understand why action_names in NULL terminated or the names are marked for translation as it is used in trace2_cmd_mode(action_names[action]); so we don't use the NULL termination or translate the names (I'd be surprised if we did for tracing) builtin/rebase.c | 93 +++++++++++++++++++++++++----------------------- 1 file changed, 49 insertions(+), 44 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index 21ccb6495e..26d25a5242 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -119,6 +119,30 @@ static struct replay_opts get_replay_opts(const struct rebase_options *opts) return replay; } +enum action { + ACTION_NONE = 0, + ACTION_CONTINUE, + ACTION_SKIP, + ACTION_ABORT, + ACTION_QUIT, + ACTION_EDIT_TODO, + ACTION_SHOW_CURRENT_PATCH, + ACTION_SHORTEN_OIDS, + ACTION_EXPAND_OIDS, + ACTION_CHECK_TODO_LIST, + ACTION_REARRANGE_SQUASH, + ACTION_ADD_EXEC +}; + +static const char *action_names[] = { N_("undefined"), + N_("continue"), + N_("skip"), + N_("abort"), + N_("quit"), + N_("edit_todo"), + N_("show_current_patch"), + NULL }; + static int add_exec_commands(struct string_list *commands) { const char *todo_file = rebase_path_todo(); @@ -347,10 +371,7 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) unsigned flags = 0; int abbreviate_commands = 0, ret = 0; struct object_id squash_onto = null_oid; - enum { - NONE = 0, CONTINUE, SKIP, EDIT_TODO, SHOW_CURRENT_PATCH, - SHORTEN_OIDS, EXPAND_OIDS, CHECK_TODO_LIST, REARRANGE_SQUASH, ADD_EXEC - } command = 0; + enum action command = ACTION_NONE; struct option options[] = { OPT_NEGBIT(0, "ff", &opts.flags, N_("allow fast-forward"), REBASE_FORCE), @@ -367,22 +388,22 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) N_("display a diffstat of what changed upstream"), REBASE_NO_QUIET | REBASE_VERBOSE | REBASE_DIFFSTAT), OPT_CMDMODE(0, "continue", &command, N_("continue rebase"), - CONTINUE), - OPT_CMDMODE(0, "skip", &command, N_("skip commit"), SKIP), + ACTION_CONTINUE), + OPT_CMDMODE(0, "skip", &command, N_("skip commit"), ACTION_SKIP), OPT_CMDMODE(0, "edit-todo", &command, N_("edit the todo list"), - EDIT_TODO), + ACTION_EDIT_TODO), OPT_CMDMODE(0, "show-current-patch", &command, N_("show the current patch"), - SHOW_CURRENT_PATCH), + ACTION_SHOW_CURRENT_PATCH), OPT_CMDMODE(0, "shorten-ids", &command, - N_("shorten commit ids in the todo list"), SHORTEN_OIDS), + N_("shorten commit ids in the todo list"), ACTION_SHORTEN_OIDS), OPT_CMDMODE(0, "expand-ids", &command, - N_("expand commit ids in the todo list"), EXPAND_OIDS), + N_("expand commit ids in the todo list"), ACTION_EXPAND_OIDS), OPT_CMDMODE(0, "check-todo-list", &command, - N_("check the todo list"), CHECK_TODO_LIST), + N_("check the todo list"), ACTION_CHECK_TODO_LIST), OPT_CMDMODE(0, "rearrange-squash", &command, - N_("rearrange fixup/squash lines"), REARRANGE_SQUASH), + N_("rearrange fixup/squash lines"), ACTION_REARRANGE_SQUASH), OPT_CMDMODE(0, "add-exec-commands", &command, - N_("insert exec commands in todo list"), ADD_EXEC), + N_("insert exec commands in todo list"), ACTION_ADD_EXEC), { OPTION_CALLBACK, 0, "onto", &opts.onto, N_("onto"), N_("onto"), PARSE_OPT_NONEG, parse_opt_commit, 0 }, { OPTION_CALLBACK, 0, "restrict-revision", &opts.restrict_revision, @@ -428,36 +449,36 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) flags |= abbreviate_commands ? TODO_LIST_ABBREVIATE_CMDS : 0; flags |= opts.rebase_merges ? TODO_LIST_REBASE_MERGES : 0; flags |= opts.rebase_cousins > 0 ? TODO_LIST_REBASE_COUSINS : 0; - flags |= command == SHORTEN_OIDS ? TODO_LIST_SHORTEN_IDS : 0; + flags |= command == ACTION_SHORTEN_OIDS ? TODO_LIST_SHORTEN_IDS : 0; if (opts.rebase_cousins >= 0 && !opts.rebase_merges) warning(_("--[no-]rebase-cousins has no effect without " "--rebase-merges")); switch (command) { - case NONE: { + case ACTION_NONE: { if (!opts.onto && !opts.upstream) die(_("a base commit must be provided with --upstream or --onto")); ret = do_interactive_rebase(&opts, flags); break; } - case SKIP: { + case ACTION_SKIP: { struct string_list merge_rr = STRING_LIST_INIT_DUP; rerere_clear(the_repository, &merge_rr); } /* fallthrough */ - case CONTINUE: { + case ACTION_CONTINUE: { struct replay_opts replay_opts = get_replay_opts(&opts); ret = sequencer_continue(the_repository, &replay_opts); break; } - case EDIT_TODO: + case ACTION_EDIT_TODO: ret = edit_todo_file(flags); break; - case SHOW_CURRENT_PATCH: { + case ACTION_SHOW_CURRENT_PATCH: { struct child_process cmd = CHILD_PROCESS_INIT; cmd.git_cmd = 1; @@ -466,17 +487,17 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) break; } - case SHORTEN_OIDS: - case EXPAND_OIDS: + case ACTION_SHORTEN_OIDS: + case ACTION_EXPAND_OIDS: ret = transform_todo_file(flags); break; - case CHECK_TODO_LIST: + case ACTION_CHECK_TODO_LIST: ret = check_todo_list_from_file(the_repository); break; - case REARRANGE_SQUASH: + case ACTION_REARRANGE_SQUASH: ret = rearrange_squash_in_todo_file(); break; - case ADD_EXEC: { + case ACTION_ADD_EXEC: { struct string_list commands = STRING_LIST_INIT_DUP; split_exec_commands(opts.cmd, &commands); @@ -1417,23 +1438,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) struct strbuf revisions = STRBUF_INIT; struct strbuf buf = STRBUF_INIT; struct object_id merge_base; - enum { - NO_ACTION, - ACTION_CONTINUE, - ACTION_SKIP, - ACTION_ABORT, - ACTION_QUIT, - ACTION_EDIT_TODO, - ACTION_SHOW_CURRENT_PATCH, - } action = NO_ACTION; - static const char *action_names[] = { N_("undefined"), - N_("continue"), - N_("skip"), - N_("abort"), - N_("quit"), - N_("edit_todo"), - N_("show_current_patch"), - NULL }; + enum action action = ACTION_NONE; const char *gpg_sign = NULL; struct string_list exec = STRING_LIST_INIT_NODUP; const char *rebase_merges = NULL; @@ -1600,7 +1605,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) builtin_rebase_options, builtin_rebase_usage, 0); - if (action != NO_ACTION && total_argc != 2) { + if (action != ACTION_NONE && total_argc != 2) { usage_with_options(builtin_rebase_usage, builtin_rebase_options); } @@ -1609,7 +1614,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) usage_with_options(builtin_rebase_usage, builtin_rebase_options); - if (action != NO_ACTION && !in_progress) + if (action != ACTION_NONE && !in_progress) die(_("No rebase in progress?")); setenv(GIT_REFLOG_ACTION_ENVIRONMENT, "rebase", 0); @@ -1709,7 +1714,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) options.action = "show-current-patch"; options.dont_finish_rebase = 1; goto run_rebase; - case NO_ACTION: + case ACTION_NONE: break; default: BUG("action: %d", action); From patchwork Tue Mar 19 19:03:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10860291 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 B50176C2 for ; Tue, 19 Mar 2019 19:04:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 98D8229463 for ; Tue, 19 Mar 2019 19:04:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8D43B29480; Tue, 19 Mar 2019 19:04:19 +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 7BA7C295F1 for ; Tue, 19 Mar 2019 19:04:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727177AbfCSTEO (ORCPT ); Tue, 19 Mar 2019 15:04:14 -0400 Received: from mail-wm1-f65.google.com ([209.85.128.65]:53674 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727536AbfCSTEJ (ORCPT ); Tue, 19 Mar 2019 15:04:09 -0400 Received: by mail-wm1-f65.google.com with SMTP id e74so17985230wmg.3 for ; Tue, 19 Mar 2019 12:04:08 -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:reply-to :mime-version:content-transfer-encoding; bh=iqtHuef0ha1SGidogmgtRzyPQw7w5WTPOSsZHX1eA/Q=; b=trWxeRLH6H4CSarE9IgC1TZcyX4S0aNpMrcqgFhJhkLqcD/CasBql/QbOmcj2TNIEv VSgYSTd1u8SnrLQAXfcnwWJF8grLy0GM6B2miZV9Q6FCjh1S1Nx7Dr9YAMyGQ4esyyEr BaNtgoimnkYLZxTT2omjY7Mnc/zXkd3x/QQVtna7zWRIFx4O0iWWPe369Ft1s4OSwmaa AzO2+3y0lj4RA7iBp2GN4/TkQ2GD+AsU4Gni5LK/WS7YQ1wOT6pckWhT8zbUMlgLR1AW SE8bnpO32chyawTMSlAG27ugDq06NcLJSibYTiY5LVOi8W3DBg1VSO1SXRnUgrzIfj77 HPiw== 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:reply-to:mime-version:content-transfer-encoding; bh=iqtHuef0ha1SGidogmgtRzyPQw7w5WTPOSsZHX1eA/Q=; b=Bv5ZLIP/x2D46nTTi6ey3HYNGlng1JnWvPtQ9fgO4BBxFSceHee00qU/HlL/4UOKXn Xo1M8sSfqWgymcckCh2CkekZKJV2ejo0tZD2Ot5fo5KmrzWrG+4v/BCvLaDWzJaPwQp1 98pLCt70Em17vCIJkBTydAhkZyB8LAfD5p8s+WqXMqkhGnKBunsiM+yU0yRPpliB30+3 CncnK2ggre2EM/da0qlI8k2arv1h15FsASzAkhKagBe8kk6YL4PLI9Yyxs0oEOePsok5 JN7ejneldy59uOQlKj6uVIYG6/LmzDW9ZoKfgOqyUwqauvCV6r94xyYc62Kj2l+ghA/2 jYNA== X-Gm-Message-State: APjAAAX41utb4vKDNy1u8v11uwm84igsq0mXRGnwkIBupLhjl/r+wMhp VnCxSfQPfMauCJmumI1goa/mUNr9R70= X-Google-Smtp-Source: APXvYqzXXyup1yMYt/zXFANDC+rmwGOsQFptmQ4DjaJzvPbhGkrYrBx6V6sN03m/+AqfJSiYQDa2+Q== X-Received: by 2002:a1c:dfc5:: with SMTP id w188mr4588243wmg.79.1553022247575; Tue, 19 Mar 2019 12:04:07 -0700 (PDT) Received: from lindisfarne.localdomain (host-89-242-184-133.as13285.net. [89.242.184.133]) by smtp.gmail.com with ESMTPSA id s187sm6253853wms.7.2019.03.19.12.04.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Mar 2019 12:04:07 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Phillip Wood Subject: [RFC PATCH 11/11] rebase -i: run without forking rebase--interactive Date: Tue, 19 Mar 2019 19:03:17 +0000 Message-Id: <20190319190317.6632-12-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190319190317.6632-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> Reply-To: Phillip Wood 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 From: Phillip Wood When the builtin rebase starts an interactive rebase it parses the options and then repackages them and forks `rebase--interactive`. Separate the option parsing in cmd_rebase__interactive() from the business logic to allow interactive rebases can be run without forking `rebase__interactive` by calling run_rebase_interactive() directly. This makes it easy to debug the sequencer without worrying about attaching to child processes. It also makes it easy to remove cmd_rebase__interactive() in the future when git-legacy-rebase.sh and git-rebase--preserve-merges.sh are retired. Signed-off-by: Phillip Wood --- builtin/rebase.c | 221 ++++++++++++++++++----------------------------- 1 file changed, 86 insertions(+), 135 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index 26d25a5242..2e26d350f0 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -317,7 +317,9 @@ static int do_interactive_rebase(struct rebase_options *opts, unsigned flags) &revisions, &shortrevisions)) return -1; - if (init_basic_state(&replay, opts->head_name, opts->onto, head_hash)) { + if (init_basic_state(&replay, + opts->head_name ? opts->head_name : "detached HEAD", + opts->onto, head_hash)) { free(revisions); free(shortrevisions); @@ -360,6 +362,77 @@ static int do_interactive_rebase(struct rebase_options *opts, unsigned flags) return ret; } +static int run_rebase_interactive(struct rebase_options *opts, + enum action command) +{ + unsigned flags = 0; + int abbreviate_commands = 0, ret = 0; + + git_config_get_bool("rebase.abbreviatecommands", &abbreviate_commands); + + flags |= opts->keep_empty ? TODO_LIST_KEEP_EMPTY : 0; + flags |= abbreviate_commands ? TODO_LIST_ABBREVIATE_CMDS : 0; + flags |= opts->rebase_merges ? TODO_LIST_REBASE_MERGES : 0; + flags |= opts->rebase_cousins > 0 ? TODO_LIST_REBASE_COUSINS : 0; + flags |= command == ACTION_SHORTEN_OIDS ? TODO_LIST_SHORTEN_IDS : 0; + + switch (command) { + case ACTION_NONE: { + if (!opts->onto && !opts->upstream) + die(_("a base commit must be provided with --upstream or --onto")); + + ret = do_interactive_rebase(opts, flags); + break; + } + case ACTION_SKIP: { + struct string_list merge_rr = STRING_LIST_INIT_DUP; + + rerere_clear(the_repository, &merge_rr); + } + /* fallthrough */ + case ACTION_CONTINUE: { + struct replay_opts replay_opts = get_replay_opts(opts); + + ret = sequencer_continue(the_repository, &replay_opts); + break; + } + case ACTION_EDIT_TODO: + ret = edit_todo_file(flags); + break; + case ACTION_SHOW_CURRENT_PATCH: { + struct child_process cmd = CHILD_PROCESS_INIT; + + cmd.git_cmd = 1; + argv_array_pushl(&cmd.args, "show", "REBASE_HEAD", "--", NULL); + ret = run_command(&cmd); + + break; + } + case ACTION_SHORTEN_OIDS: + case ACTION_EXPAND_OIDS: + ret = transform_todo_file(flags); + break; + case ACTION_CHECK_TODO_LIST: + ret = check_todo_list_from_file(the_repository); + break; + case ACTION_REARRANGE_SQUASH: + ret = rearrange_squash_in_todo_file(); + break; + case ACTION_ADD_EXEC: { + struct string_list commands = STRING_LIST_INIT_DUP; + + split_exec_commands(opts->cmd, &commands); + ret = add_exec_commands(&commands); + string_list_clear(&commands, 0); + break; + } + default: + BUG("invalid command '%d'", command); + } + + return ret; +} + static const char * const builtin_rebase_interactive_usage[] = { N_("git rebase--interactive []"), NULL @@ -368,8 +441,6 @@ static const char * const builtin_rebase_interactive_usage[] = { int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) { struct rebase_options opts = REBASE_OPTIONS_INIT; - unsigned flags = 0; - int abbreviate_commands = 0, ret = 0; struct object_id squash_onto = null_oid; enum action command = ACTION_NONE; struct option options[] = { @@ -434,8 +505,6 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) opts.rebase_cousins = -1; - git_config_get_bool("rebase.abbreviatecommands", &abbreviate_commands); - if (argc == 1) usage_with_options(builtin_rebase_interactive_usage, options); @@ -445,71 +514,11 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) if (!is_null_oid(&squash_onto)) opts.squash_onto = &squash_onto; - flags |= opts.keep_empty ? TODO_LIST_KEEP_EMPTY : 0; - flags |= abbreviate_commands ? TODO_LIST_ABBREVIATE_CMDS : 0; - flags |= opts.rebase_merges ? TODO_LIST_REBASE_MERGES : 0; - flags |= opts.rebase_cousins > 0 ? TODO_LIST_REBASE_COUSINS : 0; - flags |= command == ACTION_SHORTEN_OIDS ? TODO_LIST_SHORTEN_IDS : 0; - if (opts.rebase_cousins >= 0 && !opts.rebase_merges) warning(_("--[no-]rebase-cousins has no effect without " "--rebase-merges")); - switch (command) { - case ACTION_NONE: { - if (!opts.onto && !opts.upstream) - die(_("a base commit must be provided with --upstream or --onto")); - - ret = do_interactive_rebase(&opts, flags); - break; - } - case ACTION_SKIP: { - struct string_list merge_rr = STRING_LIST_INIT_DUP; - - rerere_clear(the_repository, &merge_rr); - } - /* fallthrough */ - case ACTION_CONTINUE: { - struct replay_opts replay_opts = get_replay_opts(&opts); - - ret = sequencer_continue(the_repository, &replay_opts); - break; - } - case ACTION_EDIT_TODO: - ret = edit_todo_file(flags); - break; - case ACTION_SHOW_CURRENT_PATCH: { - struct child_process cmd = CHILD_PROCESS_INIT; - - cmd.git_cmd = 1; - argv_array_pushl(&cmd.args, "show", "REBASE_HEAD", "--", NULL); - ret = run_command(&cmd); - - break; - } - case ACTION_SHORTEN_OIDS: - case ACTION_EXPAND_OIDS: - ret = transform_todo_file(flags); - break; - case ACTION_CHECK_TODO_LIST: - ret = check_todo_list_from_file(the_repository); - break; - case ACTION_REARRANGE_SQUASH: - ret = rearrange_squash_in_todo_file(); - break; - case ACTION_ADD_EXEC: { - struct string_list commands = STRING_LIST_INIT_DUP; - - split_exec_commands(opts.cmd, &commands); - ret = add_exec_commands(&commands); - string_list_clear(&commands, 0); - break; - } - default: - BUG("invalid command '%d'", command); - } - - return !!ret; + return !!run_rebase_interactive(&opts, command); } static int use_builtin_rebase(void) @@ -1072,7 +1081,7 @@ static int run_am(struct rebase_options *opts) return status; } -static int run_specific_rebase(struct rebase_options *opts) +static int run_specific_rebase(struct rebase_options *opts, enum action action) { const char *argv[] = { NULL, NULL }; struct strbuf script_snippet = STRBUF_INIT, buf = STRBUF_INIT; @@ -1081,77 +1090,19 @@ static int run_specific_rebase(struct rebase_options *opts) if (opts->type == REBASE_INTERACTIVE) { /* Run builtin interactive rebase */ - struct child_process child = CHILD_PROCESS_INIT; - - argv_array_pushf(&child.env_array, "GIT_CHERRY_PICK_HELP=%s", - resolvemsg); + setenv("GIT_CHERRY_PICK_HELP", resolvemsg, 1); if (!(opts->flags & REBASE_INTERACTIVE_EXPLICIT)) { - argv_array_push(&child.env_array, - "GIT_SEQUENCE_EDITOR=:"); + setenv("GIT_SEQUENCE_EDITOR", ":", 1); opts->autosquash = 0; } + if (opts->gpg_sign_opt) { + /* remove the leading "-S" */ + char *tmp = xstrdup(opts->gpg_sign_opt + 2); + free(opts->gpg_sign_opt); + opts->gpg_sign_opt = tmp; + } - child.git_cmd = 1; - argv_array_push(&child.args, "rebase--interactive"); - - if (opts->action) - argv_array_pushf(&child.args, "--%s", opts->action); - if (opts->keep_empty) - argv_array_push(&child.args, "--keep-empty"); - if (opts->rebase_merges) - argv_array_push(&child.args, "--rebase-merges"); - if (opts->rebase_cousins) - argv_array_push(&child.args, "--rebase-cousins"); - if (opts->autosquash) - argv_array_push(&child.args, "--autosquash"); - if (opts->flags & REBASE_VERBOSE) - argv_array_push(&child.args, "--verbose"); - if (opts->flags & REBASE_FORCE) - argv_array_push(&child.args, "--no-ff"); - if (opts->restrict_revision) - argv_array_pushf(&child.args, - "--restrict-revision=^%s", - oid_to_hex(&opts->restrict_revision->object.oid)); - if (opts->upstream) - argv_array_pushf(&child.args, "--upstream=%s", - oid_to_hex(&opts->upstream->object.oid)); - if (opts->onto) - argv_array_pushf(&child.args, "--onto=%s", - oid_to_hex(&opts->onto->object.oid)); - if (opts->squash_onto) - argv_array_pushf(&child.args, "--squash-onto=%s", - oid_to_hex(opts->squash_onto)); - if (opts->onto_name) - argv_array_pushf(&child.args, "--onto-name=%s", - opts->onto_name); - argv_array_pushf(&child.args, "--head-name=%s", - opts->head_name ? - opts->head_name : "detached HEAD"); - if (opts->strategy) - argv_array_pushf(&child.args, "--strategy=%s", - opts->strategy); - if (opts->strategy_opts) - argv_array_pushf(&child.args, "--strategy-opts=%s", - opts->strategy_opts); - if (opts->switch_to) - argv_array_pushf(&child.args, "--switch-to=%s", - opts->switch_to); - if (opts->cmd) - argv_array_pushf(&child.args, "--cmd=%s", opts->cmd); - if (opts->allow_empty_message) - argv_array_push(&child.args, "--allow-empty-message"); - if (opts->allow_rerere_autoupdate == RERERE_AUTOUPDATE) - argv_array_push(&child.args, "--rerere-autoupdate"); - else if (opts->allow_rerere_autoupdate == RERERE_NOAUTOUPDATE) - argv_array_push(&child.args, "--no-rerere-autoupdate"); - if (opts->gpg_sign_opt) - argv_array_push(&child.args, opts->gpg_sign_opt); - if (opts->signoff) - argv_array_push(&child.args, "--signoff"); - if (opts->reschedule_failed_exec) - argv_array_push(&child.args, "--reschedule-failed-exec"); - - status = run_command(&child); + status = run_rebase_interactive(opts, action); goto finished_rebase; } @@ -2212,7 +2163,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) options.revisions = revisions.buf; run_rebase: - ret = !!run_specific_rebase(&options); + ret = !!run_specific_rebase(&options, action); cleanup: strbuf_release(&revisions);