@@ -34,6 +34,17 @@ fn get_exclusive_tree(
34
34
Ok ( merged_tree. into ( ) )
35
35
}
36
36
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
+
37
48
/// Takes two commits and determines if one is a subset of or equal to the other.
38
49
///
39
50
/// ### Performance
@@ -46,10 +57,14 @@ fn is_subset(
46
57
superset_id : gix:: ObjectId ,
47
58
subset_id : gix:: ObjectId ,
48
59
common_base_id : gix:: ObjectId ,
49
- ) -> Result < bool > {
60
+ ) -> Result < SubsetKind > {
50
61
let exclusive_superset = get_exclusive_tree ( repository, superset_id, common_base_id) ?;
51
62
let exclusive_subset = get_exclusive_tree ( repository, subset_id, common_base_id) ?;
52
63
64
+ if exclusive_superset == exclusive_subset {
65
+ return Ok ( SubsetKind :: Equal ) ;
66
+ }
67
+
53
68
let common_base = repository. find_commit ( common_base_id) ?;
54
69
55
70
let ( options, unresolved) = repository. merge_options_fail_fast ( ) ?;
@@ -61,10 +76,12 @@ fn is_subset(
61
76
options,
62
77
) ?;
63
78
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 )
66
83
} else {
67
- Ok ( false )
84
+ Ok ( SubsetKind :: Subset )
68
85
}
69
86
}
70
87
@@ -134,6 +151,8 @@ mod test {
134
151
mod is_subset {
135
152
use gitbutler_oxidize:: OidExt ;
136
153
154
+ use crate :: commit_ops:: SubsetKind ;
155
+
137
156
use super :: super :: is_subset;
138
157
use super :: * ;
139
158
@@ -147,13 +166,16 @@ mod test {
147
166
& [ ( "foo.txt" , "bar" ) , ( "bar.txt" , "baz" ) ] ,
148
167
) ;
149
168
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
155
178
)
156
- . unwrap( ) )
157
179
}
158
180
159
181
#[ test]
@@ -170,21 +192,27 @@ mod test {
170
192
& [ ( "foo.txt" , "bar" ) , ( "bar.txt" , "baz" ) ] ,
171
193
) ;
172
194
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
+ ) ;
180
205
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
+ ) ;
188
216
}
189
217
190
218
#[ test]
@@ -221,21 +249,27 @@ mod test {
221
249
// identify that the changes each commit introduced are infact
222
250
// a superset/subset of each other
223
251
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
+ ) ;
231
262
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
+ ) ;
239
273
}
240
274
}
241
275
}
0 commit comments