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 sys
     25 import urllib2
     26 import hashlib
     27 
     28 import registry
     29 
     30 sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
     31 
     32 from build.common import *
     33 
     34 BASE_URL = ""
     35 
     36 class RegistrySource:
     37 	def __init__(self, repository, filename, revision, checksum):
     38 		self.repository	= repository
     39 		self.filename	= filename
     40 		self.revision	= revision
     41 		self.checksum	= checksum
     42 
     43 	def __hash__(self):
     44 		return hash((self.repository, self.filename, self.revision, self.checksum))
     45 
     46 	def __eq__(self, other):
     47 		return (self.repository, self.filename, self.revision, self.checksum) == (other.repository, other.filename, other.revision, other.checksum)
     48 
     49 	def getFilename (self):
     50 		return os.path.basename(self.filename)
     51 
     52 	def getCacheFilename (self):
     53 		return "r%s-%s" % (self.revision, self.getFilename())
     54 
     55 	def getChecksum (self):
     56 		return self.checksum
     57 
     58 	def getRevision (self):
     59 		return self.revision
     60 
     61 	def getRepo (self):
     62 		return self.repository
     63 
     64 	def getRevision (self):
     65 		return self.revision
     66 
     67 	def getFilename (self):
     68 		return self.filename
     69 
     70 def computeChecksum (data):
     71 	return hashlib.sha256(data).hexdigest()
     72 
     73 def makeSourceUrl (repository, revision, filename):
     74 	return "%s/%s/%s" % (repository, revision, filename)
     75 
     76 def checkoutGit (repository, revision, fullDstPath):
     77 	if not os.path.exists(fullDstPath):
     78 		execute(["git", "clone", "--no-checkout", repository, fullDstPath])
     79 
     80 	pushWorkingDir(fullDstPath)
     81 	try:
     82 		execute(["git", "fetch", repository, "+refs/heads/*:refs/remotes/origin/*"])
     83 		execute(["git", "checkout", revision])
     84 	finally:
     85 		popWorkingDir()
     86 
     87 def checkoutFile (repository, revision, filename, cacheDir):
     88 	try:
     89 		req		= urllib2.urlopen(makeSourceUrl(repository, revision, filename))
     90 		data	= req.read()
     91 	except IOError:
     92 		fullDstPath = os.path.join(cacheDir, "git")
     93 
     94 		checkoutGit(repository, revision, fullDstPath)
     95 		f		= open(os.path.join(fullDstPath, filename), "r")
     96 		data	= f.read()
     97 		f.close()
     98 	except:
     99 		print "Unexpected error:", sys.exc_info()[0]
    100 
    101 	return data
    102 
    103 def fetchFile (dstPath, repository, revision, filename, checksum, cacheDir):
    104 	def writeFile (filename, data):
    105 		f = open(filename, 'wb')
    106 		f.write(data)
    107 		f.close()
    108 
    109 	if not os.path.exists(os.path.dirname(dstPath)):
    110 		os.makedirs(os.path.dirname(dstPath))
    111 
    112 	print "Fetching %s/%s@%s" % (repository, filename, revision)
    113 	data		= checkoutFile(repository, revision, filename, cacheDir)
    114 	gotChecksum	= computeChecksum(data)
    115 
    116 	if checksum != gotChecksum:
    117 		raise Exception("Checksum mismatch, expected %s, got %s" % (checksum, gotChecksum))
    118 
    119 	writeFile(dstPath, data)
    120 
    121 def checkFile (filename, checksum):
    122 	def readFile (filename):
    123 		f = open(filename, 'rb')
    124 		data = f.read()
    125 		f.close()
    126 		return data
    127 
    128 	if os.path.exists(filename):
    129 		return computeChecksum(readFile(filename)) == checksum
    130 	else:
    131 		return False
    132 
    133 g_registryCache = {}
    134 
    135 def getRegistry (source):
    136 	global g_registryCache
    137 
    138 	if source in g_registryCache:
    139 		return g_registryCache[source]
    140 
    141 	cacheDir	= os.path.join(os.path.dirname(__file__), "cache")
    142 	cachePath	= os.path.join(cacheDir, source.getCacheFilename())
    143 
    144 	if not checkFile(cachePath, source.checksum):
    145 		fetchFile(cachePath, source.getRepo(), source.getRevision(), source.getFilename(), source.getChecksum(), cacheDir)
    146 
    147 	parsedReg	= registry.parse(cachePath)
    148 
    149 	g_registryCache[source] = parsedReg
    150 
    151 	return parsedReg
    152