1# -*- coding: utf-8 -*- 2 3#------------------------------------------------------------------------- 4# drawElements Quality Program utilities 5# -------------------------------------- 6# 7# Copyright 2015 The Android Open Source Project 8# 9# Licensed under the Apache License, Version 2.0 (the "License"); 10# you may not use this file except in compliance with the License. 11# You may obtain a copy of the License at 12# 13# http://www.apache.org/licenses/LICENSE-2.0 14# 15# Unless required by applicable law or agreed to in writing, software 16# distributed under the License is distributed on an "AS IS" BASIS, 17# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18# See the License for the specific language governing permissions and 19# limitations under the License. 20# 21#------------------------------------------------------------------------- 22 23import os 24import urllib2 25import hashlib 26 27import registry 28 29BASE_URL = "" 30 31class RegistrySource: 32 def __init__(self, filename, revision, checksum): 33 self.filename = filename 34 self.revision = revision 35 self.checksum = checksum 36 37 def __hash__(self): 38 return hash((self.filename, self.revision, self.checksum)) 39 40 def __eq__(self, other): 41 return (self.filename, self.revision, self.checksum) == (other.filename, other.revision, other.checksum) 42 43 def getFilename (self): 44 return self.filename 45 46 def getCacheFilename (self): 47 return "r%d-%s" % (self.revision, self.filename) 48 49 def getChecksum (self): 50 return self.checksum 51 52 def getRevision (self): 53 return self.revision 54 55 def getSourceUrl (self): 56 return "https://cvs.khronos.org/svn/repos/ogl/trunk/doc/registry/public/api/%s?r=%d" % (self.filename, self.revision) 57 58def computeChecksum (data): 59 return hashlib.sha256(data).hexdigest() 60 61def fetchUrl (url): 62 req = urllib2.urlopen(url) 63 data = req.read() 64 return data 65 66def fetchFile (dstPath, url, checksum): 67 def writeFile (filename, data): 68 f = open(filename, 'wb') 69 f.write(data) 70 f.close() 71 72 if not os.path.exists(os.path.dirname(dstPath)): 73 os.makedirs(os.path.dirname(dstPath)) 74 75 print "Fetching %s" % url 76 data = fetchUrl(url) 77 gotChecksum = computeChecksum(data) 78 79 if checksum != gotChecksum: 80 raise Exception("Checksum mismatch, exepected %s, got %s" % (checksum, gotChecksum)) 81 82 writeFile(dstPath, data) 83 84def checkFile (filename, checksum): 85 def readFile (filename): 86 f = open(filename, 'rb') 87 data = f.read() 88 f.close() 89 return data 90 91 if os.path.exists(filename): 92 return computeChecksum(readFile(filename)) == checksum 93 else: 94 return False 95 96g_registryCache = {} 97 98def getRegistry (source): 99 global g_registryCache 100 101 if source in g_registryCache: 102 return g_registryCache[source] 103 104 cacheDir = os.path.join(os.path.dirname(__file__), "cache") 105 cachePath = os.path.join(cacheDir, source.getCacheFilename()) 106 107 if not checkFile(cachePath, source.checksum): 108 fetchFile(cachePath, source.getSourceUrl(), source.getChecksum()) 109 110 parsedReg = registry.parse(cachePath) 111 112 g_registryCache[source] = parsedReg 113 114 return parsedReg 115