Add revision specifier support.
authorJelmer Vernooij <jelmer@samba.org>
Sun, 11 Nov 2007 19:15:40 +0000 (20:15 +0100)
committerJelmer Vernooij <jelmer@samba.org>
Sun, 11 Nov 2007 19:15:40 +0000 (20:15 +0100)
NEWS
README
__init__.py
mapping.txt
revspec.py
tests/__init__.py
tests/test_revspec.py [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 4000b5d2574ec0ca05572b8bae7d7c33dcfb2e1a..b61dc78b1250ae5fb97763be518d6d59af8e1600 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,9 @@
 bzr-svn 0.4.5  UNRELEASED
 
+  IMPROVEMENTS
+
+   * Add revision specifier for "svn:" that accepts a single revision number.
+
   INTERNALS
 
    * No longer store svn:author, svn:date and svn:log in the bzr-svn cache. 
diff --git a/README b/README
index 0a0c30d2f61014017944a89802375458ac46fe85..e561edf7c45e99de299b2e4d47b02483cf42ce37 100644 (file)
--- a/README
+++ b/README
@@ -1,3 +1,5 @@
+#FORMAT rst
+
 ============
 Introduction
 ============
index 57f36fa03143c1e7297ecaf6da87fbd20a475665..2141d60513d0bd9abe08aa4cbb0b4ba34a6a02bd 100644 (file)
@@ -21,10 +21,12 @@ import bzrlib
 from bzrlib.bzrdir import BzrDirFormat, format_registry
 from bzrlib.commands import Command, register_command, display_command, Option
 from bzrlib.help_topics import topic_registry
+from bzrlib.revisionspec import SPEC_TYPES
 from bzrlib.trace import warning
 from bzrlib.transport import register_lazy_transport, register_transport_proto
 
 import format
+import revspec
 
 # versions ending in 'exp' mean experimental mappings
 # versions ending in 'dev' mean development version
@@ -111,6 +113,7 @@ format_registry.register("subversion", format.SvnRemoteFormat,
 format_registry.register("subversion-wc", format.SvnWorkingTreeDirFormat, 
                          "Subversion working copy. ", 
                          native=False, hidden=True)
+SPEC_TYPES.append(revspec.RevisionSpec_svn)
 
 versions_checked = False
 def lazy_check_versions():
index c0db011b3959e1d4536409705f5a36bdd2bd5113..ae433c8464cfe6782359a1075ef149547ffc343b 100644 (file)
@@ -1,3 +1,5 @@
+#FORMAT rst
+
 This document specifies mapping between Subversion and Bazaar semantics.
 
 Revision: 4
@@ -73,7 +75,7 @@ subversion will not erase the property for subsequent commits.
 
 A (path,revnum) tuple is valid if:
 * path is valid according to the branching scheme
-* either path,revnum or one of its children was touched in the particular 
+* either path, revnum or one of its children was touched in the particular 
   revision
 
 If possible, the Subversion revision property ``bzr:revision-id`` should be 
index e60a323cd170392d4a9d49258013eb806524cf64..43725527252767b5808622e65c439bb735baec21 100644 (file)
@@ -15,7 +15,8 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 """Custom revision specifier for Subversion."""
 
-from bzrlib.revisionspec import SPEC_TYPES, RevisionSpec
+from bzrlib.errors import InvalidRevisionSpec
+from bzrlib.revisionspec import RevisionSpec, RevisionInfo
 
 class RevisionSpec_svn(RevisionSpec):
     """Selects a revision using a Subversion revision number."""
@@ -23,13 +24,14 @@ class RevisionSpec_svn(RevisionSpec):
     prefix = 'svn:'
 
     def _match_on(self, branch, revs):
-        pass
+        loc = self.spec.find(':')
+        try:
+            return RevisionInfo.from_revision_id(branch, branch.generate_revision_id(int(self.spec[loc+1:])), branch.revision_history())
+        except ValueError:
+            raise InvalidRevisionSpec(self.user_spec, branch)
 
     def needs_branch(self):
         return True
 
     def get_branch(self):
         return None
-
-
-SPEC_TYPES.append(RevisionSpec_svn)
index 01d79da287216de0c7687433f139953d6e29d6f9..ce08829667bf8bd465736ae77eb955017b3edc11 100644 (file)
@@ -291,6 +291,7 @@ def test_suite():
             'test_radir',
             'test_repos', 
             'test_revids',
+            'test_revspec',
             'test_scheme', 
             'test_transport',
             'test_tree',
diff --git a/tests/test_revspec.py b/tests/test_revspec.py
new file mode 100644 (file)
index 0000000..1bcc17e
--- /dev/null
@@ -0,0 +1,65 @@
+# Copyright (C) 2005-2007 Jelmer Vernooij <jelmer@samba.org>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+"""
+Tests for revision specificiers.
+"""
+
+from bzrlib.branch import Branch
+from bzrlib.errors import InvalidRevisionSpec
+from bzrlib.revisionspec import RevisionSpec, RevisionInfo
+from bzrlib.tests import TestCase
+
+from tests import TestCaseWithSubversionRepository
+
+
+class TestRevSpec(TestCase):
+    def test_present(self):
+        self.assertIsNot(None, RevisionSpec.from_string("svn:foo"))
+
+    def test_needs_branch(self):
+        self.assertTrue(RevisionSpec.from_string("svn:foo").needs_branch())
+
+    def test_get_branch(self):
+        self.assertIs(None, RevisionSpec.from_string("svn:foo").get_branch())
+
+
+class TestRevSpecsBySubversion(TestCaseWithSubversionRepository):
+    def test_by_single_revno(self):
+        revspec = RevisionSpec.from_string("svn:2")
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({"dc/foo": "foo"})
+        self.client_add("dc/foo")
+        self.client_commit("dc", "msg")
+
+        self.build_tree({"dc/bar": "bar"})
+        self.client_add("dc/bar")
+        self.client_commit("dc", "msg2")
+
+        branch = Branch.open(repos_url)
+        revinfo = revspec._match_on(branch, None)
+
+        self.assertEquals(RevisionInfo.from_revision_id(branch, branch.last_revision(), branch.revision_history()), revinfo)
+
+    def test_invalid_revnum(self):
+        revspec = RevisionSpec.from_string("svn:foo")
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({"dc/bar": "bar"})
+        self.client_add("dc/bar")
+        self.client_commit("dc", "msg2")
+
+        branch = Branch.open(repos_url)
+
+        self.assertRaises(InvalidRevisionSpec, revspec._match_on, branch, None)