From patchwork Wed Apr 17 14:30:33 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10905415 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 C94A017E6 for ; Wed, 17 Apr 2019 14:33:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AED65287D3 for ; Wed, 17 Apr 2019 14:33:03 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id AC0C928B25; Wed, 17 Apr 2019 14:33:03 +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 B3408287D3 for ; Wed, 17 Apr 2019 14:33:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732386AbfDQOdA (ORCPT ); Wed, 17 Apr 2019 10:33:00 -0400 Received: from mail-wr1-f68.google.com ([209.85.221.68]:41353 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732088AbfDQOc7 (ORCPT ); Wed, 17 Apr 2019 10:32:59 -0400 Received: by mail-wr1-f68.google.com with SMTP id r4so32229579wrq.8 for ; Wed, 17 Apr 2019 07:32: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=FazjZUDHg2znIjHp6mw7wR852Mk9BKrEqXez4RURy0c=; b=G7qbOjEdgAxLLIwZPJIitSf5af4EP8o4jkr0i4VSI+otCN7xRJmLNX9waUX8QjM+a7 Hw7/hTadvAQnYkHEABAgJxQEtTPhvFUkbN6fxeio9fHNvTcpBlWBRz1sA5xdUYRvAcN5 2suyYYoCQoT8+EX/Ax61cwp1cRTaNNu4MxHe+hx58h9Gfr6WjwnHGvrT0GYtQl6I2Z/N CQnd+W1T17/4wNblzeKrzVsCFQoSPZq+y4RCFUisXPqLXH+XkX6rVXWJXAMUAbXHju+P jeYvJA7TwyeYBO2WX1tsIv2eJ4Tf51FX7ghMk5+3Dther4RwOmChLVEI49a1uhUnweCc uddg== 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=FazjZUDHg2znIjHp6mw7wR852Mk9BKrEqXez4RURy0c=; b=KMXV7pVe9hv4P4UC43EvHoV0NsJyAV2pnAye+RWREDQXUyI3/6ur/Yx96/lfbckF1p diTgTYiWdjLk8RrZ6SUh1qYAoqGGkACMGI1PE3TNONNquyWbjqeM6uu4IeDy+/LWUJZy Fm5/dI0mCNfdo4a4a0x43st6jnf8ToidJ2MheEn2UMlaeuFldqKw3SQWKzLZTqqI+ZdC YgjdrKzotd0i5MNitIhnQVk+O7/feL3kNFAix9GzaeNLQT7BgWXqBwqeCrEvfCUxm8pI Z8p/enFGz7ZyH2pSJ2x1FmsKrPM9EtJZWAoJGUWcR9dluBImC2Xw4nMDpfmZn6QImPSZ BxXg== X-Gm-Message-State: APjAAAV3tJpplTL9+I4gsiWipH4rqIhDJKz0BwDCxud/nEEBFtGm+DWv wQLGn9RWPtI4d9lNseYzxv8StJ+BMu8= X-Google-Smtp-Source: APXvYqx9ACr3uV4kpd+FDM/Cuu9FVDpqgUyTLUICDnn2kUSMs1/ZrqTZobvz0I+pbe6BHkT66/3uYw== X-Received: by 2002:a5d:424b:: with SMTP id s11mr48277588wrr.158.1555511577922; Wed, 17 Apr 2019 07:32:57 -0700 (PDT) Received: from localhost.localdomain (host-92-22-21-176.as13285.net. [92.22.21.176]) by smtp.gmail.com with ESMTPSA id t17sm52127726wrr.26.2019.04.17.07.32.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Apr 2019 07:32:57 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Junio C Hamano , Elijah Newren , Duy Nguyen , Alban Gruin , Josh Steadmon , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFy?= =?utf-8?b?bWFzb24=?= , Phillip Wood Subject: [PATCH v1 01/12] sequencer: always discard index after checkout Date: Wed, 17 Apr 2019 15:30:33 +0100 Message-Id: <20190417143044.17655-2-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190417143044.17655-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> <20190417143044.17655-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 --- 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 Wed Apr 17 14:30:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10905423 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 DFD9E13B5 for ; Wed, 17 Apr 2019 14:33:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BEC0628A4F for ; Wed, 17 Apr 2019 14:33:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BD0F828BB0; Wed, 17 Apr 2019 14:33: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 61D2928AFB for ; Wed, 17 Apr 2019 14:33:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732450AbfDQOdD (ORCPT ); Wed, 17 Apr 2019 10:33:03 -0400 Received: from mail-wm1-f65.google.com ([209.85.128.65]:39780 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729453AbfDQOdA (ORCPT ); Wed, 17 Apr 2019 10:33:00 -0400 Received: by mail-wm1-f65.google.com with SMTP id n25so3866329wmk.4 for ; Wed, 17 Apr 2019 07:32: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=vBYHgDWbDaKF9A5UfZDeMsu8tOyr/BCe+UTtCyUerjQ=; b=LWIFZ+ThS+MCUn6l324krt5bIZ5grq9Vx5xTPc9sm/u43wntyVwczDV1xrBm/IQ3Yi gWFlGOvTzJ5ipDsfS6MaKx5OO64hAZHDUy2njEjoAnsYbF9l3wmNF4t2U2Addpc0sk3a U1xvYayfuTzhtIJ59AcQUoQlT5X3RLfl7Hn03ltfqiEfMrI7cJJjnxui4U3I+utiCkvn QFbLG7AUC+x2uvtMEm973Om6Mc6WpYQA4aGjEvzycg3aF9ZB0EGwq5cUiD1ljTi43IID yEArk/S5vPn4kbHXnvu7JX83hQvCaFOkgAvLydAZBy20ev7T6Dje+p157csIq91JFSle KXIQ== 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=vBYHgDWbDaKF9A5UfZDeMsu8tOyr/BCe+UTtCyUerjQ=; b=RZtkiEjerQaBUZBUcGPcE6JeD8jVeK2upWjao2IizZaoPqRqHANR80Av/4b+RoQuqh OxIDds7//SDXO96xAt1gapCxkHDnMJqnJ2IxDw4awndPFW1KyiRPBVvWt6XPS7M4w3kD x7YgMXuaAAHog1bAhI7A92pcHIEdTFY6uEIeFYxHvz6OYe1AWDpkZOjyKMYzPzuJ/dXU YTQkeqeBKNqIE1MI3HYxg9jQwJkXyjeA/fGqLcC1fu+f7DBtYlzKxXQDX+zjpnqTwla3 zKzUyZS/jr3mR5WzbMGFCCtk9iWgsDVQuZuobPbsomlVf4R0B+/RBqeK6B5FWmwy5XIb ujsg== X-Gm-Message-State: APjAAAUPByCuaCc9d7LPlqddNwo/SCr5+cIIfm/3kuIXAbkZcrhAoKz4 EBsF81Dm/u8FP5sA7CBUWNesMX17lLQ= X-Google-Smtp-Source: APXvYqzD3TmKGU/ASV9ETxwy7JSqVm2C3Vv5HRbWH1JbptgeH3My0eLRYrGWBBiOSxTC5Lq9INrxKg== X-Received: by 2002:a1c:6587:: with SMTP id z129mr31855317wmb.84.1555511579076; Wed, 17 Apr 2019 07:32:59 -0700 (PDT) Received: from localhost.localdomain (host-92-22-21-176.as13285.net. [92.22.21.176]) by smtp.gmail.com with ESMTPSA id t17sm52127726wrr.26.2019.04.17.07.32.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Apr 2019 07:32:58 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Junio C Hamano , Elijah Newren , Duy Nguyen , Alban Gruin , Josh Steadmon , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFy?= =?utf-8?b?bWFzb24=?= , Phillip Wood , Jeff Hostetler Subject: [PATCH v1 02/12] rebase: don't translate trace strings Date: Wed, 17 Apr 2019 15:30:34 +0100 Message-Id: <20190417143044.17655-3-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190417143044.17655-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> <20190417143044.17655-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 commit b3a5d5a80c ("trace2:data: add subverb for rebase", 2019-02-22) mistakenly marked the subverb names for translation and unnecessarily NULL terminated the array. Signed-off-by: Phillip Wood --- builtin/rebase.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index 52114cbf0d..239a54ecfe 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -1027,14 +1027,13 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) 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 }; + static const char *action_names[] = { "undefined", + "continue", + "skip", + "abort", + "quit", + "edit_todo", + "show_current_patch" }; const char *gpg_sign = NULL; struct string_list exec = STRING_LIST_INIT_NODUP; const char *rebase_merges = NULL; From patchwork Wed Apr 17 14:30:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10905417 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 C1BB414DB for ; Wed, 17 Apr 2019 14:33:04 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AC00E28BA0 for ; Wed, 17 Apr 2019 14:33:04 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A9F9B28B7E; Wed, 17 Apr 2019 14:33:04 +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 362C328B7E for ; Wed, 17 Apr 2019 14:33:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732461AbfDQOdD (ORCPT ); Wed, 17 Apr 2019 10:33:03 -0400 Received: from mail-wr1-f66.google.com ([209.85.221.66]:44069 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732088AbfDQOdC (ORCPT ); Wed, 17 Apr 2019 10:33:02 -0400 Received: by mail-wr1-f66.google.com with SMTP id w18so2146747wrv.11 for ; Wed, 17 Apr 2019 07:33: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=8H3fsUqU94DOicsjySVKxiyLP7tOZ/UTCRSTVhkz8M8=; b=AalxDBU0wjmLJhEJRQMs/Lex36LVNxdtB8I6xM3JDzzu/oQGE8ybT69dCNGzBjvRkL 0EsTIkyp+94rNtaJS9Yioo6OpLnYf8eVPYq08aBHXUDQUrlpCYqCjQq+GbkEpv3mjdTI Zx/keDFFC84F0JGDzn2fm7XDKOJw4lY4lz6HPEHZZMyt9RcVo7UsqOIhTEJ6Dnhqlj1y 3qEppesPj/V/jIQ2nWbHS1kuajzmzsBlAo8h45TMebVHZ78bgAv/rYU06JaF48rJ2e9T Zf7zp7bhi1K2dCx1Z3A7diohVGWUbukJhpWLm3kw+cbS6kcdcJvBLEWbYV0UEuPiyXEV qirQ== 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=8H3fsUqU94DOicsjySVKxiyLP7tOZ/UTCRSTVhkz8M8=; b=kyThGN1FmKcaAkbM/oFaVvN9PxsRIF1ghs3DzBnDeg9MhFE2a4OTVKBOcXrsvW1h02 t5v2J6HdUBu441t1F7vcmmW4qDgmei/tzDUtforJQMI0V8I332VK9UkurfdYh+6wuc40 70z/NxrTTITAtslIC6jL+w/LJh3H4Nv7U9ZWLDAXvGzcyoSDygRatV48CPAtPCm8igdo QfkZjlOiPldz1r8sAfzVwkXWgSd5KcIFnziAcnfknGXSqv1pd1hpy6qs85W3Een+y8BR 0hsj2spqtTajGehp6TRAbFUcEsJrKurvG9/7+V6HDDRozyUr/HvggA6iK22Ztxb2VhIh pDHw== X-Gm-Message-State: APjAAAVSXcyrTEbz1q6i/ztcmLEvIbYME7BXhdPREH+Tcl/2CXlewFKB ohpzdVrcsRNDezjW8TLbyOIOoKCzGn0= X-Google-Smtp-Source: APXvYqyBeF+uYeyFsmvy0FMLrVNGSNTwgo9D/nrJlfS9YbHr/qwcxyQ7A18uPn4/11sHTuhQL6F4Lw== X-Received: by 2002:a5d:6646:: with SMTP id f6mr10203501wrw.68.1555511580263; Wed, 17 Apr 2019 07:33:00 -0700 (PDT) Received: from localhost.localdomain (host-92-22-21-176.as13285.net. [92.22.21.176]) by smtp.gmail.com with ESMTPSA id t17sm52127726wrr.26.2019.04.17.07.32.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Apr 2019 07:32:59 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Junio C Hamano , Elijah Newren , Duy Nguyen , Alban Gruin , Josh Steadmon , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFy?= =?utf-8?b?bWFzb24=?= , Phillip Wood Subject: [PATCH v1 03/12] rebase: rename write_basic_state() Date: Wed, 17 Apr 2019 15:30:35 +0100 Message-Id: <20190417143044.17655-4-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190417143044.17655-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> <20190417143044.17655-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 239a54ecfe..0b1a193a8e 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 Wed Apr 17 14:30:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10905421 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 6865E18FD for ; Wed, 17 Apr 2019 14:33:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 513A128B7F for ; Wed, 17 Apr 2019 14:33:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4F05828BB1; Wed, 17 Apr 2019 14:33: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 C26AD28B7F for ; Wed, 17 Apr 2019 14:33:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732463AbfDQOdE (ORCPT ); Wed, 17 Apr 2019 10:33:04 -0400 Received: from mail-wr1-f66.google.com ([209.85.221.66]:43115 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732399AbfDQOdD (ORCPT ); Wed, 17 Apr 2019 10:33:03 -0400 Received: by mail-wr1-f66.google.com with SMTP id k17so27578277wrx.10 for ; Wed, 17 Apr 2019 07:33:02 -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=NqNn/Gamrf1WZe/5ECTWZjfA/fzvYU+ccnZ68FTcD04=; b=sbpvK0302qM7UbEdo3+kKNfjp3VykuvTB72DVc+l8KqBiYZ3YDz616usyDvk4yGaqw JJAC7tw9rQy4A4HXJL7QeIe3SJjrSSt778h1pEyCo8aUdaYWMbYPMvAn5bg7BvcjR2PI tphK/W4JPwCLcELbKj9XVs2JTLijf2jI1fYEqOrXBS7S1dUx5yxP9PQl2BNPIAmBC+Ps 1zoWRsCyPUibDHfdjdpNrrT2VmeodpP664Lw6KPxltYGuQiwEQ6WMvbwSukv8uJFpI1Z JmYHqFcXcYqpTnoVi3dbNJLkkAfv5aU/kIFZ250KvLegCveW++lP1DvT79X8RQRZEvYy 4Pkg== 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=NqNn/Gamrf1WZe/5ECTWZjfA/fzvYU+ccnZ68FTcD04=; b=XPNhjnO/HqS5kYZlxYmhwtrGQ8ppvXOqBcjSkbkGkpxh6AnpsCYucvBIACKMRWGtWv 3ZANZSQQeahAGeh9oUhHowHWdgkCob7f35pwX+Y19T4ti0zbnXJIAjwfJ3u9ViPG0Nr5 KhQukVTjkbI2J4CKvU8JrQ1Tykpr1dzdbeV4W6hSo1dwjpTZQ/VVnGfeSShr4h5KYK0H h3D02KKqVdgtZ/InPJ/C4HUm2NOHVJybflBPH5BjwK8TWc/SBVyCepUnzEPzSrDOb9i/ 4o9QGjed2SQaHit9EBsIx76gX8fPfxCGt3LZ7lBo/NHl66H72Y6i9mfcPw3yIrBG8/9r eCGQ== X-Gm-Message-State: APjAAAU/f4yBZUQl43ZyxIfBXDYsG/0RMYzrcREjxS/W1PGZCtTNKNDT UY/YLFCUgd21y1/8x2eM69CKTErAIiA= X-Google-Smtp-Source: APXvYqzKatHaM0879/SckPcAJ4vXPoXgFbZYekviIaV0Kg01ztL1l6AZgw0AROy46GqS2HlOcjJqtA== X-Received: by 2002:adf:b3d4:: with SMTP id x20mr8082566wrd.284.1555511581441; Wed, 17 Apr 2019 07:33:01 -0700 (PDT) Received: from localhost.localdomain (host-92-22-21-176.as13285.net. [92.22.21.176]) by smtp.gmail.com with ESMTPSA id t17sm52127726wrr.26.2019.04.17.07.33.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Apr 2019 07:33:01 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Junio C Hamano , Elijah Newren , Duy Nguyen , Alban Gruin , Josh Steadmon , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFy?= =?utf-8?b?bWFzb24=?= , Phillip Wood Subject: [PATCH v1 04/12] rebase: use OPT_RERERE_AUTOUPDATE() Date: Wed, 17 Apr 2019 15:30:36 +0100 Message-Id: <20190417143044.17655-5-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190417143044.17655-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> <20190417143044.17655-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 0b1a193a8e..e7b8122003 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, }; @@ -1101,10 +1100,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 Wed Apr 17 14:30:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10905427 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 EDD0C14DB for ; Wed, 17 Apr 2019 14:33:09 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D3EA228B3C for ; Wed, 17 Apr 2019 14:33:09 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C78C128807; Wed, 17 Apr 2019 14:33:09 +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 037E428BA0 for ; Wed, 17 Apr 2019 14:33:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732501AbfDQOdH (ORCPT ); Wed, 17 Apr 2019 10:33:07 -0400 Received: from mail-wr1-f68.google.com ([209.85.221.68]:33504 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732399AbfDQOdF (ORCPT ); Wed, 17 Apr 2019 10:33:05 -0400 Received: by mail-wr1-f68.google.com with SMTP id q1so32301714wrp.0 for ; Wed, 17 Apr 2019 07:33:04 -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=DY07e9PPVvIVd8Yay3ITj5bup5JnWTRw+gbpILnff3Y=; b=UK6KM7D3QiQn1JCF6VFiMOPG8XmDaqcgZrrepG3EP0BxxFtDEeIJufVvjh1zT3Uehn TZCDo0zyi5GW5srz7elR/Yyrh50FZGLd1be8ocw7eBT37DPZCaADax37L0/N4/zCGCpj H3vwsyxItrX6IvCfCIKO/Y27TqRvvUG9qPhsKk7yg/lz7YDllqSIo3dnB/CrfLH5Ep8d F1jOaxWYmiTWWy2+K4JcEI8V4nRp5EI4xl5hMdT8Ph72hi1kT4Ky97V0xYGLSv82nCUY 5PgFFVh2tOvqyU71Rt9rG84oobikNzFVf4ea63QiYqEgmmGEu50gWmGQinBrZ0V9DyJn /9ww== 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=DY07e9PPVvIVd8Yay3ITj5bup5JnWTRw+gbpILnff3Y=; b=m80/kJ99peXT4ldJ8e7PBWNqCT/L8pg/Ozw3lBD6ZSraS71ZbEd0y8tJ1Xh3c0Ajnj HOhtuB/EpF+pNkd8foQf+eM/XJj6giYDmuM3XUt+kmIhcvo5z22OSgXn3HtoU8co0Z36 QW4ckzZIAwBCm1zC2EeKOOJzpUtt2LjYPLTENy5+j5EYi8o5TXc7dbKNkwFU7h/HLGkf jEvzCKMpV7Q3NHUcvQ17Lv0EyB1kzK7sE0lYLz513l6TuoZiI1nmQ43EmlzZUsqNdJhf Gw8FDYslhBQRTaeZwXVQqeARXeP7wAxr2RguHMg847GzK7yWGBchwtpEt/spX/LH2QWR lnVA== X-Gm-Message-State: APjAAAW+/Y3Rh1BoSGX492uYlntPR2a8+P8aoQybRVz1cJlkYpCCdU1k hETuV1Uid+ghm1AskM/t9naaJxDsjus= X-Google-Smtp-Source: APXvYqwHqLoTiBV8R5ofd24YOyAZn5Zh/gff7xogWntmM2uMdfgGEIVWpzWqZ/MecV34Pk7MBSjvPw== X-Received: by 2002:adf:fe41:: with SMTP id m1mr58274640wrs.220.1555511583135; Wed, 17 Apr 2019 07:33:03 -0700 (PDT) Received: from localhost.localdomain (host-92-22-21-176.as13285.net. [92.22.21.176]) by smtp.gmail.com with ESMTPSA id t17sm52127726wrr.26.2019.04.17.07.33.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Apr 2019 07:33:02 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Junio C Hamano , Elijah Newren , Duy Nguyen , Alban Gruin , Josh Steadmon , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFy?= =?utf-8?b?bWFzb24=?= , Phillip Wood Subject: [PATCH v1 05/12] rebase -i: combine rebase--interactive.c with rebase.c Date: Wed, 17 Apr 2019 15:30:37 +0100 Message-Id: <20190417143044.17655-6-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190417143044.17655-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> <20190417143044.17655-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 e7b8122003..57a3c9caf1 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 Wed Apr 17 14:30:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10905425 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 1B7A013B5 for ; Wed, 17 Apr 2019 14:33:09 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0512528B7E for ; Wed, 17 Apr 2019 14:33:09 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0330628B8A; Wed, 17 Apr 2019 14:33: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 7E93228BB1 for ; Wed, 17 Apr 2019 14:33:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732507AbfDQOdH (ORCPT ); Wed, 17 Apr 2019 10:33:07 -0400 Received: from mail-wm1-f67.google.com ([209.85.128.67]:55290 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732476AbfDQOdG (ORCPT ); Wed, 17 Apr 2019 10:33:06 -0400 Received: by mail-wm1-f67.google.com with SMTP id c1so3655181wml.4 for ; Wed, 17 Apr 2019 07:33: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=21Qog8pZirIkeGAb1gZg7FJQ0I7Py6Ff4WG4LddQpFk=; b=p9JQlHgSzNR/efQOd0CEKN5FudZIzyl8SgbBhHqnLlVwBLKxkbx/Kgzhc5fseTGIHG 0wqM8IN/aTCQhkfw7N3l6wHlFd/e5CxYL1+7Pbjz4Ezw/XllW5ks5bU+qkZyjNuFbx9F 2T5mwdeMew2x+BjIcSWddFd/i+DL2rMRPvcHYMd3aQ6YJZpX6stCpYzye/QQbBSBuO8h KCiF7Yus/t2bBRKMdeQ28HZPMDhh3Xp57lKV37nImSnR/sPccl2u+r5DeaN7uo8jXguj jXH4naNdKb8QncfIo3XWHj2LIo5h9tJV0WlUR/3ECTaMGPIUMRAQYb4TsacTPCNPRC5S 0L9g== 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=21Qog8pZirIkeGAb1gZg7FJQ0I7Py6Ff4WG4LddQpFk=; b=ZmbYmcERhL1c8IqaATtsrRuSQZAFeVoQnknGon3H/RxptP+8Wp5bzz4TAM9eYYN+DY lGvOxjkBJZghv2PJohTEuiYruDOLyb7NH8mz/F7ENi/yY1dJGPyW09BdOUtTfISsAM2Z EInBkpNS8228GdmUs3NjIC5tN3MkiQRbCAB97mKzm8yAtAhlm2dJDAioP6kZhykQQH1M 7DA2OTmLspZhnSYNVz0X1rdRzSf+vkFqFoLADmDiQY/7w5vDdWo+6YfSx5cRn/pnp+Qc q+8w9mGUOwfOOGJbhY0i920nF1Rfp8p9x21i/WBOpfKcI29R8P6vooi0Fmhmw1cEpuV2 zktw== X-Gm-Message-State: APjAAAVbG41s6mxBdehqXnR7s2xkRsme/mmosUnAu+JAshbNC6+ALLJX GARaN+6dpkOy4fzKyCA+TshPlb9Kans= X-Google-Smtp-Source: APXvYqwUY2C3pz51L5PV+xmxF3qZ1Q3aFvTkZ77u9IgmDVECq7M8K3VSWyIc9WJE7EWGw/qfZcsvxQ== X-Received: by 2002:a1c:9c03:: with SMTP id f3mr32593362wme.67.1555511584353; Wed, 17 Apr 2019 07:33:04 -0700 (PDT) Received: from localhost.localdomain (host-92-22-21-176.as13285.net. [92.22.21.176]) by smtp.gmail.com with ESMTPSA id t17sm52127726wrr.26.2019.04.17.07.33.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Apr 2019 07:33:03 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Junio C Hamano , Elijah Newren , Duy Nguyen , Alban Gruin , Josh Steadmon , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFy?= =?utf-8?b?bWFzb24=?= , Phillip Wood Subject: [PATCH v1 06/12] rebase -i: remove duplication Date: Wed, 17 Apr 2019 15:30:38 +0100 Message-Id: <20190417143044.17655-7-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190417143044.17655-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> <20190417143044.17655-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 57a3c9caf1..610b67827b 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 Wed Apr 17 14:30:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10905431 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 A32F813B5 for ; Wed, 17 Apr 2019 14:33:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8D14F28807 for ; Wed, 17 Apr 2019 14:33:13 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8B56328B2C; Wed, 17 Apr 2019 14:33: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 4613828B67 for ; Wed, 17 Apr 2019 14:33:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732529AbfDQOdL (ORCPT ); Wed, 17 Apr 2019 10:33:11 -0400 Received: from mail-wm1-f67.google.com ([209.85.128.67]:36108 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732483AbfDQOdH (ORCPT ); Wed, 17 Apr 2019 10:33:07 -0400 Received: by mail-wm1-f67.google.com with SMTP id h18so3903628wml.1 for ; Wed, 17 Apr 2019 07:33: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=cLHWclJG2+LiBo4VnvLi4lU4hncTVSJawhWW/tPVPRo=; b=KHfm18Omgkc88NoND1JuhD0UccqHUrqwKcZhliWfzuU4OJ8eHvzDaVh7kzm0M4w0pk 7NeQlF+j7A2INspbjJvlzPwIyJz+fQ+7D1hZ3cZlkj6iilc3oWI4izEOHEiXpJMWxp+f G8dhB7kaR2znyLO4PKz3ZRThqTaa6TQbposfsHxC+CrxZ9uuvS3VXm+qd4atErjBqS6i NlGS/KKwo3DEwSaMsI7QJvwK/bxqOqGYaDl7oQsJmdlP6qW4+AYdWCQ++McHOmfdb4Re nTmElZ5EeGoV0RlyVAujtbwRdGY0NaufkJKqM6Kv7w5R90my8d0MHVJ1EShhPNPqe7Rs PzLA== 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=cLHWclJG2+LiBo4VnvLi4lU4hncTVSJawhWW/tPVPRo=; b=mL+t4EDP3mbkJo9sDX50zYkNEC2Kd9ce2hESI04ws3LEY28slKJmx61HJtjG93cG+p 2TajMmu7hhJqyIBnO2dVh+Yshm/3SUiEQhZ0F7Rqk7jqsO1MneMpCoFitxq956ez/NWS x1boDawlmfxtHx1txKHfl5b2+RAO7yhaXh7qYgNTFn7Lj0Sr+yhvRV71Z6OpLnM0GU1R SOsFasv9AyMuBZwRSPC3w281F32s/bNHYvaUdA6B6SKdPzorY19ixBARszgpeXYF9znU bVfm64LOx5AXNvwTZ3Gkq5nFKkNnIftIsKX0PR2I73ptLZbfxxn4JiiJUIcvgSmSavFv 1ooA== X-Gm-Message-State: APjAAAVhGfdMJVjFdgua596WiPSkj91I3kxkfFwpdoRwzvQzi3MzSdAX XsMTYlT87CrBpL/zZ3+HmatZV6Dz6oY= X-Google-Smtp-Source: APXvYqzbJ3DJeNSLRN5GA5Hocso2szE6r+TZxGIpq1KgkCULT25hcATROPMx4j7hXKmCeudmdQOGEw== X-Received: by 2002:a1c:6502:: with SMTP id z2mr29823983wmb.119.1555511585664; Wed, 17 Apr 2019 07:33:05 -0700 (PDT) Received: from localhost.localdomain (host-92-22-21-176.as13285.net. [92.22.21.176]) by smtp.gmail.com with ESMTPSA id t17sm52127726wrr.26.2019.04.17.07.33.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Apr 2019 07:33:05 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Junio C Hamano , Elijah Newren , Duy Nguyen , Alban Gruin , Josh Steadmon , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFy?= =?utf-8?b?bWFzb24=?= , Phillip Wood Subject: [PATCH v1 07/12] rebase -i: use struct commit when parsing options Date: Wed, 17 Apr 2019 15:30:39 +0100 Message-Id: <20190417143044.17655-8-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190417143044.17655-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> <20190417143044.17655-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 --- 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 610b67827b..06f6490ca3 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 Wed Apr 17 14:30:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10905429 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 018A114DB for ; Wed, 17 Apr 2019 14:33:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DE7B6287D3 for ; Wed, 17 Apr 2019 14:33:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D2CB028B3C; Wed, 17 Apr 2019 14:33: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 A714328B2C for ; Wed, 17 Apr 2019 14:33:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732524AbfDQOdK (ORCPT ); Wed, 17 Apr 2019 10:33:10 -0400 Received: from mail-wm1-f66.google.com ([209.85.128.66]:52270 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732476AbfDQOdJ (ORCPT ); Wed, 17 Apr 2019 10:33:09 -0400 Received: by mail-wm1-f66.google.com with SMTP id a184so3676921wma.2 for ; Wed, 17 Apr 2019 07:33: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=XMjIpNyaO5FyQdCuidnj3R1xFj9i6i3i8gEmKbtmaoU=; b=WGxJGVy5MFAzt++0VXkBW6YPbJoYKbcTf4GiUUSYUWPD7VSnotO0ZPDvlC0sNaD064 AVwwIqAgGV1Ea7OiQbTEw9KV85wdhNZ2i2y4Lkw8i4THOH4HWJuZtKUjCM5bKzjkHtMj Hz6A9oORDJP0fPhruQ22ftEb6ExN40O/vXJF4ZPokr+Bkt3KgfZ/rHNIYpMe8nUPHI6X 6Bcr8t29He/t1JNwZ21EsRhI1XgMym/PQIVoofTDbtz/Eag0THRkmQkNg3KbFJ8xeU1B MNhQlmIC3Sih1lQVvIRxKwLp2t5PQqr0Hec+hVMKra2Aiv2wUoPrRs+KywA874TtU+M7 +kog== 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=XMjIpNyaO5FyQdCuidnj3R1xFj9i6i3i8gEmKbtmaoU=; b=lm5+yohIdF4zgZ9bRd5jRJgev/83tbgln+hcwUTwyRfWu6nXFVeN4R8y07O307gIW1 qQ3CwqnrUOVLV6mX1nm9w00qHOmuqAcvNVdyfxsIdYylYT8wwfLuqSGb1zu16IavEjTw aEKMJV0tOB5MUfCieiTeh7QlDXNVfUbIwaMUFHZqQWleHMUk8NZkf5v6CC5yb1Zb2RbN yi76CeYk3n3V6F26JbOWbhwyp4MhuF7D4YvOQE8NeFDKG/b8nHgbNRqPzeHkdflNvF2J 7WlrAFsgVVjIbNIWnDPdXx30RC1CUFm1anR8siwFnm5z2nCsZzUQdO354Vz7ArE1lo9i 4jnw== X-Gm-Message-State: APjAAAWNAskpNL6PjbBHAOTfMSEs5ZbsYV7GeFrVRT4+Q5DUArEJV/0V XaGoHrXwICyB4o9dgqPeWLSZQG7S5xE= X-Google-Smtp-Source: APXvYqzBuecUrSGciT9N5FSDZhv+Vh1OUioZ/zUBgI/U4eQvxIOItDnTmRJ7IMxvfoTG3Ipp2ad35Q== X-Received: by 2002:a7b:c458:: with SMTP id l24mr30360362wmi.75.1555511586878; Wed, 17 Apr 2019 07:33:06 -0700 (PDT) Received: from localhost.localdomain (host-92-22-21-176.as13285.net. [92.22.21.176]) by smtp.gmail.com with ESMTPSA id t17sm52127726wrr.26.2019.04.17.07.33.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Apr 2019 07:33:06 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Junio C Hamano , Elijah Newren , Duy Nguyen , Alban Gruin , Josh Steadmon , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFy?= =?utf-8?b?bWFzb24=?= , Phillip Wood Subject: [PATCH v1 08/12] rebase -i: use struct object_id for squash_onto Date: Wed, 17 Apr 2019 15:30:40 +0100 Message-Id: <20190417143044.17655-9-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190417143044.17655-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> <20190417143044.17655-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 06f6490ca3..3b9da69473 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 Wed Apr 17 14:30:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10905435 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 E19DD17E6 for ; Wed, 17 Apr 2019 14:33:15 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C93B728AFB for ; Wed, 17 Apr 2019 14:33:15 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C6FDC28B52; Wed, 17 Apr 2019 14:33: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 DDC8D28B2A for ; Wed, 17 Apr 2019 14:33:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732549AbfDQOdO (ORCPT ); Wed, 17 Apr 2019 10:33:14 -0400 Received: from mail-wm1-f68.google.com ([209.85.128.68]:39797 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732511AbfDQOdL (ORCPT ); Wed, 17 Apr 2019 10:33:11 -0400 Received: by mail-wm1-f68.google.com with SMTP id n25so3867079wmk.4 for ; Wed, 17 Apr 2019 07:33:09 -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=I09xJgZceWl+/W7xugirCKE0JWWD9NuXMK6hDBGJfrc=; b=JHp1+MkvjQAmh44/Sc1gvYnZj9b4PLaCEJgxSy+xMCVgiUvq4fnC8EZvtkXoyi38d5 PVrcAd+2mxGusQP1byBsCSpm3V/Avi3RDvL91s+PlzDSkd822PXUTRIOF3UWHRoKnlNc CvPMK7JdPphxanmdeUD258CZWCqLXisWELVncDLm7liGO3onSG1TX+ceZwGpNQ/275zo KiCJODSJj7+wl+UxCJ2QmgxjTWG4sLdK+OT6qNNzED1Tjv34yw7ZOB5yLWzStvk7V1vp 7gDENIukYuKmx0NZtmQglUGZJOGcAXsdaoDVYpcF+kp3h+Hv9Oc/w3kPf7kuVAbTBRh6 oFjQ== 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=I09xJgZceWl+/W7xugirCKE0JWWD9NuXMK6hDBGJfrc=; b=h5MSKWloskXgRxmT2x+zq8cU2v6ZwrzSsBgIknS9fHQ43ZFZVn0pdsZyK7tGcPQmC7 AxM6A/vRea4p1LszyzyW9C+zvA9x5krkDqCCw+W9bNf0+MNc4TGGukJnn2JBpqZmq51S LeRSCF6GZ/5lPSONLhOxR0DcPJFQnJ/cPyuwTglBeMyON2CE5AF6m56AQhcU+JvfrP37 zr8hpDnLiFB8L/xLZlBwbYqfRor01SlomXulMWoV/FdOZ6qFkq/CFdhJcNYd5Vy11XD0 U7mWWrO8O0Q4ZL6Fw5yFcF1P16lZ5G1MkaF9xK3qihecIUkjoOUZWz3hreO7+x0jhC8K fXqQ== X-Gm-Message-State: APjAAAVqaUF/XUlxcBrF4dq0tCWDyoxCTwlIQqFJm1+ndnTPCAsyRXmB x/vKUYJWyrCnI8pxZJ3mIEwfJeYNB0M= X-Google-Smtp-Source: APXvYqzwm7C0Ae+kfeBcbGJeXh6V8BXQGR3L7aZ3hZGjHvhJ5ho9FMnO1JsucPXsjWJkAhsVPjNkUg== X-Received: by 2002:a1c:4602:: with SMTP id t2mr4343wma.120.1555511588292; Wed, 17 Apr 2019 07:33:08 -0700 (PDT) Received: from localhost.localdomain (host-92-22-21-176.as13285.net. [92.22.21.176]) by smtp.gmail.com with ESMTPSA id t17sm52127726wrr.26.2019.04.17.07.33.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Apr 2019 07:33:07 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Junio C Hamano , Elijah Newren , Duy Nguyen , Alban Gruin , Josh Steadmon , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFy?= =?utf-8?b?bWFzb24=?= , Phillip Wood Subject: [PATCH v1 09/12] rebase -i: use struct rebase_options to parse args Date: Wed, 17 Apr 2019 15:30:41 +0100 Message-Id: <20190417143044.17655-10-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190417143044.17655-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> <20190417143044.17655-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 3b9da69473..aa97d81ab8 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; + + replay.action = REPLAY_INTERACTIVE_REBASE; + sequencer_init_config(&replay); + + 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; @@ -1539,6 +1559,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 Wed Apr 17 14:30:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10905433 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 6A7F814DB for ; Wed, 17 Apr 2019 14:33:15 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5350A28AB9 for ; Wed, 17 Apr 2019 14:33:15 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 47BBE28B3C; Wed, 17 Apr 2019 14:33: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 AAF8428AFB for ; Wed, 17 Apr 2019 14:33:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732543AbfDQOdN (ORCPT ); Wed, 17 Apr 2019 10:33:13 -0400 Received: from mail-wm1-f68.google.com ([209.85.128.68]:38651 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732520AbfDQOdL (ORCPT ); Wed, 17 Apr 2019 10:33:11 -0400 Received: by mail-wm1-f68.google.com with SMTP id w15so3878326wmc.3 for ; Wed, 17 Apr 2019 07:33:10 -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=2aFIoiHn7j26pXlfTkt4mExeq7SpjgBZmILbvH4T+14=; b=pI65QbGR+nOtTRc92ZcwJTG175gIVYJ1cMt6nbu3CS9Q1/t+Z95FUywLUEHtOB0WuF NTPLFWnG7r5pOZRTNEBqhfKdFv324qxEZQl6f5+CF1RZ0k22pTTUhx522tFMyyum8gYb TUriaWVXkwFml7VVlsOPI+3B6XmU3sp9WX4L9tHfozMltemGRbcgO1RZv9jOQ71rpyxn oCLGgvsbdtjRKZIqdnQ3gfwNj0mMGwDtdD7Vb8mSD3z7pxTcHuuEzabxjsZnp4yP0bz1 f4JE9IvLJOo3wkze8dEeHodnlK/dW3L0mRW4+1UvDMoRWOmBdk+86eEYir4aoiT7hfIS XQJg== 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=2aFIoiHn7j26pXlfTkt4mExeq7SpjgBZmILbvH4T+14=; b=M3OWgRig3mT+fvzir/iS7um8tmMAK5/Mvd9fiAiVG9jkWZLFaBqPchrlheC5GtinWX QEzC1ubRBnSc2mVV1XPA6+S2OKhSdAKXw5sOKkuWHjvtC1sLcURwPDlPl6w0WEIslTwe j/+TSjqQv2IaBeZoTaZqiVx2wYI6H22azHK+5d9JQT4WZ8VoTDr0LjHcJuzFHVx2IAgV qlZdwHGYB4jtMMZYGdDt8FZY+kb63GZUzj7KptCPwRurPYJN90ksF4nIIS+EZUBlTtI1 7RMwgCWEzB/++n+oIw7mmQf9bnBaO5Vc89ZFUPjPjN+unWRk421cOvKrqEbksjwLlFBF lNbQ== X-Gm-Message-State: APjAAAVz3u3bbKQF2qXkW3jU7URcmCufr9a50k+cUlFoX92Z7/8G13vO O5n4Q6gFaB4tgnWARTm+xqdcU3VxfH0= X-Google-Smtp-Source: APXvYqzRjA2/iyUe/3i2Wz1C49mh2vcOeC/4UlKWSduG7ncUbGZo1jrCxEx7Iin5DTh0/etTaCfr4w== X-Received: by 2002:a1c:c504:: with SMTP id v4mr32551785wmf.45.1555511589526; Wed, 17 Apr 2019 07:33:09 -0700 (PDT) Received: from localhost.localdomain (host-92-22-21-176.as13285.net. [92.22.21.176]) by smtp.gmail.com with ESMTPSA id t17sm52127726wrr.26.2019.04.17.07.33.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Apr 2019 07:33:09 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Junio C Hamano , Elijah Newren , Duy Nguyen , Alban Gruin , Josh Steadmon , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFy?= =?utf-8?b?bWFzb24=?= , Phillip Wood Subject: [PATCH v1 10/12] rebase -i: use struct rebase_options in do_interactive_rebase() Date: Wed, 17 Apr 2019 15:30:42 +0100 Message-Id: <20190417143044.17655-11-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190417143044.17655-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> <20190417143044.17655-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 aa97d81ab8..277dbaadf4 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 Wed Apr 17 14:30:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10905439 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 4485A17E6 for ; Wed, 17 Apr 2019 14:33:18 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2D0AB28B67 for ; Wed, 17 Apr 2019 14:33:18 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2152A28B52; Wed, 17 Apr 2019 14:33:18 +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 7AA4F28B60 for ; Wed, 17 Apr 2019 14:33:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732553AbfDQOdP (ORCPT ); Wed, 17 Apr 2019 10:33:15 -0400 Received: from mail-wm1-f68.google.com ([209.85.128.68]:36118 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732483AbfDQOdO (ORCPT ); Wed, 17 Apr 2019 10:33:14 -0400 Received: by mail-wm1-f68.google.com with SMTP id h18so3904026wml.1 for ; Wed, 17 Apr 2019 07:33:11 -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=oxBRKvQ27Xk9sUIZnHEVJCPeVAkgflsfVxg5fYefr1s=; b=E15psLeYq4ld4bd/icBwLMrY4P7hQdmCRwhJvLaupkSCKbqB92kieo9gjzizvBvuZZ ghkWL2oiWWB42UwTx6kEazDGKqMf4B3p6QGs0GLEb5vwgJDTcxuG3cxhWJymmAjp4JOB zYZxDkEKjvYGpLRrLhgpuj3wctp7hYWGyQmNPRnv9WrWXImGpWL8GlEBhXJB3XXMsboK 5BARzRCvdxusFILe7m5NFDnGW8spDCgH1oDQQWko/QYzxyymCpllT9UoMB2IOcVQ0qO9 hyRbVYA9styIO9vlxo8yZTM1cjFLqlJscKuP2chf+E78A+AQA4TzfNCSnpOPbRbjbF7W CB2g== 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=oxBRKvQ27Xk9sUIZnHEVJCPeVAkgflsfVxg5fYefr1s=; b=pJ8ArjDg4NnwiCY6pr1lPyP/w5hrrTgkdW8dsmH1cdOu6TUYhAldhTCVmeozD3IH+J DIiD9tTcQ4BXx5Qc2/0CNndZIOgENxROHu8ao/kUo/LSsE7fSlNofdJb1lDVeO6ehnRu j3h3UQQlYUGRvxLii8Jhl5hCaLaTkXaDvONFoEsYunh/JU8jtf7c384aiTU/h9pDSOqg H/Z65cASCIU10Fxsmjz3E9tz0afyhis4VaUpUv9Ns44dsMeTE1Z+eYPG1xDsVcjJxf9Y eWiERthidaWH9mxKhQxfD5f5hzSDxfTxg/GpIsXu08GNFLeeO3hDUV5PjWHTlczYcx6L GNaw== X-Gm-Message-State: APjAAAX8AObwE8H7n5huFikzw5mQvGkVKoPCTVT3j0XZ2Z50tXfuQqPU qooOTT73fwFbCVFSXwYaf/nmO64h940= X-Google-Smtp-Source: APXvYqxSkEakMTlvMb9qI/PEw0BSzWZe4KOYZ8kOdRrXLnbuwNTojpWPvRgolReRtm9k5hfqRVMwiA== X-Received: by 2002:a1c:9c03:: with SMTP id f3mr32593757wme.67.1555511590825; Wed, 17 Apr 2019 07:33:10 -0700 (PDT) Received: from localhost.localdomain (host-92-22-21-176.as13285.net. [92.22.21.176]) by smtp.gmail.com with ESMTPSA id t17sm52127726wrr.26.2019.04.17.07.33.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Apr 2019 07:33:10 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Junio C Hamano , Elijah Newren , Duy Nguyen , Alban Gruin , Josh Steadmon , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFy?= =?utf-8?b?bWFzb24=?= , Phillip Wood Subject: [PATCH v1 11/12] rebase: use a common action enum Date: Wed, 17 Apr 2019 15:30:43 +0100 Message-Id: <20190417143044.17655-12-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190417143044.17655-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> <20190417143044.17655-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 --- builtin/rebase.c | 91 +++++++++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 43 deletions(-) diff --git a/builtin/rebase.c b/builtin/rebase.c index 277dbaadf4..0020e1ecf6 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -119,6 +119,29 @@ 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[] = { "undefined", + "continue", + "skip", + "abort", + "quit", + "edit_todo", + "show_current_patch" }; + static int add_exec_commands(struct string_list *commands) { const char *todo_file = rebase_path_todo(); @@ -347,10 +370,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 +387,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 +448,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 +486,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,22 +1437,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[] = { "undefined", - "continue", - "skip", - "abort", - "quit", - "edit_todo", - "show_current_patch" }; + enum action action = ACTION_NONE; const char *gpg_sign = NULL; struct string_list exec = STRING_LIST_INIT_NODUP; const char *rebase_merges = NULL; @@ -1599,7 +1604,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); } @@ -1608,7 +1613,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); @@ -1708,7 +1713,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 Wed Apr 17 14:30:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Phillip Wood X-Patchwork-Id: 10905437 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 BF31C13B5 for ; Wed, 17 Apr 2019 14:33:17 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A7D8A28B67 for ; Wed, 17 Apr 2019 14:33:17 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9BCED28B1D; Wed, 17 Apr 2019 14:33: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 CF4FB28B36 for ; Wed, 17 Apr 2019 14:33:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732556AbfDQOdQ (ORCPT ); Wed, 17 Apr 2019 10:33:16 -0400 Received: from mail-wr1-f67.google.com ([209.85.221.67]:40711 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732531AbfDQOdO (ORCPT ); Wed, 17 Apr 2019 10:33:14 -0400 Received: by mail-wr1-f67.google.com with SMTP id h4so32273568wre.7 for ; Wed, 17 Apr 2019 07:33:13 -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=EcJhr0DrvZq24w9u+bTcz7YvYO9BVz6q6GB6kSi/Ly0=; b=sj4PpIeKZnZS52NX2dkQyD5jJ+j85eVe6hBuAQk3o010mT6WzV8ZsMrYTn5kRc2J3M aDC6X3FtldZkhoVf80KXbJTbi5hm2sdLwd1L5gzMC1SFOpl3elCNw/Ei28cuFHOEviRP DaH1Czb6zIMq++VdQpKc2iKtH8+PYWgErIzXDUKCoyVPDe/lKEUWp6q9p3f+alINt9RP gJIo1lvgqYpmubSzplXRcjb2P0HpmZuk53MMMMI0XyYK411EQtnKY+RpqMjULFT3vU0A FYBaPUIS9Gucl9YTzZNUlwkIpnGTK+kgs1gB6RTHVZvb/SaXHNyBm1G/w/okQyKfwQHj xsYQ== 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=EcJhr0DrvZq24w9u+bTcz7YvYO9BVz6q6GB6kSi/Ly0=; b=qXkYFGdU6YdfCyb4DSG9cn0xh2c7PvkzWH1OCBY1qbK2etjNjiTtH4cyh/WClf5zFz Ke+SSJfH6d427YAHCMrAXTdR80TV/FJXRRlXYVtaM0xHS6EWt1Lplj/1yvmviTW94494 MO0WdguAb5MBkgOjT0keUG/ZODLUQQnkCZbdSWWEZE+2BFFzOVVIAo+bdqI3vNFALCjw gBQ40fFLNrpvazHTEzRGdKhc1jvJKlfcPkH9Cz/h9aQJGwRQsvkDaiZJXZgvuFRDddCY jxmJzTRudk/YyHsAcXdWkYjn7A76FNl/tZfFaKG9aLGkukaNO1gQ/DMirXS7VkSFWvye 8vHg== X-Gm-Message-State: APjAAAWCe7xt2AAe54TwKhNQbvaVbPnOsUQm1hE5EBlEYSjna13BLgMl di8GuCA9YyksREcYIXoNcV3DyIyQXV0= X-Google-Smtp-Source: APXvYqxlDCGIwsKvKGYuq9ByJpJPBVT6rpnpzHR5t/Hg4jfYcS8we5IRpeOq3i8R4a+iv+PnCLwh/A== X-Received: by 2002:a5d:4e82:: with SMTP id e2mr24612966wru.164.1555511592409; Wed, 17 Apr 2019 07:33:12 -0700 (PDT) Received: from localhost.localdomain (host-92-22-21-176.as13285.net. [92.22.21.176]) by smtp.gmail.com with ESMTPSA id t17sm52127726wrr.26.2019.04.17.07.33.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Apr 2019 07:33:11 -0700 (PDT) From: Phillip Wood To: Git Mailing List Cc: Johannes Schindelin , Junio C Hamano , Elijah Newren , Duy Nguyen , Alban Gruin , Josh Steadmon , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFy?= =?utf-8?b?bWFzb24=?= , Phillip Wood Subject: [PATCH v1 12/12] rebase -i: run without forking rebase--interactive Date: Wed, 17 Apr 2019 15:30:44 +0100 Message-Id: <20190417143044.17655-13-phillip.wood123@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190417143044.17655-1-phillip.wood123@gmail.com> References: <20190319190317.6632-1-phillip.wood123@gmail.com> <20190417143044.17655-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. Starting interactive rebases without forking makes it easy to debug the sequencer without worrying about attaching to child processes. Ævar has also reported that some of the rebase perf tests are 30% faster [1]. This patch 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. [1] https://public-inbox.org/git/87y359cfjj.fsf@evledraar.gmail.com/ 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 0020e1ecf6..cd233c6118 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -316,7 +316,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); @@ -359,6 +361,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 @@ -367,8 +440,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[] = { @@ -433,8 +504,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); @@ -444,71 +513,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) @@ -1071,7 +1080,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; @@ -1080,77 +1089,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; } @@ -2211,7 +2162,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);