Fix remote-priority merge postprocessing.
This commit is contained in:
@@ -251,6 +251,58 @@ def _postprocess_local_priority_merge(
|
|||||||
|
|
||||||
return merged
|
return merged
|
||||||
|
|
||||||
|
def _postprocess_remote_priority_merge(
|
||||||
|
merged_lines: list[str],
|
||||||
|
base_paths: Sequence[str],
|
||||||
|
local_paths: Sequence[str],
|
||||||
|
remote_paths: Sequence[str],
|
||||||
|
) -> list[str]:
|
||||||
|
|
||||||
|
base_counter = Counter(base_paths)
|
||||||
|
local_counter = Counter(local_paths)
|
||||||
|
remote_counter = Counter(remote_paths)
|
||||||
|
|
||||||
|
remote_base_tracks: list[str] = [
|
||||||
|
track for track in remote_paths if base_counter[track] > 0
|
||||||
|
]
|
||||||
|
|
||||||
|
target_new_counter: dict[str, int] = {}
|
||||||
|
all_tracks = set(local_counter.keys()) | set(remote_counter.keys())
|
||||||
|
for track in all_tracks:
|
||||||
|
if base_counter[track] > 0:
|
||||||
|
continue
|
||||||
|
r_cnt = remote_counter.get(track, 0)
|
||||||
|
l_cnt = local_counter.get(track, 0)
|
||||||
|
if r_cnt > 0:
|
||||||
|
target_new_counter[track] = r_cnt
|
||||||
|
elif l_cnt > 0:
|
||||||
|
target_new_counter[track] = l_cnt
|
||||||
|
|
||||||
|
new_tracks: list[str] = []
|
||||||
|
used_counter: Counter[str] = Counter()
|
||||||
|
|
||||||
|
for track in remote_paths:
|
||||||
|
if base_counter[track] > 0:
|
||||||
|
continue
|
||||||
|
if track not in target_new_counter:
|
||||||
|
continue
|
||||||
|
if used_counter[track] >= target_new_counter[track]:
|
||||||
|
continue
|
||||||
|
new_tracks.append(track)
|
||||||
|
used_counter[track] += 1
|
||||||
|
|
||||||
|
for track in local_paths:
|
||||||
|
if base_counter[track] > 0:
|
||||||
|
continue
|
||||||
|
if track not in target_new_counter:
|
||||||
|
continue
|
||||||
|
if used_counter[track] >= target_new_counter[track]:
|
||||||
|
continue
|
||||||
|
new_tracks.append(track)
|
||||||
|
used_counter[track] += 1
|
||||||
|
|
||||||
|
return remote_base_tracks + new_tracks
|
||||||
|
|
||||||
|
|
||||||
def merge_playlists(
|
def merge_playlists(
|
||||||
base_text: str,
|
base_text: str,
|
||||||
@@ -294,6 +346,11 @@ def merge_playlists(
|
|||||||
merged_lines, base_paths, local_paths, remote_paths
|
merged_lines, base_paths, local_paths, remote_paths
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if strategy == ConflictResolutionStrategy.REMOTE_PRIORITY:
|
||||||
|
merged_lines = _postprocess_remote_priority_merge(
|
||||||
|
merged_lines, base_paths, local_paths, remote_paths
|
||||||
|
)
|
||||||
|
|
||||||
_write_results(merged_lines, test_folder)
|
_write_results(merged_lines, test_folder)
|
||||||
|
|
||||||
return MergeResult(merged_paths=merged_lines, conflicts=conflicts)
|
return MergeResult(merged_paths=merged_lines, conflicts=conflicts)
|
||||||
|
|||||||
Reference in New Issue
Block a user