# HG changeset patch # User Ryan McElroy # Date 1418613104 28800 # Node ID 3c2419e07df5b33d6e9fc131eb2bd38a8b97d353 # Parent aead63705504d6ad43f9596da109ad8c0be6c863 namespaces: remove weakref; always pass in repo It turns out that maintaining a reference of any sort (even weak!) to the repo when constructed doesn't work because we may at some point pass in a repoview filtered by something other than what the initial repo was. diff -r aead63705504 -r 3c2419e07df5 mercurial/context.py --- a/mercurial/context.py Thu Oct 16 23:27:54 2014 -0700 +++ b/mercurial/context.py Sun Dec 14 19:11:44 2014 -0800 @@ -409,7 +409,7 @@ # lookup bookmarks through the name interface try: - self._node = repo.names.singlenode(changeid) + self._node = repo.names.singlenode(repo, changeid) self._rev = repo.changelog.rev(self._node) return except KeyError: diff -r aead63705504 -r 3c2419e07df5 mercurial/localrepo.py --- a/mercurial/localrepo.py Thu Oct 16 23:27:54 2014 -0700 +++ b/mercurial/localrepo.py Sun Dec 14 19:11:44 2014 -0800 @@ -299,7 +299,7 @@ self.filteredrevcache = {} # generic mapping between names and nodes - self.names = namespaces.namespaces(self) + self.names = namespaces.namespaces() def close(self): pass diff -r aead63705504 -r 3c2419e07df5 mercurial/namespaces.py --- a/mercurial/namespaces.py Thu Oct 16 23:27:54 2014 -0700 +++ b/mercurial/namespaces.py Sun Dec 14 19:11:44 2014 -0800 @@ -1,6 +1,5 @@ from i18n import _ from mercurial import util -import weakref def tolist(val): """ @@ -32,19 +31,14 @@ _names_version = 0 - def __init__(self, repo): + def __init__(self): self._names = util.sortdict() - self._repo = weakref.ref(repo) # we need current mercurial named objects (bookmarks, tags, and # branches) to be initialized somewhere, so that place is here self.addnamespace("bookmarks", lambda repo, name: tolist(repo._bookmarks.get(name))) - @property - def repo(self): - return self._repo() - def addnamespace(self, namespace, namemap, order=None): """ register a namespace @@ -60,7 +54,7 @@ else: self._names[namespace] = val - def singlenode(self, name): + def singlenode(self, repo, name): """ Return the 'best' node for the given name. Best means the first node in the first nonempty list returned by a name-to-nodes mapping function @@ -69,11 +63,11 @@ Raises a KeyError if there is no such node. """ for ns, v in self._names.iteritems(): - n = v['namemap'](self.repo, name) + n = v['namemap'](repo, name) if n: # return max revision number if len(n) > 1: - cl = self.repo.changelog + cl = repo.changelog maxrev = max(cl.rev(node) for node in n) return cl.node(maxrev) return n[0] diff -r aead63705504 -r 3c2419e07df5 mercurial/statichttprepo.py --- a/mercurial/statichttprepo.py Thu Oct 16 23:27:54 2014 -0700 +++ b/mercurial/statichttprepo.py Sun Dec 14 19:11:44 2014 -0800 @@ -106,7 +106,7 @@ self.vfs = self.opener self._phasedefaults = [] - self.names = namespaces.namespaces(self) + self.names = namespaces.namespaces() try: requirements = scmutil.readrequires(self.opener, self.supported)