bzr-svn 0.4.12 UNRELEASED
+
+ CHANGES
+
+ * Implement set-revprops command.
+
+ FEATURES
+
+ * Add bzr:skip revision property to allow skipping
+ more detailed analysis of revisions not created by bzr.
+
BUG FIXES
* Cope with svn+ prefix when setting tags. (#261748)
* Fix compatibility with Bazaar 1.7.
+ * Set bzr signature revision property during commit if possible.
+
bzr-svn 0.4.11 2008-08-26
bzr-svn 0.4.11~rc2 2008-08-26
mappingv4:
- refuse to set fileprops on repository on which revprops have been set
- - skip looking for fileprops if revprops have been found in earlier revisions
+ - skip looking for fileprops if revprops have been found in earlier revisions \
+ AND server supports revprops AND mapping.supports_custom_revprops()
- implement layout functions, including command
- integrate svn-set-revprops into svn-upgrade ?
+ - add options in commit for create_root, create_prefix
+ - if create_root=False: skip _check_dirs_exist
todo:
- generate deltas rather than fulltexts when creating file id maps
- Run all tests against repository with revprop changing allowed and without
- Needs upgrade command that can use legacy file properties and set revprops
- Support disabling legacy file property support somehow
-- remove set revision properties settings
for other things to do, see:
from bzrlib.plugins.svn.upgrade import set_revprops
from bzrlib.plugins.svn.mapping import get_default_mapping
repos = Repository.open(location)
+ if not repos.transport.has_capability("commit-revprops"):
+ raise BzrCommandError("Please upgrade the Subversion server to 1.5 or higher.")
if mapping is None:
mapping = get_default_mapping()
new_mapping = mapping.from_repository(repos)
else:
self._base_branch_props = lazy_dict({}, self.repository.branchprop_list.get_properties, self.base_path, self.base_revnum)
self.supports_custom_revprops = self.repository.transport.has_capability("commit-revprops")
- if self.supports_custom_revprops:
+ if self.supports_custom_revprops is None and self.base_mapping.supports_custom_revprops() and self.repository.seen_bzr_revprops():
+ raise BzrError("Please upgrade your Subversion client libraries to 1.5 or higher to be able to commit with Subversion mapping %s" % self.base_mapping.name)
+
+ if self.supports_custom_revprops == True:
self._svn_revprops = {}
if opt_signature is not None:
self._svn_revprops[mapping.SVN_REVPROP_BZR_SIGNATURE] = opt_signature
def changes_path(self, path, revnum):
return self._get_revision_paths(revnum).has_key(path)
+
+ def get_change(self, path, revnum):
+ return self._get_revision_paths(revnum).get(path)
def find_children(self, path, revnum):
"""Find all children of path in revnum.
@classmethod
def supports_custom_revprops(cls):
- """Whether this mapping can be used with custom revision properties."""
- return False
-
- def is_bzr_revision(self, revprops, fileprops):
- """Whether this is a revision that was pushed by Bazaar."""
+ """Whether this mapping will primarily use custom revision properties."""
return False
@classmethod
def export_message(self, message, revprops, fileprops):
fileprops[SVN_PROP_BZR_LOG] = message.encode("utf-8")
- def is_bzr_revision(self, revprops, fileprops):
- return fileprops.has_key(SVN_PROP_BZR_REVISION_ID+self.name)
-
def get_revision_id(self, branch_path, revprops, fileprops):
# Lookup the revision from the bzr:revision-id-vX property
text = fileprops.get(SVN_PROP_BZR_REVISION_ID+self.name, None)
return []
return svn_revprops.get(SVN_REVPROP_BZR_MERGE, "").splitlines()
- def is_bzr_revision(self, revprops, fileprops):
- if revprops.has_key(SVN_REVPROP_BZR_MAPPING_VERSION):
- return True
- if revprops.has_key(SVN_REVPROP_BZR_SKIP):
- return False
- return None
-
def get_revision_id(self, branch_path, revprops, fileprops):
- if not self.is_bzr_revision(revprops, fileprops):
+ if not is_bzr_revision_revprops(revprops):
return (None, None)
if revprops[SVN_REVPROP_BZR_ROOT] == branch_path:
revid = revprops[SVN_REVPROP_BZR_REVISION_ID]
return parse_mapping_name(k[len(SVN_PROP_BZR_REVISION_ID):])
return None
+def is_bzr_revision_revprops(revprops):
+ if revprops.has_key(SVN_REVPROP_BZR_MAPPING_VERSION):
+ return True
+ if revprops.has_key(SVN_REVPROP_BZR_SKIP):
+ return False
+ return None
+
+def is_bzr_revision_fileprops(fileprops):
+ for k in fileprops:
+ if k.startswith(SVN_PROP_BZR_REVISION_ID):
+ return True
+ return None
def supports_custom_revprops():
return True
- def is_bzr_revision(self, revprops, fileprops):
- """Whether this is a revision that was pushed by Bazaar."""
- is_revprop_rev = self.revprops.is_bzr_revision(revprops, fileprops)
- if is_revprop_rev is not None:
- return is_revprop_rev
- return self.fileprops.is_bzr_revision(revprops, fileprops)
-
@classmethod
def revision_id_bzr_to_foreign(cls, revid):
assert isinstance(revid, str)
from bzrlib.plugins.svn.mapping import (SVN_REVPROP_BZR_SIGNATURE,
BzrSvnMapping,
get_default_mapping,
+ is_bzr_revision_revprops, is_bzr_revision_fileprops,
parse_svn_dateprop)
from bzrlib.plugins.svn.parents import DiskCachingParentsProvider
from bzrlib.plugins.svn.revids import CachingRevidMap, RevidMap
lhs_parent = self.repository.lhs_revision_parent(self.branch_path, self.revnum, mapping)
return lhs_parent
- def is_bzr_revision(self, mapping):
- return mapping.is_bzr_revision(self.revprops, self.fileprops)
+ def is_bzr_revision(self):
+ # If the server already sent us all revprops, look at those first
+ if self.repository.transport.has_capability("log-revprops"):
+ order = [lambda: is_bzr_revision_revprops(self.revprops),
+ lambda: is_bzr_revision_fileprops(self.fileprops)]
+ else:
+ order = [lambda: is_bzr_revision_fileprops(self.fileprops),
+ lambda: is_bzr_revision_revprops(self.revprops)]
+ for fn in order:
+ ret = fn()
+ if ret is not None:
+ return ret
+ return None
def get_rhs_parents(self, mapping):
extra_rhs_parents = mapping.get_rhs_parents(self.branch_path, self.revprops, self.fileprops)
if extra_rhs_parents != ():
return extra_rhs_parents
- if self.is_bzr_revision(mapping):
+ if self.is_bzr_revision():
return ()
(prev_path, prev_revnum) = self.repository._log.get_previous(self.branch_path,
self._hinted_branch_path = branch_path
self._real_parents_provider = self
self._cached_tags = {}
+ self._revmeta_cache = {}
cache = self.get_config().get_use_cache()
svn_fileprops = {}
else:
svn_fileprops = self.branchprop_list.get_changed_properties(bp, revnum)
- yield RevisionMetadata(self, bp, paths, revnum, revprops, svn_fileprops)
+ yield self._revmeta(bp, paths, revnum, revprops, svn_fileprops)
def all_revision_ids(self, layout=None, mapping=None):
if mapping is None:
except NoSuchRevision:
continue
- svn_fileprops = self.branchprop_list.get_changed_properties(branch, revnum)
- svn_revprops = self._log.revprop_list(revnum)
- revmeta = RevisionMetadata(self, branch, None, revnum, svn_revprops, svn_fileprops)
+ revmeta = self._revmeta(branch, None, revnum)
parent_map[revision_id] = revmeta.get_parent_ids(mapping)
return parent_map
if revid is not None:
yield revid
+ def _revmeta(self, path, changes, revnum, revprops=None, fileprops=None):
+ if (path, revnum) in self._revmeta_cache:
+ return self._revmeta_cache[path,revnum]
+
+ if revprops is None:
+ revprops = self._log.revprop_list(revnum)
+ if fileprops is None:
+ fileprops = self.branchprop_list.get_changed_properties(path, revnum)
+
+ revmeta = RevisionMetadata(self, path, changes, revnum, revprops, fileprops)
+ self._revmeta_cache[path,revnum] = revmeta
+ return revmeta
+
def get_revision(self, revision_id):
"""See Repository.get_revision."""
if not revision_id or not isinstance(revision_id, str):
(path, revnum, mapping) = self.lookup_revision_id(revision_id)
- svn_revprops = self._log.revprop_list(revnum)
- svn_fileprops = self.branchprop_list.get_changed_properties(path, revnum)
-
- revmeta = RevisionMetadata(self, path, None, revnum, svn_revprops, svn_fileprops)
+ revmeta = self._revmeta(path, None, revnum)
return revmeta.get_revision(mapping)
else:
bp = next[0]
+ def seen_bzr_revprops(self):
+ """Check whether bzr-specific custom revision properties are present on this
+ repository.
+
+ """
+ for revmeta in self._log.iter_all_changes():
+ if revmeta.is_bzr_revision():
+ return True
+ return False
+
def iter_reverse_branch_changes(self, branch_path, from_revnum, to_revnum,
mapping=None, pb=None, limit=0):
"""Return all the changes that happened in a branch
else:
svn_fileprops = self.branchprop_list.get_changed_properties(bp, revnum)
- yield RevisionMetadata(self, bp, paths, revnum, revprops, svn_fileprops)
+ yield self._revmeta(bp, paths, revnum, revprops, svn_fileprops)
def get_config(self):
return SvnRepositoryConfig(self.uuid)
for entry_revid, branch, revno, mapping in self.discover_revids(layout, 0, self.repos.get_latest_revnum(), project):
if revid == entry_revid:
(bp, revnum, mapping_name) = self.bisect_revid_revnum(revid, branch, 0, revno)
- return (bp, revnum, parse_mapping_name(mapping_name))
+ return (bp, revnum, mapping_name)
raise NoSuchRevision(self, revid)
def discover_revids(self, layout, from_revnum, to_revnum, project=None):
from bzrlib.tag import BasicTags
from bzrlib.trace import mutter
-from bzrlib.plugins.svn import commit, core, properties
+from bzrlib.plugins.svn import commit, core, mapping, properties
class SubversionTags(BasicTags):
def __init__(self, branch):
try:
self.capabilities[cap] = conn.has_capability(cap)
except NotImplementedError:
- self.capabilities[cap] = False # Assume the worst
+ self.capabilities[cap] = None # None for unknown
return self.capabilities[cap]
finally:
self.add_connection(conn)
continue
assert old_mapping.supports_custom_revprops() or bp is not None
new_revprops = dict(revprops.items())
- revmeta = RevisionMetadata(repository, bp, changes, revnum, revprops, fileprops)
+ revmeta = repository._revmeta(bp, changes, revnum, revprops, fileprops)
rev = revmeta.get_revision(old_mapping)
revno = graph.find_distance_to_null(rev.revision_id, [])
+ assert bp is not None
new_mapping.export_revision(bp, rev.timestamp, rev.timezone, rev.committer, rev.properties, rev.revision_id, revno, rev.parent_ids, new_revprops, None)
new_mapping.export_fileid_map(old_mapping.import_fileid_map(revprops, fileprops),
new_revprops, None)
new_revprops, None)
if rev.message != mapping.parse_svn_log(revprops.get(properties.PROP_REVISION_LOG)):
new_mapping.export_message(rev.message, new_revprops, None)
- changed_revprops = dict(filter(lambda (k,v): revprops.get(k) != v, new_revprops.items()))
+ changed_revprops = dict(filter(lambda (k,v): k not in revprops or revprops[k] != v, new_revprops.items()))
if logcache is not None:
logcache.drop_revprops(revnum)
for k, v in changed_revprops.items():