542
CONFLICT_SUBMODULE_HISTORY_NOT_AVAILABLE,
543
CONFLICT_SUBMODULE_MAY_HAVE_REWINDS,
544
CONFLICT_SUBMODULE_NULL_MERGE_BASE,
545
+ CONFLICT_SUBMODULE_CORRUPT,
546
547
/* Keep this entry _last_ in the list */
548
NB_CONFLICT_TYPES,
595
[CONFLICT_SUBMODULE_MAY_HAVE_REWINDS] =
596
"CONFLICT (submodule may have rewinds)",
597
[CONFLICT_SUBMODULE_NULL_MERGE_BASE] =
597
- "CONFLICT (submodule lacks merge base)"
598
+ "CONFLICT (submodule lacks merge base)",
599
+ [CONFLICT_SUBMODULE_CORRUPT] =
600
+ "CONFLICT (submodule corrupt)"
601
};
602
603
struct logical_conflict_info {
1711
die("revision walk setup failed");
1712
while ((commit = get_revision(&revs)) != NULL) {
1713
struct object *o = &(commit->object);
1711
- if (repo_in_merge_bases(repo, b, commit))
1714
+ int ret = repo_in_merge_bases(repo, b, commit);
1715
+
1716
+ if (ret < 0) {
1717
+ object_array_clear(&merges);
1718
+ release_revisions(&revs);
1719
+ return ret;
1720
+ }
1721
+ if (ret > 0)
1722
add_object_array(o, NULL, &merges);
1723
}
1724
reset_revision_walk();
1733
contains_another = 0;
1734
for (j = 0; j < merges.nr; j++) {
1735
struct commit *m2 = (struct commit *) merges.objects[j].item;
1726
- if (i != j && repo_in_merge_bases(repo, m2, m1)) {
1727
- contains_another = 1;
1728
- break;
1736
+ if (i != j) {
1737
+ int ret = repo_in_merge_bases(repo, m2, m1);
1738
+ if (ret < 0) {
1739
+ object_array_clear(&merges);
1740
+ release_revisions(&revs);
1741
+ return ret;
1742
+ }
1743
+ if (ret > 0) {
1744
+ contains_another = 1;
1745
+ break;
1746
+ }
1747
}
1748
}
1749
1765
{
1766
struct repository subrepo;
1767
struct strbuf sb = STRBUF_INIT;
1750
- int ret = 0;
1768
+ int ret = 0, ret2;
1769
struct commit *commit_o, *commit_a, *commit_b;
1770
int parent_count;
1771
struct object_array merges;
1812
}
1813
1814
/* check whether both changes are forward */
1797
- if (!repo_in_merge_bases(&subrepo, commit_o, commit_a) ||
1798
- !repo_in_merge_bases(&subrepo, commit_o, commit_b)) {
1815
+ ret2 = repo_in_merge_bases(&subrepo, commit_o, commit_a);
1816
+ if (ret2 < 0) {
1817
+ path_msg(opt, CONFLICT_SUBMODULE_CORRUPT, 0,
1818
+ path, NULL, NULL, NULL,
1819
+ _("Failed to merge submodule %s "
1820
+ "(repository corrupt)"),
1821
+ path);
1822
+ goto cleanup;
1823
+ }
1824
+ if (ret2 > 0)
1825
+ ret2 = repo_in_merge_bases(&subrepo, commit_o, commit_b);
1826
+ if (ret2 < 0) {
1827
+ path_msg(opt, CONFLICT_SUBMODULE_CORRUPT, 0,
1828
+ path, NULL, NULL, NULL,
1829
+ _("Failed to merge submodule %s "
1830
+ "(repository corrupt)"),
1831
+ path);
1832
+ goto cleanup;
1833
+ }
1834
+ if (!ret2) {
1835
path_msg(opt, CONFLICT_SUBMODULE_MAY_HAVE_REWINDS, 0,
1836
path, NULL, NULL, NULL,
1837
_("Failed to merge submodule %s "
1841
}
1842
1843
/* Case #1: a is contained in b or vice versa */
1808
- if (repo_in_merge_bases(&subrepo, commit_a, commit_b)) {
1844
+ ret2 = repo_in_merge_bases(&subrepo, commit_a, commit_b);
1845
+ if (ret2 < 0) {
1846
+ path_msg(opt, CONFLICT_SUBMODULE_CORRUPT, 0,
1847
+ path, NULL, NULL, NULL,
1848
+ _("Failed to merge submodule %s "
1849
+ "(repository corrupt)"),
1850
+ path);
1851
+ goto cleanup;
1852
+ }
1853
+ if (ret2 > 0) {
1854
oidcpy(result, b);
1855
path_msg(opt, INFO_SUBMODULE_FAST_FORWARDING, 1,
1856
path, NULL, NULL, NULL,
1859
ret = 1;
1860
goto cleanup;
1861
}
1817
- if (repo_in_merge_bases(&subrepo, commit_b, commit_a)) {
1862
+ ret2 = repo_in_merge_bases(&subrepo, commit_b, commit_a);
1863
+ if (ret2 < 0) {
1864
+ path_msg(opt, CONFLICT_SUBMODULE_CORRUPT, 0,
1865
+ path, NULL, NULL, NULL,
1866
+ _("Failed to merge submodule %s "
1867
+ "(repository corrupt)"),
1868
+ path);
1869
+ goto cleanup;
1870
+ }
1871
+ if (ret2 > 0) {
1872
oidcpy(result, a);
1873
path_msg(opt, INFO_SUBMODULE_FAST_FORWARDING, 1,
1874
path, NULL, NULL, NULL,
1893
parent_count = find_first_merges(&subrepo, path, commit_a, commit_b,
1894
&merges);
1895
switch (parent_count) {
1896
+ case -1:
1897
+ path_msg(opt, CONFLICT_SUBMODULE_CORRUPT, 0,
1898
+ path, NULL, NULL, NULL,
1899
+ _("Failed to merge submodule %s "
1900
+ "(repository corrupt)"),
1901
+ path);
1902
+ break;
1903
case 0:
1904
path_msg(opt, CONFLICT_SUBMODULE_FAILED_TO_MERGE, 0,
1905
path, NULL, NULL, NULL,