import tempfile
import subprocess
import os
from prollytree import VersionedKvStore, ConflictResolution, MergeConflict
def setup_git_repo(tmpdir):
subprocess.run(['git', 'init'], cwd=tmpdir, check=True, capture_output=True)
subprocess.run(['git', 'config', 'user.name', 'Test'], cwd=tmpdir, check=True, capture_output=True)
subprocess.run(['git', 'config', 'user.email', 'test@test.com'], cwd=tmpdir, check=True, capture_output=True)
data_dir = os.path.join(tmpdir, 'data')
os.makedirs(data_dir, exist_ok=True)
return data_dir
def test_merge_no_conflicts():
with tempfile.TemporaryDirectory() as tmpdir:
data_dir = setup_git_repo(tmpdir)
store = VersionedKvStore(data_dir)
store.insert(b"shared", b"initial_value")
store.insert(b"key1", b"value1")
store.commit("Initial commit")
store.create_branch("feature")
store.insert(b"feature_key", b"feature_value")
store.update(b"shared", b"feature_value")
store.commit("Feature branch changes")
store.checkout("main")
store.insert(b"main_key", b"main_value")
store.commit("Main branch changes")
merge_commit = store.merge("feature")
assert merge_commit is not None
assert store.get(b"shared") == b"feature_value" assert store.get(b"feature_key") == b"feature_value" assert store.get(b"main_key") == b"main_value" assert store.get(b"key1") == b"value1"
def test_merge_with_conflicts_ignore_all():
with tempfile.TemporaryDirectory() as tmpdir:
data_dir = setup_git_repo(tmpdir)
store = VersionedKvStore(data_dir)
store.insert(b"conflict_key", b"initial_value")
store.commit("Initial commit")
store.create_branch("feature")
store.update(b"conflict_key", b"feature_value")
store.commit("Feature change")
store.checkout("main")
store.update(b"conflict_key", b"main_value")
store.commit("Main change")
merge_commit = store.merge("feature", ConflictResolution.IgnoreAll)
assert merge_commit is not None
assert store.get(b"conflict_key") == b"main_value"
def test_merge_with_conflicts_take_source():
with tempfile.TemporaryDirectory() as tmpdir:
data_dir = setup_git_repo(tmpdir)
store = VersionedKvStore(data_dir)
store.insert(b"conflict_key", b"initial_value")
store.commit("Initial commit")
store.create_branch("feature")
store.update(b"conflict_key", b"feature_value")
store.commit("Feature change")
store.checkout("main")
store.update(b"conflict_key", b"main_value")
store.commit("Main change")
merge_commit = store.merge("feature", ConflictResolution.TakeSource)
assert merge_commit is not None
assert store.get(b"conflict_key") == b"feature_value"
def test_try_merge_basic():
with tempfile.TemporaryDirectory() as tmpdir:
data_dir = setup_git_repo(tmpdir)
store = VersionedKvStore(data_dir)
store.insert(b"conflict_key", b"initial_value")
store.commit("Initial commit")
store.create_branch("feature")
store.update(b"conflict_key", b"feature_value")
store.commit("Feature change")
store.checkout("main")
store.update(b"conflict_key", b"main_value")
store.commit("Main change")
success, conflicts = store.try_merge("feature")
assert success is False
assert len(conflicts) > 0
assert store.get(b"conflict_key") == b"main_value"
if __name__ == "__main__":
try:
test_merge_no_conflicts()
print("✅ test_merge_no_conflicts passed")
test_merge_with_conflicts_ignore_all()
print("✅ test_merge_with_conflicts_ignore_all passed")
test_merge_with_conflicts_take_source()
print("✅ test_merge_with_conflicts_take_source passed")
test_try_merge_basic()
print("✅ test_try_merge_basic passed")
print("\n🎉 All merge tests passed!")
except Exception as e:
print(f"❌ Test failed: {e}")
import traceback
traceback.print_exc()