summaryrefslogtreecommitdiff
path: root/subvertpy/tests/test_wc.py
diff options
context:
space:
mode:
Diffstat (limited to 'subvertpy/tests/test_wc.py')
-rw-r--r--subvertpy/tests/test_wc.py364
1 files changed, 305 insertions, 59 deletions
diff --git a/subvertpy/tests/test_wc.py b/subvertpy/tests/test_wc.py
index 940cfc6e..a501aee1 100644
--- a/subvertpy/tests/test_wc.py
+++ b/subvertpy/tests/test_wc.py
@@ -15,12 +15,13 @@
"""Subversion ra library tests."""
+import hashlib
from io import BytesIO
import os
-from unittest import SkipTest
import subvertpy
from subvertpy import (
+ NODE_DIR,
NODE_FILE,
wc,
)
@@ -42,16 +43,16 @@ class VersionTest(TestCase):
self.assertTrue(wc.api_version() <= wc.version())
-class WorkingCopyTests(TestCase):
+class AdmTests(TestCase):
def test_get_adm_dir(self):
- self.assertEqual(b".svn", wc.get_adm_dir())
+ self.assertEqual(".svn", wc.get_adm_dir())
def test_set_adm_dir(self):
old_dir_name = wc.get_adm_dir()
try:
wc.set_adm_dir(b"_svn")
- self.assertEqual(b"_svn", wc.get_adm_dir())
+ self.assertEqual("_svn", wc.get_adm_dir())
finally:
wc.set_adm_dir(old_dir_name)
@@ -68,11 +69,11 @@ class WorkingCopyTests(TestCase):
if wc.api_version() < (1, 5):
self.assertRaises(
NotImplementedError, wc.match_ignore_list, "foo", [])
- return # Skip test
- self.assertTrue(wc.match_ignore_list("foo", ["f*"]))
- self.assertTrue(wc.match_ignore_list("foo", ["foo"]))
- self.assertFalse(wc.match_ignore_list("foo", []))
- self.assertFalse(wc.match_ignore_list("foo", ["bar"]))
+ else:
+ self.assertTrue(wc.match_ignore_list("foo", ["f*"]))
+ self.assertTrue(wc.match_ignore_list("foo", ["foo"]))
+ self.assertFalse(wc.match_ignore_list("foo", []))
+ self.assertFalse(wc.match_ignore_list("foo", ["bar"]))
class WcTests(SubversionTestCase):
@@ -88,52 +89,64 @@ class WcTests(SubversionTestCase):
self.assertEqual((0, 0, 0, 0), ret)
-class AdmTests(SubversionTestCase):
-
- def setUp(self):
- super(AdmTests, self).setUp()
- if getattr(wc, "WorkingCopy", None) is None:
- raise SkipTest(
- "Subversion 1.7 API for WorkingCopy not yet supported")
+class AdmObjTests(SubversionTestCase):
def test_has_binary_prop(self):
self.make_client("repos", "checkout")
self.build_tree({"checkout/bar": b"\x00 \x01"})
self.client_add('checkout/bar')
- adm = wc.WorkingCopy(None, "checkout")
- path = os.path.join(self.test_dir, "checkout/bar")
- self.assertFalse(adm.has_binary_prop(path))
+ self.client_set_prop('checkout/bar', 'svn:mime-type', 'text/bar')
+ adm = wc.Adm(None, "checkout")
+ self.assertFalse(adm.has_binary_prop("checkout/bar"))
adm.close()
+ def test_with(self):
+ self.make_client("repos", "checkout")
+ self.build_tree({"checkout/bar": b"\x00 \x01"})
+ self.client_add('checkout/bar')
+ self.client_set_prop('checkout/bar', 'svn:mime-type', 'text/bar')
+ with wc.Adm(None, "checkout") as adm:
+ self.assertFalse(adm.has_binary_prop("checkout/bar"))
+
def test_get_ancestry(self):
repos_url = self.make_client("repos", "checkout")
self.build_tree({"checkout/bar": b"\x00 \x01"})
self.client_add('checkout/bar')
- adm = wc.WorkingCopy(None, "checkout")
+ adm = wc.Adm(None, "checkout")
self.assertEqual(("%s/bar" % repos_url, 0),
adm.get_ancestry("checkout/bar"))
adm.close()
def test_maybe_set_repos_root(self):
repos_url = self.make_client("repos", "checkout")
- adm = wc.WorkingCopy(None, "checkout")
+ adm = wc.Adm(None, "checkout")
adm.maybe_set_repos_root(
os.path.join(self.test_dir, "checkout"), repos_url)
adm.close()
def test_add_repos_file(self):
self.make_client("repos", "checkout")
- adm = wc.WorkingCopy(None, "checkout", True)
- adm.add_repos_file("checkout/bar", BytesIO(b"basecontents"),
- BytesIO(b"contents"), {}, {})
- self.assertEqual(b"basecontents",
- wc.get_pristine_contents("checkout/bar").read())
+ adm = wc.Adm(None, "checkout", True)
+ if wc.api_version() < (1, 6):
+ self.assertRaises(
+ NotImplementedError,
+ adm.add_repos_file, "checkout/bar",
+ BytesIO(b"basecontents"), BytesIO(b"contents"), {}, {})
+ else:
+ adm.add_repos_file("checkout/bar", BytesIO(b"basecontents"),
+ BytesIO(b"contents"), {}, {})
+ if wc.api_version() >= (1, 7):
+ self.skipTest("TODO: doesn't yet work with svn >= 1.7")
+ self.assertEqual(b"basecontents",
+ wc.get_pristine_contents("checkout/bar").read())
def test_mark_missing_deleted(self):
+ if wc.api_version() >= (1, 7):
+ self.skipTest("TODO: doesn't yet work with svn >= 1.7")
self.make_client("repos", "checkout")
self.build_tree({"checkout/bar": b"\x00 \x01"})
self.client_add('checkout/bar')
- adm = wc.WorkingCopy(None, "checkout", True)
+ adm = wc.Adm(None, "checkout", True)
os.remove("checkout/bar")
adm.mark_missing_deleted("checkout/bar")
self.assertFalse(os.path.exists("checkout/bar"))
@@ -142,25 +155,27 @@ class AdmTests(SubversionTestCase):
self.make_client("repos", "checkout")
self.build_tree({"checkout/bar": b"\x00 \x01"})
self.client_add('checkout/bar')
- adm = wc.WorkingCopy(None, "checkout", True)
+ adm = wc.Adm(None, "checkout", True)
adm.remove_from_revision_control("bar")
self.assertTrue(os.path.exists("checkout/bar"))
def test_relocate(self):
self.make_client("repos", "checkout")
- adm = wc.WorkingCopy(None, "checkout", True)
+ adm = wc.Adm(None, "checkout", True)
adm.relocate("checkout", "file://", "http://")
def test_translated_stream(self):
+ self.skipTest("TODO: doesn't yet work")
self.make_client("repos", "checkout")
self.build_tree({"checkout/bar": b"My id: $Id$"})
self.client_add('checkout/bar')
self.client_set_prop("checkout/bar", "svn:keywords", "Id\n")
self.client_commit("checkout", "foo")
- adm = wc.WorkingCopy(None, "checkout", True)
- path = os.path.join(self.test_dir, "checkout/bar")
- stream = adm.translated_stream(path, path, wc.TRANSLATE_TO_NF)
- self.assertTrue(stream.read().startswith(b"My id: $Id: "))
+ adm = wc.Adm(None, "checkout", True)
+ stream = adm.translated_stream(
+ 'checkout/bar', 'checkout/bar', wc.TRANSLATE_TO_NF)
+ body = stream.read()
+ self.assertTrue(body.startswith(b"My id: $Id: "), body)
def test_text_modified(self):
self.make_client("repos", "checkout")
@@ -168,7 +183,7 @@ class AdmTests(SubversionTestCase):
self.client_add('checkout/bar')
self.client_set_prop("checkout/bar", "svn:keywords", "Id\n")
self.client_commit("checkout", "foo")
- adm = wc.WorkingCopy(None, "checkout")
+ adm = wc.Adm(None, "checkout")
self.assertFalse(adm.text_modified("checkout/bar"))
self.build_tree({"checkout/bar": b"gambon"})
self.assertTrue(adm.text_modified("checkout/bar", True))
@@ -179,7 +194,7 @@ class AdmTests(SubversionTestCase):
self.client_add('checkout/bar')
self.client_set_prop("checkout/bar", "svn:keywords", "Id\n")
self.client_commit("checkout", "foo")
- adm = wc.WorkingCopy(None, "checkout", True)
+ adm = wc.Adm(None, "checkout", True)
self.assertFalse(adm.props_modified("checkout/bar"))
adm.prop_set("aprop", "avalue", "checkout/bar")
self.assertTrue(adm.props_modified("checkout/bar"))
@@ -188,37 +203,35 @@ class AdmTests(SubversionTestCase):
self.make_client("repos", "checkout")
self.build_tree({"checkout/bar": b"file"})
self.client_add('checkout/bar')
- adm = wc.WorkingCopy(None, "checkout", True)
+ adm = wc.Adm(None, "checkout", True)
adm.prop_set("aprop", "avalue", "checkout/bar")
- self.assertEqual(adm.prop_get("aprop", "checkout/bar"), "avalue")
+ self.assertEqual(adm.prop_get("aprop", "checkout/bar"), b"avalue")
adm.prop_set("aprop", None, "checkout/bar")
self.assertEqual(adm.prop_get("aprop", "checkout/bar"), None)
def test_committed_queue(self):
- if getattr(wc, "CommittedQueue", None) is None:
- raise SkipTest("CommittedQueue not available")
cq = wc.CommittedQueue()
self.make_client("repos", "checkout")
- adm = wc.WorkingCopy(None, "checkout", True)
+ adm = wc.Adm(None, "checkout", True)
adm.process_committed_queue(cq, 1, "2010-05-31T08:49:22.430000Z",
"jelmer")
def test_entry_not_found(self):
self.make_client("repos", "checkout")
- adm = wc.WorkingCopy(None, "checkout")
+ adm = wc.Adm(None, "checkout")
self.assertRaises(KeyError, adm.entry, "bar")
def test_entry(self):
self.make_client("repos", "checkout")
self.build_tree({"checkout/bar": b"\x00 \x01"})
self.client_add('checkout/bar')
- adm = wc.WorkingCopy(None, "checkout")
+ adm = wc.Adm(None, "checkout")
entry = adm.entry("checkout/bar")
self.assertEqual("bar", entry.name)
self.assertEqual(NODE_FILE, entry.kind)
self.assertEqual(0, entry.revision)
self.client_commit("checkout", "msg")
- adm = wc.WorkingCopy(None, "checkout")
+ adm = wc.Adm(None, "checkout")
entry = adm.entry("checkout/bar")
self.assertEqual("bar", entry.name)
self.assertEqual(NODE_FILE, entry.kind)
@@ -233,7 +246,7 @@ class AdmTests(SubversionTestCase):
self.make_client("repos", ".")
self.build_tree({"bar": None})
self.client_add('bar')
- adm = wc.WorkingCopy(None, ".")
+ adm = wc.Adm(None, ".")
self.assertTrue(adm.is_wc_root(self.test_dir))
self.assertFalse(adm.is_wc_root(os.path.join(self.test_dir, "bar")))
@@ -241,23 +254,33 @@ class AdmTests(SubversionTestCase):
self.make_client("repos", "checkout")
self.build_tree({"checkout/bar": b"text"})
self.client_add('checkout/bar')
- adm = wc.WorkingCopy(None, "checkout")
- self.assertEqual(wc.STATUS_ADDED, adm.status('bar').status)
+ adm = wc.Adm(None, "checkout")
+ self.assertEqual(
+ wc.STATUS_ADDED,
+ adm.status('checkout/bar').status)
self.client_commit("checkout", "foo")
- adm = wc.WorkingCopy(None, "checkout")
- self.assertEqual(wc.STATUS_NORMAL, adm.status('bar').status)
+ adm = wc.Adm(None, "checkout")
+ self.assertEqual(
+ wc.STATUS_NORMAL,
+ adm.status('checkout/bar').status)
def test_transmit_text_deltas(self):
+ if wc.api_version() >= (1, 7):
+ self.skipTest("TODO: doesn't yet work with svn >= 1.7")
self.make_client("repos", ".")
self.build_tree({"bar": b"blala"})
self.client_add('bar')
- adm = wc.WorkingCopy(None, ".", True)
+ adm = wc.Adm(None, ".", True)
class Editor(object):
"""Editor"""
def __init__(self):
self._windows = []
+ self._prop = {}
+
+ def change_prop(self, name, value):
+ self._prop[name] = value
def apply_textdelta(self, checksum):
def window_handler(window):
@@ -267,47 +290,120 @@ class AdmTests(SubversionTestCase):
def close(self):
pass
editor = Editor()
- (tmpfile, digest) = adm.transmit_text_deltas("bar", True, editor)
+ (tmpfile, md5_digest) = adm.transmit_text_deltas("bar", True, editor)
self.assertEqual(editor._windows,
[(0, 0, 5, 0, [(2, 0, 5)], b'blala'), None])
self.assertIsInstance(tmpfile, str)
- self.assertEqual(16, len(digest))
+ self.assertEqual(16, len(md5_digest))
+ self.assertEqual(hashlib.md5(b'blala').digest(), md5_digest)
bar = adm.entry("bar")
self.assertEqual(-1, bar.cmt_rev)
self.assertEqual(0, bar.revision)
+ self.assertIn(bar.checksum, (None, hashlib.md5(b'blala').hexdigest()))
cq = wc.CommittedQueue()
- cq.queue("bar", adm)
+ cq.queue("bar", adm, wcprop_changes=editor._prop,
+ md5_digest=md5_digest)
adm.process_committed_queue(cq, 1, "2010-05-31T08:49:22.430000Z",
"jelmer")
bar = adm.entry("bar")
self.assertEqual("bar", bar.name)
self.assertEqual(NODE_FILE, bar.kind)
self.assertEqual(wc.SCHEDULE_NORMAL, bar.schedule)
- self.assertIs(None, bar.checksum)
+ self.assertIn(bar.checksum, (None, hashlib.md5(b'blala').hexdigest()))
self.assertEqual(1, bar.cmt_rev)
self.assertEqual(1, bar.revision)
def test_process_committed_queue(self):
+ if wc.api_version() >= (1, 7):
+ self.skipTest("TODO: doesn't yet work with svn >= 1.7")
self.make_client("repos", "checkout")
- self.build_tree({"checkout/bar": b"la"})
+ self.build_tree({"checkout/bar": b"blala"})
self.client_add('checkout/bar')
- adm = wc.WorkingCopy(None, "checkout", True)
+ adm = wc.Adm(None, "checkout", True)
+
+ class Editor(object):
+ """Editor"""
+
+ def __init__(self):
+ self._windows = []
+ self._prop = {}
+
+ def change_prop(self, name, value):
+ self._prop[name] = value
+
+ def apply_textdelta(self, checksum):
+ def window_handler(window):
+ self._windows.append(window)
+ return window_handler
+
+ def close(self):
+ pass
+
+ editor = Editor()
+ (tmpfile, md5_digest) = adm.transmit_text_deltas(
+ "checkout/bar", True, editor)
+ self.assertEqual(editor._windows,
+ [(0, 0, 5, 0, [(2, 0, 5)], b'blala'), None])
+ self.assertIsInstance(tmpfile, str)
+ self.assertEqual(16, len(md5_digest))
+ self.assertEqual(hashlib.md5(b'blala').digest(), md5_digest)
+
cq = wc.CommittedQueue()
- cq.queue(os.path.join(self.test_dir, "checkout/bar"), adm)
+ cq.queue("checkout/bar", adm, wcprop_changes=editor._prop,
+ md5_digest=md5_digest)
adm.process_committed_queue(cq, 1, "2010-05-31T08:49:22.430000Z",
"jelmer")
bar = adm.entry("checkout/bar")
self.assertEqual("bar", bar.name)
self.assertEqual(NODE_FILE, bar.kind)
- self.assertEqual(wc.SCHEDULE_ADD, bar.schedule)
+ self.assertEqual(wc.SCHEDULE_NORMAL, bar.schedule)
+
+ def test_process_committed(self):
+ if wc.api_version() >= (1, 7):
+ self.skipTest("TODO: doesn't yet work with svn >= 1.7")
+ self.make_client("repos", ".")
+ self.build_tree({"bar": b"la"})
+ self.client_add('bar')
+ adm = wc.Adm(None, ".", True)
+
+ class Editor(object):
+ """Editor"""
+
+ def __init__(self):
+ self._windows = []
+
+ def apply_textdelta(self, checksum):
+ def window_handler(window):
+ self._windows.append(window)
+ return window_handler
+
+ def close(self):
+ pass
+ editor = Editor()
+ (tmpfile, digest) = adm.transmit_text_deltas("bar", True, editor)
+ self.assertEqual(editor._windows,
+ [(0, 0, 2, 0, [(2, 0, 2)], b'la'), None])
+ self.assertIsInstance(tmpfile, str)
+ self.assertEqual(16, len(digest))
+ self.assertEqual(hashlib.md5(b'la').digest(), digest)
+ bar = adm.entry("bar")
+ self.assertEqual(-1, bar.cmt_rev)
+ self.assertEqual(0, bar.revision)
+
+ adm.process_committed(
+ "bar", False, 1, "2010-05-31T08:49:22.430000Z", "jelmer")
+ bar = adm.entry("bar")
+ self.assertEqual("bar", bar.name)
+ self.assertEqual(NODE_FILE, bar.kind)
+ self.assertEqual(wc.SCHEDULE_NORMAL, bar.schedule)
def test_probe_try(self):
self.make_client("repos", "checkout")
self.build_tree({"checkout/bar": b"la"})
self.client_add('checkout/bar')
- adm = wc.WorkingCopy(None, "checkout", True)
+ adm = wc.Adm(None, "checkout", True)
try:
self.assertIs(None, adm.probe_try(self.test_dir))
except subvertpy.SubversionException as e:
@@ -315,5 +411,155 @@ class AdmTests(SubversionTestCase):
if num != subvertpy.ERR_WC_NOT_WORKING_COPY:
raise
self.assertEqual(
- "checkout",
+ os.path.abspath("checkout"),
adm.probe_try(os.path.join("checkout", "bar")).access_path())
+
+ def test_lock(self):
+ if wc.api_version() >= (1, 9):
+ self.skipTest("TODO: doesn't yet work with svn >= 1.9")
+ self.make_client("repos", "checkout")
+ self.build_tree({"checkout/bar": b"la"})
+ self.client_add('checkout/bar')
+ adm = wc.Adm(None, "checkout", True)
+ lock = wc.Lock()
+ lock.token = b"blah"
+ adm.add_lock("checkout", lock)
+ adm.remove_lock("checkout")
+
+
+class ContextTests(SubversionTestCase):
+
+ def setUp(self):
+ super(ContextTests, self).setUp()
+ if wc.api_version() < (1, 7):
+ self.skipTest("context API not available on Subversion < 1.7")
+
+ def test_create(self):
+ context = wc.Context()
+ self.assertIsInstance(context, wc.Context)
+
+ def test_locked(self):
+ context = wc.Context()
+ self.make_client("repos", "checkout")
+ self.assertEqual((False, False), context.locked("checkout"))
+
+ def test_check_wc(self):
+ context = wc.Context()
+ self.make_client("repos", "checkout")
+ self.assertIsInstance(context.check_wc("checkout"), int)
+
+ def test_text_modified(self):
+ context = wc.Context()
+ self.make_client("repos", "checkout")
+ with open('checkout/bla.txt', 'w') as f:
+ f.write("modified")
+ self.client_add("checkout/bla.txt")
+ self.assertTrue(context.text_modified("checkout/bla.txt"))
+
+ def test_props_modified(self):
+ context = wc.Context()
+ self.make_client("repos", "checkout")
+ with open('checkout/bla.txt', 'w') as f:
+ f.write("modified")
+ self.client_add("checkout/bla.txt")
+ self.assertFalse(context.props_modified("checkout/bla.txt"))
+
+ def test_conflicted(self):
+ context = wc.Context()
+ self.make_client("repos", "checkout")
+ with open('checkout/bla.txt', 'w') as f:
+ f.write("modified")
+ self.client_add("checkout/bla.txt")
+ self.assertEqual(
+ (False, False, False),
+ context.conflicted("checkout/bla.txt"))
+
+ def test_crawl_revisions(self):
+ context = wc.Context()
+ self.make_client("repos", "checkout")
+ with open('checkout/bla.txt', 'w') as f:
+ f.write("modified")
+ self.client_add("checkout/bla.txt")
+ ret = []
+
+ class Reporter(object):
+ def set_path(self, *args):
+ ret.append(args)
+
+ def finish(self):
+ pass
+ context.crawl_revisions("checkout", Reporter())
+
+ self.assertEqual(ret, [('', 0, 0, None, 3)])
+
+ def test_get_update_editor(self):
+ self.make_client("repos", "checkout")
+ context = wc.Context()
+ editor = context.get_update_editor("checkout", "")
+ editor.close()
+
+ def test_status(self):
+ self.make_client("repos", "checkout")
+ context = wc.Context()
+ status = context.status("checkout")
+ self.assertEqual(NODE_DIR, status.kind)
+
+ def test_walk_status(self):
+ self.make_client("repos", "checkout")
+ with open('checkout/bla.txt', 'w') as f:
+ f.write("modified")
+ self.client_add("checkout/bla.txt")
+ context = wc.Context()
+ result = {}
+ context.walk_status("checkout", result.__setitem__)
+ self.assertEqual(
+ set(result.keys()),
+ {os.path.abspath("checkout"),
+ os.path.abspath("checkout/bla.txt")})
+
+ def test_locking(self):
+ if wc.api_version() >= (1, 7):
+ self.skipTest("TODO: doesn't yet work with svn >= 1.7")
+ self.make_client("repos", "checkout")
+ with open('checkout/bla.txt', 'w') as f:
+ f.write("modified")
+ self.client_add("checkout/bla.txt")
+ context = wc.Context()
+ lock = wc.Lock(token=b'foo')
+ self.assertEqual((False, False), context.locked("checkout"))
+ context.add_lock("checkout/", lock)
+ self.assertEqual((True, True), context.locked("checkout"))
+ context.remove_lock("checkout/", lock)
+
+ def test_add_from_disk(self):
+ if wc.api_version() >= (1, 7):
+ self.skipTest("TODO: doesn't yet work with svn >= 1.7")
+ self.make_client("repos", "checkout")
+ with open('checkout/bla.txt', 'w') as f:
+ f.write("modified")
+ context = wc.Context()
+ lock = wc.Lock(token=b'foo')
+ lock.path = os.path.abspath('checkout')+"/"
+ context.add_lock("checkout", lock)
+ context.add_from_disk('checkout/bla.txt')
+ context.remove_lock("checkout", lock)
+
+ def test_get_prop_diffs(self):
+ self.make_client("repos", "checkout")
+ context = wc.Context()
+ (orig_props, propdelta) = context.get_prop_diffs("checkout")
+ self.assertEqual({}, orig_props)
+ self.assertEqual([], propdelta)
+
+ def test_process_committed_queue(self):
+ if wc.api_version() >= (1, 7):
+ self.skipTest("TODO: doesn't yet work with svn >= 1.7")
+ self.make_client("repos", "checkout")
+ adm = wc.Context()
+ self.build_tree({"checkout/bar": b"blala"})
+ self.client_add('checkout/bar')
+ adm.add_lock("checkout", wc.Lock(token=b'foo'))
+ cq = wc.CommittedQueue()
+ cq.queue("checkout/bar", adm)
+ adm.process_committed_queue(cq, 1, "2010-05-31T08:49:22.430000Z",
+ "jelmer")