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