summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2018-06-04 21:39:48 +0900
committerJunio C Hamano <gitster@pobox.com>2018-06-04 21:39:48 +0900
commitf635b8d17b673ffb96c0f10d11751500e1892b2a (patch)
tree41d2a0f42dfa5a060d96a12194efc49ced331633
parentc2c7d17b030646b40e6764ba34a5ebf66aee77af (diff)
parent4d36f88be7401fb4ff225557aae05a458091b24b (diff)
downloadgit-f635b8d17b673ffb96c0f10d11751500e1892b2a.tar.gz
git-f635b8d17b673ffb96c0f10d11751500e1892b2a.tar.xz
Merge branch 'jt/submodule-pull-recurse-rebase'
"git pull -recurse-submodules --rebase", when the submodule repository's history did not have anything common between ours and the upstream's, failed to execute. We need to fetch from them to continue even in such a case. * jt/submodule-pull-recurse-rebase: submodule: do not pass null OID to setup_revisions
-rw-r--r--submodule.c6
-rw-r--r--submodule.h5
-rwxr-xr-xt/t5572-pull-submodule.sh21
3 files changed, 29 insertions, 3 deletions
diff --git a/submodule.c b/submodule.c
index edc3a206d..939d6870e 100644
--- a/submodule.c
+++ b/submodule.c
@@ -1169,8 +1169,10 @@ int submodule_touches_in_range(struct object_id *excl_oid,
argv_array_push(&args, "--"); /* args[0] program name */
argv_array_push(&args, oid_to_hex(incl_oid));
- argv_array_push(&args, "--not");
- argv_array_push(&args, oid_to_hex(excl_oid));
+ if (!is_null_oid(excl_oid)) {
+ argv_array_push(&args, "--not");
+ argv_array_push(&args, oid_to_hex(excl_oid));
+ }
collect_changed_submodules(&subs, &args);
ret = subs.nr;
diff --git a/submodule.h b/submodule.h
index a2871d031..7856b8a0b 100644
--- a/submodule.h
+++ b/submodule.h
@@ -92,7 +92,10 @@ extern int bad_to_remove_submodule(const char *path, unsigned flags);
int add_submodule_odb(const char *path);
-/* Checks if there are submodule changes in a..b. */
+/*
+ * Checks if there are submodule changes in a..b. If a is the null OID,
+ * checks b and all its ancestors instead.
+ */
extern int submodule_touches_in_range(struct object_id *a,
struct object_id *b);
extern int find_unpushed_submodules(struct oid_array *commits,
diff --git a/t/t5572-pull-submodule.sh b/t/t5572-pull-submodule.sh
index 321bd37de..f916729a1 100755
--- a/t/t5572-pull-submodule.sh
+++ b/t/t5572-pull-submodule.sh
@@ -132,4 +132,25 @@ test_expect_success 'pull rebase recursing fails with conflicts' '
test_i18ngrep "locally recorded submodule modifications" err
'
+test_expect_success 'branch has no merge base with remote-tracking counterpart' '
+ rm -rf parent child &&
+
+ test_create_repo a-submodule &&
+ test_commit -C a-submodule foo &&
+
+ test_create_repo parent &&
+ git -C parent submodule add "$(pwd)/a-submodule" &&
+ git -C parent commit -m foo &&
+
+ git clone parent child &&
+
+ # Reset master so that it has no merge base with
+ # refs/remotes/origin/master.
+ OTHER=$(git -C child commit-tree -m bar \
+ $(git -C child rev-parse HEAD^{tree})) &&
+ git -C child reset --hard "$OTHER" &&
+
+ git -C child pull --recurse-submodules --rebase
+'
+
test_done