comparison mercurial/hgweb/hgweb_mod.py @ 4232:0d51eb296fb9

Merge with crew-stable
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Fri, 16 Mar 2007 00:45:18 -0300
parents 5c1e18bb804c c52b7176af94
children ca639faa38a2
comparison
equal deleted inserted replaced
4224:2a8b6d78d7ee 4232:0d51eb296fb9
1064 if not self.check_perm(req, 'push', False): 1064 if not self.check_perm(req, 'push', False):
1065 bail(_('push not authorized\n'), 1065 bail(_('push not authorized\n'),
1066 headers={'status': '401 Unauthorized'}) 1066 headers={'status': '401 Unauthorized'})
1067 return 1067 return
1068 1068
1069 req.httphdr("application/mercurial-0.1")
1070
1071 their_heads = req.form['heads'][0].split(' ') 1069 their_heads = req.form['heads'][0].split(' ')
1072 1070
1073 def check_heads(): 1071 def check_heads():
1074 heads = map(hex, self.repo.heads()) 1072 heads = map(hex, self.repo.heads())
1075 return their_heads == [hex('force')] or their_heads == heads 1073 return their_heads == [hex('force')] or their_heads == heads
1076 1074
1077 # fail early if possible 1075 # fail early if possible
1078 if not check_heads(): 1076 if not check_heads():
1079 bail(_('unsynced changes\n')) 1077 bail(_('unsynced changes\n'))
1080 return 1078 return
1079
1080 req.httphdr("application/mercurial-0.1")
1081 1081
1082 # do not lock repo until all changegroup data is 1082 # do not lock repo until all changegroup data is
1083 # streamed. save to temporary file. 1083 # streamed. save to temporary file.
1084 1084
1085 fd, tempname = tempfile.mkstemp(prefix='hg-unbundle-') 1085 fd, tempname = tempfile.mkstemp(prefix='hg-unbundle-')
1087 try: 1087 try:
1088 length = int(req.env['CONTENT_LENGTH']) 1088 length = int(req.env['CONTENT_LENGTH'])
1089 for s in util.filechunkiter(req, limit=length): 1089 for s in util.filechunkiter(req, limit=length):
1090 fp.write(s) 1090 fp.write(s)
1091 1091
1092 lock = self.repo.lock()
1093 try: 1092 try:
1094 if not check_heads(): 1093 lock = self.repo.lock()
1095 req.write('0\n') 1094 try:
1096 req.write(_('unsynced changes\n')) 1095 if not check_heads():
1097 return 1096 req.write('0\n')
1098 1097 req.write(_('unsynced changes\n'))
1099 fp.seek(0) 1098 return
1100 header = fp.read(6) 1099
1101 if not header.startswith("HG"): 1100 fp.seek(0)
1102 # old client with uncompressed bundle 1101 header = fp.read(6)
1103 def generator(f): 1102 if not header.startswith("HG"):
1104 yield header 1103 # old client with uncompressed bundle
1105 for chunk in f: 1104 def generator(f):
1106 yield chunk 1105 yield header
1107 elif not header.startswith("HG10"): 1106 for chunk in f:
1108 req.write("0\n") 1107 yield chunk
1109 req.write(_("unknown bundle version\n")) 1108 elif not header.startswith("HG10"):
1110 return 1109 req.write("0\n")
1111 elif header == "HG10GZ": 1110 req.write(_("unknown bundle version\n"))
1112 def generator(f): 1111 return
1113 zd = zlib.decompressobj() 1112 elif header == "HG10GZ":
1114 for chunk in f: 1113 def generator(f):
1115 yield zd.decompress(chunk) 1114 zd = zlib.decompressobj()
1116 elif header == "HG10BZ": 1115 for chunk in f:
1117 def generator(f): 1116 yield zd.decompress(chunk)
1118 zd = bz2.BZ2Decompressor() 1117 elif header == "HG10BZ":
1119 zd.decompress("BZ") 1118 def generator(f):
1120 for chunk in f: 1119 zd = bz2.BZ2Decompressor()
1121 yield zd.decompress(chunk) 1120 zd.decompress("BZ")
1122 elif header == "HG10UN": 1121 for chunk in f:
1123 def generator(f): 1122 yield zd.decompress(chunk)
1124 for chunk in f: 1123 elif header == "HG10UN":
1125 yield chunk 1124 def generator(f):
1125 for chunk in f:
1126 yield chunk
1127 else:
1128 req.write("0\n")
1129 req.write(_("unknown bundle compression type\n"))
1130 return
1131 gen = generator(util.filechunkiter(fp, 4096))
1132
1133 # send addchangegroup output to client
1134
1135 old_stdout = sys.stdout
1136 sys.stdout = cStringIO.StringIO()
1137
1138 try:
1139 url = 'remote:%s:%s' % (proto,
1140 req.env.get('REMOTE_HOST', ''))
1141 try:
1142 ret = self.repo.addchangegroup(
1143 util.chunkbuffer(gen), 'serve', url)
1144 except util.Abort, inst:
1145 sys.stdout.write("abort: %s\n" % inst)
1146 ret = 0
1147 finally:
1148 val = sys.stdout.getvalue()
1149 sys.stdout = old_stdout
1150 req.write('%d\n' % ret)
1151 req.write(val)
1152 finally:
1153 lock.release()
1154 except (OSError, IOError), inst:
1155 req.write('0\n')
1156 filename = getattr(inst, 'filename', '')
1157 # Don't send our filesystem layout to the client
1158 if filename.startswith(self.repo.root):
1159 filename = filename[len(self.repo.root)+1:]
1126 else: 1160 else:
1127 req.write("0\n") 1161 filename = ''
1128 req.write(_("unknown bundle compression type\n")) 1162 error = getattr(inst, 'strerror', 'Unknown error')
1129 return 1163 req.write('%s: %s\n' % (error, filename))
1130 gen = generator(util.filechunkiter(fp, 4096))
1131
1132 # send addchangegroup output to client
1133
1134 old_stdout = sys.stdout
1135 sys.stdout = cStringIO.StringIO()
1136
1137 try:
1138 url = 'remote:%s:%s' % (proto,
1139 req.env.get('REMOTE_HOST', ''))
1140 try:
1141 ret = self.repo.addchangegroup(util.chunkbuffer(gen),
1142 'serve', url)
1143 except util.Abort, inst:
1144 sys.stdout.write("abort: %s\n" % inst)
1145 ret = 0
1146 finally:
1147 val = sys.stdout.getvalue()
1148 sys.stdout = old_stdout
1149 req.write('%d\n' % ret)
1150 req.write(val)
1151 finally:
1152 lock.release()
1153 finally: 1164 finally:
1154 fp.close() 1165 fp.close()
1155 os.unlink(tempname) 1166 os.unlink(tempname)
1156 1167
1157 def do_stream_out(self, req): 1168 def do_stream_out(self, req):