[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