19
19
from bzrlib.branch import Branch, BranchFormat, BranchCheckResult, PullResult
20
20
from bzrlib.bzrdir import BzrDir
21
21
from bzrlib.errors import (NoSuchFile, DivergedBranches, NoSuchRevision,
22
NotBranchError, UnstackableBranchFormat)
22
NoSuchTag, NotBranchError, UnstackableBranchFormat,
23
24
from bzrlib.inventory import (Inventory)
24
25
from bzrlib.revision import is_null, ensure_null, NULL_REVISION
26
from bzrlib.tag import BasicTags
27
from bzrlib.trace import mutter
25
28
from bzrlib.workingtree import WorkingTree
27
from bzrlib.plugins.svn import core
30
from bzrlib.plugins.svn import core, wc
28
31
from bzrlib.plugins.svn.auth import create_auth_baton
29
32
from bzrlib.plugins.svn.client import Client, get_config
30
33
from bzrlib.plugins.svn.commit import push
58
class SubversionTags(BasicTags):
59
def __init__(self, branch, layout=None, project=""):
61
self.repository = branch.repository
62
self.layout = layout or self.repository.get_layout()
63
self.project = project
65
def set_tag(self, tag_name, tag_target):
66
path = self.layout.get_tag_path(tag_name, self.project)
67
parent = urlutils.dirname(path)
69
(from_bp, from_revnum, mapping) = self.repository.lookup_revision_id(tag_target)
70
except NoSuchRevision:
71
mutter("not setting tag %s; unknown revision %s", tag_name, tag_target)
75
conn = self.repository.transport.connections.get(urlutils.join(self.repository.base, parent))
76
deletefirst = (conn.check_path(urlutils.basename(path), self.repository.get_latest_revnum()) != core.NODE_NONE)
78
ci = conn.get_commit_editor({"svn:log": "Add tag %s" % tag_name})
82
root.delete_entry(urlutils.basename(path))
83
root.add_directory(urlutils.basename(path), urlutils.join(self.repository.base, from_bp), from_revnum)
90
self.repository.transport.add_connection(conn)
92
def lookup_tag(self, tag_name):
94
return self.get_tag_dict()[tag_name]
96
raise NoSuchTag(tag_name)
98
def get_tag_dict(self):
99
return self.repository.find_tags(project=self.project,
102
def get_reverse_tag_dict(self):
103
"""Returns a dict with revisions as keys
104
and a list of tags for that revision as value"""
105
d = self.get_tag_dict()
109
rev[d[key]].append(key)
114
def delete_tag(self, tag_name):
115
path = self.layout.get_tag_path(tag_name, self.project)
116
parent = urlutils.dirname(path)
117
conn = self.repository.transport.connections.get(urlutils.join(self.repository.base, parent))
118
if conn.check_path(urlutils.basename(path), self.repository.get_latest_revnum()) != core.NODE_DIR:
119
raise NoSuchTag(tag_name)
121
ci = conn.get_commit_editor({"svn:log": "Remove tag %s" % tag_name})
123
root = ci.open_root()
124
root.delete_entry(urlutils.basename(path))
131
self.repository.transport.add_connection(conn)
133
def _set_tag_dict(self, dest_dict):
134
cur_dict = self.get_tag_dict()
135
for k,v in dest_dict.iteritems():
136
if cur_dict.get(k) != v:
139
if k not in dest_dict:
54
143
class SvnBranch(Branch):
55
144
"""Maps to a Branch in a Subversion repository """
56
145
def __init__(self, repository, branch_path):
62
151
:param revnum: Subversion revision number of the branch to
63
152
look at; none for latest.
154
self.repository = repository
65
155
super(SvnBranch, self).__init__()
66
self.repository = repository
67
156
assert isinstance(self.repository, SvnRepository)
68
157
self.control_files = FakeControlFiles()
69
158
self._format = SvnBranchFormat()
103
195
:param relpath: path from the repository root.
105
assert relpath.startswith(self.get_branch_path())
197
assert relpath.startswith(self.get_branch_path()), \
198
"expected %s prefix, got %s" % (self.get_branch_path(), relpath)
106
199
return relpath[len(self.get_branch_path()):].strip("/")
108
201
def get_branch_path(self, revnum=None):
180
273
:param revision_id: Tip of the checkout.
181
274
:return: WorkingTree object of the checkout.
183
if revision_id is None:
276
from bzrlib.plugins.svn.workingtree import update_wc
277
if revision_id is not None:
278
revnum = self.lookup_revision_id(revision_id)
186
rev = self.lookup_revision_id(revision_id)
280
revnum = self.get_revnum()
188
282
svn_url = bzr_to_svn_url(self.base)
189
client_ctx = Client(auth=create_auth_baton(svn_url))
190
client_ctx.checkout(svn_url, to_location, rev, "HEAD", True)
192
return WorkingTree.open(to_location)
283
os.mkdir(to_location)
284
wc.ensure_adm(to_location, self.repository.uuid, svn_url,
285
bzr_to_svn_url(self.repository.base), revnum)
286
adm = wc.WorkingCopy(None, to_location, write_lock=True)
288
conn = self.repository.transport.connections.get(svn_url)
290
update_wc(adm, to_location, conn, revnum)
293
self.repository.transport.add_connection(conn)
296
wt = WorkingTree.open(to_location)
194
299
def create_checkout(self, to_location, revision_id=None, lightweight=False,
195
300
accelerator_tree=None, hardlink=False):
232
337
def set_last_revision_info(self, revno, revid):
233
338
"""See Branch.set_last_revision_info()."""
340
def mainline_missing_revisions(self, other, stop_revision):
342
lastrevid = self.last_revision()
343
for revid in other.repository.iter_reverse_revision_history(stop_revision):
344
if lastrevid == revid:
347
missing.append(revid)
348
raise UnrelatedBranches()
235
350
def last_revision_info(self):
236
351
"""See Branch.last_revision_info()."""
237
352
last_revid = self.last_revision()