1 # -*- coding: utf-8 -*-
12 def __init__(self, filename, revision, checksum):
13 self.filename = filename
14 self.revision = revision
15 self.checksum = checksum
18 return hash((self.filename, self.revision, self.checksum))
20 def __eq__(self, other):
21 return (self.filename, self.revision, self.checksum) == (other.filename, other.revision, other.checksum)
23 def getFilename (self):
26 def getCacheFilename (self):
27 return "r%d-%s" % (self.revision, self.filename)
29 def getChecksum (self):
32 def getRevision (self):
35 def getSourceUrl (self):
36 return "https://cvs.khronos.org/svn/repos/ogl/trunk/doc/registry/public/api/%s?r=%d" % (self.filename, self.revision)
38 def computeChecksum (data):
39 return hashlib.sha256(data).hexdigest()
42 req = urllib2.urlopen(url)
46 def fetchFile (dstPath, url, checksum):
47 def writeFile (filename, data):
48 f = open(filename, 'wb')
52 if not os.path.exists(os.path.dirname(dstPath)):
53 os.makedirs(os.path.dirname(dstPath))
55 print "Fetching %s" % url
57 gotChecksum = computeChecksum(data)
59 if checksum != gotChecksum:
60 raise Exception("Checksum mismatch, exepected %s, got %s" % (checksum, gotChecksum))
62 writeFile(dstPath, data)
64 def checkFile (filename, checksum):
65 def readFile (filename):
66 f = open(filename, 'rb')
71 if os.path.exists(filename):
72 return computeChecksum(readFile(filename)) == checksum
78 def getRegistry (source):
79 global g_registryCache
81 if source in g_registryCache:
82 return g_registryCache[source]
84 cacheDir = os.path.join(os.path.dirname(__file__), "cache")
85 cachePath = os.path.join(cacheDir, source.getCacheFilename())
87 if not checkFile(cachePath, source.checksum):
88 fetchFile(cachePath, source.getSourceUrl(), source.getChecksum())
90 parsedReg = registry.parse(cachePath)
92 g_registryCache[source] = parsedReg