Skip to content

Commit 8098878

Browse files
bradkinggitster
authored andcommitted
submodule: Search for merges only at end of recursive merge
The submodule merge search is not useful during virtual merges because the results cannot be used automatically. Furthermore any suggestions made by the search may apply to commits different than HEAD:sub and MERGE_HEAD:sub, thus confusing the user. Skip searching for submodule merges during a virtual merge such as that between B and C while merging the heads of: B---BC / \ / A X \ / \ C---CB Run the search only when the recursion level is zero (!o->call_depth). This fixes known breakage tested in t7405-submodule-merge. Signed-off-by: Brad King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 72251b7 commit 8098878

File tree

4 files changed

+11
-5
lines changed

4 files changed

+11
-5
lines changed

merge-recursive.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -946,8 +946,10 @@ static struct merge_file_info merge_file_1(struct merge_options *o,
946946
free(result_buf.ptr);
947947
result.clean = (merge_status == 0);
948948
} else if (S_ISGITLINK(a->mode)) {
949-
result.clean = merge_submodule(result.sha, one->path, one->sha1,
950-
a->sha1, b->sha1);
949+
result.clean = merge_submodule(result.sha,
950+
one->path, one->sha1,
951+
a->sha1, b->sha1,
952+
!o->call_depth);
951953
} else if (S_ISLNK(a->mode)) {
952954
hashcpy(result.sha, a->sha1);
953955

submodule.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -794,7 +794,7 @@ static void print_commit(struct commit *commit)
794794

795795
int merge_submodule(unsigned char result[20], const char *path,
796796
const unsigned char base[20], const unsigned char a[20],
797-
const unsigned char b[20])
797+
const unsigned char b[20], int search)
798798
{
799799
struct commit *commit_base, *commit_a, *commit_b;
800800
int parent_count;
@@ -849,6 +849,10 @@ int merge_submodule(unsigned char result[20], const char *path,
849849
* user needs to confirm the resolution.
850850
*/
851851

852+
/* Skip the search if makes no sense to the calling context. */
853+
if (!search)
854+
return 0;
855+
852856
/* find commit which merges them */
853857
parent_count = find_first_merges(&merges, path, commit_a, commit_b);
854858
switch (parent_count) {

submodule.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ int fetch_populated_submodules(int num_options, const char **options,
2828
int quiet);
2929
unsigned is_submodule_modified(const char *path, int ignore_untracked);
3030
int merge_submodule(unsigned char result[20], const char *path, const unsigned char base[20],
31-
const unsigned char a[20], const unsigned char b[20]);
31+
const unsigned char a[20], const unsigned char b[20], int search);
3232
int check_submodule_needs_pushing(unsigned char new_sha1[20], const char *remotes_name);
3333

3434
#endif

t/t7405-submodule-merge.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ test_expect_success 'setup for recursive merge with submodule' '
269269
'
270270

271271
# merge should leave submodule unmerged in index
272-
test_expect_failure 'recursive merge with submodule' '
272+
test_expect_success 'recursive merge with submodule' '
273273
(cd merge-recursive &&
274274
test_must_fail git merge top-bc &&
275275
echo "160000 $(git rev-parse top-cb:sub) 2 sub" > expect2 &&

0 commit comments

Comments
 (0)