Rev 1854: Add initial support for bzr:hidden. in file:///data/jelmer/bzr-svn/trunk/

Jelmer Vernooij jelmer at samba.org
Sun Sep 7 23:15:08 BST 2008


At file:///data/jelmer/bzr-svn/trunk/

------------------------------------------------------------
revno: 1854
revision-id: jelmer at samba.org-20080907221506-bqm9jt9cmqaq3awb
parent: jelmer at samba.org-20080907210222-rvt7g1bd7vjfsl6h
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: trunk
timestamp: Mon 2008-09-08 00:15:06 +0200
message:
  Add initial support for bzr:hidden.
modified:
  NEWS                           news-20061231030336-h9fhq245ie0de8bs-1
  TODO                           todo-20060729211917-2kpobww0zyvvo0j2-1
  branch.py                      svnbranch.py-20051017135706-11c749eb0dab04a7
  commit.py                      commit.py-20060607190346-qvq128wgfubhhgm2-1
  convert.py                     svn2bzr.py-20051018015439-cb4563bff29e632d
  fetch.py                       fetch.py-20060625004942-x2lfaib8ra707a8p-1
  fileids.py                     fileids.py-20060714013623-u5iiyqqnko11grcf-1
  mapping.py                     mapping.py-20080128201303-6cp01phc0dmc0kiv-1
  mapping4.py                    mapping4.py-20080827182338-y4xzpsf43vyiwcir-1
  repository.py                  repository.py-20060306123302-1f8c5069b3fe0265
  revmeta.py                     revmeta.py-20080901215045-n8a6arqybs9ez5hl-1
  upgrade.py                     upgrade.py-20070106192108-0rakplee2lzah4gs-1
=== modified file 'NEWS'
--- a/NEWS	2008-09-07 21:02:22 +0000
+++ b/NEWS	2008-09-07 22:15:06 +0000
@@ -38,6 +38,8 @@
 
    * Don't rely on cache when checking revision id during commit. (#230863)
 
