Source.clean(self)
self.removeArchives()
- def update (self):
+ def update (self, cmdProtocol = None):
if not self.isArchiveUpToDate():
self.fetchAndVerifyArchive()
- # \note No way to verify that extracted contents match archive, re-extract
- Source.clean(self)
- self.extract()
+ if self.getExtractedChecksum() != self.checksum:
+ Source.clean(self)
+ self.extract()
+ self.storeExtractedChecksum(self.checksum)
def removeArchives (self):
archiveDir = os.path.join(EXTERNAL_DIR, pkg.baseDir, pkg.archiveDir)
else:
return False
+ def getExtractedChecksumFilePath (self):
+ return os.path.join(EXTERNAL_DIR, pkg.baseDir, pkg.archiveDir, "extracted")
+
+ def getExtractedChecksum (self):
+ extractedChecksumFile = self.getExtractedChecksumFilePath()
+
+ if os.path.exists(extractedChecksumFile):
+ return readFile(extractedChecksumFile)
+ else:
+ return None
+
+ def storeExtractedChecksum (self, checksum):
+ writeFile(self.getExtractedChecksumFilePath(), checksum)
+
def fetchAndVerifyArchive (self):
print "Fetching %s" % self.url
self.postExtract(dstPath)
class GitRepo (Source):
- def __init__(self, url, revision, baseDir, extractDir = "src"):
+ def __init__(self, httpsUrl, sshUrl, revision, baseDir, extractDir = "src"):
Source.__init__(self, baseDir, extractDir)
- self.url = url
+ self.httpsUrl = httpsUrl
+ self.sshUrl = sshUrl
self.revision = revision
- def update (self):
+ def selectUrl(self, cmdProtocol = None):
+ if cmdProtocol == None:
+ # reuse parent repo protocol
+ proc = subprocess.Popen(['git', 'ls-remote', '--get-url', 'origin'], stdout=subprocess.PIPE)
+ (stdout, stderr) = proc.communicate()
+
+ if proc.returncode != 0:
+ raise Exception("Failed to execute 'git ls-remote origin', got %d" % proc.returncode)
+ if (stdout[:3] == 'ssh') or (stdout[:3] == 'git'):
+ protocol = 'ssh'
+ else:
+ assert stdout[:5] == 'https'
+ protocol = 'https'
+ else:
+ protocol = cmdProtocol
+
+ if protocol == 'ssh':
+ if self.sshUrl != None:
+ url = self.sshUrl
+ else:
+ assert self.httpsUrl != None
+ url = self.httpsUrl
+ else:
+ assert protocol == 'https'
+ url = self.httpsUrl
+
+ assert url != None
+ return url
+
+ def update (self, cmdProtocol = None):
fullDstPath = os.path.join(EXTERNAL_DIR, self.baseDir, self.extractDir)
+ url = self.selectUrl(cmdProtocol)
if not os.path.exists(fullDstPath):
- execute(["git", "clone", "--no-checkout", self.url, fullDstPath])
+ execute(["git", "clone", "--no-checkout", url, fullDstPath])
pushWorkingDir(fullDstPath)
try:
- execute(["git", "fetch", self.url, "+refs/heads/*:refs/remotes/origin/*"])
+ execute(["git", "fetch", url, "+refs/heads/*:refs/remotes/origin/*"])
execute(["git", "checkout", self.revision])
finally:
popWorkingDir()
postExtract = postExtractLibpng),
GitRepo(
"https://github.com/KhronosGroup/SPIRV-Tools.git",
- "3e6b2dfa699b13987657298ab2a7652a0a577ca9",
+ None,
+ "5c19de25107d496a15c7869b3e1dab0a0f85913d",
"spirv-tools"),
GitRepo(
"https://github.com/KhronosGroup/glslang.git",
- "f5dcdf01230b504c340070d9938cd4b62b867f99",
+ None,
+ "e3aa654c4b0c761b28d7864192ca8ceea6faf70a",
"glslang"),
+ GitRepo(
+ "https://github.com/KhronosGroup/SPIRV-Headers.git",
+ None,
+ "bd47a9abaefac00be692eae677daed1b977e625c",
+ "spirv-headers"),
]
def parseArgs ():
parser = argparse.ArgumentParser(description = "Fetch external sources")
parser.add_argument('--clean', dest='clean', action='store_true', default=False,
help='Remove sources instead of fetching')
+ parser.add_argument('--protocol', dest='protocol', default=None, choices=['ssh', 'https'],
+ help="Select protocol to checkout git repositories.")
return parser.parse_args()
if __name__ == "__main__":
if args.clean:
pkg.clean()
else:
- pkg.update()
+ pkg.update(args.protocol)