git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] pull: optionally rebase submodules

From
BWBrandon Williams <bmwill@google.com>
Date
May 12, 2017, 17:30 UTC
Message-ID
<20170512173039.GC98586@google.com>
In-Reply-To
<702FD1AB212642BA80B1ADF27D75916B@PhilipOakley>
On 05/11, Philip Oakley wrote:
Show 19 quoted lines
> 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!
Show 192 quoted lines
> --
> 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
Previous: Philip Oakley
Message 5 of 5 in “pull: optionally rebase submodules”
  1. pull: optionally rebase submodulesBrandon Williams, May 11, 2017
  2. Stefan BellerMay 11, 2017
  3. Brandon WilliamsMay 15, 2017
  4. Philip OakleyMay 11, 2017
  5. Brandon WilliamsMay 12, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.