Rev 1433: Support setting tags. in file:///data/jelmer/bzr-svn/tags/

Jelmer Vernooij jelmer at samba.org
Thu Jul 3 22:12:29 BST 2008


At file:///data/jelmer/bzr-svn/tags/

------------------------------------------------------------
revno: 1433
revision-id: jelmer at samba.org-20080703211228-3bvk5itd516n75px
parent: jelmer at samba.org-20080703203944-ro3eh9caweh59aav
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: tags
timestamp: Thu 2008-07-03 23:12:28 +0200
message:
  Support setting tags.
modified:
  branch.py                      svnbranch.py-20051017135706-11c749eb0dab04a7
  tests/test_branch.py           test_branch.py-20060508162215-74ffeb5d608f8e20
=== modified file 'branch.py'
--- a/branch.py	2008-07-03 20:39:44 +0000
+++ b/branch.py	2008-07-03 21:12:28 +0000
@@ -22,6 +22,7 @@
                            NoSuchTag, NotBranchError, UnstackableBranchFormat)
 from bzrlib.inventory import (Inventory)
 from bzrlib.revision import is_null, ensure_null, NULL_REVISION
+from bzrlib.tag import BasicTags
 from bzrlib.workingtree import WorkingTree
 
 from bzrlib.plugins.svn import core
@@ -51,15 +52,33 @@
         pass
 
 
-class SubversionTags:
-    def __init__(self, repository, layout=None, project=""):
-        self.repository = repository
-        self.layout = layout or repository.get_layout()
+class SubversionTags(BasicTags):
+    def __init__(self, branch, layout=None, project=""):
+        self.branch = branch
+        self.repository = branch.repository
+        self.layout = layout or self.repository.get_layout()
         self.project = project
 
     def set_tag(self, tag_name, tag_target):
-        # TODO: copy tag_target to tags/tag_name
-        raise NotImplementedError
+        path = self.layout.get_tag_path(tag_name, self.project)
+        parent = urlutils.dirname(path)
+        (from_bp, from_revnum, mapping) = self.repository.lookup_revision_id(tag_target)
+        conn = self.repository.transport.connections.get(urlutils.join(self.repository.base, parent))
+        deletefirst = (conn.check_path(urlutils.basename(path), self.repository.get_latest_revnum()) != core.NODE_NONE)
+        try:
+            ci = conn.get_commit_editor({"svn:log": "Add tag %s" % tag_name})
+            try:
+                root = ci.open_root()
+                if deletefirst:
+                    root.delete_entry(urlutils.basename(path))
+                root.add_directory(urlutils.basename(path), urlutils.join(self.repository.base, from_bp), from_revnum)
+                root.close()
+            except:
+                ci.abort()
+                raise
+            ci.close()
+        finally:
+            self.repository.transport.add_connection(conn)
 
     def lookup_tag(self, tag_name):
         try:
@@ -87,7 +106,7 @@
         path = self.layout.get_tag_path(tag_name, self.project)
         parent = urlutils.dirname(path)
         conn = self.repository.transport.connections.get(urlutils.join(self.repository.base, parent))
-        if self.repository.transport.check_path(path, self.repository.get_latest_revnum()) != core.NODE_DIR:
+        if conn.check_path(urlutils.basename(path), self.repository.get_latest_revnum()) != core.NODE_DIR:
             raise NoSuchTag(tag_name)
         try:
             ci = conn.get_commit_editor({"svn:log": "Remove tag %s" % tag_name})
@@ -102,9 +121,6 @@
         finally:
             self.repository.transport.add_connection(conn)
 
-    def merge_to(self, to_tags, overwrite=False):
-        raise NotImplementedError
-
 
 class SvnBranch(Branch):
     """Maps to a Branch in a Subversion repository """
@@ -142,7 +158,7 @@
             raise NotSvnBranchPath(branch_path, mapping=self.mapping)
 
     def _make_tags(self):
-        return SubversionTags(self.repository)
+        return SubversionTags(self)
 
     def set_branch_path(self, branch_path):
         """Change the branch path for this branch.

=== modified file 'tests/test_branch.py'
--- a/tests/test_branch.py	2008-07-03 20:39:44 +0000
+++ b/tests/test_branch.py	2008-07-03 21:12:28 +0000
@@ -27,6 +27,7 @@
 import os
 from unittest import TestCase
 
+from bzrlib.plugins.svn import core
 from bzrlib.plugins.svn.branch import FakeControlFiles, SvnBranchFormat
 from bzrlib.plugins.svn.convert import load_dumpfile
 from bzrlib.plugins.svn.mapping import SVN_PROP_BZR_REVISION_ID
@@ -58,6 +59,25 @@
         b = Branch.open(repos_url + "/trunk")
         self.assertEquals(["foo"], b.tags.get_tag_dict().keys())
 
+    def test_tag_set(self):
+        repos_url = self.make_repository('a')
+
+        dc = self.get_commit_editor(repos_url)
+        dc.add_dir("trunk")
+        dc.add_dir("tags")
+        dc.close()
+
+        dc = self.get_commit_editor(repos_url)
+        trunk = dc.open_dir("trunk")
+        trunk.add_file("trunk/bla").modify()
+        dc.close()
+
+        b = Branch.open(repos_url + "/trunk")
+        b.tags.set_tag("mytag", b.repository.generate_revision_id(1, "trunk", b.repository.get_mapping()))
+
+        self.assertEquals(core.NODE_DIR, 
+                b.repository.transport.check_path("tags/mytag", 3))
+
     def test_tags_delete(self):
         repos_url = self.make_repository("a")
        




More information about the bazaar-commits mailing list