Skip to content

Commit 1aaeab5

Browse files
committed
merge: Handle not having common ancesstors
This is an important case in GitJournal.
1 parent a46fdef commit 1aaeab5

File tree

2 files changed

+21
-22
lines changed

2 files changed

+21
-22
lines changed

lib/exceptions.dart

-2
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,6 @@ class GitMergeTooManyBases extends GitException {}
155155

156156
class GitMergeOnHashNotAllowed extends GitException {}
157157

158-
class GitMergeNoCommonAncestor extends GitException {}
159-
160158
class GitNotImplemented extends GitException {}
161159

162160
class GitRepoExists implements GitException {}

lib/merge.dart

+21-20
Original file line numberDiff line numberDiff line change
@@ -36,29 +36,29 @@ extension Merge on GitRepository {
3636
if (bases.length > 1) {
3737
throw GitMergeTooManyBases();
3838
}
39-
if (bases.isEmpty) {
40-
throw GitMergeNoCommonAncestor();
41-
}
42-
var baseHash = bases.first.hash;
39+
if (bases.isNotEmpty) {
40+
var baseHash = bases.first.hash;
4341

44-
// up to date
45-
if (baseHash == commitB.hash) {
46-
return;
47-
}
42+
// up to date
43+
if (baseHash == commitB.hash) {
44+
return;
45+
}
4846

49-
// fastforward
50-
if (baseHash == headCommit.hash) {
51-
var branchNameRef = headRef.target;
52-
assert(branchNameRef.isBranch());
47+
// fastforward
48+
if (baseHash == headCommit.hash) {
49+
var branchNameRef = headRef.target;
50+
assert(branchNameRef.isBranch());
5351

54-
var newRef = HashReference(branchNameRef, commitB.hash);
55-
refStorage.saveRef(newRef);
52+
var newRef = HashReference(branchNameRef, commitB.hash);
53+
refStorage.saveRef(newRef);
5654

57-
checkout('.');
58-
return;
55+
checkout('.');
56+
return;
57+
}
5958
}
6059

61-
var baseTree = objStorage.readTree(bases.first.treeHash);
60+
var baseTree =
61+
bases.isNotEmpty ? objStorage.readTree(bases.first.treeHash) : null;
6262
var headTree = objStorage.readTree(headCommit.treeHash);
6363
var bTree = objStorage.readTree(commitB.treeHash);
6464

@@ -79,13 +79,13 @@ extension Merge on GitRepository {
7979
}
8080

8181
/// throws exceptions
82-
GitHash _combineTrees(GitTree a, GitTree b, GitTree base) {
82+
GitHash _combineTrees(GitTree a, GitTree b, GitTree? base) {
8383
// Get all the paths
8484
var names = a.entries.map((e) => e.name).toSet();
8585
names.addAll(b.entries.map((e) => e.name));
8686

8787
var entries = <GitTreeEntry>[];
88-
for (var baseEntry in base.entries) {
88+
for (var baseEntry in base?.entries ?? <GitTreeEntry>[]) {
8989
var name = baseEntry.name;
9090
var aIndex = a.entries.indexWhere((e) => e.name == name);
9191
var bIndex = b.entries.indexWhere((e) => e.name == name);
@@ -118,7 +118,8 @@ extension Merge on GitRepository {
118118
var name = entry.name;
119119

120120
// If the entry was already in the base
121-
var baseIndex = base.entries.indexWhere((e) => e.name == name);
121+
var baseIndex =
122+
base == null ? -1 : base.entries.indexWhere((e) => e.name == name);
122123
if (baseIndex != -1) {
123124
continue;
124125
}

0 commit comments

Comments
 (0)