]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/lib/python/hgext/hgwebfs.py
hgwebfs: simplify retry loop construction
[plan9front.git] / sys / lib / python / hgext / hgwebfs.py
index ab6d95319e276f67909d49050375c4ebf9443207..430269cf1ffde9de5eab2ea46419a091b2aa3637 100644 (file)
@@ -2,27 +2,52 @@
 
 import mercurial.url
 import re
+import os
 
 class Webconn:
        def __init__(self, mnt, req):
+               while True:
+                       try:
+                               self.open(mnt, req)
+                               return
+                       except IOError, e:
+                               try:
+                                       errstr = e.strerror
+                                       params = errstr[errstr.index("needkey ")+8:]
+                                       if params.find("!password?") < 0:
+                                               raise e
+                                       if os.spawnl(os.P_WAIT, "/boot/factotum", "getkey", "-g", params) != 0:
+                                               raise e
+                               except:
+                                       raise e
+
+       def open(self, mnt, req):
+               if type(req) == str:
+                       self.url = req
+               else:
+                       self.url = req.get_full_url()
+               if self.url[0:5] == 'file:':
+                       path = self.url[5:]
+                       while path[0:2] == '//':
+                               path = path[1:]
+                       self.dir = '/dev/null'
+                       self.body = open(path, 'r', 0)
+                       return
                ctl = open(mnt+'/clone', 'r+', 0)
                try:
-                       self.url = req.get_full_url()
                        self.dir = mnt+'/'+ctl.readline().rstrip('\n')
                        ctl.seek(0)
                        ctl.write('url '+self.url)
-                       m = ''
-                       for h,v in req.headers:
-                               m += h+': '+v+'\r\n'
-                       if len(m) > 0:
-                               m = 'headers '+m
-                               print m
-                               ctl.seek(0)
-                               ctl.write(m)
+                       m = 'User-Agent: mercurial/proto-1.0\r\n';
+                       for h in req.headers:
+                               m += h+': '+req.headers[h]+'\r\n'
+                       ctl.seek(0)
+                       ctl.write('headers '+m)
                        if req.has_data():
                                data = req.get_data()
-                               post = open(self.dir+'/postdata', 'w', 0);
+                               post = open(self.dir+'/postbody', 'w', 0);
                                try:
+                                       data.seek(0)
                                        while True:
                                                buf = data.read(4096)
                                                if len(buf) == 0:
@@ -61,6 +86,9 @@ class Webopener:
        def __init__(self):
                self.handlers = []
 
+       def add_handler(self, handler):
+               return
+
        def open(self, req, data=None):
                return Webconn('/mnt/web', req)
 
@@ -71,4 +99,5 @@ class Webopener:
 def webopener(ui, authinfo=None):
        return Webopener();
 
+mercurial.url.has_https = 1
 mercurial.url.opener = webopener