@@ -18,8 +18,19 @@ limitations under the License.
1818
1919mod common;
2020
21- use prollytree:: diff:: { IgnoreConflictsResolver , TakeDestinationResolver , TakeSourceResolver } ;
22- use prollytree:: git:: versioned_store:: GitVersionedKvStore ;
21+ use prollytree:: diff:: {
22+ ConflictResolver , IgnoreConflictsResolver , MergeConflict , MergeResult , TakeDestinationResolver ,
23+ TakeSourceResolver ,
24+ } ;
25+ use prollytree:: git:: versioned_store:: { GitVersionedKvStore , InMemoryVersionedKvStore } ;
26+
27+ struct LeaveUnresolved ;
28+
29+ impl ConflictResolver for LeaveUnresolved {
30+ fn resolve_conflict ( & self , _conflict : & MergeConflict ) -> Option < MergeResult > {
31+ None
32+ }
33+ }
2334
2435// ---------------------------------------------------------------------------
2536// Helper: set up divergent branches with a conflict on a shared key
@@ -232,3 +243,36 @@ fn test_mixed_adds_deletes_conflicts() {
232243
233244 std:: mem:: forget ( _temp) ;
234245}
246+
247+ #[ test]
248+ fn test_delete_modify_merge_surfaces_conflict_and_preserves_destination ( ) {
249+ let ( _temp, dataset) = common:: setup_repo_and_dataset ( ) ;
250+ let mut store = InMemoryVersionedKvStore :: < 32 > :: init ( & dataset) . expect ( "init" ) ;
251+
252+ store. insert ( b"K" . to_vec ( ) , b"v0" . to_vec ( ) ) . unwrap ( ) ;
253+ store. commit ( "base" ) . unwrap ( ) ;
254+ store. create_branch ( "feature" ) . unwrap ( ) ;
255+ store. checkout_generic ( "main" ) . unwrap ( ) ;
256+
257+ store. insert ( b"K" . to_vec ( ) , b"v1" . to_vec ( ) ) . unwrap ( ) ;
258+ store. commit ( "main modifies K" ) . unwrap ( ) ;
259+
260+ store. checkout_generic ( "feature" ) . unwrap ( ) ;
261+ assert ! ( store. delete( b"K" ) . unwrap( ) ) ;
262+ store. commit ( "feature deletes K" ) . unwrap ( ) ;
263+
264+ store. checkout_generic ( "main" ) . unwrap ( ) ;
265+ let result = store. merge_generic ( "feature" , & LeaveUnresolved ) ;
266+
267+ assert ! (
268+ result. is_err( ) ,
269+ "delete/modify merge must surface an unresolved conflict"
270+ ) ;
271+ assert_eq ! (
272+ store. get( b"K" ) ,
273+ Some ( b"v1" . to_vec( ) ) ,
274+ "destination modification must not be silently deleted"
275+ ) ;
276+
277+ std:: mem:: forget ( _temp) ;
278+ }
0 commit comments