Skip to content

Commit

Permalink
submodule: do not pass null OID to setup_revisions
Browse files Browse the repository at this point in the history
If "git pull --recurse-submodules --rebase" is invoked when the current
branch and its corresponding remote-tracking branch have no merge base,
a "bad object" fatal error occurs. This issue was introduced with commit
a6d7eb2 ("pull: optionally rebase submodules (remote submodule
changes only)", 2017-06-23), which also introduced this feature.

This is because cmd_pull() in builtin/pull.c thus invokes
submodule_touches_in_range() with a null OID as the first parameter.
Ensure that this case works, and document what happens in this case.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Reviewed-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
jonathantanmy authored and gitster committed May 25, 2018
1 parent 468165c commit 4d36f88
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 3 deletions.
6 changes: 4 additions & 2 deletions submodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -1166,8 +1166,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;
Expand Down
5 changes: 4 additions & 1 deletion submodule.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,10 @@ extern int merge_submodule(struct object_id *result, const char *path,
const struct object_id *a,
const struct object_id *b, int search);

/* 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,
Expand Down
21 changes: 21 additions & 0 deletions t/t5572-pull-submodule.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 4d36f88

Please sign in to comment.