diff --git a/hgext/largefiles/proto.py b/hgext/largefiles/proto.py --- a/hgext/largefiles/proto.py +++ b/hgext/largefiles/proto.py @@ -40,7 +40,7 @@ tmpfp = util.atomictempfile(path, createmode=repo.store.createmode) try: - proto.getfile(tmpfp) + proto.forwardpayload(tmpfp) tmpfp._fp.seek(0) if sha != lfutil.hexsha1(tmpfp._fp): raise IOError(0, _('largefile contents do not match hash')) diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py --- a/mercurial/wireproto.py +++ b/mercurial/wireproto.py @@ -1008,7 +1008,7 @@ fp = os.fdopen(fd, pycompat.sysstr('wb+')) r = 0 try: - proto.getfile(fp) + proto.forwardpayload(fp) fp.seek(0) gen = exchange.readbundle(repo.ui, fp, None) if (isinstance(gen, changegroupmod.cg1unpacker) diff --git a/mercurial/wireprotoserver.py b/mercurial/wireprotoserver.py --- a/mercurial/wireprotoserver.py +++ b/mercurial/wireprotoserver.py @@ -64,14 +64,10 @@ returns a list of values (same order as )""" @abc.abstractmethod - def getfile(self, fp): - """write the whole content of a file into a file like object + def forwardpayload(self, fp): + """Read the raw payload and forward to a file. - The file is in the form:: - - (\n)+0\n - - chunk size is the ascii version of the int. + The payload is read in full before the function returns. """ @abc.abstractmethod @@ -145,7 +141,7 @@ args.update(cgi.parse_qs(argvalue, keep_blank_values=True)) return args - def getfile(self, fp): + def forwardpayload(self, fp): length = int(self._req.env[r'CONTENT_LENGTH']) # If httppostargs is used, we need to read Content-Length # minus the amount that was consumed by args. @@ -392,7 +388,12 @@ data[arg] = val return [data[k] for k in keys] - def getfile(self, fpout): + def forwardpayload(self, fpout): + # The file is in the form: + # + # \n + # ... + # 0\n _sshv1respondbytes(self._fout, b'') count = int(self._fin.readline()) while count: