[Pkg-bazaar-commits] ./bzr-svn/unstable r345: * New upstream release.
Jelmer Vernooij
jelmer at samba.org
Fri May 22 17:10:09 UTC 2009
------------------------------------------------------------
revno: 345
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: unstable
timestamp: Fri 2009-05-22 19:09:26 +0200
message:
* New upstream release.
* Add python-tdb and python-xdg to Recommends.
* Drop bzr-rebase from Recommends to Suggests.
modified:
NEWS
__init__.py
branch.py
cache/__init__.py
cache/sqlitecache.py
cache/tdbcache.py
commit.py
debian/changelog
debian/control
fetch.py
layout/standard.py
logwalker.py
push.py
repository.py
revids.py
revmeta.py
setup.py
tags.py
tests/test_cache.py
tests/test_fetch.py
tests/test_layout.py
transport.py
------------------------------------------------------------
revno: 220.106.181
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.6
timestamp: Wed 2009-05-20 17:59:15 +0200
message:
start on 0.6.1.
modified:
NEWS
__init__.py
setup.py
------------------------------------------------------------
revno: 220.106.182
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.6
timestamp: Wed 2009-05-20 20:36:07 +0200
message:
Use common function for updating tags in svn.
modified:
branch.py
------------------------------------------------------------
revno: 220.106.183
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.6
timestamp: Thu 2009-05-21 17:18:18 +0200
message:
Cope with credentials being a dictionary rather than a tuple.
modified:
transport.py
------------------------------------------------------------
revno: 220.106.184
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.6
timestamp: Thu 2009-05-21 19:12:39 +0200
message:
Fix cache inspection after push when using the TDB database.
modified:
NEWS
cache/tdbcache.py
------------------------------------------------------------
revno: 220.106.185
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.6
timestamp: Fri 2009-05-22 03:01:26 +0200
message:
Fix CustomLayout.is_branch_parent, CustomLayout.is_tag_parent.
modified:
layout/standard.py
tests/test_layout.py
------------------------------------------------------------
revno: 220.106.186
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.6
timestamp: Fri 2009-05-22 03:15:51 +0200
message:
Explicitly check for prefixes being None since an empty set of prefixes is actually valid.
modified:
revmeta.py
------------------------------------------------------------
revno: 220.106.187
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.6
timestamp: Fri 2009-05-22 04:27:06 +0200
message:
Split out branch tip finding function.
modified:
revids.py
------------------------------------------------------------
revno: 220.106.188
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.6
timestamp: Fri 2009-05-22 04:59:15 +0200
message:
Avoid buggy find_latest_change.
modified:
NEWS
branch.py
revids.py
------------------------------------------------------------
revno: 220.106.189
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.6
timestamp: Fri 2009-05-22 05:11:29 +0200
message:
s/paths/prefixes.
modified:
logwalker.py
------------------------------------------------------------
revno: 220.106.190
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.6
timestamp: Fri 2009-05-22 14:12:51 +0200
message:
Fix paths.
modified:
logwalker.py
------------------------------------------------------------
revno: 220.106.191
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.6
timestamp: Fri 2009-05-22 15:07:21 +0200
message:
Check for last revnum in paths rather than in revinfo (could've fetched the revprops for another reason).
modified:
cache/sqlitecache.py
tests/test_cache.py
------------------------------------------------------------
revno: 220.106.192
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.6
timestamp: Fri 2009-05-22 15:28:50 +0200
message:
Split out write readme file.
modified:
cache/__init__.py
------------------------------------------------------------
revno: 220.106.193
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.6
timestamp: Fri 2009-05-22 15:36:17 +0200
message:
Support XDG if the python-xdg module is installed. Old cache directories will also still be kept and used.
modified:
NEWS
cache/__init__.py
------------------------------------------------------------
revno: 220.106.194
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.6
timestamp: Fri 2009-05-22 15:36:30 +0200
message:
Fix syntax error.
modified:
branch.py
------------------------------------------------------------
revno: 220.106.195
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.6
timestamp: Fri 2009-05-22 17:07:07 +0200
message:
Handle hidden revisions during fetch.
modified:
NEWS
fetch.py
repository.py
revmeta.py
tests/test_fetch.py
------------------------------------------------------------
revno: 220.106.196
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.6
timestamp: Fri 2009-05-22 17:53:27 +0200
message:
Pass information about project around in a couple more places, so we don't search the full repository for revids.
modified:
branch.py
commit.py
fetch.py
push.py
repository.py
tags.py
------------------------------------------------------------
revno: 220.106.197
tags: bzr-svn-0.6.1
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.6
timestamp: Fri 2009-05-22 18:32:03 +0200
message:
Release 0.6.1.
modified:
NEWS
__init__.py
-------------- next part --------------
=== modified file 'NEWS'
--- a/NEWS 2009-05-20 16:19:35 +0000
+++ b/NEWS 2009-05-22 17:09:26 +0000
@@ -1,3 +1,22 @@
+bzr-svn 0.6.1 2009-05-22
+
+ BUG FIXES
+
+ * Cope with credentials in shared connections sometimes being a direct
+ dictionary.
+
+ * Fix cache inspection after push when using the TDB database.
+
+ * Prevent NoSuchRevision exception when pulling into a local branch that
+ is ahead of the remote branch.
+
+ * Avoid buggy LogWalker.find_latest_change(). (#378799)
+
+ * Use xdg cache directory (~/.cache/bzr-svn usually) if the Python XDG
+ module is available.
+
+ * Handle hidden revisions properly during branch fetch.
+
bzr-svn 0.6.0 2009-05-20
FEATURES
=== modified file '__init__.py'
--- a/__init__.py 2009-05-20 16:19:35 +0000
+++ b/__init__.py 2009-05-22 17:09:26 +0000
@@ -35,7 +35,7 @@
# versions ending in 'exp' mean experimental mappings
# versions ending in 'dev' mean development version
# versions ending in 'final' mean release (well tested, etc)
-version_info = (0, 6, 0, 'final', 0)
+version_info = (0, 6, 1, 'final', 0)
if version_info[3] == 'final':
version_string = '%d.%d.%d' % version_info[:3]
=== modified file 'branch.py'
--- a/branch.py 2009-05-20 16:19:35 +0000
+++ b/branch.py 2009-05-22 17:09:26 +0000
@@ -73,6 +73,9 @@
from bzrlib.plugins.svn import (
util,
)
+from bzrlib.plugins.svn.fetch import (
+ InterFromSvnRepository,
+ )
from bzrlib.plugins.svn.push import (
InterToSvnRepository,
create_branch_with_hidden_commit,
@@ -107,9 +110,11 @@
def report(self, to_file):
if not is_quiet():
- if self.old_revid == self.new_revid:
+ if self.old_revid in (self.new_revid, NULL_REVISION):
to_file.write('No revisions to pull.\n')
else:
+ if self.new_revmeta is None:
+ self.new_revmeta, _ = self.source_branch.repository._get_revmeta(self.new_revid)
to_file.write('Now on revision %d (svn revno: %d).\n' %
(self.new_revno, self.new_revmeta.revnum))
self._show_tag_conficts(to_file)
@@ -643,7 +648,10 @@
# common case of having something to pull, and so that the
# check for already merged can operate on the just fetched
# graph, which will be cached in memory.
- self.target.fetch(self.source, stop_revision)
+ interrepo = InterFromSvnRepository(self.source.repository,
+ self.target.repository)
+ interrepo.fetch(stop_revision, project=self.source.project,
+ mapping=self.source.mapping)
# Check to see if one is an ancestor of the other
if not overwrite:
if graph is None:
@@ -696,19 +704,19 @@
result.old_revmeta = None
tags_since_revnum = None
if stop_revision == NULL_REVISION:
+ result.new_revid = NULL_REVISION
result.new_revmeta = None
tags_until_revnum = 0
elif stop_revision is not None:
result.new_revmeta, _ = self.source.repository._get_revmeta(stop_revision)
tags_until_revnum = result.new_revmeta.revnum
else:
+ result.new_revmeta = None
tags_until_revnum = self.source.repository.get_latest_revnum()
self.update_revisions(stop_revision, overwrite)
if self.source.supports_tags():
result.tag_conflicts = self.source.tags.merge_to(self.target.tags, overwrite, _from_revnum=tags_since_revnum, _to_revnum=tags_until_revnum)
(result.new_revno, result.new_revid) = self.target.last_revision_info()
- if stop_revision is None:
- result.new_revmeta, _ = self.source.repository._get_revmeta(result.new_revid)
if _hook_master:
result.master_branch = _hook_master
result.local_branch = result.target_branch
@@ -835,8 +843,11 @@
self.source.repository, rev, push_metadata=False)
finally:
pb.finished()
- self.source.repository.fetch(self.target.repository,
- revision_id=revid_map[rev.revision_id])
+ interrepo = InterFromSvnRepository(self.target.repository,
+ self.source.repository)
+ interrepo.fetch(revision_id=revid_map[rev.revision_id],
+ mapping=self.target.mapping,
+ project=self.target.project)
self.target._clear_cached_state()
assert stop_revision in revid_map
assert len(revid_map.keys()) > 0
@@ -859,6 +870,9 @@
finally:
self.source.unlock()
+ def update_tags(self, overwrite=False):
+ return self.source.tags.merge_to(self.target.tags, overwrite)
+
def push(self, overwrite=False, stop_revision=None,
_push_merged=None, _override_svn_revprops=None):
"""See InterBranch.push()."""
@@ -872,8 +886,7 @@
self._update_revisions(stop_revision, overwrite,
push_merged=_push_merged,
override_svn_revprops=_override_svn_revprops)
- result.tag_conflicts = self.source.tags.merge_to(
- self.target.tags, overwrite)
+ result.tag_conflicts = self.update_tags(overwrite)
return result
finally:
self.source.unlock()
@@ -894,8 +907,7 @@
self._update_revisions(stop_revision, overwrite,
push_merged=_push_merged,
override_svn_revprops=_override_svn_revprops)
- result.tag_conflicts = self.source.tags.merge_to(
- self.target.tags, overwrite)
+ result.tag_conflicts = self.update_tags(overwrite)
return result
finally:
self.source.unlock()
=== modified file 'cache/__init__.py'
--- a/cache/__init__.py 2009-05-20 16:19:35 +0000
+++ b/cache/__init__.py 2009-05-22 17:09:26 +0000
@@ -35,6 +35,24 @@
from bzrlib.plugins.svn import version_info
+
+def write_cache_readme(path):
+ f = open(path, 'w')
+ try:
+ f.write(
+"""This directory contains information cached by the bzr-svn plugin.
+
+It is used for performance reasons only and can be removed
+without losing data.
+
+See http://bazaar-vcs.org/BzrForeignBranches/Subversion for details.
+""")
+ if version_info[3] == 'exp':
+ f.write("This is the directory used by the experimental version of bzr-svn.\n")
+ finally:
+ f.close()
+
+
def create_cache_dir():
"""Create the top-level bzr-svn cache directory.
@@ -43,10 +61,8 @@
ensure_config_dir_exists()
if version_info[3] == 'exp':
name = 'svn-cache-exp'
- extra = "This is the directory used by the experimental version of bzr-svn.\n"
else:
name = 'svn-cache'
- extra = ""
if sys.platform in ("nt", "win32"):
from bzrlib.win32utils import get_local_appdata_location
s = get_local_appdata_location()
@@ -56,21 +72,24 @@
if type(s) == str:
s = s.decode(bzrlib.user_encoding)
base_cache_dir = s.encode(osutils._fs_enc)
+ cache_dir = os.path.join(base_cache_dir, name)
else:
base_cache_dir = config_dir()
- cache_dir = os.path.join(base_cache_dir, name)
+ cache_dir = os.path.join(base_cache_dir, name)
+ # Check and use old location if possible
+ if os.path.exists(cache_dir):
+ return cache_dir
+ try:
+ from xdg.BaseDirectory import xdg_cache_home
+ except ImportError:
+ pass
+ else:
+ cache_dir = os.path.join(xdg_cache_home, "bazaar", "svn")
if not os.path.exists(cache_dir):
- os.mkdir(cache_dir)
-
- open(os.path.join(cache_dir, "README"), 'w').write(
-"""This directory contains information cached by the bzr-svn plugin.
-
-It is used for performance reasons only and can be removed
-without losing data.
-
-See http://bazaar-vcs.org/BzrForeignBranches/Subversion for details.
-""" + extra)
+ os.makedirs(cache_dir)
+ write_cache_readme(os.path.join(cache_dir, "README"))
+
return cache_dir
=== modified file 'cache/sqlitecache.py'
--- a/cache/sqlitecache.py 2009-05-20 00:30:45 +0000
+++ b/cache/sqlitecache.py 2009-05-22 13:07:21 +0000
@@ -368,7 +368,7 @@
"""
def last_revnum(self):
- saved_revnum = self.cachedb.execute("SELECT MAX(rev) FROM revinfo").fetchone()[0]
+ saved_revnum = self.cachedb.execute("SELECT MAX(rev) FROM changed_path").fetchone()[0]
if saved_revnum is None:
return 0
return saved_revnum
=== modified file 'cache/tdbcache.py'
--- a/cache/tdbcache.py 2009-05-20 00:30:45 +0000
+++ b/cache/tdbcache.py 2009-05-21 17:12:39 +0000
@@ -245,6 +245,7 @@
assert orig_paths[p][2] == -1
new_paths[p.strip("/")] = (orig_paths[p][0], copyfrom_path, orig_paths[p][2])
self.db["paths/%d" % rev] = bencode(new_paths)
+ self.db["log-last"] = "%d" % max(self.last_revnum(), rev)
def drop_revprops(self, revnum):
self.db["revprops/%d" % revnum] = bencode({})
@@ -262,7 +263,6 @@
if revprops is None:
revprops = {}
self.db["revprops/%d" % revision] = bencode((revprops, all_revprops))
- self.db["log-last"] = "%d" % max(self.last_revnum(), revision)
def last_revnum(self):
try:
=== modified file 'commit.py'
--- a/commit.py 2009-05-20 16:19:35 +0000
+++ b/commit.py 2009-05-22 17:09:26 +0000
@@ -137,7 +137,7 @@
return None
-def update_mergeinfo(repository, graph, oldvalue, baserevid, merges):
+def update_mergeinfo(lookup_revid, graph, oldvalue, baserevid, merges):
"""Update a svn:mergeinfo property to include a specified list of merges."""
pb = ui.ui_factory.nested_progress_bar()
try:
@@ -148,7 +148,7 @@
if graph.is_ancestor(revid, baserevid):
break
try:
- (uuid, path, revnum), mapping = repository.lookup_revision_id(revid)
+ (uuid, path, revnum), mapping = lookup_revid(revid)
except NoSuchRevision:
break
@@ -481,6 +481,7 @@
if base_foreign_revid is None or base_mapping is None:
base_foreign_revid, base_mapping = \
repository.lookup_revision_id(self.base_revid)
+ self.base_foreign_revid = base_foreign_revid
(uuid, self.base_path, self.base_revnum) = base_foreign_revid
self.base_mapping = base_mapping
self._base_revmeta = self.repository._revmeta_provider.lookup_revision(self.base_path, self.base_revnum)
@@ -537,12 +538,15 @@
if len(merges) > 0:
old_svk_merges = self._base_branch_props.get(SVN_PROP_SVK_MERGE, "")
+ def lookup_revid(revid):
+ return repository.lookup_revision_id(revid,
+ foreign_sibling=self.base_foreign_revid)
new_svk_merges = update_svk_features(old_svk_merges, merges,
- self.repository.lookup_revision_id)
+ lookup_revid)
if new_svk_merges is not None:
self._svnprops[SVN_PROP_SVK_MERGE] = new_svk_merges
- new_mergeinfo = update_mergeinfo(self.repository, graph,
+ new_mergeinfo = update_mergeinfo(lookup_revid, graph,
self._base_branch_props.get(properties.PROP_MERGEINFO, ""),
self.base_revid, merges)
if new_mergeinfo is not None:
@@ -667,7 +671,7 @@
continue
try:
(uuid, base_path, base_revnum), base_mapping = \
- self.repository.lookup_revision_id(p)
+ self.repository.lookup_revision_id(p, foreign_sibling=self.base_foreign_revid)
except NoSuchRevision:
continue
inv = None
=== modified file 'debian/changelog'
--- a/debian/changelog 2009-05-20 16:43:02 +0000
+++ b/debian/changelog 2009-05-22 17:09:26 +0000
@@ -1,6 +1,8 @@
-bzr-svn (0.6.0-2) UNRELEASED; urgency=low
+bzr-svn (0.6.1-1) unstable; urgency=low
- * Add python-tdb to Recommends.
+ * New upstream release.
+ * Add python-tdb and python-xdg to Recommends.
+ * Drop bzr-rebase from Recommends to Suggests.
-- Jelmer Vernooij <jelmer at debian.org> Wed, 20 May 2009 18:42:50 +0200
=== modified file 'debian/control'
--- a/debian/control 2009-05-20 16:43:02 +0000
+++ b/debian/control 2009-05-22 17:09:26 +0000
@@ -13,7 +13,8 @@
Architecture: all
Depends: bzr (>= 1.15~), bzr (<< 1.16~), ${python:Depends}, ${misc:Depends}, python (>= 2.5) | python-pysqlite2, python-subvertpy (>> 0.6.1)
Enhances: bzr, subversion
-Recommends: bzr-rebase (>= 0.5.0), python-tdb
+Recommends: python-tdb, python-xdg
+Suggests: bzr-rebase (>= 0.5.0)
Conflicts: bzr-rebase (<< 0.5.0)
XB-Python-Version: ${python:Versions}
Description: Bazaar plugin providing Subversion integration
=== modified file 'fetch.py'
--- a/fetch.py 2009-05-20 16:19:35 +0000
+++ b/fetch.py 2009-05-22 17:09:26 +0000
@@ -925,8 +925,6 @@
map = {}
for revmeta, mapping in revmetas:
try:
- if revmeta.is_hidden(mapping):
- continue
map[revmeta, mapping] = revmeta.get_revision_id(mapping)
except SubversionException, (_, ERR_FS_NOT_DIRECTORY):
continue
@@ -958,14 +956,15 @@
not m.is_branch_or_tag(revmeta.branch_path)):
continue
if prefix is not None:
- lhs_parent_revmeta = revmeta.get_direct_lhs_parent_revmeta()
+ lhs_parent_revmeta = revmeta.get_lhs_parent_revmeta(m)
if lhs_parent_revmeta is not None and not changes.path_is_child(prefix, lhs_parent_revmeta.branch_path):
# Parent branch path is outside of prefix; we need to
# check manually
self.needed.extend(self.find_mainline(lhs_parent_revmeta.get_foreign_revid(), lhsm))
if lhsm != master_mapping or heads is not None:
- needed_mappings[revmeta.get_direct_lhs_parent_revmeta()].add(lhsm)
- needs_checking.append((revmeta, m))
+ needed_mappings[revmeta.get_lhs_parent_revmeta(m)].add(lhsm)
+ if not revmeta.is_hidden(m):
+ needs_checking.append((revmeta, m))
self.needed.extend(reversed(self.check_revmetas(needs_checking)))
def find_all(self, mapping, pb=None):
@@ -977,7 +976,8 @@
from_revnum = self.source.get_latest_revnum()
return self.find_iter_revisions(self.source._revmeta_provider.iter_all_revisions(self.source.get_layout(), check_unusual_path=mapping.is_branch_or_tag, from_revnum=from_revnum, pb=pb), mapping)
- def find_mainline(self, foreign_revid, mapping, project=None, find_ghosts=False, pb=None):
+ def find_mainline(self, foreign_revid, mapping,
+ find_ghosts=False, pb=None):
if (foreign_revid, mapping) in self.checked:
return []
revmetas = deque()
@@ -1009,26 +1009,26 @@
for revmeta, mapping in revmetas:
for p in revmeta.get_rhs_parents(mapping):
try:
- foreign_revid, rhs_mapping = self.source.lookup_revision_id(p, project=project)
+ foreign_revid, rhs_mapping = self.source.lookup_revision_id(p, foreign_sibling=revmeta.get_foreign_revid())
except NoSuchRevision:
pass # Ghost
else:
- self.extra.append((foreign_revid, project, rhs_mapping))
+ self.extra.append((foreign_revid, rhs_mapping))
return revmetas
- def find_until(self, foreign_revid, mapping, find_ghosts=False, pb=None,
- project=None):
+ def find_until(self, foreign_revid, mapping, find_ghosts=False,
+ pb=None):
"""Find all missing revisions until revision_id
:param revision_id: Stop revision
:param find_ghosts: Find ghosts
:return: List with revmeta, mapping tuples to fetch
"""
- self.extra.append((foreign_revid, project, mapping))
+ self.extra.append((foreign_revid, mapping))
while len(self.extra) > 0:
- foreign_revid, project, mapping = self.extra.pop()
+ foreign_revid, mapping = self.extra.pop()
self.needed.extend(self.find_mainline(foreign_revid, mapping,
- project, find_ghosts=find_ghosts, pb=pb))
+ find_ghosts=find_ghosts, pb=pb))
class InterFromSvnRepository(InterRepository):
@@ -1195,7 +1195,7 @@
self.target.commit_write_group()
def fetch(self, revision_id=None, pb=None, find_ghosts=False,
- needed=None, mapping=None, fetch_spec=None):
+ needed=None, mapping=None, project=None, fetch_spec=None):
"""Fetch revisions. """
if revision_id == NULL_REVISION:
return
@@ -1217,14 +1217,16 @@
target_is_empty)
if needed is None:
if revision_id is not None:
- foreign_revid, mapping = self.source.lookup_revision_id(revision_id)
+ foreign_revid, mapping = self.source.lookup_revision_id(revision_id, project=project)
revisionfinder.find_until(foreign_revid,
- mapping, find_ghosts, pb=nested_pb)
+ mapping, find_ghosts=find_ghosts,
+ pb=nested_pb)
elif fetch_spec is not None:
for head in fetch_spec.heads:
- foreign_revid, mapping = self.source.lookup_revision_id(head)
+ foreign_revid, mapping = self.source.lookup_revision_id(head, project=project)
revisionfinder.find_until(foreign_revid,
- mapping, find_ghosts, pb=nested_pb)
+ mapping, find_ghosts=find_ghosts,
+ pb=nested_pb)
else:
revisionfinder.find_all(self.source.get_mapping(), pb=nested_pb)
needed = revisionfinder.get_missing()
=== modified file 'layout/standard.py'
--- a/layout/standard.py 2009-05-06 09:42:48 +0000
+++ b/layout/standard.py 2009-05-22 01:01:26 +0000
@@ -311,6 +311,18 @@
def __repr__(self):
return "%s(%r,%r)" % (self.__class__.__name__, self.branches, self.tags)
+ def _is_prefix(self, prefixes, path, project=None):
+ for branch in prefixes:
+ if branch.startswith("%s/" % path):
+ return True
+ return False
+
+ def is_branch_parent(self, path, project=None):
+ return self._is_prefix(self.branches, path, project)
+
+ def is_tag_parent(self, path, project=None):
+ return self._is_prefix(self.tags, path, project)
+
class WildcardLayout(RepositoryLayout):
=== modified file 'logwalker.py'
--- a/logwalker.py 2009-05-20 16:19:35 +0000
+++ b/logwalker.py 2009-05-22 17:09:26 +0000
@@ -44,17 +44,17 @@
# Maximum number of extra revisions to fetch in caching logwalker
MAX_OVERHEAD_FETCH = 1000
-def iter_changes(paths, from_revnum, to_revnum, get_revision_paths,
+def iter_changes(prefixes, from_revnum, to_revnum, get_revision_paths,
revprop_list, limit=0):
ascending = (to_revnum > from_revnum)
revnum = from_revnum
- if paths is None:
+ if prefixes is None:
path = ""
else:
- assert len(paths) == 1
- path = paths[0].strip("/")
+ assert len(prefixes) == 1
+ path = prefixes[0].strip("/")
assert from_revnum >= to_revnum or path == "", \
"path: %s, %d >= %d" % (path, from_revnum, to_revnum)
@@ -162,10 +162,10 @@
return revnum
- def iter_changes(self, paths, from_revnum, to_revnum=0, limit=0, pb=None):
+ def iter_changes(self, prefixes, from_revnum, to_revnum=0, limit=0, pb=None):
"""Return iterator over all the revisions between from_revnum and to_revnum named path or inside path.
- :param paths: Paths to report about.
+ :param prefixes: Prefixes of paths to report about
:param from_revnum: Start revision.
:param to_revnum: End revision.
:return: An iterator that yields tuples with (paths, revnum, revprops)
@@ -173,10 +173,10 @@
in revnum.
"""
assert from_revnum >= 0 and to_revnum >= 0, "%r -> %r" % (from_revnum, to_revnum)
- self.mutter("iter changes %r->%r (%r)", from_revnum, to_revnum, paths)
+ self.mutter("iter changes %r->%r (%r)", from_revnum, to_revnum, prefixes)
self._fetch_revisions(max(from_revnum, to_revnum), pb=pb)
- return iter(iter_changes(paths, from_revnum, to_revnum,
+ return iter(iter_changes(prefixes, from_revnum, to_revnum,
self.get_revision_paths, self.revprop_list, limit))
def get_revision_paths(self, revnum):
@@ -307,10 +307,10 @@
def revprop_list(self, revnum):
return lazy_dict({}, self._transport.revprop_list, revnum)
- def iter_changes(self, paths, from_revnum, to_revnum=0, limit=0, pb=None):
+ def iter_changes(self, prefixes, from_revnum, to_revnum=0, limit=0, pb=None):
"""Return iterator over all the revisions between revnum and 0 named path or inside path.
- :param paths: Paths report about (in revnum)
+ :param prefixes: Prefixes to report about (in from_revnum)
:param from_revnum: Start revision.
:param to_revnum: End revision.
:return: An iterator that yields tuples with (paths, revnum, revprops)
@@ -325,7 +325,7 @@
else:
todo_revprops = ["svn:author", "svn:log", "svn:date"]
- iterator = self._transport.iter_log(paths, from_revnum, to_revnum, limit,
+ iterator = self._transport.iter_log(prefixes, from_revnum, to_revnum, limit,
True, False, False, revprops=todo_revprops)
for (changed_paths, revnum, known_revprops, has_children) in iterator:
@@ -373,8 +373,8 @@
self.paths = paths
self.revprops = revprops
- def iter_changes(self, paths, from_revnum, to_revnum=0, limit=0, pb=None):
- return iter(iter_changes(paths, from_revnum, to_revnum,
+ def iter_changes(self, prefixes, from_revnum, to_revnum=0, limit=0, pb=None):
+ return iter(iter_changes(prefixes, from_revnum, to_revnum,
self.get_revision_paths, self.revprop_list, limit))
def get_revision_paths(self, revnum):
=== modified file 'push.py'
--- a/push.py 2009-05-17 16:17:31 +0000
+++ b/push.py 2009-05-22 15:53:27 +0000
@@ -366,7 +366,8 @@
if parent_revid == NULL_REVISION:
target_project = None
else:
- (_, bp, _), _ = self.target.lookup_revision_id(parent_revid)
+ (_, bp, _), _ = self.target.lookup_revision_id(parent_revid,
+ foreign_sibling=rev.foreign_revid)
(_, target_project, _, _) = layout.parse(bp)
bp = determine_branch_path(rev, layout, target_project)
target_config = self._get_branch_config(bp)
=== modified file 'repository.py'
--- a/repository.py 2009-05-20 16:19:35 +0000
+++ b/repository.py 2009-05-22 17:09:26 +0000
@@ -725,7 +725,7 @@
yield entry
for rhs_parent_revid in revmeta.get_rhs_parents(mapping):
try:
- (_, rhs_parent_bp, rhs_parent_revnum), rhs_parent_mapping = self.lookup_revision_id(rhs_parent_revid)
+ (_, rhs_parent_bp, rhs_parent_revnum), rhs_parent_mapping = self.lookup_revision_id(rhs_parent_revid, foreign_sibling=revmeta.get_foreign_revid())
except bzr_errors.NoSuchRevision:
pass
else:
@@ -733,6 +733,10 @@
def _iter_reverse_revmeta_mapping_history(self, branch_path, revnum,
to_revnum, mapping, pb=None, limit=0):
+ """Iterate over the history of a RevisionMetadata object.
+
+ This will skip hidden revisions.
+ """
assert mapping is not None
expected_revid = None
iter = self._revmeta_provider.iter_reverse_branch_changes(branch_path,
@@ -740,11 +744,14 @@
for revmeta in iter:
(mapping, lhs_mapping) = revmeta.get_appropriate_mappings(mapping)
assert not lhs_mapping.newer_than(mapping), "LHS mapping %r newer than %r" % (lhs_mapping, mapping)
+ if revmeta.is_hidden(mapping):
+ mapping = lhs_mapping
+ continue
revid = revmeta.get_revision_id(mapping)
if (expected_revid is not None and
not revid in (None, expected_revid)):
# Need to restart, branch root has changed
- (_, branch_path, revnum), mapping = self.lookup_revision_id(revid)
+ (_, branch_path, revnum), mapping = self.lookup_revision_id(revid, foreign_sibling=revmeta.get_foreign_revid())
iter = self._revmeta_provider.iter_reverse_branch_changes(branch_path, revnum, to_revnum=to_revnum, pb=pb, limit=limit)
if not mapping.is_branch_or_tag(revmeta.branch_path):
return
@@ -753,11 +760,12 @@
mapping = lhs_mapping
if expected_revid is not None and expected_revid != NULL_REVISION:
# Need to restart, branch root has changed
- (_, branch_path, revnum), mapping = self.lookup_revision_id(expected_revid)
+ (_, branch_path, revnum), mapping = self.lookup_revision_id(expected_revid, foreign_sibling=revmeta.get_foreign_revid())
for (revmeta, mapping) in self._iter_reverse_revmeta_mapping_history(branch_path, revnum, to_revnum=to_revnum, mapping=mapping, pb=pb, limit=limit):
yield (revmeta, mapping)
- def iter_reverse_revision_history(self, revision_id, pb=None, limit=0):
+ def iter_reverse_revision_history(self, revision_id, pb=None, limit=0,
+ project=None):
"""Iterate backwards through revision ids in the lefthand history
:param revision_id: The revision id to start with. All its lefthand
@@ -765,7 +773,7 @@
"""
if revision_id in (None, NULL_REVISION):
return
- (uuid, branch_path, revnum), mapping = self.lookup_revision_id(revision_id)
+ (uuid, branch_path, revnum), mapping = self.lookup_revision_id(revision_id, project=project)
assert uuid == self.uuid
for revmeta, mapping in self._iter_reverse_revmeta_mapping_history(
branch_path, revnum, to_revnum=0, mapping=mapping, pb=pb,
@@ -897,7 +905,7 @@
return self.lookup_foreign_revision_id((self.uuid, path, revnum), mapping)
def lookup_revision_id(self, revid, layout=None, ancestry=None,
- project=None):
+ project=None, foreign_sibling=None):
"""Parse an existing Subversion-based revision id.
:param revid: The revision id.
@@ -908,9 +916,6 @@
"""
# FIXME: Use ancestry
# If there is no entry in the map, walk over all branches:
- if layout is None:
- layout = self.get_layout()
-
# Try a simple parse
try:
(uuid, branch_path, revnum), mapping = mapping_registry.parse_revision_id(revid)
@@ -924,6 +929,13 @@
except bzr_errors.InvalidRevisionId:
pass
+ if layout is None:
+ layout = self.get_layout()
+ if foreign_sibling is not None and project is None:
+ try:
+ project = layout.parse(foreign_sibling[1])[1]
+ except errors.NotSvnBranchPath:
+ project = None
return self.revmap.get_branch_revnum(revid, layout, project)
def seen_bzr_revprops(self):
=== modified file 'revids.py'
--- a/revids.py 2009-05-20 16:19:35 +0000
+++ b/revids.py 2009-05-22 17:09:26 +0000
@@ -86,20 +86,26 @@
if revid is not None:
yield (revid, branch_path.strip("/"), revnum, mapping)
- def discover_fileprop_revids(self, layout, from_revnum, to_revnum, project=None, pb=None):
+ def find_branch_tips(self, layout, from_revnum, to_revnum, project=None):
+ # TODO: Use RevisionMetadataBrowser to find the tip revmetas all at once
reuse_policy = self.repos.get_config().get_reuse_revisions()
assert reuse_policy in ("other-branches", "removed-branches", "none")
check_removed = (reuse_policy == "removed-branches")
- # TODO: Some sort of progress indication
for (branch, revno, exists) in self.repos.find_fileprop_paths(layout, from_revnum, to_revnum, project, check_removed=check_removed):
- if pb is not None:
- pb.update("finding fileprop revids", revno-from_revnum, to_revnum-from_revnum)
assert isinstance(branch, str)
assert isinstance(revno, int)
+ iterator = self.repos._revmeta_provider.iter_reverse_branch_changes(branch, revno, to_revnum=0, limit=0)
+ yield iterator.next()
+
+ def discover_fileprop_revids(self, layout, from_revnum, to_revnum, project=None, pb=None):
+ for revmeta in self.find_branch_tips(layout, from_revnum, to_revnum, project):
+ # TODO: Some sort of progress indication
+ if pb is not None:
+ pb.update("finding fileprop revids",
+ revmeta.revnum-from_revnum, to_revnum-from_revnum)
# Look at their bzr:revision-id-vX
revids = set()
try:
- revmeta = self.repos._revmeta_provider.lookup_revision(branch, self.repos._log.find_latest_change(branch, revno))
if revmeta.consider_bzr_fileprops():
for revid, bzr_revno, mapping_name in revmeta.get_roundtrip_ancestor_revids():
revids.add(((bzr_revno, revid), mapping_name))
@@ -116,7 +122,8 @@
except KeyError:
pass
else:
- yield (entry_revid, branch, 0, revno, mapping)
+ yield (entry_revid, revmeta.branch_path, 0,
+ revmeta.revnum, mapping)
def bisect_revid_revnum(self, revid, branch_path, min_revnum, max_revnum):
"""Find out what the actual revnum was that corresponds to a revid.
=== modified file 'revmeta.py'
--- a/revmeta.py 2009-05-20 00:30:57 +0000
+++ b/revmeta.py 2009-05-22 15:07:07 +0000
@@ -494,6 +494,8 @@
"""Check whether this revision should be hidden from Bazaar history."""
if not mapping.supports_hidden:
return False
+ if not self.changes_branch_root():
+ return False
(bzr_revno, revid, hidden) = self.get_revision_info(mapping)
return hidden
@@ -1144,11 +1146,11 @@
del self._pending_ancestors[x]
self._unusual.update(self._unusual_history[x])
del self._unusual_history[x]
- if self._prefixes:
+ if self._prefixes is not None:
self._prefixes.update(self._pending_prefixes[x])
# Eliminate anything that's not under prefixes/
- if self._prefixes:
+ if self._prefixes is not None:
for bp in self._ancestors.keys():
if not self.under_prefixes(bp, self._prefixes):
del self._ancestors[bp]
@@ -1165,7 +1167,7 @@
# Find out what branches have changed
for p in sorted(paths):
- if self._prefixes and not self.under_prefixes(p, self._prefixes):
+ if self._prefixes is not None and not self.under_prefixes(p, self._prefixes):
continue
action = paths[p][0]
try:
=== modified file 'setup.py'
--- a/setup.py 2009-05-15 23:14:37 +0000
+++ b/setup.py 2009-05-20 15:59:15 +0000
@@ -5,7 +5,7 @@
from distutils.core import setup
import os, sys
-version = (0, 6, 0)
+version = (0, 6, 1)
version_string = ".".join([str(x) for x in version])
setup(name='bzr-svn',
=== modified file 'tags.py'
--- a/tags.py 2009-05-12 23:38:32 +0000
+++ b/tags.py 2009-05-22 15:53:27 +0000
@@ -49,14 +49,16 @@
class ReverseTagDict(object):
- def __init__(self, repository, tags):
+ def __init__(self, repository, tags, project):
self.repository = repository
+ self.project = project
self._by_foreign_revid = {}
for name, revmeta in tags.iteritems():
self._by_foreign_revid.setdefault(revmeta.get_foreign_revid(), []).append(name)
def get(self, revid):
- foreign_revid, mapping = self.repository.lookup_revision_id(revid)
+ foreign_revid, mapping = self.repository.lookup_revision_id(revid,
+ project=self.project)
return self._by_foreign_revid.get(foreign_revid)
@@ -257,7 +259,8 @@
def get_reverse_tag_dict(self):
"""Returns a dict with revisions as keys
and a list of tags for that revision as value"""
- return ReverseTagDict(self.repository, self._get_tag_dict_revmeta())
+ return ReverseTagDict(self.repository, self._get_tag_dict_revmeta(),
+ self.branch.project)
def delete_tag(self, tag_name):
path = self.branch.layout.get_tag_path(tag_name, self.branch.project)
=== modified file 'tests/test_cache.py'
--- a/tests/test_cache.py 2009-05-20 00:30:45 +0000
+++ b/tests/test_cache.py 2009-05-22 13:07:21 +0000
@@ -32,6 +32,10 @@
class LogCacheTests(object):
+ def test_last_revnum(self):
+ self.cache.insert_paths(42, {"foo": ("A", None, -1)})
+ self.assertEquals(42, self.cache.last_revnum())
+
def test_insert_paths(self):
self.cache.insert_paths(42, {"foo": ("A", None, -1)})
self.assertEquals({"foo": ("A", None, -1)},
=== modified file 'tests/test_fetch.py'
--- a/tests/test_fetch.py 2009-05-20 16:19:35 +0000
+++ b/tests/test_fetch.py 2009-05-22 17:09:26 +0000
@@ -1853,6 +1853,39 @@
self.assertEqual(oldrepos.generate_revision_id(2, "", mapping),
inv2[inv2.path2id("bla")].revision)
+ def test_fetch_hidden(self):
+ repos_url = self.make_repository('d')
+
+ dc = self.get_commit_editor(repos_url)
+ trunk = dc.add_dir("trunk")
+ trunk.add_file("trunk/bla").modify("data")
+ dc.close()
+
+ dc = self.get_commit_editor(repos_url)
+ branches = dc.add_dir("branches")
+ branch = branches.add_dir("branches/brancha", "trunk")
+ dc.close()
+
+ self.client_set_revprop(repos_url, 2, "bzr:hidden", "")
+ self.client_set_revprop(repos_url, 2, "bzr:root", "branches/brancha")
+
+ dc = self.get_commit_editor(repos_url)
+ branches = dc.open_dir("branches")
+ brancha = branches.open_dir("branches/brancha")
+ brancha.add_file("branches/brancha/lala")
+ dc.close()
+
+ oldrepos = Repository.open(repos_url)
+ oldrepos.set_layout(TrunkLayout(0))
+ dir = BzrDir.create("f", format.get_rich_root_format())
+ newrepos = dir.create_repository()
+ self.copy_content(oldrepos, newrepos)
+
+ mapping = oldrepos.get_mapping()
+ self.assertTrue(newrepos.has_revision(mapping.revision_id_foreign_to_bzr((oldrepos.uuid, "branches/brancha", 3))))
+ self.assertTrue(newrepos.has_revision(mapping.revision_id_foreign_to_bzr((oldrepos.uuid, "trunk", 1))))
+ self.assertFalse(newrepos.has_revision(mapping.revision_id_foreign_to_bzr((oldrepos.uuid, "branches/brancha", 2))))
+
def test_fetch_svk_merge(self):
repos_url = self.make_repository('d')
=== modified file 'tests/test_layout.py'
--- a/tests/test_layout.py 2009-04-01 01:24:58 +0000
+++ b/tests/test_layout.py 2009-05-22 01:01:26 +0000
@@ -21,6 +21,7 @@
NotSvnBranchPath,
)
from bzrlib.plugins.svn.layout.standard import (
+ CustomLayout,
RootLayout,
TrunkLayout,
WildcardLayout,
@@ -131,3 +132,16 @@
self.assertEquals("bla", x.get_tag_name("tags/bla"))
x = WildcardLayout(["trunk"], ["tags/bla"])
self.assertEquals(None, x.get_tag_name("bla"))
+
+
+class CustomLayoutTests(TestCase):
+
+ def test_is_branch(self):
+ x = CustomLayout(["foo/bar"])
+ self.assertTrue(x.is_branch("foo/bar"))
+ self.assertFalse(x.is_branch("foo"))
+
+ def test_is_branch_parent(self):
+ x = CustomLayout(["foo/bar"])
+ self.assertFalse(x.is_branch_parent("foo/bar"))
+ self.assertTrue(x.is_branch_parent("foo"))
=== modified file 'transport.py'
--- a/transport.py 2009-05-20 16:19:35 +0000
+++ b/transport.py 2009-05-22 17:09:26 +0000
@@ -92,7 +92,10 @@
# we try to use bzr svn on this transport
shared_connection = getattr(bzr_transport, "_shared_connection", None)
if shared_connection is not None and shared_connection.credentials is not None:
- creds = shared_connection.credentials[0]
+ if isinstance(shared_connection.credentials, dict):
+ creds = shared_connection.credentials
+ else:
+ creds = shared_connection.credentials[0]
else:
creds = None
svnbase = bzr_transport.base
More information about the Pkg-bazaar-commits
mailing list