Kiln » Kiln Extensions
Clone URL:  
kilnstore.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
'''HTTP-based store for Kiln.''' import urllib2 from mercurial import util, url as url_ import bfutil import remotestore class kilnstore(remotestore.remotestore): def __init__(self, ui, repo, remote): self.baseurl = bfutil.urljoin(remote.url(), 'bfile') try: # Mercurial >= 1.9 self.baseurl, authinfo = util.url(self.baseurl).authinfo() except AttributeError: # Mercurial <= 1.8 self.baseurl, authinfo = url_.getauthinfo(self.baseurl) self.opener = url_.opener(repo.ui, authinfo) super(kilnstore, self).__init__(ui, repo, remote.url()) def _put(self, hash, fd): try: req = urllib2.Request(bfutil.urljoin(self.baseurl, hash), fd) resp = self.opener.open(req) return self._stat(hash) and 1 or 0 except urllib2.HTTPError, e: return 1 def _get(self, hash): req = urllib2.Request(bfutil.urljoin(self.baseurl, hash)) return (None, self.opener.open(req)) # '0' for OK, '1' for invalid checksum, '2' for missing def _stat(self, hash): try: req = urllib2.Request(bfutil.urljoin(self.baseurl, hash)) req.add_header('SHA1-Request', hash) return int(hash != \ self.opener.open(req).info().getheader('Content-SHA1')) except urllib2.HTTPError, e: if e.code == 404: return 2 else: raise