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 a6d7eb2c7a ("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>
Jonathan Tan committed
May 24, 2018 at 13:47 UTC
4d36f88be7401fb4ff225557aae05a458091b24b
3 files changed
+29
-3
submodule.c
+4
-2
@@ -1166,8 +1166,10 @@ int submodule_touches_in_range(struct object_id *excl_oid,
1166
1167
argv_array_push(&args, "--"); /* args[0] program name */
1168
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
+ }
1173
1174
collect_changed_submodules(&subs, &args);
1175
ret = subs.nr;
submodule.h
+4
-1
@@ -94,7 +94,10 @@ extern int merge_submodule(struct object_id *result, const char *path,
94
const struct object_id *a,
95
const struct object_id *b, int search);
96
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
+ */
101
extern int submodule_touches_in_range(struct object_id *a,
102
struct object_id *b);
103
extern int find_unpushed_submodules(struct oid_array *commits,
t/t5572-pull-submodule.sh
+21
@@ -132,4 +132,25 @@ test_expect_success 'pull rebase recursing fails with conflicts' '
132
test_i18ngrep "locally recorded submodule modifications" err
133
'
134
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
+
156
test_done