1e5c31af7Sopenharmony_ci# -*- coding: utf-8 -*-
2e5c31af7Sopenharmony_ci
3e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci# drawElements Quality Program utilities
5e5c31af7Sopenharmony_ci# --------------------------------------
6e5c31af7Sopenharmony_ci#
7e5c31af7Sopenharmony_ci# Copyright 2015 The Android Open Source Project
8e5c31af7Sopenharmony_ci#
9e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
10e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License.
11e5c31af7Sopenharmony_ci# You may obtain a copy of the License at
12e5c31af7Sopenharmony_ci#
13e5c31af7Sopenharmony_ci#      http://www.apache.org/licenses/LICENSE-2.0
14e5c31af7Sopenharmony_ci#
15e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
16e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
17e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and
19e5c31af7Sopenharmony_ci# limitations under the License.
20e5c31af7Sopenharmony_ci#
21e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
22e5c31af7Sopenharmony_ci
23e5c31af7Sopenharmony_ciimport os
24e5c31af7Sopenharmony_ciimport sys
25e5c31af7Sopenharmony_ciimport shutil
26e5c31af7Sopenharmony_ciimport tarfile
27e5c31af7Sopenharmony_ciimport zipfile
28e5c31af7Sopenharmony_ciimport hashlib
29e5c31af7Sopenharmony_ciimport argparse
30e5c31af7Sopenharmony_ciimport subprocess
31e5c31af7Sopenharmony_ciimport ssl
32e5c31af7Sopenharmony_ciimport stat
33e5c31af7Sopenharmony_ciimport platform
34e5c31af7Sopenharmony_ci
35e5c31af7Sopenharmony_ciscriptPath = os.path.join(os.path.dirname(__file__), "..", "scripts")
36e5c31af7Sopenharmony_cisys.path.insert(0, scriptPath)
37e5c31af7Sopenharmony_ci
38e5c31af7Sopenharmony_cifrom ctsbuild.common import *
39e5c31af7Sopenharmony_ci
40e5c31af7Sopenharmony_ciEXTERNAL_DIR	= os.path.realpath(os.path.normpath(os.path.dirname(__file__)))
41e5c31af7Sopenharmony_ci
42e5c31af7Sopenharmony_ciSYSTEM_NAME		= platform.system()
43e5c31af7Sopenharmony_ci
44e5c31af7Sopenharmony_cidef computeChecksum (data):
45e5c31af7Sopenharmony_ci	return hashlib.sha256(data).hexdigest()
46e5c31af7Sopenharmony_ci
47e5c31af7Sopenharmony_cidef onReadonlyRemoveError (func, path, exc_info):
48e5c31af7Sopenharmony_ci	os.chmod(path, stat.S_IWRITE)
49e5c31af7Sopenharmony_ci	os.unlink(path)
50e5c31af7Sopenharmony_ci
51e5c31af7Sopenharmony_ciclass Source:
52e5c31af7Sopenharmony_ci	def __init__(self, baseDir, extractDir):
53e5c31af7Sopenharmony_ci		self.baseDir		= baseDir
54e5c31af7Sopenharmony_ci		self.extractDir		= extractDir
55e5c31af7Sopenharmony_ci
56e5c31af7Sopenharmony_ci	def clean (self):
57e5c31af7Sopenharmony_ci		fullDstPath = os.path.join(EXTERNAL_DIR, self.baseDir, self.extractDir)
58e5c31af7Sopenharmony_ci		# Remove read-only first
59e5c31af7Sopenharmony_ci		readonlydir = os.path.join(fullDstPath, ".git")
60e5c31af7Sopenharmony_ci		if os.path.exists(readonlydir):
61e5c31af7Sopenharmony_ci			shutil.rmtree(readonlydir, onerror = onReadonlyRemoveError)
62e5c31af7Sopenharmony_ci		if os.path.exists(fullDstPath):
63e5c31af7Sopenharmony_ci			shutil.rmtree(fullDstPath, ignore_errors=False)
64e5c31af7Sopenharmony_ci
65e5c31af7Sopenharmony_ciclass SourcePackage (Source):
66e5c31af7Sopenharmony_ci	def __init__(self, url, checksum, baseDir, extractDir = "src", postExtract=None):
67e5c31af7Sopenharmony_ci		Source.__init__(self, baseDir, extractDir)
68e5c31af7Sopenharmony_ci		self.url			= url
69e5c31af7Sopenharmony_ci		self.filename		= os.path.basename(self.url)
70e5c31af7Sopenharmony_ci		self.checksum		= checksum
71e5c31af7Sopenharmony_ci		self.archiveDir		= "packages"
72e5c31af7Sopenharmony_ci		self.postExtract	= postExtract
73e5c31af7Sopenharmony_ci
74e5c31af7Sopenharmony_ci	def clean (self):
75e5c31af7Sopenharmony_ci		Source.clean(self)
76e5c31af7Sopenharmony_ci		self.removeArchives()
77e5c31af7Sopenharmony_ci
78e5c31af7Sopenharmony_ci	def update (self, cmdProtocol = None, force = False):
79e5c31af7Sopenharmony_ci		if not self.isArchiveUpToDate():
80e5c31af7Sopenharmony_ci			self.fetchAndVerifyArchive()
81e5c31af7Sopenharmony_ci
82e5c31af7Sopenharmony_ci		if self.getExtractedChecksum() != self.checksum:
83e5c31af7Sopenharmony_ci			Source.clean(self)
84e5c31af7Sopenharmony_ci			self.extract()
85e5c31af7Sopenharmony_ci			self.storeExtractedChecksum(self.checksum)
86e5c31af7Sopenharmony_ci
87e5c31af7Sopenharmony_ci	def removeArchives (self):
88e5c31af7Sopenharmony_ci		archiveDir = os.path.join(EXTERNAL_DIR, pkg.baseDir, pkg.archiveDir)
89e5c31af7Sopenharmony_ci		if os.path.exists(archiveDir):
90e5c31af7Sopenharmony_ci			shutil.rmtree(archiveDir, ignore_errors=False)
91e5c31af7Sopenharmony_ci
92e5c31af7Sopenharmony_ci	def isArchiveUpToDate (self):
93e5c31af7Sopenharmony_ci		archiveFile = os.path.join(EXTERNAL_DIR, pkg.baseDir, pkg.archiveDir, pkg.filename)
94e5c31af7Sopenharmony_ci		if os.path.exists(archiveFile):
95e5c31af7Sopenharmony_ci			return computeChecksum(readBinaryFile(archiveFile)) == self.checksum
96e5c31af7Sopenharmony_ci		else:
97e5c31af7Sopenharmony_ci			return False
98e5c31af7Sopenharmony_ci
99e5c31af7Sopenharmony_ci	def getExtractedChecksumFilePath (self):
100e5c31af7Sopenharmony_ci		return os.path.join(EXTERNAL_DIR, pkg.baseDir, pkg.archiveDir, "extracted")
101e5c31af7Sopenharmony_ci
102e5c31af7Sopenharmony_ci	def getExtractedChecksum (self):
103e5c31af7Sopenharmony_ci		extractedChecksumFile = self.getExtractedChecksumFilePath()
104e5c31af7Sopenharmony_ci
105e5c31af7Sopenharmony_ci		if os.path.exists(extractedChecksumFile):
106e5c31af7Sopenharmony_ci			return readFile(extractedChecksumFile)
107e5c31af7Sopenharmony_ci		else:
108e5c31af7Sopenharmony_ci			return None
109e5c31af7Sopenharmony_ci
110e5c31af7Sopenharmony_ci	def storeExtractedChecksum (self, checksum):
111e5c31af7Sopenharmony_ci		checksum_bytes = checksum.encode("utf-8")
112e5c31af7Sopenharmony_ci		writeBinaryFile(self.getExtractedChecksumFilePath(), checksum_bytes)
113e5c31af7Sopenharmony_ci
114e5c31af7Sopenharmony_ci	def connectToUrl (self, url):
115e5c31af7Sopenharmony_ci		result = None
116e5c31af7Sopenharmony_ci
117e5c31af7Sopenharmony_ci		if sys.version_info < (3, 0):
118e5c31af7Sopenharmony_ci			from urllib2 import urlopen
119e5c31af7Sopenharmony_ci		else:
120e5c31af7Sopenharmony_ci			from urllib.request import urlopen
121e5c31af7Sopenharmony_ci
122e5c31af7Sopenharmony_ci		if args.insecure:
123e5c31af7Sopenharmony_ci			print("Ignoring certificate checks")
124e5c31af7Sopenharmony_ci			ssl_context = ssl._create_unverified_context()
125e5c31af7Sopenharmony_ci			result = urlopen(url, context=ssl_context)
126e5c31af7Sopenharmony_ci		else:
127e5c31af7Sopenharmony_ci			result = urlopen(url)
128e5c31af7Sopenharmony_ci
129e5c31af7Sopenharmony_ci		return result
130e5c31af7Sopenharmony_ci
131e5c31af7Sopenharmony_ci	def fetchAndVerifyArchive (self):
132e5c31af7Sopenharmony_ci		print("Fetching %s" % self.url)
133e5c31af7Sopenharmony_ci
134e5c31af7Sopenharmony_ci		req			= self.connectToUrl(self.url)
135e5c31af7Sopenharmony_ci		data		= req.read()
136e5c31af7Sopenharmony_ci		checksum	= computeChecksum(data)
137e5c31af7Sopenharmony_ci		dstPath		= os.path.join(EXTERNAL_DIR, self.baseDir, self.archiveDir, self.filename)
138e5c31af7Sopenharmony_ci
139e5c31af7Sopenharmony_ci		if checksum != self.checksum:
140e5c31af7Sopenharmony_ci			raise Exception("Checksum mismatch for %s, expected %s, got %s" % (self.filename, self.checksum, checksum))
141e5c31af7Sopenharmony_ci
142e5c31af7Sopenharmony_ci		if not os.path.exists(os.path.dirname(dstPath)):
143e5c31af7Sopenharmony_ci			os.makedirs(os.path.dirname(dstPath))
144e5c31af7Sopenharmony_ci
145e5c31af7Sopenharmony_ci		writeBinaryFile(dstPath, data)
146e5c31af7Sopenharmony_ci
147e5c31af7Sopenharmony_ci	def extract (self):
148e5c31af7Sopenharmony_ci		print("Extracting %s to %s/%s" % (self.filename, self.baseDir, self.extractDir))
149e5c31af7Sopenharmony_ci
150e5c31af7Sopenharmony_ci		srcPath	= os.path.join(EXTERNAL_DIR, self.baseDir, self.archiveDir, self.filename)
151e5c31af7Sopenharmony_ci		tmpPath	= os.path.join(EXTERNAL_DIR, ".extract-tmp-%s" % self.baseDir)
152e5c31af7Sopenharmony_ci		dstPath	= os.path.join(EXTERNAL_DIR, self.baseDir, self.extractDir)
153e5c31af7Sopenharmony_ci
154e5c31af7Sopenharmony_ci		if self.filename.endswith(".zip"):
155e5c31af7Sopenharmony_ci			archive	= zipfile.ZipFile(srcPath)
156e5c31af7Sopenharmony_ci		else:
157e5c31af7Sopenharmony_ci			archive	= tarfile.open(srcPath)
158e5c31af7Sopenharmony_ci
159e5c31af7Sopenharmony_ci		if os.path.exists(tmpPath):
160e5c31af7Sopenharmony_ci			shutil.rmtree(tmpPath, ignore_errors=False)
161e5c31af7Sopenharmony_ci
162e5c31af7Sopenharmony_ci		os.mkdir(tmpPath)
163e5c31af7Sopenharmony_ci
164e5c31af7Sopenharmony_ci		archive.extractall(tmpPath)
165e5c31af7Sopenharmony_ci		archive.close()
166e5c31af7Sopenharmony_ci
167e5c31af7Sopenharmony_ci		extractedEntries = os.listdir(tmpPath)
168e5c31af7Sopenharmony_ci		if len(extractedEntries) != 1 or not os.path.isdir(os.path.join(tmpPath, extractedEntries[0])):
169e5c31af7Sopenharmony_ci			raise Exception("%s doesn't contain single top-level directory" % self.filename)
170e5c31af7Sopenharmony_ci
171e5c31af7Sopenharmony_ci		topLevelPath = os.path.join(tmpPath, extractedEntries[0])
172e5c31af7Sopenharmony_ci
173e5c31af7Sopenharmony_ci		if not os.path.exists(dstPath):
174e5c31af7Sopenharmony_ci			os.mkdir(dstPath)
175e5c31af7Sopenharmony_ci
176e5c31af7Sopenharmony_ci		for entry in os.listdir(topLevelPath):
177e5c31af7Sopenharmony_ci			if os.path.exists(os.path.join(dstPath, entry)):
178e5c31af7Sopenharmony_ci				raise Exception("%s exists already" % entry)
179e5c31af7Sopenharmony_ci
180e5c31af7Sopenharmony_ci			shutil.move(os.path.join(topLevelPath, entry), dstPath)
181e5c31af7Sopenharmony_ci
182e5c31af7Sopenharmony_ci		shutil.rmtree(tmpPath, ignore_errors=True)
183e5c31af7Sopenharmony_ci
184e5c31af7Sopenharmony_ci		if self.postExtract != None:
185e5c31af7Sopenharmony_ci			self.postExtract(dstPath)
186e5c31af7Sopenharmony_ci
187e5c31af7Sopenharmony_ciclass SourceFile (Source):
188e5c31af7Sopenharmony_ci	def __init__(self, url, filename, checksum, baseDir, extractDir = "src"):
189e5c31af7Sopenharmony_ci		Source.__init__(self, baseDir, extractDir)
190e5c31af7Sopenharmony_ci		self.url			= url
191e5c31af7Sopenharmony_ci		self.filename		= filename
192e5c31af7Sopenharmony_ci		self.checksum		= checksum
193e5c31af7Sopenharmony_ci
194e5c31af7Sopenharmony_ci	def update (self, cmdProtocol = None, force = False):
195e5c31af7Sopenharmony_ci		if not self.isFileUpToDate():
196e5c31af7Sopenharmony_ci			Source.clean(self)
197e5c31af7Sopenharmony_ci			self.fetchAndVerifyFile()
198e5c31af7Sopenharmony_ci
199e5c31af7Sopenharmony_ci	def isFileUpToDate (self):
200e5c31af7Sopenharmony_ci		file = os.path.join(EXTERNAL_DIR, pkg.baseDir, pkg.extractDir, pkg.filename)
201e5c31af7Sopenharmony_ci		if os.path.exists(file):
202e5c31af7Sopenharmony_ci			data = readFile(file)
203e5c31af7Sopenharmony_ci			return computeChecksum(data.encode('utf-8')) == self.checksum
204e5c31af7Sopenharmony_ci		else:
205e5c31af7Sopenharmony_ci			return False
206e5c31af7Sopenharmony_ci
207e5c31af7Sopenharmony_ci	def connectToUrl (self, url):
208e5c31af7Sopenharmony_ci		result = None
209e5c31af7Sopenharmony_ci
210e5c31af7Sopenharmony_ci		if sys.version_info < (3, 0):
211e5c31af7Sopenharmony_ci			from urllib2 import urlopen
212e5c31af7Sopenharmony_ci		else:
213e5c31af7Sopenharmony_ci			from urllib.request import urlopen
214e5c31af7Sopenharmony_ci
215e5c31af7Sopenharmony_ci		if args.insecure:
216e5c31af7Sopenharmony_ci			print("Ignoring certificate checks")
217e5c31af7Sopenharmony_ci			ssl_context = ssl._create_unverified_context()
218e5c31af7Sopenharmony_ci			result = urlopen(url, context=ssl_context)
219e5c31af7Sopenharmony_ci		else:
220e5c31af7Sopenharmony_ci			result = urlopen(url)
221e5c31af7Sopenharmony_ci
222e5c31af7Sopenharmony_ci		return result
223e5c31af7Sopenharmony_ci
224e5c31af7Sopenharmony_ci	def fetchAndVerifyFile (self):
225e5c31af7Sopenharmony_ci		print("Fetching %s" % self.url)
226e5c31af7Sopenharmony_ci
227e5c31af7Sopenharmony_ci		req			= self.connectToUrl(self.url)
228e5c31af7Sopenharmony_ci		data		= req.read()
229e5c31af7Sopenharmony_ci		checksum	= computeChecksum(data)
230e5c31af7Sopenharmony_ci		dstPath		= os.path.join(EXTERNAL_DIR, self.baseDir, self.extractDir, self.filename)
231e5c31af7Sopenharmony_ci
232e5c31af7Sopenharmony_ci		if checksum != self.checksum:
233e5c31af7Sopenharmony_ci			raise Exception("Checksum mismatch for %s, expected %s, got %s" % (self.filename, self.checksum, checksum))
234e5c31af7Sopenharmony_ci
235e5c31af7Sopenharmony_ci		if not os.path.exists(os.path.dirname(dstPath)):
236e5c31af7Sopenharmony_ci			os.mkdir(os.path.dirname(dstPath))
237e5c31af7Sopenharmony_ci
238e5c31af7Sopenharmony_ci		writeBinaryFile(dstPath, data)
239e5c31af7Sopenharmony_ci
240e5c31af7Sopenharmony_ciclass GitRepo (Source):
241e5c31af7Sopenharmony_ci	def __init__(self, httpsUrl, sshUrl, revision, baseDir, extractDir = "src", removeTags = [], patch = ""):
242e5c31af7Sopenharmony_ci		Source.__init__(self, baseDir, extractDir)
243e5c31af7Sopenharmony_ci		self.httpsUrl	= httpsUrl
244e5c31af7Sopenharmony_ci		self.sshUrl		= sshUrl
245e5c31af7Sopenharmony_ci		self.revision	= revision
246e5c31af7Sopenharmony_ci		self.removeTags	= removeTags
247e5c31af7Sopenharmony_ci		self.patch		= patch
248e5c31af7Sopenharmony_ci
249e5c31af7Sopenharmony_ci	def checkout(self, url, fullDstPath, force):
250e5c31af7Sopenharmony_ci		if not os.path.exists(os.path.join(fullDstPath, '.git')):
251e5c31af7Sopenharmony_ci			execute(["git", "clone", "--no-checkout", url, fullDstPath])
252e5c31af7Sopenharmony_ci
253e5c31af7Sopenharmony_ci		pushWorkingDir(fullDstPath)
254e5c31af7Sopenharmony_ci		try:
255e5c31af7Sopenharmony_ci			for tag in self.removeTags:
256e5c31af7Sopenharmony_ci				proc = subprocess.Popen(['git', 'tag', '-l', tag], stdout=subprocess.PIPE)
257e5c31af7Sopenharmony_ci				(stdout, stderr) = proc.communicate()
258e5c31af7Sopenharmony_ci				if len(stdout) > 0:
259e5c31af7Sopenharmony_ci					execute(["git", "tag", "-d",tag])
260e5c31af7Sopenharmony_ci			force_arg = ['--force'] if force else []
261e5c31af7Sopenharmony_ci			execute(["git", "fetch"] + force_arg + ["--tags", url, "+refs/heads/*:refs/remotes/origin/*"])
262e5c31af7Sopenharmony_ci			execute(["git", "checkout"] + force_arg + [self.revision])
263e5c31af7Sopenharmony_ci
264e5c31af7Sopenharmony_ci			if(self.patch != ""):
265e5c31af7Sopenharmony_ci				patchFile = os.path.join(EXTERNAL_DIR, self.patch)
266e5c31af7Sopenharmony_ci				execute(["git", "reset", "--hard", "HEAD"])
267e5c31af7Sopenharmony_ci				execute(["git", "apply", patchFile])
268e5c31af7Sopenharmony_ci		finally:
269e5c31af7Sopenharmony_ci			popWorkingDir()
270e5c31af7Sopenharmony_ci
271e5c31af7Sopenharmony_ci	def update (self, cmdProtocol, force = False):
272e5c31af7Sopenharmony_ci		fullDstPath = os.path.join(EXTERNAL_DIR, self.baseDir, self.extractDir)
273e5c31af7Sopenharmony_ci		url         = self.httpsUrl
274e5c31af7Sopenharmony_ci		backupUrl   = self.sshUrl
275e5c31af7Sopenharmony_ci
276e5c31af7Sopenharmony_ci		# If url is none then start with ssh
277e5c31af7Sopenharmony_ci		if cmdProtocol == 'ssh' or url == None:
278e5c31af7Sopenharmony_ci			url       = self.sshUrl
279e5c31af7Sopenharmony_ci			backupUrl = self.httpsUrl
280e5c31af7Sopenharmony_ci
281e5c31af7Sopenharmony_ci		try:
282e5c31af7Sopenharmony_ci			self.checkout(url, fullDstPath, force)
283e5c31af7Sopenharmony_ci		except:
284e5c31af7Sopenharmony_ci			if backupUrl != None:
285e5c31af7Sopenharmony_ci				self.checkout(backupUrl, fullDstPath, force)
286e5c31af7Sopenharmony_ci
287e5c31af7Sopenharmony_cidef postExtractLibpng (path):
288e5c31af7Sopenharmony_ci	shutil.copy(os.path.join(path, "scripts", "pnglibconf.h.prebuilt"),
289e5c31af7Sopenharmony_ci				os.path.join(path, "pnglibconf.h"))
290e5c31af7Sopenharmony_ci
291e5c31af7Sopenharmony_ciPACKAGES = [
292e5c31af7Sopenharmony_ci	SourcePackage(
293e5c31af7Sopenharmony_ci		"http://zlib.net/fossils/zlib-1.2.13.tar.gz",
294e5c31af7Sopenharmony_ci		"b3a24de97a8fdbc835b9833169501030b8977031bcb54b3b3ac13740f846ab30",
295e5c31af7Sopenharmony_ci		"zlib"),
296e5c31af7Sopenharmony_ci	SourcePackage(
297e5c31af7Sopenharmony_ci		"http://prdownloads.sourceforge.net/libpng/libpng-1.6.27.tar.gz",
298e5c31af7Sopenharmony_ci		"c9d164ec247f426a525a7b89936694aefbc91fb7a50182b198898b8fc91174b4",
299e5c31af7Sopenharmony_ci		"libpng",
300e5c31af7Sopenharmony_ci		postExtract = postExtractLibpng),
301e5c31af7Sopenharmony_ci	SourceFile(
302e5c31af7Sopenharmony_ci		"https://raw.githubusercontent.com/baldurk/renderdoc/v1.1/renderdoc/api/app/renderdoc_app.h",
303e5c31af7Sopenharmony_ci		"renderdoc_app.h",
304e5c31af7Sopenharmony_ci		"e7b5f0aa5b1b0eadc63a1c624c0ca7f5af133aa857d6a4271b0ef3d0bdb6868e",
305e5c31af7Sopenharmony_ci		"renderdoc"),
306e5c31af7Sopenharmony_ci	GitRepo(
307e5c31af7Sopenharmony_ci		"https://github.com/KhronosGroup/SPIRV-Tools.git",
308e5c31af7Sopenharmony_ci		"git@github.com:KhronosGroup/SPIRV-Tools.git",
309e5c31af7Sopenharmony_ci		"bfc94f63a7adbcf8ae166f5f108ac9f69079efc0",
310e5c31af7Sopenharmony_ci		"spirv-tools"),
311e5c31af7Sopenharmony_ci	GitRepo(
312e5c31af7Sopenharmony_ci		"https://github.com/KhronosGroup/glslang.git",
313e5c31af7Sopenharmony_ci		None,
314e5c31af7Sopenharmony_ci		"c5117b328afc86e16edff6ed6afe0fe7872a7cf3",
315e5c31af7Sopenharmony_ci		"glslang",
316e5c31af7Sopenharmony_ci		removeTags = ["main-tot"]),
317e5c31af7Sopenharmony_ci	GitRepo(
318e5c31af7Sopenharmony_ci		"https://github.com/KhronosGroup/SPIRV-Headers.git",
319e5c31af7Sopenharmony_ci		"git@github.com:KhronosGroup/SPIRV-Headers.git",
320e5c31af7Sopenharmony_ci		"b8b9eb8640c8c0107ba580fbcb10f969022ca32c",
321e5c31af7Sopenharmony_ci		"spirv-headers"),
322e5c31af7Sopenharmony_ci	GitRepo(
323e5c31af7Sopenharmony_ci		"https://github.com/KhronosGroup/Vulkan-Docs.git",
324e5c31af7Sopenharmony_ci		"git@github.com:KhronosGroup/Vulkan-Docs.git",
325e5c31af7Sopenharmony_ci		"b9aad705f0d9e5e6734ac2ad671d5d1de57b05e0",
326e5c31af7Sopenharmony_ci		"vulkan-docs"),
327e5c31af7Sopenharmony_ci	GitRepo(
328e5c31af7Sopenharmony_ci		"https://github.com/google/amber.git",
329e5c31af7Sopenharmony_ci		None,
330e5c31af7Sopenharmony_ci		"933ecb4d6288675a92eb1650e0f52b1d7afe8273",
331e5c31af7Sopenharmony_ci		"amber"),
332e5c31af7Sopenharmony_ci	GitRepo(
333e5c31af7Sopenharmony_ci		"https://github.com/open-source-parsers/jsoncpp.git",
334e5c31af7Sopenharmony_ci		"git@github.com:open-source-parsers/jsoncpp.git",
335e5c31af7Sopenharmony_ci		"9059f5cad030ba11d37818847443a53918c327b1",
336e5c31af7Sopenharmony_ci		"jsoncpp"),
337e5c31af7Sopenharmony_ci	# NOTE: The samples application is not well suited to external
338e5c31af7Sopenharmony_ci	# integration, this fork contains the small fixes needed for use
339e5c31af7Sopenharmony_ci	# by the CTS.
340e5c31af7Sopenharmony_ci	GitRepo(
341e5c31af7Sopenharmony_ci		"https://github.com/Igalia/vk_video_samples.git",
342e5c31af7Sopenharmony_ci		"git@github.com:Igalia/vk_video_samples.git",
343e5c31af7Sopenharmony_ci		"138bbe048221d315962ddf8413aa6a08cc62a381",
344e5c31af7Sopenharmony_ci		"nvidia-video-samples"),
345e5c31af7Sopenharmony_ci	GitRepo(
346e5c31af7Sopenharmony_ci		"https://github.com/Igalia/ESExtractor.git",
347e5c31af7Sopenharmony_ci		"git@github.com:Igalia/ESExtractor.git",
348e5c31af7Sopenharmony_ci		"v0.3.3",
349e5c31af7Sopenharmony_ci		"ESExtractor"),
350e5c31af7Sopenharmony_ci]
351e5c31af7Sopenharmony_ci
352e5c31af7Sopenharmony_cidef parseArgs ():
353e5c31af7Sopenharmony_ci	versionsForInsecure = ((2,7,9), (3,4,3))
354e5c31af7Sopenharmony_ci	versionsForInsecureStr = ' or '.join(('.'.join(str(x) for x in v)) for v in versionsForInsecure)
355e5c31af7Sopenharmony_ci
356e5c31af7Sopenharmony_ci	parser = argparse.ArgumentParser(description = "Fetch external sources")
357e5c31af7Sopenharmony_ci	parser.add_argument('--clean', dest='clean', action='store_true', default=False,
358e5c31af7Sopenharmony_ci						help='Remove sources instead of fetching')
359e5c31af7Sopenharmony_ci	parser.add_argument('--insecure', dest='insecure', action='store_true', default=False,
360e5c31af7Sopenharmony_ci						help="Disable certificate check for external sources."
361e5c31af7Sopenharmony_ci						" Minimum python version required " + versionsForInsecureStr)
362e5c31af7Sopenharmony_ci	parser.add_argument('--protocol', dest='protocol', default='https', choices=['ssh', 'https'],
363e5c31af7Sopenharmony_ci						help="Select protocol to checkout git repositories.")
364e5c31af7Sopenharmony_ci	parser.add_argument('--force', dest='force', action='store_true', default=False,
365e5c31af7Sopenharmony_ci						help="Pass --force to git fetch and checkout commands")
366e5c31af7Sopenharmony_ci
367e5c31af7Sopenharmony_ci	args = parser.parse_args()
368e5c31af7Sopenharmony_ci
369e5c31af7Sopenharmony_ci	if args.insecure:
370e5c31af7Sopenharmony_ci		for versionItem in versionsForInsecure:
371e5c31af7Sopenharmony_ci			if (sys.version_info.major == versionItem[0]):
372e5c31af7Sopenharmony_ci				if sys.version_info < versionItem:
373e5c31af7Sopenharmony_ci					parser.error("For --insecure minimum required python version is " +
374e5c31af7Sopenharmony_ci								versionsForInsecureStr)
375e5c31af7Sopenharmony_ci				break;
376e5c31af7Sopenharmony_ci
377e5c31af7Sopenharmony_ci	return args
378e5c31af7Sopenharmony_ci
379e5c31af7Sopenharmony_cidef run(*popenargs, **kwargs):
380e5c31af7Sopenharmony_ci	process = subprocess.Popen(*popenargs, **kwargs)
381e5c31af7Sopenharmony_ci
382e5c31af7Sopenharmony_ci	try:
383e5c31af7Sopenharmony_ci		stdout, stderr = process.communicate(None)
384e5c31af7Sopenharmony_ci	except:
385e5c31af7Sopenharmony_ci		process.kill()
386e5c31af7Sopenharmony_ci		process.wait()
387e5c31af7Sopenharmony_ci		raise
388e5c31af7Sopenharmony_ci
389e5c31af7Sopenharmony_ci	retcode = process.poll()
390e5c31af7Sopenharmony_ci
391e5c31af7Sopenharmony_ci	if retcode:
392e5c31af7Sopenharmony_ci		raise subprocess.CalledProcessError(retcode, process.args, output=stdout, stderr=stderr)
393e5c31af7Sopenharmony_ci
394e5c31af7Sopenharmony_ci	return retcode, stdout, stderr
395e5c31af7Sopenharmony_ci
396e5c31af7Sopenharmony_ciif __name__ == "__main__":
397e5c31af7Sopenharmony_ci	args = parseArgs()
398e5c31af7Sopenharmony_ci
399e5c31af7Sopenharmony_ci	for pkg in PACKAGES:
400e5c31af7Sopenharmony_ci		if args.clean:
401e5c31af7Sopenharmony_ci			pkg.clean()
402e5c31af7Sopenharmony_ci		else:
403e5c31af7Sopenharmony_ci			pkg.update(args.protocol, args.force)
404