# HG changeset patch # User Greg Ward # Date 1247755181 14400 # Node ID 234a230cc33b5f23cea1685f72572f11de692cf9 # Parent 5614a628d173b68ed2eea4318e3a3fc10c7f7e6a localrepo: improve readability of _findtags(), readtags() (issue548). - rename many local variables - add some comments - refactor call to line.split() (catch ValueError rather than checking length of return value: one less local variable) diff -r 5614a628d173 -r 234a230cc33b mercurial/localrepo.py --- a/mercurial/localrepo.py Thu Jul 16 10:39:41 2009 -0400 +++ b/mercurial/localrepo.py Thu Jul 16 10:39:41 2009 -0400 @@ -258,63 +258,67 @@ # be one tagtype for all such "virtual" tags? Or is the status # quo fine? - globaltags = {} + alltags = {} # map tag name to (node, hist) tagtypes = {} def readtags(lines, fn, tagtype): - filetags = {} + filetags = {} # map tag name to (node, hist) count = 0 def warn(msg): self.ui.warn(_("%s, line %s: %s\n") % (fn, count, msg)) - for l in lines: + for line in lines: count += 1 - if not l: + if not line: continue - s = l.split(" ", 1) - if len(s) != 2: + try: + (nodehex, name) = line.split(" ", 1) + except ValueError: warn(_("cannot parse entry")) continue - node, key = s - key = encoding.tolocal(key.strip()) # stored in UTF-8 + name = encoding.tolocal(name.strip()) # stored in UTF-8 try: - bin_n = bin(node) + nodebin = bin(nodehex) except TypeError: - warn(_("node '%s' is not well formed") % node) + warn(_("node '%s' is not well formed") % nodehex) continue - if bin_n not in self.changelog.nodemap: + if nodebin not in self.changelog.nodemap: # silently ignore as pull -r might cause this continue - h = [] - if key in filetags: - n, h = filetags[key] - h.append(n) - filetags[key] = (bin_n, h) + # update filetags: map tag name to (node, hist) where + # node is the node from the latest line read with + # 'name', and hist is the list of nodes previously + # associated with 'name' + hist = [] + if name in filetags: + n, hist = filetags[name] + hist.append(n) + filetags[name] = (nodebin, hist) - for k, nh in filetags.iteritems(): - if k not in globaltags: - globaltags[k] = nh - tagtypes[k] = tagtype + for name, nodehist in filetags.iteritems(): + if name not in alltags: + alltags[name] = nodehist + tagtypes[name] = tagtype continue - # we prefer the global tag if: + # we prefer alltags[name] if: # it supercedes us OR # mutual supercedes and it has a higher rank # otherwise we win because we're tip-most - an, ah = nh - bn, bh = globaltags[k] - if (bn != an and an in bh and - (bn not in ah or len(bh) > len(ah))): - an = bn - ah.extend([n for n in bh if n not in ah]) - globaltags[k] = an, ah - tagtypes[k] = tagtype + anode, ahist = nodehist + bnode, bhist = alltags[name] + if (bnode != anode and anode in bhist and + (bnode not in ahist or len(bhist) > len(ahist))): + anode = bnode + ahist.extend([n for n in bhist if n not in ahist]) + alltags[name] = anode, ahist + tagtypes[name] = tagtype seen = set() - f = None - ctxs = [] + fctx = None + ctxs = [] # list of filectx for node in self.heads(): try: fnode = self[node].filenode('.hgtags') @@ -322,15 +326,15 @@ continue if fnode not in seen: seen.add(fnode) - if not f: - f = self.filectx('.hgtags', fileid=fnode) + if not fctx: + fctx = self.filectx('.hgtags', fileid=fnode) else: - f = f.filectx(fnode) - ctxs.append(f) + fctx = fctx.filectx(fnode) + ctxs.append(fctx) # read the tags file from each head, ending with the tip - for f in reversed(ctxs): - readtags(f.data().splitlines(), f, "global") + for fctx in reversed(ctxs): + readtags(fctx.data().splitlines(), fctx, "global") try: data = encoding.fromlocal(self.opener("localtags").read()) @@ -341,10 +345,9 @@ pass tags = {} - for k, nh in globaltags.iteritems(): - n = nh[0] - if n != nullid: - tags[k] = n + for (name, (node, hist)) in alltags.iteritems(): + if node != nullid: + tags[name] = node tags['tip'] = self.changelog.tip() return (tags, tagtypes)