summaryrefslogtreecommitdiff
path: root/hgsubversion/util.py
diff options
context:
space:
mode:
Diffstat (limited to 'hgsubversion/util.py')
-rw-r--r--hgsubversion/util.py72
1 files changed, 51 insertions, 21 deletions
diff --git a/hgsubversion/util.py b/hgsubversion/util.py
index 0a157c2..94c97af 100644
--- a/hgsubversion/util.py
+++ b/hgsubversion/util.py
@@ -23,6 +23,12 @@ try:
except ImportError:
pass
+try:
+ from mercurial import smartset
+ smartset.baseset # force demandimport to load the module now
+except ImportError:
+ smartset = None
+
import maps
ignoredfiles = set(['.hgtags', '.hgsvnexternals', '.hgsub', '.hgsubstate'])
@@ -44,6 +50,27 @@ def configpath(ui, name):
path = ui.config('hgsubversion', name)
return path and hgutil.expandpath(path)
+def fileproperty(fname, pathfunc, default=None,
+ serializer=str, deserializer=str):
+ """define a property that is backed by a file"""
+ def fget(self):
+ if not hgutil.safehasattr(self, fname):
+ path = pathfunc(self)
+ if os.path.exists(path):
+ with open(path, 'r') as f:
+ setattr(self, fname, deserializer(f.read()))
+ else:
+ setattr(self, fname, default)
+ return getattr(self, fname)
+
+ def fset(self, value):
+ setattr(self, fname, value)
+ path = pathfunc(self)
+ with open(path, 'w') as f:
+ f.write(serializer(value))
+
+ return property(fget, fset)
+
def filterdiff(diff, oldrev, newrev):
diff = newfile_devnull_re.sub(r'--- \1\t(revision 0)' '\n'
r'+++ \1\t(working copy)',
@@ -320,16 +347,14 @@ def revset_fromsvn(repo, subset, x):
rev = repo.changelog.rev
bin = node.bin
meta = repo.svnmeta(skiperrorcheck=True)
- try:
- svnrevs = set(rev(bin(l.split(' ', 2)[1]))
- for l in maps.RevMap.readmapfile(meta.revmap_file,
- missingok=False))
- return filter(svnrevs.__contains__, subset)
- except IOError, err:
- if err.errno != errno.ENOENT:
- raise
+ if not meta.revmapexists:
raise hgutil.Abort("svn metadata is missing - "
"run 'hg svn rebuildmeta' to reconstruct it")
+ svnrevs = set(rev(h) for h in meta.revmap.hashes().keys())
+ filteredrevs = filter(svnrevs.__contains__, subset)
+ if smartset is not None:
+ filteredrevs = smartset.baseset(filteredrevs)
+ return filteredrevs
def revset_svnrev(repo, subset, x):
'''``svnrev(number)``
@@ -344,22 +369,18 @@ def revset_svnrev(repo, subset, x):
except ValueError:
raise error.ParseError("the argument to svnrev() must be a number")
- rev = rev + ' '
- revs = []
meta = repo.svnmeta(skiperrorcheck=True)
- try:
- for l in maps.RevMap.readmapfile(meta.revmap_file, missingok=False):
- if l.startswith(rev):
- n = l.split(' ', 2)[1]
- r = repo[node.bin(n)].rev()
- if r in subset:
- revs.append(r)
- return revs
- except IOError, err:
- if err.errno != errno.ENOENT:
- raise
+ if not meta.revmapexists:
raise hgutil.Abort("svn metadata is missing - "
"run 'hg svn rebuildmeta' to reconstruct it")
+ revs = []
+ for n in meta.revmap.revhashes(revnum):
+ r = repo[n].rev()
+ if r in subset:
+ revs.append(r)
+ if smartset is not None:
+ revs = smartset.baseset(revs)
+ return revs
revsets = {
'fromsvn': revset_fromsvn,
@@ -388,3 +409,12 @@ def parse_revnum(svnrepo, r):
return svnrepo.last_changed_rev
else:
raise error.RepoLookupError("unknown Subversion revision %r" % r)
+
+def get_contexts(repo, fromrev=0):
+ """Generator yielding contexts from the repository."""
+
+ for rev in xrange(fromrev, len(repo)):
+ try:
+ yield repo[rev]
+ except error.RepoLookupError:
+ pass