+   * Avoid pushing changes again when pushing new branch. (#203368)
+
   INTERNALS
 
    * Remove custom commit code for working tree. 

=== modified file 'TODO'
--- a/TODO	2008-09-04 08:48:16 +0000
+++ b/TODO	2008-09-07 22:15:06 +0000
@@ -3,20 +3,19 @@
  - allow skipping a revision completely - to allow creating branches using "svn cp"
  - create schemes from layouts rather than the other way around
   + remove Mapping.get_guessed_layout()
-
+- fix update_after_commit test
+- fix text parents
+
+more tests:
+- Run all tests against repository with revprop changing allowed and without
+- performance tests (count roundtrips?)
+- bzr:hidden
+- bzr svn-set-revprops
+
+performance:
 - generate deltas rather than fulltexts when creating file id maps
-- fix working trees
-
-tests:
-- more blackbox tests
- - svn-import without scheme specified should guess
-- performance tests (count roundtrips?)
-
-.svn working trees:
-- implement apply_inventory_delta()
-
-- Needs more tests
- - Run all tests against repository with revprop changing allowed and without
+- use replay and replay range to fetch revisions
+- implement SvnWorkingTree.apply_inventory_delta()
 
 for other things to do, see:
 

=== modified file 'branch.py'
--- a/branch.py	2008-09-06 23:49:34 +0000
+++ b/branch.py	2008-09-07 22:15:06 +0000
@@ -315,7 +315,7 @@
         if self._revmeta_cache is None:
             pb = ui.ui_factory.nested_progress_bar()
             try:
-                self._revmeta_cache = self.repository._revmeta_provider.get_mainline(self.get_branch_path(), self.get_revnum(), self.mapping, pb=pb)
+                self._revmeta_cache = [revmeta for revmeta in self.repository._revmeta_provider.get_mainline(self.get_branch_path(), self.get_revnum(), self.mapping, pb=pb) if not revmeta.is_hidden(self.mapping)]
             finally:
                 pb.finished()
         return self._revmeta_cache

=== modified file 'commit.py'
--- a/commit.py	2008-09-07 21:02:22 +0000
+++ b/commit.py	2008-09-07 22:15:06 +0000
@@ -653,6 +653,32 @@
     builder.finish_inventory()
 
 
+def create_branch_with_hidden_commit(repository, branch_path, revid, deletefirst=False):
+    revprops = {properties.PROP_REVISION_LOG: "Create new branch."}
+    revmeta, mapping = repository._get_revmeta(revid)
+    fileprops = dict(revmeta.get_fileprops().items())
+    mapping.export_hidden(revprops, fileprops)
+    parent = urlutils.dirname(branch_path)
+    conn = repository.transport.get_connection(parent)
+    try:
+        ci = conn.get_commit_editor(revprops)
+        try:
+            root = ci.open_root()
+            if deletefirst:
+                root.delete_entry(urlutils.basename(branch_path))
+            branch_dir = root.add_directory(urlutils.basename(branch_path), urlutils.join(repository.base, revmeta.branch_path), revmeta.revnum)
+            for k, v in properties.diff(fileprops, revmeta.get_fileprops()).items():
+                branch_dir.change_prop(k, v)
+            branch_dir.close()
+            root.close()
+        except:
+            ci.abort()
+            raise
+        ci.close()
+    finally:
+        repository.transport.add_connection(conn)
+
+
 def push_new(graph, target_repository, target_branch_path, source, stop_revision,
              push_metadata=True, append_revisions_only=False):
     """Push a revision into Subversion, creating a new branch.
@@ -675,7 +701,12 @@
         start_revid_parent = NULL_REVISION
     else:
         start_revid_parent = rev.parent_ids[0]
-    return push_revision_tree(graph, target_repository, target_branch_path, 
+    # If this is just intended to create a new branch
+    mapping = target_repository.get_mapping()
+    if (stop_revision != NULL_REVISION and stop_revision == start_revid and mapping.supports_hidden):
+        create_branch_with_hidden_commit(target_repository, target_branch_path, start_revid, mapping)
+    else:
+        return push_revision_tree(graph, target_repository, target_branch_path, 
                               target_repository.get_config(), 
                               source, start_revid_parent, start_revid, 
                               rev, push_metadata=push_metadata,

=== modified file 'convert.py'
--- a/convert.py	2008-09-07 02:22:28 +0000
+++ b/convert.py	2008-09-07 22:15:06 +0000
@@ -190,6 +190,8 @@
                                                                        to_revnum, from_revnum,
                                                                        project=project):
                     pb.update("determining revisions to fetch", to_revnum-revmeta.revnum, to_revnum)
+                    if revmeta.is_hidden(mapping):
+                        continue
                     if target_repos is not None and not target_repos.has_revision(revmeta.get_revision_id(mapping)):
                         revmetas.append(revmeta)
                     if not revmeta.branch_path in existing_branches:

=== modified file 'fetch.py'
--- a/fetch.py	2008-09-07 02:01:34 +0000
+++ b/fetch.py	2008-09-07 22:15:06 +0000
@@ -591,6 +591,8 @@
         graph = self.source.get_graph()
         available_revs = set()
         for revmeta in self.source._revmeta_provider.iter_all_changes(self.source.get_layout(), mapping=mapping, from_revnum=self.source.get_latest_revnum(), pb=pb):
+            if revmeta.is_hidden(mapping):
+                continue
             revid = revmeta.get_revision_id(mapping)
             available_revs.add(revid)
             meta_map[revid] = revmeta
@@ -642,6 +644,8 @@
                 if pb:
                     pb.update("determining revisions to fetch", 
                               revnum-revmeta.revnum, revnum)
+                if revmeta.is_hidden(mapping):
+                    continue
                 revid = revmeta.get_revision_id(mapping)
                 parent_ids = revmeta.get_parent_ids(mapping)
                 if revid in checked:

=== modified file 'fileids.py'
--- a/fileids.py	2008-09-06 14:20:53 +0000
+++ b/fileids.py	2008-09-07 22:15:06 +0000
@@ -168,6 +168,8 @@
         try:
             for i, revmeta in enumerate(reversed(todo)):
                 pb.update('generating file id map', i, len(todo))
+                if revmeta.is_hidden(mapping):
+                    continue
                 revid = revmeta.get_revision_id(mapping)
                 (idmap, changes) = self.apply_changes(revmeta, 
                         mapping, self.repos._log.find_children)
@@ -261,6 +263,8 @@
             pb = ui.ui_factory.nested_progress_bar()
             for revmeta in self.repos._revmeta_provider.iter_reverse_branch_changes(branch, revnum, to_revnum=0, mapping=mapping):
                 pb.update("fetching changes for file ids", revnum-revmeta.revnum, revnum)
+                if revmeta.is_hidden(mapping):
+                    continue
                 revid = revmeta.get_revision_id(mapping)
                 try:
                     map = self.cache.load(revid)

=== modified file 'mapping.py'
--- a/mapping.py	2008-09-06 22:56:12 +0000
+++ b/mapping.py	2008-09-07 22:15:06 +0000
@@ -33,6 +33,7 @@
 SVN_PROP_BZR_TEXT_PARENTS = 'bzr:text-parents'
 SVN_PROP_BZR_LOG = 'bzr:log'
 SVN_PROP_BZR_REQUIRED_FEATURES = 'bzr:required-features'
+SVN_PROP_BZR_HIDDEN = 'bzr:hidden'
 
 SVN_REVPROP_BZR_COMMITTER = 'bzr:committer'
 SVN_REVPROP_BZR_FILEIDS = 'bzr:file-ids'
@@ -49,6 +50,7 @@
 SVN_REVPROP_BZR_REQUIRED_FEATURES = 'bzr:required-features'
 SVN_REVPROP_BZR_BASE_REVISION = 'bzr:base-revision'
 SVN_REVPROP_BZR_SKIP = 'bzr:skip'
+SVN_REVPROP_BZR_HIDDEN = 'bzr:hidden'
 SVN_REVPROP_BZR_TAGS = 'bzr:tags'
 
 
@@ -285,6 +287,7 @@
     roundtripping = False
     can_use_revprops = False
     can_use_fileprops = False
+    supports_hidden = False
 
     def __init__(self):
         if (version_info[3] == 'exp' or self.experimental) and not BzrSvnMapping._warned_experimental:
@@ -432,6 +435,12 @@
     def get_test_instance(cls):
         return cls()
 
+    def is_bzr_revision_hidden(self, revprops, changed_fileprops):
+        return False
+
+    def export_hidden(self, revprops, fileprops):
+        raise NotImplementedError(self.export_hidden)
+
 
 def parse_fileid_property(text):
     """Pares a fileid file or revision property.
@@ -672,7 +681,7 @@
 mapping_registry.register_lazy('v4', 'bzrlib.plugins.svn.mapping4', 
                                'BzrSvnMappingv4',
                                'Fourth format (bzr-svn 0.5.x)')
-mapping_registry.set_default('v3')
+mapping_registry.set_default('v4')
 
 def find_mapping(revprops, fileprops):
     if SVN_REVPROP_BZR_MAPPING_VERSION in revprops:

=== modified file 'mapping4.py'
--- a/mapping4.py	2008-09-04 11:47:09 +0000
+++ b/mapping4.py	2008-09-07 22:15:06 +0000
@@ -33,6 +33,7 @@
     roundtripping = True
     can_use_revprops = True
     can_use_fileprops = True
+    supports_hidden = True
 
     def __init__(self, layout=None):
         self.name = "v4"
@@ -149,3 +150,18 @@
 
     def get_mandated_layout(self, repository):
         return self.layout
+
+    def is_bzr_revision_hidden(self, revprops, changed_fileprops):
+        if revprops.has_key(mapping.SVN_REVPROP_BZR_HIDDEN):
+            return True
+        if (changed_fileprops.has_key(mapping.SVN_PROP_BZR_HIDDEN) and 
+            changed_fileprops.get(mapping.SVN_PROP_BZR_HIDDEN) is not None):
+            return True
+        return False
+
+    def export_hidden(self, revprops, fileprops):
+        if revprops is not None:
+            revprops[mapping.SVN_REVPROP_BZR_HIDDEN] = ""
+            return
+        old_value = fileprops.get(mapping.SVN_PROP_BZR_HIDDEN, "0")
+        fileprops[mapping.SVN_PROP_BZR_HIDDEN] = str(int(old_value)+1)

=== modified file 'repository.py'
--- a/repository.py	2008-09-07 20:51:45 +0000
+++ b/repository.py	2008-09-07 22:15:06 +0000
@@ -261,7 +261,7 @@
             yield self.get_revision_delta(revision)
 
     def get_revision_delta(self, revision):
-        parentrevmeta = self._revmeta_provider.branch_prev_location(revision.svn_meta, revision.svn_mapping)
+        parentrevmeta = revision.svn_meta.get_lhs_parent_revmeta(revision.svn_mapping)
         from bzrlib.plugins.svn.fetch import TreeDeltaBuildEditor
         if parentrevmeta is None:
             parentfileidmap = {}
@@ -334,6 +334,8 @@
         if layout is None:
             layout = self.get_layout()
         for revmeta in self._revmeta_provider.iter_all_changes(layout, mapping, self.get_latest_revnum()):
+            if revmeta.is_hidden(mapping):
+                continue
             yield revmeta.get_revision_id(mapping)
 
     def set_make_working_trees(self, new_value):
@@ -360,6 +362,8 @@
         for revmeta in self._revmeta_provider.iter_reverse_branch_changes(branch_path, revnum, to_revnum=0, 
                                                         mapping=mapping, pb=pb, 
                                                         limit=limit):
+            if revmeta.is_hidden(mapping):
+                continue
             yield revmeta.get_revision_id(mapping)
 
     def get_ancestry(self, revision_id, topo_sorted=True):
@@ -414,22 +418,27 @@
                 continue
 
             try:
-                (branch, revnum, mapping) = self.lookup_revision_id(ensure_null(revision_id))
+                revmeta, mapping = self._get_revmeta(ensure_null(revision_id))
             except NoSuchRevision:
                 continue
+            else:
+                parent_map[revision_id] = revmeta.get_parent_ids(mapping)
 
-            revmeta = self._revmeta_provider.get_revision(branch, revnum)
-            parent_map[revision_id] = revmeta.get_parent_ids(mapping)
         return parent_map
 
+    def _get_revmeta(self, revision_id):
+        (branch, revnum, mapping) = self.lookup_revision_id(revision_id)
+        revmeta = self._revmeta_provider.get_revision(branch, revnum)
+        return revmeta, mapping
+
     def get_revision(self, revision_id):
         """See Repository.get_revision."""
         if not revision_id or not isinstance(revision_id, str):
             raise InvalidRevisionId(revision_id=revision_id, branch=self)
 
-        (path, revnum, mapping) = self.lookup_revision_id(revision_id)
+        revmeta, mapping = self._get_revmeta(revision_id)
         
-        return self._revmeta_provider.get_revision(path, revnum).get_revision(mapping)
+        return revmeta.get_revision(mapping)
 
     def get_revisions(self, revision_ids):
         """See Repository.get_revisions()."""

=== modified file 'revmeta.py'
--- a/revmeta.py	2008-09-06 23:49:34 +0000
+++ b/revmeta.py	2008-09-07 22:15:06 +0000
@@ -140,14 +140,19 @@
     def get_lhs_parent_revmeta(self, mapping):
         assert (mapping.is_branch(self.branch_path) or 
                 mapping.is_tag(self.branch_path)), "%s not valid in %r" % (self.branch_path, mapping)
-        if self.metabranch is not None and self.metabranch.mapping == mapping:
-            # Perhaps the metabranch already has the parent?
-            parentrevmeta = self.metabranch.get_lhs_parent(self)
-            if parentrevmeta is not None:
-                return parentrevmeta
-        # FIXME: Don't use self.repository.branch_prev_location,
-        #        since it browses history
-        return self.repository._revmeta_provider.branch_prev_location(self, mapping)
+        def get_next_parent(rm):
+            if self.metabranch is not None and self.metabranch.mapping == mapping:
+                # Perhaps the metabranch already has the parent?
+                parentrevmeta = self.metabranch.get_lhs_parent(rm)
+                if parentrevmeta is not None:
+                    return parentrevmeta
+            # FIXME: Don't use self.repository.branch_prev_location,
+            #        since it browses history
+            return self.repository._revmeta_provider.branch_prev_location(rm, mapping)
+        nm = get_next_parent(self)
+        while nm is not None and nm.is_hidden(mapping):
+            nm = get_next_parent(self)
+        return nm
 
     def get_lhs_parent(self, mapping):
         # Sometimes we can retrieve the lhs parent from the revprop data
@@ -180,6 +185,9 @@
     def is_bzr_revision_fileprops(self):
         return is_bzr_revision_fileprops(self.get_changed_fileprops())
 
+    def is_hidden(self, mapping):
+        return mapping.is_bzr_revision_hidden(self.get_revprops(), self.get_changed_fileprops())
+
     def is_bzr_revision(self):
         """Determine (with as few network requests as possible) if this is a bzr revision.
 

=== modified file 'upgrade.py'
--- a/upgrade.py	2008-09-04 11:47:09 +0000
+++ b/upgrade.py	2008-09-07 22:15:06 +0000
@@ -269,7 +269,7 @@
                 continue
             assert old_mapping.can_use_revprops or bp is not None
             new_revprops = dict(revprops.items())
-            revmeta = repository._revmeta(bp, changes, revnum, revprops, fileprops)
+            revmeta = repository._revmeta_provider.get_revision(bp, revnum, changes, revprops, fileprops)
             rev = revmeta.get_revision(old_mapping)
             revno = graph.find_distance_to_null(rev.revision_id, [])
             assert bp is not None




More information about the bazaar-commits mailing list