Show More
@@ -10,7 +10,7 import os | |||
|
10 | 10 | import os.path |
|
11 | 11 | import mimetypes |
|
12 | 12 | from mercurial.demandload import demandload |
|
13 | demandload(globals(), "re zlib ConfigParser cStringIO") | |
|
13 | demandload(globals(), "re zlib ConfigParser cStringIO sys tempfile") | |
|
14 | 14 | demandload(globals(), "mercurial:mdiff,ui,hg,util,archival,templater") |
|
15 | 15 | demandload(globals(), "mercurial.hgweb.request:hgrequest") |
|
16 | 16 | demandload(globals(), "mercurial.hgweb.common:get_mtime,staticfile") |
@@ -835,7 +835,57 class hgweb(object): | |||
|
835 | 835 | or self.t("error", error="%r not found" % fname)) |
|
836 | 836 | |
|
837 | 837 | def do_capabilities(self, req): |
|
838 | resp = '' | |
|
838 | resp = 'unbundle' | |
|
839 | 839 | req.httphdr("application/mercurial-0.1", length=len(resp)) |
|
840 | 840 | req.write(resp) |
|
841 | 841 | |
|
842 | def do_unbundle(self, req): | |
|
843 | their_heads = req.form['heads'][0].split(' ') | |
|
844 | ||
|
845 | def check_heads(): | |
|
846 | heads = map(hex, self.repo.heads()) | |
|
847 | return their_heads == [hex('force')] or their_heads == heads | |
|
848 | ||
|
849 | req.httphdr("application/mercurial-0.1") | |
|
850 | ||
|
851 | # fail early if possible | |
|
852 | if not check_heads(): | |
|
853 | req.write('0\n') | |
|
854 | req.write(_('unsynced changes\n')) | |
|
855 | return | |
|
856 | ||
|
857 | # do not lock repo until all changegroup data is | |
|
858 | # streamed. save to temporary file. | |
|
859 | ||
|
860 | fd, tempname = tempfile.mkstemp(prefix='hg-unbundle-') | |
|
861 | fp = os.fdopen(fd, 'wb+') | |
|
862 | try: | |
|
863 | length = int(req.env['CONTENT_LENGTH']) | |
|
864 | for s in util.filechunkiter(req, limit=length): | |
|
865 | fp.write(s) | |
|
866 | ||
|
867 | lock = self.repo.lock() | |
|
868 | try: | |
|
869 | if not check_heads(): | |
|
870 | req.write('0\n') | |
|
871 | req.write(_('unsynced changes\n')) | |
|
872 | return | |
|
873 | ||
|
874 | fp.seek(0) | |
|
875 | ||
|
876 | # send addchangegroup output to client | |
|
877 | ||
|
878 | old_stdout = sys.stdout | |
|
879 | sys.stdout = cStringIO.StringIO() | |
|
880 | ||
|
881 | try: | |
|
882 | ret = self.repo.addchangegroup(fp, 'serve') | |
|
883 | req.write('%d\n' % ret) | |
|
884 | req.write(sys.stdout.getvalue()) | |
|
885 | finally: | |
|
886 | sys.stdout = old_stdout | |
|
887 | finally: | |
|
888 | lock.release() | |
|
889 | finally: | |
|
890 | fp.close() | |
|
891 | os.unlink(tempname) |
@@ -18,6 +18,9 class hgrequest(object): | |||
|
18 | 18 | self.form = cgi.parse(self.inp, self.env, keep_blank_values=1) |
|
19 | 19 | self.will_close = True |
|
20 | 20 | |
|
21 | def read(self, count=-1): | |
|
22 | return self.inp.read(count) | |
|
23 | ||
|
21 | 24 | def write(self, *things): |
|
22 | 25 | for thing in things: |
|
23 | 26 | if hasattr(thing, "__iter__"): |
General Comments 0
You need to be logged in to leave comments.
Login now