Rev 1606: Move tags code into a separate file. in http://people.samba.org/bzr/jelmer/bzr-svn/trunk
Jelmer Vernooij
jelmer at samba.org
Fri Aug 22 22:18:09 BST 2008
At http://people.samba.org/bzr/jelmer/bzr-svn/trunk
------------------------------------------------------------
revno: 1606
revision-id: jelmer at samba.org-20080822211808-1vlr4yazhvat7or6
parent: jelmer at samba.org-20080822204103-xdf23m6sgj5jvjnc
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.4
timestamp: Fri 2008-08-22 23:18:08 +0200
message:
Move tags code into a separate file.
added:
tags.py tags.py-20080822211316-scblu3akdvu0b64c-1
modified:
branch.py svnbranch.py-20051017135706-11c749eb0dab04a7
=== modified file 'branch.py'
--- a/branch.py 2008-08-22 20:41:03 +0000
+++ b/branch.py 2008-08-22 21:18:08 +0000
@@ -23,7 +23,6 @@
UnrelatedBranches)
from bzrlib.inventory import (Inventory)
from bzrlib.revision import is_null, ensure_null, NULL_REVISION
-from bzrlib.tag import BasicTags
from bzrlib.trace import mutter
from bzrlib.workingtree import WorkingTree
@@ -36,6 +35,7 @@
from bzrlib.plugins.svn.errors import NotSvnBranchPath, ERR_FS_NO_SUCH_REVISION
from bzrlib.plugins.svn.format import get_rich_root_format
from bzrlib.plugins.svn.repository import SvnRepository
+from bzrlib.plugins.svn.tags import SubversionTags
from bzrlib.plugins.svn.transport import bzr_to_svn_url
import os
@@ -55,129 +55,6 @@
pass
-class SubversionTags(BasicTags):
- def __init__(self, branch):
- self.branch = branch
- self.repository = branch.repository
-
- def set_tag(self, tag_name, tag_target):
- path = self.branch.layout.get_tag_path(tag_name, self.branch.project)
- parent = urlutils.dirname(path)
- try:
- (from_bp, from_revnum, mapping) = self.repository.lookup_revision_id(tag_target)
- except NoSuchRevision:
- mutter("not setting tag %s; unknown revision %s", tag_name, tag_target)
- return
- if from_bp == path:
- return
- 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:
- return self.get_tag_dict()[tag_name]
- except KeyError:
- raise NoSuchTag(tag_name)
-
- def get_tag_dict(self, _from_revnum=0):
- return self.repository.find_tags(project=self.branch.project,
- layout=self.branch.layout,
- from_revnum=_from_revnum)
-
- def get_reverse_tag_dict(self):
- """Returns a dict with revisions as keys
- and a list of tags for that revision as value"""
- d = self.get_tag_dict()
- rev = {}
- for key in d:
- try:
- rev[d[key]].append(key)
- except KeyError:
- rev[d[key]] = [key]
- return rev
-
- def delete_tag(self, tag_name):
- path = self.branch.layout.get_tag_path(tag_name, self.branch.project)
- parent = urlutils.dirname(path)
- conn = self.repository.transport.connections.get(urlutils.join(self.repository.base, parent))
- 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})
- try:
- root = ci.open_root()
- root.delete_entry(urlutils.basename(path))
- root.close()
- except:
- ci.abort()
- raise
- ci.close()
- finally:
- self.repository.transport.add_connection(conn)
-
- def _set_tag_dict(self, dest_dict):
- cur_dict = self.get_tag_dict()
- for k,v in dest_dict.iteritems():
- if cur_dict.get(k) != v:
- self.set_tag(k, v)
- for k in cur_dict:
- if k not in dest_dict:
- self.delete_tag(k)
-
- def merge_to(self, to_tags, overwrite=False, _from_revnum=None):
- """Copy tags between repositories if necessary and possible.
-
- This method has common command-line behaviour about handling
- error cases.
-
- All new definitions are copied across, except that tags that already
- exist keep their existing definitions.
-
- :param to_tags: Branch to receive these tags
- :param overwrite: Overwrite conflicting tags in the target branch
- :param _from_revnum: Revision number since which to check tags.
-
- :returns: A list of tags that conflicted, each of which is
- (tagname, source_target, dest_target), or None if no copying was
- done.
- """
- if self.branch == to_tags.branch:
- return
- if not self.supports_tags():
- # obviously nothing to copy
- return
- source_dict = self.get_tag_dict(_from_revnum=_from_revnum)
- if not source_dict:
- # no tags in the source, and we don't want to clobber anything
- # that's in the destination
- return
- to_tags.branch.lock_write()
- try:
- dest_dict = to_tags.get_tag_dict()
- result, conflicts = self._reconcile_tags(source_dict, dest_dict,
- overwrite)
- if result != dest_dict:
- to_tags._set_tag_dict(result)
- finally:
- to_tags.branch.unlock()
- return conflicts
-
-
-
class SvnBranch(Branch):
"""Maps to a Branch in a Subversion repository """
def __init__(self, repository, branch_path, _skip_check=False):
=== added file 'tags.py'
--- a/tags.py 1970-01-01 00:00:00 +0000
+++ b/tags.py 2008-08-22 21:18:08 +0000
@@ -0,0 +1,104 @@
+# Copyright (C) 2005-2007 Jelmer Vernooij <jelmer at 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/>.
+
+from bzrlib import urlutils
+from bzrlib.errors import NoSuchRevision, NoSuchTag
+from bzrlib.tag import BasicTags
+
+from bzrlib.plugins.svn import core
+
+class SubversionTags(BasicTags):
+ def __init__(self, branch):
+ self.branch = branch
+ self.repository = branch.repository
+
+ def set_tag(self, tag_name, tag_target):
+ path = self.branch.layout.get_tag_path(tag_name, self.branch.project)
+ parent = urlutils.dirname(path)
+ try:
+ (from_bp, from_revnum, mapping) = self.repository.lookup_revision_id(tag_target)
+ except NoSuchRevision:
+ mutter("not setting tag %s; unknown revision %s", tag_name, tag_target)
+ return
+ if from_bp == path:
+ return
+ 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:
+ return self.get_tag_dict()[tag_name]
+ except KeyError:
+ raise NoSuchTag(tag_name)
+
+ def get_tag_dict(self, _from_revnum=0):
+ return self.repository.find_tags(project=self.branch.project,
+ layout=self.branch.layout,
+ from_revnum=_from_revnum)
+
+ def get_reverse_tag_dict(self):
+ """Returns a dict with revisions as keys
+ and a list of tags for that revision as value"""
+ d = self.get_tag_dict()
+ rev = {}
+ for key in d:
+ try:
+ rev[d[key]].append(key)
+ except KeyError:
+ rev[d[key]] = [key]
+ return rev
+
+ def delete_tag(self, tag_name):
+ path = self.branch.layout.get_tag_path(tag_name, self.branch.project)
+ parent = urlutils.dirname(path)
+ conn = self.repository.transport.connections.get(urlutils.join(self.repository.base, parent))
+ 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})
+ try:
+ root = ci.open_root()
+ root.delete_entry(urlutils.basename(path))
+ root.close()
+ except:
+ ci.abort()
+ raise
+ ci.close()
+ finally:
+ self.repository.transport.add_connection(conn)
+
+ def _set_tag_dict(self, dest_dict):
+ cur_dict = self.get_tag_dict()
+ for k,v in dest_dict.iteritems():
+ if cur_dict.get(k) != v:
+ self.set_tag(k, v)
+ for k in cur_dict:
+ if k not in dest_dict:
+ self.delete_tag(k)
+
More information about the bazaar-commits
mailing list