332 self.opener = opener(self.path) |
332 self.opener = opener(self.path) |
333 self.wopener = opener(self.root) |
333 self.wopener = opener(self.root) |
334 self.manifest = manifest(self.opener) |
334 self.manifest = manifest(self.opener) |
335 self.changelog = changelog(self.opener) |
335 self.changelog = changelog(self.opener) |
336 self.ignorelist = None |
336 self.ignorelist = None |
337 self.tags = None |
337 self.tagscache = None |
|
338 self.nodetagscache = None |
338 |
339 |
339 if not self.remote: |
340 if not self.remote: |
340 self.dirstate = dirstate(self.opener, ui, self.root) |
341 self.dirstate = dirstate(self.opener, ui, self.root) |
341 try: |
342 try: |
342 self.ui.readconfig(self.opener("hgrc")) |
343 self.ui.readconfig(self.opener("hgrc")) |
353 except IOError: pass |
354 except IOError: pass |
354 for pat in self.ignorelist: |
355 for pat in self.ignorelist: |
355 if pat.search(f): return True |
356 if pat.search(f): return True |
356 return False |
357 return False |
357 |
358 |
358 def lookup(self, key): |
359 def tags(self): |
359 if self.tags is None: |
360 '''return a mapping of tag to node''' |
360 self.tags = {} |
361 if not self.tagscache: |
|
362 self.tagscache = {} |
361 try: |
363 try: |
362 # read each head of the tags file, ending with the tip |
364 # read each head of the tags file, ending with the tip |
363 # and add each tag found to the map, with "newer" ones |
365 # and add each tag found to the map, with "newer" ones |
364 # taking precedence |
366 # taking precedence |
365 fl = self.file(".hgtags") |
367 fl = self.file(".hgtags") |
367 h.reverse() |
369 h.reverse() |
368 for r in h: |
370 for r in h: |
369 for l in fl.revision(r).splitlines(): |
371 for l in fl.revision(r).splitlines(): |
370 if l: |
372 if l: |
371 n, k = l.split(" ") |
373 n, k = l.split(" ") |
372 self.tags[k] = bin(n) |
374 self.tagscache[k] = bin(n) |
373 except KeyError: pass |
375 except KeyError: pass |
374 self.tags['tip'] = self.changelog.tip() |
376 self.tagscache['tip'] = self.changelog.tip() |
|
377 |
|
378 return self.tagscache |
|
379 |
|
380 def tagslist(self): |
|
381 '''return a list of tags ordered by revision''' |
|
382 l = [] |
|
383 for t,n in self.tags().items(): |
|
384 try: |
|
385 r = self.changelog.rev(n) |
|
386 except: |
|
387 r = -2 # sort to the beginning of the list if unknown |
|
388 l.append((r,t,n)) |
|
389 l.sort() |
|
390 return [(t,n) for r,t,n in l] |
|
391 |
|
392 def nodetags(self, node): |
|
393 '''return the tags associated with a node''' |
|
394 if not self.nodetagscache: |
|
395 self.nodetagscache = {} |
|
396 for t,n in self.tags().items(): |
|
397 self.nodetagscache.setdefault(n,[]).append(t) |
|
398 return self.nodetagscache.get(node, []) |
|
399 |
|
400 def lookup(self, key): |
375 try: |
401 try: |
376 return self.tags[key] |
402 return self.tags()[key] |
377 except KeyError: |
403 except KeyError: |
378 return self.changelog.lookup(key) |
404 return self.changelog.lookup(key) |
379 |
405 |
380 def join(self, f): |
406 def join(self, f): |
381 return os.path.join(self.path, f) |
407 return os.path.join(self.path, f) |