##// END OF EJS Templates
Protocol switch from using generators to stream-like objects....
Matt Mackall -
r635:85e2209d default
parent child Browse files
Show More
@@ -867,18 +867,21 b' def serve(ui, repo, **opts):'
867 867 """export the repository via HTTP"""
868 868
869 869 if opts["stdio"]:
870 fin, fout = sys.stdin, sys.stdout
871 sys.stdout = sys.stderr
872
870 873 def getarg():
871 argline = sys.stdin.readline()[:-1]
874 argline = fin.readline()[:-1]
872 875 arg, l = argline.split()
873 val = sys.stdin.read(int(l))
876 val = fin.read(int(l))
874 877 return arg, val
875 878 def respond(v):
876 sys.stdout.write("%d\n" % len(v))
877 sys.stdout.write(v)
878 sys.stdout.flush()
879 fout.write("%d\n" % len(v))
880 fout.write(v)
881 fout.flush()
879 882
880 883 while 1:
881 cmd = sys.stdin.readline()[:-1]
884 cmd = fin.readline()[:-1]
882 885 if cmd == '':
883 886 return
884 887 if cmd == "heads":
@@ -903,24 +906,13 b' def serve(ui, repo, **opts):'
903 906 arg, roots = getarg()
904 907 nodes = map(hg.bin, roots.split(" "))
905 908
906 b = []
907 t = 0
908 for chunk in repo.changegroup(nodes):
909 t += len(chunk)
910 b.append(chunk)
911 if t > 4096:
912 sys.stdout.write(struct.pack(">l", t))
913 for c in b:
914 sys.stdout.write(c)
915 t = 0
916 b = []
909 cg = repo.changegroup(nodes)
910 while 1:
911 d = cg.read(4096)
912 if not d: break
913 fout.write(d)
917 914
918 sys.stdout.write(struct.pack(">l", t))
919 for c in b:
920 sys.stdout.write(c)
921
922 sys.stdout.write(struct.pack(">l", -1))
923 sys.stdout.flush()
915 out.flush()
924 916
925 917 def openlog(opt, default):
926 918 if opts[opt] and opts[opt] != '-': return open(opts[opt], 'w')
@@ -1025,35 +1025,6 b' class localrepository:'
1025 1025 return remote.addchangegroup(cg)
1026 1026
1027 1027 def changegroup(self, basenodes):
1028 nodes = self.newer(basenodes)
1029
1030 # construct the link map
1031 linkmap = {}
1032 for n in nodes:
1033 linkmap[self.changelog.rev(n)] = n
1034
1035 # construct a list of all changed files
1036 changed = {}
1037 for n in nodes:
1038 c = self.changelog.read(n)
1039 for f in c[3]:
1040 changed[f] = 1
1041 changed = changed.keys()
1042 changed.sort()
1043
1044 # the changegroup is changesets + manifests + all file revs
1045 revs = [ self.changelog.rev(n) for n in nodes ]
1046
1047 for y in self.changelog.group(linkmap): yield y
1048 for y in self.manifest.group(linkmap): yield y
1049 for f in changed:
1050 yield struct.pack(">l", len(f) + 4) + f
1051 g = self.file(f).group(linkmap)
1052 for y in g:
1053 yield y
1054
1055 def addchangegroup(self, generator):
1056
1057 1028 class genread:
1058 1029 def __init__(self, generator):
1059 1030 self.g = generator
@@ -1067,6 +1038,40 b' class localrepository:'
1067 1038 d, self.buf = self.buf[:l], self.buf[l:]
1068 1039 return d
1069 1040
1041 def gengroup():
1042 nodes = self.newer(basenodes)
1043
1044 # construct the link map
1045 linkmap = {}
1046 for n in nodes:
1047 linkmap[self.changelog.rev(n)] = n
1048
1049 # construct a list of all changed files
1050 changed = {}
1051 for n in nodes:
1052 c = self.changelog.read(n)
1053 for f in c[3]:
1054 changed[f] = 1
1055 changed = changed.keys()
1056 changed.sort()
1057
1058 # the changegroup is changesets + manifests + all file revs
1059 revs = [ self.changelog.rev(n) for n in nodes ]
1060
1061 for y in self.changelog.group(linkmap): yield y
1062 for y in self.manifest.group(linkmap): yield y
1063 for f in changed:
1064 yield struct.pack(">l", len(f) + 4) + f
1065 g = self.file(f).group(linkmap)
1066 for y in g:
1067 yield y
1068
1069 yield struct.pack(">l", 0)
1070
1071 return genread(gengroup())
1072
1073 def addchangegroup(self, source):
1074
1070 1075 def getchunk():
1071 1076 d = source.read(4)
1072 1077 if not d: return ""
@@ -1087,10 +1092,9 b' class localrepository:'
1087 1092 def revmap(x):
1088 1093 return self.changelog.rev(x)
1089 1094
1090 if not generator: return
1095 if not source: return
1091 1096 changesets = files = revisions = 0
1092 1097
1093 source = genread(generator)
1094 1098 tr = self.transaction()
1095 1099
1096 1100 # pull off the changeset group
@@ -1592,17 +1596,27 b' class httprepository:'
1592 1596
1593 1597 def changegroup(self, nodes):
1594 1598 n = " ".join(map(hex, nodes))
1595 zd = zlib.decompressobj()
1596 1599 f = self.do_cmd("changegroup", roots=n)
1597 1600 bytes = 0
1598 while 1:
1599 d = f.read(4096)
1600 bytes += len(d)
1601 if not d:
1602 yield zd.flush()
1603 break
1604 yield zd.decompress(d)
1605 self.ui.note("%d bytes of data transfered\n" % bytes)
1601
1602 class zread:
1603 def __init__(self, f):
1604 self.zd = zlib.decompressobj()
1605 self.f = f
1606 self.buf = ""
1607 def read(self, l):
1608 while l > len(self.buf):
1609 r = f.read(4096)
1610 if r:
1611 self.buf += self.zd.decompress(r)
1612 else:
1613 self.buf += self.zd.flush()
1614 break
1615 d, self.buf = self.buf[:l], self.buf[l:]
1616 return d
1617
1618 return zread(f)
1619
1606 1620
1607 1621 class sshrepository:
1608 1622 def __init__(self, ui, path):
@@ -1680,14 +1694,7 b' class sshrepository:'
1680 1694 def changegroup(self, nodes):
1681 1695 n = " ".join(map(hex, nodes))
1682 1696 f = self.do_cmd("changegroup", roots=n)
1683 bytes = 0
1684 while 1:
1685 l = struct.unpack(">l", f.read(4))[0]
1686 if l == -1: break
1687 d = f.read(l)
1688 bytes += len(d)
1689 yield d
1690 self.ui.note("%d bytes of data transfered\n" % bytes)
1697 return self.pipei
1691 1698
1692 1699 def repository(ui, path=None, create=0):
1693 1700 if path:
@@ -687,7 +687,10 b' class hgweb:'
687 687 nodes = map(bin, args['roots'][0].split(" "))
688 688
689 689 z = zlib.compressobj()
690 for chunk in self.repo.changegroup(nodes):
690 f = self.repo.changegroup(nodes)
691 while 1:
692 chunk = f.read(4096)
693 if not chunk: break
691 694 sys.stdout.write(z.compress(chunk))
692 695
693 696 sys.stdout.write(z.flush())
General Comments 0
You need to be logged in to leave comments. Login now