comparison mercurial/hg.py @ 60:e32fdbd97839

Add hg:// protocol Fix some of the getchangegroup logic
author mpm@selenic.com
date Thu, 12 May 2005 01:21:58 -0800
parents ad2ea1185f04
children b3e2ddff0159
comparison
equal deleted inserted replaced
59:2bff7c0ea1d3 60:e32fdbd97839
230 230
231 return file(f, mode) 231 return file(f, mode)
232 232
233 return o 233 return o
234 234
235 class repository: 235 class localrepository:
236 def __init__(self, ui, path=None, create=0): 236 def __init__(self, ui, path=None, create=0):
237 self.remote = 0 237 self.remote = 0
238 if path and path[:7] == "http://": 238 if path and path[:7] == "http://":
239 self.remote = 1 239 self.remote = 1
240 self.path = path 240 self.path = path
610 nl.append(n) 610 nl.append(n)
611 611
612 return nl 612 return nl
613 613
614 def getchangegroup(self, remote): 614 def getchangegroup(self, remote):
615 tip = remote.branches([]) 615 tip = remote.branches([])[0]
616 cl = self.changelog 616 cl = self.changelog
617 unknown = tip 617 unknown = [tip]
618 search = [] 618 search = []
619 fetch = [] 619 fetch = []
620 620
621 if tip[0] == self.changelog.tip(): 621 if tip[0] == self.changelog.tip():
622 return "" 622 return None
623 623
624 while unknown: 624 while unknown:
625 n = unknown.pop(0) 625 n = unknown.pop(0)
626 if n == nullid: break 626 if n == nullid: break
627 if n[1] and cl.nodemap.has_key(n[1]): # do we know the base? 627 if n[1] and cl.nodemap.has_key(n[1]): # do we know the base?
628 search.append(n) # schedule branch range for scanning 628 search.append(n) # schedule branch range for scanning
638 l = remote.between([(n[0], n[1])])[0] 638 l = remote.between([(n[0], n[1])])[0]
639 p = n[0] 639 p = n[0]
640 f = 1 640 f = 1
641 for i in l + [n[1]]: 641 for i in l + [n[1]]:
642 if self.changelog.nodemap.has_key(i): 642 if self.changelog.nodemap.has_key(i):
643 if f == 1: 643 if f <= 4:
644 fetch.append(p) 644 fetch.append(p)
645 else: 645 else:
646 search.append((p, i)) 646 search.append((p, i))
647 p, f = i, f * 2 647 p, f = i, f * 2
648 648
664 changed[f] = 1 664 changed[f] = 1
665 changed = changed.keys() 665 changed = changed.keys()
666 changed.sort() 666 changed.sort()
667 667
668 # the changegroup is changesets + manifests + all file revs 668 # the changegroup is changesets + manifests + all file revs
669 cg = []
670 revs = [ self.changelog.rev(n) for n in nodes ] 669 revs = [ self.changelog.rev(n) for n in nodes ]
671 670
672 g = self.changelog.group(linkmap) 671 yield self.changelog.group(linkmap)
673 cg.append(g) 672 yield self.manifest.group(linkmap)
674 g = self.manifest.group(linkmap)
675 cg.append(g)
676 673
677 for f in changed: 674 for f in changed:
678 g = self.file(f).group(linkmap) 675 g = self.file(f).group(linkmap)
679 if not g: raise "couldn't find change to %s" % f 676 if not g: raise "couldn't find change to %s" % f
680 l = struct.pack(">l", len(f)) 677 l = struct.pack(">l", len(f))
681 cg += [l, f, g] 678 yield "".join([l, f, g])
682
683 return "".join(cg)
684 679
685 def addchangegroup(self, data): 680 def addchangegroup(self, data):
686 def getlen(data, pos): 681 def getlen(data, pos):
687 return struct.unpack(">l", data[pos:pos + 4])[0] 682 return struct.unpack(">l", data[pos:pos + 4])[0]
683
684 if not data: return
688 685
689 tr = self.transaction() 686 tr = self.transaction()
690 simple = True 687 simple = True
691 688
692 print "merging changesets" 689 print "merging changesets"
784 edittext = "\n"+"".join(["HG: changed %s\n" % f for f in new]) 781 edittext = "\n"+"".join(["HG: changed %s\n" % f for f in new])
785 edittext = self.ui.edit(edittext) 782 edittext = self.ui.edit(edittext)
786 n = self.changelog.add(node, new, edittext, tr, co, cn) 783 n = self.changelog.add(node, new, edittext, tr, co, cn)
787 784
788 tr.close() 785 tr.close()
786
787 class remoterepository:
788 def __init__(self, ui, path):
789 self.url = path.replace("hg://", "http://", 1)
790 self.ui = ui
791
792 def do_cmd(self, cmd, **args):
793 q = {"cmd": cmd}
794 q.update(args)
795 qs = urllib.urlencode(q)
796 cu = "%s?%s" % (self.url, qs)
797 return urllib.urlopen(cu).read()
798
799 def branches(self, nodes):
800 n = " ".join(map(hex, nodes))
801 d = self.do_cmd("branches", nodes=n)
802 br = [ map(bin, b.split(" ")) for b in d.splitlines() ]
803 return br
804
805 def between(self, pairs):
806 n = "\n".join(["-".join(map(hex, p)) for p in pairs])
807 d = self.do_cmd("between", pairs=n)
808 p = [ map(bin, l.split(" ")) for l in d.splitlines() ]
809 return p
810
811 def changegroup(self, nodes):
812 n = " ".join(map(hex, nodes))
813 d = self.do_cmd("changegroup", roots=n)
814 return zlib.decompress(d)
815
816 def repository(ui, path=None, create=0):
817 if path and path[:5] == "hg://":
818 return remoterepository(ui, path)
819 else:
820 return localrepository(ui, path, create)
789 821
790 class ui: 822 class ui:
791 def __init__(self, verbose=False, debug=False): 823 def __init__(self, verbose=False, debug=False):
792 self.verbose = verbose 824 self.verbose = verbose
793 def write(self, *args): 825 def write(self, *args):