Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/hg.py @ 148:c32286d0a665
Improve pruning of branches in outstanding changeset algorithm
These changes make the client keep track of what it's seen more
carefully to avoid some redundant requests.
author | mpm@selenic.com |
---|---|
date | Tue, 24 May 2005 23:13:25 -0800 |
parents | 4a828422247d |
children | 8cd45e152c83 |
comparison
equal
deleted
inserted
replaced
147:b6d8ed7aeba0 | 148:c32286d0a665 |
---|---|
507 (short(tip[0]), short(tip[1]))) | 507 (short(tip[0]), short(tip[1]))) |
508 m = self.changelog.nodemap | 508 m = self.changelog.nodemap |
509 unknown = [tip] | 509 unknown = [tip] |
510 search = [] | 510 search = [] |
511 fetch = [] | 511 fetch = [] |
512 seen = {} | |
513 seenbranch = {} | |
512 | 514 |
513 if tip[0] in m: | 515 if tip[0] in m: |
514 self.ui.note("nothing to do!\n") | 516 self.ui.note("nothing to do!\n") |
515 return None | 517 return None |
516 | 518 |
517 while unknown: | 519 while unknown: |
518 n = unknown.pop(0) | 520 n = unknown.pop(0) |
521 seen[n[0]] = 1 | |
522 | |
523 self.ui.debug("examining %s:%s\n" % (short(n[0]), short(n[1]))) | |
519 if n == nullid: break | 524 if n == nullid: break |
525 if n in seenbranch: | |
526 self.ui.debug("branch already found\n") | |
527 continue | |
520 if n[1] and n[1] in m: # do we know the base? | 528 if n[1] and n[1] in m: # do we know the base? |
521 self.ui.debug("found incomplete branch %s\n" % short(n[1])) | 529 self.ui.debug("found incomplete branch %s:%s\n" |
530 % (short(n[0]), short(n[1]))) | |
522 search.append(n) # schedule branch range for scanning | 531 search.append(n) # schedule branch range for scanning |
532 seenbranch[n] = 1 | |
523 else: | 533 else: |
524 if n[2] in m and n[3] in m: | 534 if n[2] in m and n[3] in m: |
525 if n[1] not in fetch: | 535 if n[1] not in fetch: |
526 self.ui.debug("found new changeset %s\n" % | 536 self.ui.debug("found new changeset %s\n" % |
527 short(n[1])) | 537 short(n[1])) |
528 fetch.append(n[1]) # earliest unknown | 538 fetch.append(n[1]) # earliest unknown |
529 continue | 539 continue |
530 for b in remote.branches([n[2], n[3]]): | 540 |
531 if b[0] not in m: | 541 r = [] |
532 unknown.append(b) | 542 for a in n[2:4]: |
543 if a not in seen: r.append(a) | |
544 | |
545 if r: | |
546 self.ui.debug("requesting %s\n" % | |
547 " ".join(map(short, r))) | |
548 for b in remote.branches(r): | |
549 self.ui.debug("received %s:%s\n" % | |
550 (short(b[0]), short(b[1]))) | |
551 if b[0] not in m and b[0] not in seen: | |
552 unknown.append(b) | |
533 | 553 |
534 while search: | 554 while search: |
535 n = search.pop(0) | 555 n = search.pop(0) |
536 l = remote.between([(n[0], n[1])])[0] | 556 l = remote.between([(n[0], n[1])])[0] |
537 p = n[0] | 557 p = n[0] |
781 return urllib.urlopen(cu) | 801 return urllib.urlopen(cu) |
782 | 802 |
783 def branches(self, nodes): | 803 def branches(self, nodes): |
784 n = " ".join(map(hex, nodes)) | 804 n = " ".join(map(hex, nodes)) |
785 d = self.do_cmd("branches", nodes=n).read() | 805 d = self.do_cmd("branches", nodes=n).read() |
786 br = [ map(bin, b.split(" ")) for b in d.splitlines() ] | 806 br = [ tuple(map(bin, b.split(" "))) for b in d.splitlines() ] |
787 return br | 807 return br |
788 | 808 |
789 def between(self, pairs): | 809 def between(self, pairs): |
790 n = "\n".join(["-".join(map(hex, p)) for p in pairs]) | 810 n = "\n".join(["-".join(map(hex, p)) for p in pairs]) |
791 d = self.do_cmd("between", pairs=n).read() | 811 d = self.do_cmd("between", pairs=n).read() |