Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(cli): fix mergetool not working with OOBuckets #3023

Merged
merged 3 commits into from
Jul 18, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 7 additions & 3 deletions renku/infrastructure/git_merger.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,13 @@
"""Merge strategies."""

import os
import shutil
from json import JSONDecodeError
from pathlib import Path
from tempfile import mkdtemp
from typing import List, NamedTuple, Optional, Union, cast

from BTrees.OOBTree import BTree, TreeSet
from BTrees.OOBTree import BTree, Bucket, TreeSet
from deepdiff import DeepDiff
from persistent import Persistent
from persistent.list import PersistentList
Expand Down Expand Up @@ -86,6 +87,7 @@ def merge(self, local: Path, remote: Path, base: Path) -> None:
# NOTE: cleanup worktrees
for entry in self.remote_entries:
client.repository.remove_worktree(entry.path)
shutil.rmtree(entry.path, ignore_errors=True)

if not merged:
raise errors.MetadataMergeError("Couldn't merge metadata: remote object not found in merge branches.")
Expand Down Expand Up @@ -128,7 +130,7 @@ def merge_objects(self, local: Persistent, remote: Persistent, base: Optional[Pe
"""Merge two database objects."""
if type(local) != type(remote):
raise errors.MetadataMergeError(f"Cannot merge {local} and {remote}: disparate types.")
if isinstance(local, (BTree, Index)):
if isinstance(local, (BTree, Index, Bucket)):
return self.merge_btrees(local, remote)
elif isinstance(local, TreeSet):
return self.merge_treesets(local, remote)
Expand All @@ -141,7 +143,9 @@ def merge_objects(self, local: Persistent, remote: Persistent, base: Optional[Pe
f"Cannot merge {local} and {remote}: type not supported for automated merge."
)

def merge_btrees(self, local: Union[BTree, Index], remote: Union[BTree, Index]) -> Union[BTree, Index]:
def merge_btrees(
self, local: Union[BTree, Index, Bucket], remote: Union[BTree, Index, Bucket]
) -> Union[BTree, Index, Bucket]:
"""Merge two BTrees."""
local_key_ids = {k: getattr(v, "_p_oid", None) for k, v in local.items()}
remote_key_ids = {k: getattr(v, "_p_oid", None) for k, v in remote.items()}
Expand Down