Skip to content

Commit 9de4abc

Browse files
committed
Use an enum result to better describe subset
1 parent 5614029 commit 9de4abc

File tree

1 file changed

+72
-38
lines changed

1 file changed

+72
-38
lines changed

crates/gitbutler-branch-actions/src/commit_ops.rs

+72-38
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,17 @@ fn get_exclusive_tree(
3434
Ok(merged_tree.into())
3535
}
3636

37+
#[derive(PartialEq, Debug)]
38+
enum SubsetKind {
39+
/// The subset_id is not equal to or a subset of superset_id.
40+
/// superset_id MAY still be a strict subset of subset_id
41+
NotSubset,
42+
/// The subset_id is a strict subset of superset_id
43+
Subset,
44+
/// The subset_id and superset_id are equivalent commits
45+
Equal,
46+
}
47+
3748
/// Takes two commits and determines if one is a subset of or equal to the other.
3849
///
3950
/// ### Performance
@@ -46,10 +57,14 @@ fn is_subset(
4657
superset_id: gix::ObjectId,
4758
subset_id: gix::ObjectId,
4859
common_base_id: gix::ObjectId,
49-
) -> Result<bool> {
60+
) -> Result<SubsetKind> {
5061
let exclusive_superset = get_exclusive_tree(repository, superset_id, common_base_id)?;
5162
let exclusive_subset = get_exclusive_tree(repository, subset_id, common_base_id)?;
5263

64+
if exclusive_superset == exclusive_subset {
65+
return Ok(SubsetKind::Equal);
66+
}
67+
5368
let common_base = repository.find_commit(common_base_id)?;
5469

5570
let (options, unresolved) = repository.merge_options_fail_fast()?;
@@ -61,10 +76,12 @@ fn is_subset(
6176
options,
6277
)?;
6378

64-
if !merged_exclusives.has_unresolved_conflicts(unresolved) {
65-
Ok(exclusive_superset == merged_exclusives.tree.write()?)
79+
if merged_exclusives.has_unresolved_conflicts(unresolved)
80+
|| exclusive_superset != merged_exclusives.tree.write()?
81+
{
82+
Ok(SubsetKind::NotSubset)
6683
} else {
67-
Ok(false)
84+
Ok(SubsetKind::Subset)
6885
}
6986
}
7087

@@ -134,6 +151,8 @@ mod test {
134151
mod is_subset {
135152
use gitbutler_oxidize::OidExt;
136153

154+
use crate::commit_ops::SubsetKind;
155+
137156
use super::super::is_subset;
138157
use super::*;
139158

@@ -147,13 +166,16 @@ mod test {
147166
&[("foo.txt", "bar"), ("bar.txt", "baz")],
148167
);
149168

150-
assert!(is_subset(
151-
&test_repository.gix_repository(),
152-
second_commit.id().to_gix(),
153-
second_commit.id().to_gix(),
154-
base_commit.id().to_gix()
169+
assert_eq!(
170+
is_subset(
171+
&test_repository.gix_repository(),
172+
second_commit.id().to_gix(),
173+
second_commit.id().to_gix(),
174+
base_commit.id().to_gix()
175+
)
176+
.unwrap(),
177+
SubsetKind::Equal
155178
)
156-
.unwrap())
157179
}
158180

159181
#[test]
@@ -170,21 +192,27 @@ mod test {
170192
&[("foo.txt", "bar"), ("bar.txt", "baz")],
171193
);
172194

173-
assert!(is_subset(
174-
&test_repository.gix_repository(),
175-
superset.id().to_gix(),
176-
subset.id().to_gix(),
177-
base_commit.id().to_gix()
178-
)
179-
.unwrap());
195+
assert_eq!(
196+
is_subset(
197+
&test_repository.gix_repository(),
198+
superset.id().to_gix(),
199+
subset.id().to_gix(),
200+
base_commit.id().to_gix()
201+
)
202+
.unwrap(),
203+
SubsetKind::Subset
204+
);
180205

181-
assert!(!is_subset(
182-
&test_repository.gix_repository(),
183-
subset.id().to_gix(),
184-
superset.id().to_gix(),
185-
base_commit.id().to_gix()
186-
)
187-
.unwrap());
206+
assert_eq!(
207+
is_subset(
208+
&test_repository.gix_repository(),
209+
subset.id().to_gix(),
210+
superset.id().to_gix(),
211+
base_commit.id().to_gix()
212+
)
213+
.unwrap(),
214+
SubsetKind::NotSubset
215+
);
188216
}
189217

190218
#[test]
@@ -221,21 +249,27 @@ mod test {
221249
// identify that the changes each commit introduced are infact
222250
// a superset/subset of each other
223251

224-
assert!(is_subset(
225-
&test_repository.gix_repository(),
226-
superset.id().to_gix(),
227-
subset.id().to_gix(),
228-
base_commit.id().to_gix()
229-
)
230-
.unwrap());
252+
assert_eq!(
253+
is_subset(
254+
&test_repository.gix_repository(),
255+
superset.id().to_gix(),
256+
subset.id().to_gix(),
257+
base_commit.id().to_gix()
258+
)
259+
.unwrap(),
260+
SubsetKind::Subset
261+
);
231262

232-
assert!(!is_subset(
233-
&test_repository.gix_repository(),
234-
subset.id().to_gix(),
235-
superset.id().to_gix(),
236-
base_commit.id().to_gix()
237-
)
238-
.unwrap());
263+
assert_eq!(
264+
is_subset(
265+
&test_repository.gix_repository(),
266+
subset.id().to_gix(),
267+
superset.id().to_gix(),
268+
base_commit.id().to_gix()
269+
)
270+
.unwrap(),
271+
SubsetKind::NotSubset
272+
);
239273
}
240274
}
241275
}

0 commit comments

Comments
 (0)