diff options
author | Tristan Seligmann <mithrandi@debian.org> | 2017-08-11 11:50:14 +0200 |
---|---|---|
committer | Tristan Seligmann <mithrandi@debian.org> | 2017-08-11 11:50:14 +0200 |
commit | f505a84d33c238a892064774ca31854d3b5b1df2 (patch) | |
tree | a67f8519abfc6a529260814e24809d62356fc46a /hgsubversion/util.py | |
parent | ef9caf1c5d12cf3a5886c1eb3ff5bb956fdf482f (diff) |
Upstream snapsnot 1.8.7+1517-b3e41b0d50a2
Diffstat (limited to 'hgsubversion/util.py')
-rw-r--r-- | hgsubversion/util.py | 72 |
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 |