# HG changeset patch # User Thomas Arendsen Hein # Date 1203107673 -3600 # Node ID 11a09d5779f4b511d3851748cd8dadd06433f28d # Parent 74406f50bd4676641750ee53726e207ea6ffe384# Parent 7336aeff1a1d6503ff0bc0109034ac65662d687f merge with crew diff -r 74406f50bd46 -r 11a09d5779f4 hgext/mq.py --- a/hgext/mq.py Fri Feb 15 21:34:16 2008 +0100 +++ b/hgext/mq.py Fri Feb 15 21:34:33 2008 +0100 @@ -2186,20 +2186,17 @@ return tagscache - def _branchtags(self): + def _branchtags(self, partial, lrev): q = self.mq if not q.applied: - return super(mqrepo, self)._branchtags() + return super(mqrepo, self)._branchtags(partial, lrev) cl = self.changelog qbasenode = revlog.bin(q.applied[0].rev) if qbasenode not in cl.nodemap: self.ui.warn('mq status file refers to unknown node %s\n' % revlog.short(qbasenode)) - return super(mqrepo, self)._branchtags() - - self.branchcache = {} # avoid recursion in changectx - partial, last, lrev = self._readbranchcache() + return super(mqrepo, self)._branchtags(partial, lrev) qbase = cl.rev(qbasenode) start = lrev + 1 diff -r 74406f50bd46 -r 11a09d5779f4 mercurial/localrepo.py --- a/mercurial/localrepo.py Fri Feb 15 21:34:16 2008 +0100 +++ b/mercurial/localrepo.py Fri Feb 15 21:34:33 2008 +0100 @@ -94,6 +94,8 @@ self.tagscache = None self._tagstypecache = None self.branchcache = None + self._ubranchcache = None # UTF-8 version of branchcache + self._branchcachetip = None self.nodetagscache = None self.filterpats = {} self._datafilters = {} @@ -344,9 +346,7 @@ self.nodetagscache.setdefault(n, []).append(t) return self.nodetagscache.get(node, []) - def _branchtags(self): - partial, last, lrev = self._readbranchcache() - + def _branchtags(self, partial, lrev): tiprev = self.changelog.count() - 1 if lrev != tiprev: self._updatebranchcache(partial, lrev+1, tiprev+1) @@ -355,16 +355,29 @@ return partial def branchtags(self): - if self.branchcache is not None: + tip = self.changelog.tip() + if self.branchcache is not None and self._branchcachetip == tip: return self.branchcache - self.branchcache = {} # avoid recursion in changectx - partial = self._branchtags() + oldtip = self._branchcachetip + self._branchcachetip = tip + if self.branchcache is None: + self.branchcache = {} # avoid recursion in changectx + else: + self.branchcache.clear() # keep using the same dict + if oldtip is None or oldtip not in self.changelog.nodemap: + partial, last, lrev = self._readbranchcache() + else: + lrev = self.changelog.rev(oldtip) + partial = self._ubranchcache + + self._branchtags(partial, lrev) # the branch cache is stored on disk as UTF-8, but in the local # charset internally for k, v in partial.items(): self.branchcache[util.tolocal(k)] = v + self._ubranchcache = partial return self.branchcache def _readbranchcache(self): @@ -616,6 +629,9 @@ self.tagscache = None self._tagstypecache = None self.nodetagscache = None + self.branchcache = None + self._ubranchcache = None + self._branchcachetip = None def _lock(self, lockname, wait, releasefn, acquirefn, desc): try: @@ -882,8 +898,8 @@ parent2=xp2) tr.close() - if self.branchcache and "branch" in extra: - self.branchcache[util.tolocal(extra["branch"])] = n + if self.branchcache: + self.branchtags() if use_dirstate or update_dirstate: self.dirstate.setparents(n) @@ -2005,7 +2021,6 @@ if changesets > 0: # forcefully update the on-disk branch cache self.ui.debug(_("updating the branch cache\n")) - self.branchcache = None self.branchtags() self.hook("changegroup", node=hex(self.changelog.node(cor+1)), source=srctype, url=url)