From: Brandon Williams <bmwill@google.com>
To: Philip Oakley <philipoakley@iee.org>
Cc: git@vger.kernel.org, sbeller@google.com
Subject: Re: [PATCH] pull: optionally rebase submodules
Date: Fri, 12 May 2017 10:30:39 -0700 [thread overview]
Message-ID: <20170512173039.GC98586@google.com> (raw)
In-Reply-To: <702FD1AB212642BA80B1ADF27D75916B@PhilipOakley>
On 05/11, Philip Oakley wrote:
> From: "Brandon Williams" <bmwill@google.com>
> >Teach pull to optionally update submodules when '--recurse-submodules'
> >is provided. This will teach pull to run 'submodule update --rebase'
> >when the '--recurse-submodules' and '--rebase' flags are given.
> >
> >Signed-off-by: Brandon Williams <bmwill@google.com>
> >---
> >
> >Pull is already a shortcut for running fetch followed by a
> >merge/rebase, so why
> >not have it be a shortcut for running 'submodule update --rebase' when the
> >recurse flag is given!
> >
> >builtin/pull.c | 30 ++++++++++++++-
> >t/t5572-pull-submodule.sh | 97
> >+++++++++++++++++++++++++++++++++++++++++++++++
>
> Shouldn't this also touch the documentation to say that this has
> been taught?
Yes it should, thanks for reminding me!
> --
> Philip
>
>
> >2 files changed, 125 insertions(+), 2 deletions(-)
> >
> >diff --git a/builtin/pull.c b/builtin/pull.c
> >index dd1a4a94e..d73d654e6 100644
> >--- a/builtin/pull.c
> >+++ b/builtin/pull.c
> >@@ -77,6 +77,7 @@ static const char * const pull_usage[] = {
> >/* Shared options */
> >static int opt_verbosity;
> >static char *opt_progress;
> >+static int recurse_submodules;
> >
> >/* Options passed to git-merge or git-rebase */
> >static enum rebase_type opt_rebase = -1;
> >@@ -532,6 +533,17 @@ static int pull_into_void(const struct
> >object_id *merge_head,
> > return 0;
> >}
> >
> >+static int update_submodules(void)
> >+{
> >+ struct child_process cp = CHILD_PROCESS_INIT;
> >+ cp.git_cmd = 1;
> >+
> >+ argv_array_pushl(&cp.args, "submodule", "update", "--recursive", NULL);
> >+ argv_array_push(&cp.args, "--rebase");
> >+
> >+ return run_command(&cp);
> >+}
> >+
> >/**
> > * Runs git-merge, returning its exit status.
> > */
> >@@ -816,6 +828,14 @@ int cmd_pull(int argc, const char **argv,
> >const char *prefix)
> > oidclr(&rebase_fork_point);
> > }
> >
> >+ if (opt_recurse_submodules &&
> >+ !strcmp(opt_recurse_submodules, "--recurse-submodules")) {
> >+ recurse_submodules = 1;
> >+
> >+ if (!opt_rebase)
> >+ die(_("--recurse-submodules is only valid with --rebase"));
> >+ }
> >+
> > if (run_fetch(repo, refspecs))
> > return 1;
> >
> >@@ -862,6 +882,7 @@ int cmd_pull(int argc, const char **argv,
> >const char *prefix)
> > die(_("Cannot rebase onto multiple branches."));
> >
> > if (opt_rebase) {
> >+ int ret = 0;
> > struct commit_list *list = NULL;
> > struct commit *merge_head, *head;
> >
> >@@ -871,9 +892,14 @@ int cmd_pull(int argc, const char **argv,
> >const char *prefix)
> > if (is_descendant_of(merge_head, list)) {
> > /* we can fast-forward this without invoking rebase */
> > opt_ff = "--ff-only";
> >- return run_merge();
> >+ ret = run_merge();
> > }
> >- return run_rebase(&curr_head, merge_heads.oid, &rebase_fork_point);
> >+ ret = run_rebase(&curr_head, merge_heads.oid, &rebase_fork_point);
> >+
> >+ if (!ret && recurse_submodules)
> >+ ret = update_submodules();
> >+
> >+ return ret;
> > } else {
> > return run_merge();
> > }
> >diff --git a/t/t5572-pull-submodule.sh b/t/t5572-pull-submodule.sh
> >index accfa5cc0..234a22315 100755
> >--- a/t/t5572-pull-submodule.sh
> >+++ b/t/t5572-pull-submodule.sh
> >@@ -42,4 +42,101 @@
> >KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1
> >KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1
> >test_submodule_switch "git_pull_noff"
> >
> >+test_expect_success 'pull --recurse-submodule setup' '
> >+ git init child &&
> >+ (
> >+ cd child &&
> >+ echo "bar" >file &&
> >+ git add file &&
> >+ git commit -m "initial commit"
> >+ ) &&
> >+ git init parent &&
> >+ (
> >+ cd parent &&
> >+ echo "foo" >file &&
> >+ git add file &&
> >+ git commit -m "Initial commit" &&
> >+ git submodule add ../child sub &&
> >+ git commit -m "add submodule"
> >+ ) &&
> >+ git clone --recurse-submodule parent super &&
> >+ git -C super/sub checkout master
> >+'
> >+
> >+test_expect_success 'pull recursive fails without --rebase' '
> >+ test_must_fail git -C super pull --recurse-submodules 2>actual &&
> >+ test_i18ngrep "recurse-submodules is only valid with --rebase" actual
> >+'
> >+
> >+test_expect_success 'pull basic recurse' '
> >+ (
> >+ cd child &&
> >+ echo "foobar" >>file &&
> >+ git add file &&
> >+ git commit -m "update file"
> >+ ) &&
> >+ (
> >+ cd parent &&
> >+ git -C sub pull &&
> >+ git add sub &&
> >+ git commit -m "update submodule"
> >+ ) &&
> >+
> >+ git -C parent rev-parse master >expect_super &&
> >+ git -C child rev-parse master >expect_sub &&
> >+
> >+ git -C super pull --rebase --recurse-submodules &&
> >+ git -C super rev-parse master >actual_super &&
> >+ git -C super/sub rev-parse master >actual_sub &&
> >+ test_cmp expect_super actual_super &&
> >+ test_cmp expect_sub actual_sub
> >+'
> >+
> >+test_expect_success 'pull basic rebase recurse' '
> >+ (
> >+ cd child &&
> >+ echo "a" >file &&
> >+ git add file &&
> >+ git commit -m "update file"
> >+ ) &&
> >+ (
> >+ cd parent &&
> >+ git -C sub pull &&
> >+ git add sub &&
> >+ git commit -m "update submodule"
> >+ ) &&
> >+ (
> >+ cd super/sub &&
> >+ echo "b" >file2 &&
> >+ git add file2 &&
> >+ git commit -m "add file2"
> >+ ) &&
> >+
> >+ git -C parent rev-parse master >expect_super &&
> >+ git -C child rev-parse master >expect_sub &&
> >+
> >+ git -C super pull --rebase --recurse-submodules &&
> >+ git -C super rev-parse master >actual_super &&
> >+ git -C super/sub rev-parse master^ >actual_sub &&
> >+ test_cmp expect_super actual_super &&
> >+ test_cmp expect_sub actual_sub &&
> >+
> >+ echo "a" >expect &&
> >+ test_cmp expect super/sub/file &&
> >+ echo "b" >expect &&
> >+ test_cmp expect super/sub/file2
> >+'
> >+
> >+test_expect_success 'pull rebase recursing fails with conflicts' '
> >+ git -C super/sub reset --hard HEAD^^ &&
> >+ git -C super reset --hard HEAD^ &&
> >+ (
> >+ cd super/sub &&
> >+ echo "b" >file &&
> >+ git add file &&
> >+ git commit -m "update file"
> >+ ) &&
> >+ test_must_fail git -C super pull --rebase --recurse-submodules
> >+'
> >+
> >test_done
> >--
> >2.13.0.rc2.291.g57267f2277-goog
> >
> >
>
--
Brandon Williams
prev parent reply other threads:[~2017-05-12 17:33 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-11 17:24 [PATCH] pull: optionally rebase submodules Brandon Williams
2017-05-11 18:12 ` Stefan Beller
2017-05-15 23:09 ` Brandon Williams
2017-05-11 20:00 ` Philip Oakley
2017-05-12 17:30 ` Brandon Williams [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170512173039.GC98586@google.com \
--to=bmwill@google.com \
--cc=git@vger.kernel.org \
--cc=philipoakley@iee.org \
--cc=sbeller@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.