Rev 1712: pushing with v4 mappings works in file:///data/jelmer/bzr-svn/trunk/
Jelmer Vernooij
jelmer at samba.org
Sat Aug 30 02:11:50 BST 2008
At file:///data/jelmer/bzr-svn/trunk/
------------------------------------------------------------
revno: 1712
revision-id: jelmer at samba.org-20080830011146-9bkqhhay4wygnvkh
parent: jelmer at samba.org-20080830004033-jwoyzljlkfmzyogg
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: trunk
timestamp: Sat 2008-08-30 03:11:46 +0200
message:
pushing with v4 mappings works
modified:
commit.py commit.py-20060607190346-qvq128wgfubhhgm2-1
layout.py layout.py-20080323165407-y9qw8nx4oykvoe1k-1
mapping.py mapping.py-20080128201303-6cp01phc0dmc0kiv-1
mapping3/__init__.py __init__.py-20080502174630-9324zh25kka98vlw-1
mapping4.py mapping4.py-20080827182338-y4xzpsf43vyiwcir-1
repository.py repository.py-20060306123302-1f8c5069b3fe0265
revids.py revids.py-20070416220458-36vfa0730cchevp1-1
=== modified file 'commit.py'
--- a/commit.py 2008-08-30 00:40:33 +0000
+++ b/commit.py 2008-08-30 01:11:46 +0000
@@ -204,7 +204,7 @@
self._svnprops = lazy_dict({}, lambda: dict(self._base_branch_props.items()))
self.base_mapping.export_revision(
self.branch.get_branch_path(), timestamp, timezone, committer, revprops,
- revision_id, self.base_revno+1, merges, self._svn_revprops, self._svnprops)
+ revision_id, self.base_revno+1, parents, self._svn_revprops, self._svnprops)
if len(merges) > 0:
new_svk_merges = update_svk_features(self._base_branch_props.get(SVN_PROP_SVK_MERGE, ""), merges)
@@ -558,10 +558,10 @@
assert self.revision_metadata is not None
- self.repository._clear_cached_state()
-
(result_revision, result_date, result_author) = self.revision_metadata
+ self.repository._clear_cached_state(result_revision)
+
revid = self.branch.generate_revision_id(result_revision)
assert not self.push_metadata or self._new_revision_id is None or self._new_revision_id == revid
=== modified file 'layout.py'
--- a/layout.py 2008-08-30 00:40:33 +0000
+++ b/layout.py 2008-08-30 01:11:46 +0000
@@ -13,8 +13,12 @@
# 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 import urlutils, ui
from bzrlib.errors import NotBranchError
+from bzrlib.trace import mutter
+from bzrlib.plugins.svn.core import SubversionException, NODE_DIR
+from bzrlib.plugins.svn.errors import ERR_FS_NOT_DIRECTORY, ERR_FS_NOT_FOUND, ERR_RA_DAV_PATH_NOT_FOUND
+from bzrlib.plugins.svn.ra import DIRENT_KIND
class RepositoryLayout(object):
"""Describes a repository layout."""
@@ -83,6 +87,12 @@
return True
return False
+ def is_branch_parent(self, path, project=None):
+ return self.is_branch(urlutils.join(path, "trunk"), project)
+
+ def is_tag_parent(self, path, project=None):
+ return self.is_tag(urlutils.join(path, "trunk"), project)
+
def is_branch_or_tag(self, path, project=None):
return self.is_branch(path, project) or self.is_tag(path, project)
@@ -107,6 +117,7 @@
class ConfigBasedLayout(RepositoryLayout):
def __init__(self, repository):
+ self.repository = repository
self._config = repository.get_config()
def get_tag_path(self, name, project=""):
@@ -116,14 +127,14 @@
:param project: Optional name of the project the tag is for. Can include slashes.
:return: Path of the tag."
"""
- return urlutils.join(project, "tags", name)
+ return urlutils.join(project, "tags", name).strip("/")
def get_tag_name(self, path, project=""):
"""Determine the tag name from a tag path.
:param path: Path inside the repository.
"""
- return urlutils.basename(path)
+ return urlutils.basename(path).strip("/")
def push_merged_revisions(self, project=""):
"""Determine whether or not right hand side (merged) revisions should be pushed.
@@ -141,7 +152,7 @@
:param project: Optional name of the project the branch is for. Can include slashes.
:return: Path of the branch.
"""
- return urlutils.join(project, "branches", name)
+ return urlutils.join(project, "branches", name).strip("/")
def parse(self, path):
"""Parse a path.
@@ -161,23 +172,88 @@
else:
t = "branch"
j = i
- return (t, "/".join(parts[:j-1]).strip("/"), "/".join(parts[:i]).strip("/"), "/".join(parts[i+1:]))
- raise InvalidSvnBranchPath(path, self)
+ return (t, "/".join(parts[:j-1]).strip("/"), "/".join(parts[:i]).strip("/"), "/".join(parts[i+1:]).strip("/"))
+ raise NotBranchError(path)
- def get_branches(self, revnum, project="", pb=None):
+ def get_branches(self, revnum, project=None, pb=None):
"""Retrieve a list of paths that refer to branches in a specific revision.
:result: Iterator over tuples with (project, branch path)
"""
- raise NotImplementedError
+ return get_root_paths(self.repository, ["branches/*", "trunk"], revnum, self.is_tag, project)
- def get_tags(self, revnum, project="", pb=None):
+ def get_tags(self, revnum, project=None, pb=None):
"""Retrieve a list of paths that refer to tags in a specific revision.
:result: Iterator over tuples with (project, branch path)
"""
- raise NotImplementedError
+ return get_root_paths(self.repository, ["tags/*"], revnum, self.is_tag, project)
def __repr__(self):
return "%s()" % self.__class__.__name__
+def expand_branch_pattern(begin, todo, check_path, get_children, project=None):
+ """Find the paths in the repository that match the expected branch pattern.
+
+ :param begin: List of path elements currently opened.
+ :param todo: List of path elements to still evaluate (including wildcards)
+ :param check_path: Function for checking a path exists
+ :param get_children: Function for retrieving the children of a path
+ """
+ mutter('expand branches: %r, %r', begin, todo)
+ path = "/".join(begin)
+ if (project is not None and
+ not project.startswith(path) and
+ not path.startswith(project)):
+ return []
+ # If all elements have already been handled, just check the path exists
+ if len(todo) == 0:
+ if check_path(path):
+ return [path]
+ else:
+ return []
+ # Not a wildcard? Just expand next bits
+ if todo[0] != "*":
+ return expand_branch_pattern(begin+[todo[0]], todo[1:], check_path,
+ get_children, project)
+ children = get_children(path)
+ if children is None:
+ return []
+ ret = []
+ pb = ui.ui_factory.nested_progress_bar()
+ try:
+ for idx, c in enumerate(children):
+ pb.update("browsing branches", idx, len(children))
+ if len(todo) == 1:
+ # Last path element, so return directly
+ ret.append("/".join(begin+[c]))
+ else:
+ ret += expand_branch_pattern(begin+[c], todo[1:], check_path,
+ get_children, project)
+ finally:
+ pb.finished()
+ return ret
+
+def get_root_paths(repository, itemlist, revnum, verify_fn, project=None, pb=None):
+ def check_path(path):
+ return repository.transport.check_path(path, revnum) == NODE_DIR
+ def find_children(path):
+ try:
+ assert not path.startswith("/")
+ dirents = repository.transport.get_dir(path, revnum, DIRENT_KIND)[0]
+ except SubversionException, (msg, num):
+ if num in (ERR_FS_NOT_DIRECTORY, ERR_FS_NOT_FOUND, ERR_RA_DAV_PATH_NOT_FOUND):
+ return None
+ raise
+ return [d for d in dirents if dirents[d]['kind'] == NODE_DIR]
+
+ for idx, pattern in enumerate(itemlist):
+ if pb is not None:
+ pb.update("finding branches", idx, len(itemlist))
+ for bp in expand_branch_pattern([], pattern.split("/"), check_path,
+ find_children, project):
+ if verify_fn(bp, project):
+ yield "", bp, bp.split("/")[-1]
+
+
+
=== modified file 'mapping.py'
--- a/mapping.py 2008-08-30 00:40:33 +0000
+++ b/mapping.py 2008-08-30 01:11:46 +0000
@@ -629,9 +629,7 @@
def get_rhs_parents(self, branch_path, svn_revprops,
fileprops):
- if svn_revprops[SVN_REVPROP_BZR_ROOT] != branch:
- return []
- return svn_revprops.get(SVN_REVPROP_BZR_MERGE, "").splitlines()
+ return tuple(svn_revprops.get(SVN_REVPROP_BZR_MERGE, "").splitlines())
def get_branch_root(self, revprops):
return revprops[SVN_REVPROP_BZR_ROOT]
=== modified file 'mapping3/__init__.py'
--- a/mapping3/__init__.py 2008-08-29 21:48:03 +0000
+++ b/mapping3/__init__.py 2008-08-30 01:11:46 +0000
@@ -18,9 +18,7 @@
from bzrlib.trace import mutter
from bzrlib.plugins.svn import mapping, properties
-from bzrlib.plugins.svn.core import SubversionException, NODE_DIR
-from bzrlib.plugins.svn.errors import ERR_FS_NOT_DIRECTORY, ERR_FS_NOT_FOUND, ERR_RA_DAV_PATH_NOT_FOUND
-from bzrlib.plugins.svn.layout import RepositoryLayout
+from bzrlib.plugins.svn.layout import RepositoryLayout, get_root_paths
from bzrlib.plugins.svn.mapping3.scheme import (BranchingScheme, guess_scheme_from_branch_path,
guess_scheme_from_history, ListBranchingScheme,
parse_list_scheme_text, NoBranchingScheme,
@@ -33,49 +31,6 @@
# Number of revisions to evaluate when guessing the branching scheme
SCHEME_GUESS_SAMPLE_SIZE = 2000
-def expand_branch_pattern(begin, todo, check_path, get_children, project=None):
- """Find the paths in the repository that match the expected branch pattern.
-
- :param begin: List of path elements currently opened.
- :param todo: List of path elements to still evaluate (including wildcards)
- :param check_path: Function for checking a path exists
- :param get_children: Function for retrieving the children of a path
- """
- mutter('expand branches: %r, %r', begin, todo)
- path = "/".join(begin)
- if (project is not None and
- not project.startswith(path) and
- not path.startswith(project)):
- return []
- # If all elements have already been handled, just check the path exists
- if len(todo) == 0:
- if check_path(path):
- return [path]
- else:
- return []
- # Not a wildcard? Just expand next bits
- if todo[0] != "*":
- return expand_branch_pattern(begin+[todo[0]], todo[1:], check_path,
- get_children, project)
- children = get_children(path)
- if children is None:
- return []
- ret = []
- pb = ui.ui_factory.nested_progress_bar()
- try:
- for idx, c in enumerate(children):
- pb.update("browsing branches", idx, len(children))
- if len(todo) == 1:
- # Last path element, so return directly
- ret.append("/".join(begin+[c]))
- else:
- ret += expand_branch_pattern(begin+[c], todo[1:], check_path,
- get_children, project)
- finally:
- pb.finished()
- return ret
-
-
class SchemeDerivedLayout(RepositoryLayout):
def __init__(self, repository, scheme):
self.repository = repository
@@ -92,32 +47,11 @@
def get_tag_name(self, path, project=None):
return path.split("/")[-1]
- def _get_root_paths(self, itemlist, revnum, verify_fn, project=None, pb=None):
- def check_path(path):
- return self.repository.transport.check_path(path, revnum) == NODE_DIR
- def find_children(path):
- try:
- assert not path.startswith("/")
- dirents = self.repository.transport.get_dir(path, revnum, DIRENT_KIND)[0]
- except SubversionException, (msg, num):
- if num in (ERR_FS_NOT_DIRECTORY, ERR_FS_NOT_FOUND, ERR_RA_DAV_PATH_NOT_FOUND):
- return None
- raise
- return [d for d in dirents if dirents[d]['kind'] == NODE_DIR]
-
- for idx, pattern in enumerate(itemlist):
- if pb is not None:
- pb.update("finding branches", idx, len(itemlist))
- for bp in expand_branch_pattern([], pattern.split("/"), check_path,
- find_children, project):
- if verify_fn(bp, project):
- yield "", bp, bp.split("/")[-1]
-
def get_branches(self, revnum, project=None, pb=None):
- return self._get_root_paths(self.scheme.branch_list, revnum, self.scheme.is_branch, project, pb)
+ return get_root_paths(self.repository, self.scheme.branch_list, revnum, self.scheme.is_branch, project, pb)
def get_tags(self, revnum, project=None, pb=None):
- return self._get_root_paths(self.scheme.tag_list, revnum, self.scheme.is_tag, project, pb)
+ return get_root_paths(self.repository, self.scheme.tag_list, revnum, self.scheme.is_tag, project, pb)
def get_tag_path(self, name, project=""):
return self.scheme.get_tag_path(name, project)
=== modified file 'mapping4.py'
--- a/mapping4.py 2008-08-30 00:40:33 +0000
+++ b/mapping4.py 2008-08-30 01:11:46 +0000
@@ -79,6 +79,9 @@
def __eq__(self, other):
return type(self) == type(other)
+ def get_branch_root(self, revprops):
+ return self.revprops.get_branch_root(revprops)
+
def get_lhs_parent(self, branch_path, svn_revprops, fileprops):
return self.revprops.get_lhs_parent(branch_path, svn_revprops, fileprops)
=== modified file 'repository.py'
--- a/repository.py 2008-08-30 00:40:33 +0000
+++ b/repository.py 2008-08-30 01:11:46 +0000
@@ -223,6 +223,7 @@
self.base = transport.base
assert self.base is not None
self._serializer = xml7.serializer_v7
+ self._config = None
self.get_config().add_location(self.base)
self._log = logwalker.LogWalker(transport=transport)
self.fileid_map = FileIdMap(simple_apply_changes, self)
@@ -276,9 +277,9 @@
self._lock_mode = None
self._clear_cached_state()
- def _clear_cached_state(self):
+ def _clear_cached_state(self, revnum=None):
self._cached_tags = {}
- self._cached_revnum = None
+ self._cached_revnum = revnum
self._layout = None
self._parents_provider = CachingParentsProvider(self._real_parents_provider)
@@ -776,7 +777,9 @@
yield self._revmeta(bp, paths, revnum, revprops, svn_fileprops)
def get_config(self):
- return SvnRepositoryConfig(self.uuid)
+ if self._config is None:
+ self._config = SvnRepositoryConfig(self.uuid)
+ return self._config
def has_signature_for_revision_id(self, revision_id):
"""Check whether a signature exists for a particular revision id.
=== modified file 'revids.py'
--- a/revids.py 2008-08-30 00:15:33 +0000
+++ b/revids.py 2008-08-30 01:11:46 +0000
@@ -60,23 +60,24 @@
except InvalidRevisionId:
pass
- for entry_revid, branch, revno, mapping in self.discover_revprop_revids(0, self.repos.get_latest_revnum()):
+ last_revnum = self.repos.get_latest_revnum()
+ for entry_revid, branch, revno, mapping in self.discover_revprop_revids(0, last_revnum):
if revid == entry_revid:
return (branch, revno, mapping.name)
- for entry_revid, branch, revno, mapping in self.discover_fileprop_revids(layout, 0, self.repos.get_latest_revnum(), project):
+ for entry_revid, branch, revno, mapping in self.discover_fileprop_revids(layout, 0, last_revnum, project):
if revid == entry_revid:
(bp, revnum, mapping_name) = self.bisect_revid_revnum(revid, branch, 0, revno)
return (bp, revnum, mapping_name)
raise NoSuchRevision(self, revid)
def discover_revprop_revids(self, from_revnum, to_revnum):
- for (_, revno, revprops) in self.repos._log.iter_revs(None, from_revnum, to_revnum):
+ for (_, revno, revprops) in self.repos._log.iter_changes(None, from_revnum, to_revnum):
if is_bzr_revision_revprops(revprops):
mapping = find_mapping(revprops, {})
(_, revid) = mapping.get_revision_id(None, revprops, {})
if revid is not None:
- yield (revid, mapping.get_branch_root(revprops), revno, mapping)
+ yield (revid, mapping.get_branch_root(revprops).strip("/"), revno, mapping)
def discover_fileprop_revids(self, layout, from_revnum, to_revnum, project=None):
reuse_policy = self.repos.get_config().get_reuse_revisions()
@@ -191,7 +192,7 @@
# check again.
raise e
found = None
- for entry_revid, branch, revno, mapping in self.discover_revprop_revids(0, self.repos.get_latest_revnum()):
+ for entry_revid, branch, revno, mapping in self.actual.discover_revprop_revids(last_checked, last_revnum):
if entry_revid == revid:
found = (branch, revno, revno, mapping)
if entry_revid not in self.revid_seen:
More information about the bazaar-commits
mailing list