Skip to content

Commit 883e655

Browse files
authored
Merge pull request #295 from MerginMaps/copy_conflict_checksums
Adapt copy conflict changes
2 parents 3dd6637 + dda0e3b commit 883e655

3 files changed

Lines changed: 36 additions & 23 deletions

File tree

mergin/client_pull.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -543,9 +543,10 @@ def pull_project_async(mc, directory) -> Optional[PullJob]:
543543
# find corresponding local delta item
544544
local_item = next((i for i in local_delta if i.path == change.path), None)
545545
local_item_change = local_item.type if local_item else None
546+
local_item_checksum = local_item.checksum if local_item else None
546547

547548
# compare server and local changes to decide what to do in pull
548-
pull_action_type = mp.get_pull_action(change.type, local_item_change)
549+
pull_action_type = mp.get_pull_action(change.type, local_item_change, change.checksum, local_item_checksum)
549550
if not pull_action_type:
550551
continue # no action needed
551552

mergin/merginproject.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,11 @@ def get_pull_delta(self, server_files: List[Dict], server_version: str) -> Proje
504504
return ProjectDelta(to_version=server_version, changes=result)
505505

506506
def get_pull_action(
507-
self, server_change: DeltaChangeType, local_change: Optional[DeltaChangeType] = None
507+
self,
508+
server_change: DeltaChangeType,
509+
local_change: Optional[DeltaChangeType] = None,
510+
server_checksum: Optional[str] = None,
511+
local_checksum: Optional[str] = None,
508512
) -> Optional[PullActionType]:
509513
"""
510514
Determine pull actions for files by comparing server_change and local_change.
@@ -520,11 +524,17 @@ def get_pull_action(
520524
self.log.critical(f"Invalid combination of changes: server {server_change}, local {local_change}")
521525
raise ClientError(f"Invalid combination of changes: server {server_change}, local {local_change}")
522526

527+
checksum_conflict = server_checksum != local_checksum if server_checksum and local_checksum else False
528+
523529
pull_action_map = {
524530
(DeltaChangeType.CREATE, None): PullActionType.COPY,
525-
(DeltaChangeType.CREATE, DeltaChangeType.CREATE): PullActionType.COPY_CONFLICT,
531+
(DeltaChangeType.CREATE, DeltaChangeType.CREATE): (
532+
PullActionType.COPY_CONFLICT if checksum_conflict else None
533+
),
526534
(DeltaChangeType.UPDATE, None): PullActionType.COPY,
527-
(DeltaChangeType.UPDATE, DeltaChangeType.UPDATE): PullActionType.COPY_CONFLICT,
535+
(DeltaChangeType.UPDATE, DeltaChangeType.UPDATE): (
536+
PullActionType.COPY_CONFLICT if checksum_conflict else None
537+
),
528538
(DeltaChangeType.UPDATE, DeltaChangeType.DELETE): PullActionType.COPY,
529539
(DeltaChangeType.UPDATE, DeltaChangeType.UPDATE_DIFF): PullActionType.COPY_CONFLICT,
530540
(DeltaChangeType.UPDATE, DeltaChangeType.CREATE): PullActionType.COPY_CONFLICT,

mergin/test/test_mergin_project.py

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -82,27 +82,29 @@ def test_get_pull_action_valid():
8282
with tempfile.TemporaryDirectory() as tmp_dir:
8383
mp = MerginProject(tmp_dir)
8484

85-
# Test cases: (server_change, local_change, expected_action)
85+
# Test cases: (server_change, local_change, server_checksum, local_checksum, expected_action)
8686
test_cases = [
87-
(DeltaChangeType.CREATE, None, PullActionType.COPY),
88-
(DeltaChangeType.CREATE, DeltaChangeType.CREATE, PullActionType.COPY_CONFLICT),
89-
(DeltaChangeType.UPDATE, None, PullActionType.COPY),
90-
(DeltaChangeType.UPDATE, DeltaChangeType.UPDATE, PullActionType.COPY_CONFLICT),
91-
(DeltaChangeType.UPDATE, DeltaChangeType.DELETE, PullActionType.COPY),
92-
(DeltaChangeType.UPDATE, DeltaChangeType.UPDATE_DIFF, PullActionType.COPY_CONFLICT),
93-
(DeltaChangeType.UPDATE, DeltaChangeType.CREATE, PullActionType.COPY_CONFLICT),
94-
(DeltaChangeType.UPDATE_DIFF, None, PullActionType.APPLY_DIFF_NO_REBASE),
95-
(DeltaChangeType.UPDATE_DIFF, DeltaChangeType.UPDATE, PullActionType.COPY_CONFLICT),
96-
(DeltaChangeType.UPDATE_DIFF, DeltaChangeType.DELETE, PullActionType.COPY),
97-
(DeltaChangeType.UPDATE_DIFF, DeltaChangeType.UPDATE_DIFF, PullActionType.APPLY_DIFF_REBASE),
98-
(DeltaChangeType.DELETE, None, PullActionType.DELETE),
99-
(DeltaChangeType.DELETE, DeltaChangeType.UPDATE, None),
100-
(DeltaChangeType.DELETE, DeltaChangeType.DELETE, None),
101-
(DeltaChangeType.DELETE, DeltaChangeType.UPDATE_DIFF, None),
87+
(DeltaChangeType.CREATE, None, None, None, PullActionType.COPY),
88+
(DeltaChangeType.CREATE, DeltaChangeType.CREATE, "c1", "c2", PullActionType.COPY_CONFLICT),
89+
(DeltaChangeType.CREATE, DeltaChangeType.CREATE, "c1", "c1", None),
90+
(DeltaChangeType.UPDATE, None, None, None, PullActionType.COPY),
91+
(DeltaChangeType.UPDATE, DeltaChangeType.UPDATE, "c1", "c2", PullActionType.COPY_CONFLICT),
92+
(DeltaChangeType.UPDATE, DeltaChangeType.UPDATE, "c1", "c1", None),
93+
(DeltaChangeType.UPDATE, DeltaChangeType.DELETE, "c1", "c2", PullActionType.COPY),
94+
(DeltaChangeType.UPDATE, DeltaChangeType.UPDATE_DIFF, "c1", "c2", PullActionType.COPY_CONFLICT),
95+
(DeltaChangeType.UPDATE, DeltaChangeType.CREATE, "c1", "c2", PullActionType.COPY_CONFLICT),
96+
(DeltaChangeType.UPDATE_DIFF, None, "c1", "c2", PullActionType.APPLY_DIFF_NO_REBASE),
97+
(DeltaChangeType.UPDATE_DIFF, DeltaChangeType.UPDATE, "c1", "c2", PullActionType.COPY_CONFLICT),
98+
(DeltaChangeType.UPDATE_DIFF, DeltaChangeType.DELETE, "c1", "c2", PullActionType.COPY),
99+
(DeltaChangeType.UPDATE_DIFF, DeltaChangeType.UPDATE_DIFF, "c1", "c2", PullActionType.APPLY_DIFF_REBASE),
100+
(DeltaChangeType.DELETE, None, "c1", "c2", PullActionType.DELETE),
101+
(DeltaChangeType.DELETE, DeltaChangeType.UPDATE, None, None, None),
102+
(DeltaChangeType.DELETE, DeltaChangeType.DELETE, None, None, None),
103+
(DeltaChangeType.DELETE, DeltaChangeType.UPDATE_DIFF, None, None, None),
102104
]
103105

104-
for server_change, local_change, expected_action in test_cases:
105-
action = mp.get_pull_action(server_change, local_change)
106+
for server_change, local_change, server_checksum, local_checksum, expected_action in test_cases:
107+
action = mp.get_pull_action(server_change, local_change, server_checksum, local_checksum)
106108
assert (
107109
action == expected_action
108110
), f"Failed for {server_change}, {local_change}. Expected {expected_action}, got {action}"
@@ -123,7 +125,7 @@ def test_get_pull_action_fatal():
123125

124126
for server_change, local_change in fatal_cases:
125127
with pytest.raises(ClientError, match="Invalid combination of changes"):
126-
mp.get_pull_action(server_change, local_change)
128+
mp.get_pull_action(server_change, local_change, None, None)
127129

128130

129131
def test_get_pull_delta():

0 commit comments

Comments
 (0)