diff options
author | Junio C Hamano <gitster@pobox.com> | 2018-06-04 21:39:48 +0900 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-06-04 21:39:48 +0900 |
commit | f635b8d17b673ffb96c0f10d11751500e1892b2a (patch) | |
tree | 41d2a0f42dfa5a060d96a12194efc49ced331633 | |
parent | A bit more topics before -rc1 (diff) | |
parent | submodule: do not pass null OID to setup_revisions (diff) | |
download | tgif-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.c | 6 | ||||
-rw-r--r-- | submodule.h | 5 | ||||
-rwxr-xr-x | t/t5572-pull-submodule.sh | 21 |
3 files changed, 29 insertions, 3 deletions
diff --git a/submodule.c b/submodule.c index edc3a206d7..939d6870ec 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 a2871d0312..7856b8a0b3 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 321bd37deb..f916729a12 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 |