Home | History | Annotate | Download | only in khr_util
      1 # -*- coding: utf-8 -*-
      2 
      3 #-------------------------------------------------------------------------
      4 # drawElements Quality Program utilities
      5 # --------------------------------------
      6 #
      7 # Copyright 2015-2017 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 
     23 import os
     24 import urllib2
     25 import hashlib
     26 
     27 import registry
     28 
     29 BASE_URL = ""
     30 
     31 class RegistrySource:
     32 	def __init__(self, repository, filename, revision, checksum):
     33 		self.repository	= repository
     34 		self.filename	= filename
     35 		self.revision	= revision
     36 		self.checksum	= checksum
     37 
     38 	def __hash__(self):
     39 		return hash((self.repository, self.filename, self.revision, self.checksum))
     40 
     41 	def __eq__(self, other):
     42 		return (self.repository, self.filename, self.revision, self.checksum) == (other.repository, other.filename, other.revision, other.checksum)
     43 
     44 	def getFilename (self):
     45 		return os.path.basename(self.filename)
     46 
     47 	def getCacheFilename (self):
     48 		return "r%s-%s" % (self.revision, self.getFilename())
     49 
     50 	def getChecksum (self):
     51 		return self.checksum
     52 
     53 	def getRevision (self):
     54 		return self.revision
     55 
     56 	def getSourceUrl (self):
     57 		return "%s/%s/%s" % (self.repository, self.revision, self.filename)
     58 
     59 def computeChecksum (data):
     60 	return hashlib.sha256(data).hexdigest()
     61 
     62 def fetchUrl (url):
     63 	req		= urllib2.urlopen(url)
     64 	data	= req.read()
     65 	return data
     66 
     67 def fetchFile (dstPath, url, checksum):
     68 	def writeFile (filename, data):
     69 		f = open(filename, 'wb')
     70 		f.write(data)
     71 		f.close()
     72 
     73 	if not os.path.exists(os.path.dirname(dstPath)):
     74 		os.makedirs(os.path.dirname(dstPath))
     75 
     76 	print "Fetching %s" % url
     77 	data		= fetchUrl(url)
     78 	gotChecksum	= computeChecksum(data)
     79 
     80 	if checksum != gotChecksum:
     81 		raise Exception("Checksum mismatch, expected %s, got %s" % (checksum, gotChecksum))
     82 
     83 	writeFile(dstPath, data)
     84 
     85 def checkFile (filename, checksum):
     86 	def readFile (filename):
     87 		f = open(filename, 'rb')
     88 		data = f.read()
     89 		f.close()
     90 		return data
     91 
     92 	if os.path.exists(filename):
     93 		return computeChecksum(readFile(filename)) == checksum
     94 	else:
     95 		return False
     96 
     97 g_registryCache = {}
     98 
     99 def getRegistry (source):
    100 	global g_registryCache
    101 
    102 	if source in g_registryCache:
    103 		return g_registryCache[source]
    104 
    105 	cacheDir	= os.path.join(os.path.dirname(__file__), "cache")
    106 	cachePath	= os.path.join(cacheDir, source.getCacheFilename())
    107 
    108 	if not checkFile(cachePath, source.checksum):
    109 		fetchFile(cachePath, source.getSourceUrl(), source.getChecksum())
    110 
    111 	parsedReg	= registry.parse(cachePath)
    112 
    113 	g_registryCache[source] = parsedReg
    114 
    115 	return parsedReg
    116