Skip to content

Commit 4d36f88

Browse files
jonathantanmygitster
authored andcommitted
submodule: do not pass null OID to setup_revisions
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 <[email protected]> Reviewed-by: Stefan Beller <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 468165c commit 4d36f88

File tree

3 files changed

+29
-3
lines changed

3 files changed

+29
-3
lines changed

submodule.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1166,8 +1166,10 @@ int submodule_touches_in_range(struct object_id *excl_oid,
11661166

11671167
argv_array_push(&args, "--"); /* args[0] program name */
11681168
argv_array_push(&args, oid_to_hex(incl_oid));
1169-
argv_array_push(&args, "--not");
1170-
argv_array_push(&args, oid_to_hex(excl_oid));
1169+
if (!is_null_oid(excl_oid)) {
1170+
argv_array_push(&args, "--not");
1171+
argv_array_push(&args, oid_to_hex(excl_oid));
1172+
}
11711173

11721174
collect_changed_submodules(&subs, &args);
11731175
ret = subs.nr;

submodule.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,10 @@ extern int merge_submodule(struct object_id *result, const char *path,
9494
const struct object_id *a,
9595
const struct object_id *b, int search);
9696

97-
/* Checks if there are submodule changes in a..b. */
97+
/*
98+
* Checks if there are submodule changes in a..b. If a is the null OID,
99+
* checks b and all its ancestors instead.
100+
*/
98101
extern int submodule_touches_in_range(struct object_id *a,
99102
struct object_id *b);
100103
extern int find_unpushed_submodules(struct oid_array *commits,

t/t5572-pull-submodule.sh

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,25 @@ test_expect_success 'pull rebase recursing fails with conflicts' '
132132
test_i18ngrep "locally recorded submodule modifications" err
133133
'
134134

135+
test_expect_success 'branch has no merge base with remote-tracking counterpart' '
136+
rm -rf parent child &&
137+
138+
test_create_repo a-submodule &&
139+
test_commit -C a-submodule foo &&
140+
141+
test_create_repo parent &&
142+
git -C parent submodule add "$(pwd)/a-submodule" &&
143+
git -C parent commit -m foo &&
144+
145+
git clone parent child &&
146+
147+
# Reset master so that it has no merge base with
148+
# refs/remotes/origin/master.
149+
OTHER=$(git -C child commit-tree -m bar \
150+
$(git -C child rev-parse HEAD^{tree})) &&
151+
git -C child reset --hard "$OTHER" &&
152+
153+
git -C child pull --recurse-submodules --rebase
154+
'
155+
135156
test_done

0 commit comments

Comments
 (0)