[PATCH 10 of 10] branchmap: move validity logic in the object itself
Augie Fackler
raf at durin42.com
Sun Dec 23 19:26:23 CST 2012
Other than my question on patch 4 and Dave S's English tweaks, I think this series is probably a good start, but I wonder why read isn't moved into the branchmap class as well? Or maybe I overlooked that.
On Dec 21, 2012, at 8:48 PM, Pierre-Yves David <pierre-yves.david at ens-lyon.org> wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at ens-lyon.org>
> # Date 1356140640 -3600
> # Node ID 08bed0e9a2d5aa130dc84bac6ec5da8e3be7b832
> # Parent 5405ded918f63d80b075cd85edf635bbd87eec7b
> branchmap: move validity logic in the object itself
>
> In several place, We check if a branchcache is still valid regarding the current
> state of the repository. This changeset puts this logic in a method of the object
> that can be reused when necessary.
>
> A branch map is considered valid whenever it is up to date or a strict subset of
> the repository state.
>
> The change will help making branchcache aware of filtered revision.
>
> diff --git a/mercurial/branchmap.py b/mercurial/branchmap.py
> --- a/mercurial/branchmap.py
> +++ b/mercurial/branchmap.py
> @@ -7,22 +7,22 @@
>
> from node import bin, hex, nullid, nullrev
> import encoding
>
> def read(repo):
> - partial = branchcache()
> try:
> f = repo.opener("cache/branchheads")
> lines = f.read().split('\n')
> f.close()
> except (IOError, OSError):
> return branchcache()
>
> try:
> last, lrev = lines.pop(0).split(" ", 1)
> last, lrev = bin(last), int(lrev)
> - if lrev >= len(repo) or repo[lrev].node() != last:
> + partial = branchcache(tipnode=last, tiprev=lrev)
> + if not partial.validfor(repo):
> # invalidate the cache
> raise ValueError('invalidating branch cache (tip differs)')
> for l in lines:
> if not l:
> continue
> @@ -30,12 +30,10 @@ def read(repo):
> label = encoding.tolocal(label.strip())
> if not node in repo:
> raise ValueError('invalidating branch cache because node '+
> '%s does not exist' % node)
> partial.setdefault(label, []).append(bin(node))
> - partial.tipnode = last
> - partial.tiprev = lrev
> except KeyboardInterrupt:
> raise
> except Exception, inst:
> if repo.ui.debugflag:
> repo.ui.warn(str(inst), '\n')
> @@ -45,16 +43,13 @@ def read(repo):
>
>
> def updatecache(repo):
> repo = repo.unfiltered() # Until we get a smarter cache management
> cl = repo.changelog
> - tip = cl.tip()
> partial = repo._branchcache
> - if partial is not None and partial.tipnode == tip:
> - return
>
> - if partial is None or partial.tipnode not in cl.nodemap:
> + if partial is None or partial.validfor(repo):
> partial = read(repo)
>
> catip = repo._cacheabletip()
> # if partial.tiprev == catip: cache is already up to date
> # if partial.tiprev > catip: we have uncachable element in `partial` can't
> @@ -78,10 +73,21 @@ class branchcache(dict):
> def __init__(self, entries=(), tipnode=nullid, tiprev=nullrev):
> super(branchcache, self).__init__(entries)
> self.tipnode = tipnode
> self.tiprev = tiprev
>
> + def validfor(self, repo):
> + """Is the cache content valide regarding a repo
> +
> + - False when cached tipnode are unknown or if we detect a strip.
> + - True when cache is up to date or a subset of current repo."""
> + try:
> + return self.tipnode == repo.changelog.node(self.tiprev)
> + except IndexError:
> + return False
> +
> +
> def write(self, repo):
> try:
> f = repo.opener("cache/branchheads", "w", atomictemp=True)
> f.write("%s %s\n" % (hex(self.tipnode), self.tiprev))
> for label, nodes in self.iteritems():
> @@ -160,12 +166,12 @@ class branchcache(dict):
> del self[branch]
> try:
> node = cl.node(self.tiprev)
> except IndexError:
> node = None
> - if ((self.tipnode != node)
> - or (self.tipnode in droppednodes)):
> + if ((not self.validfor(repo)) or (self.tipnode in droppednodes)):
> +
> # cache key are not valid anymore
> self.tipnode = nullid
> self.tiprev = nullrev
> for heads in self.values():
> tiprev = max(cl.rev(node) for node in heads)
More information about the Mercurial-devel
mailing list