1# -*- coding: utf-8 -*-
2
3#-------------------------------------------------------------------------
4# drawElements Quality Program utilities
5# --------------------------------------
6#
7# Copyright 2016 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 re
25import sys
26import argparse
27
28def readFile (filename):
29	f = open(filename, 'rb')
30	d = f.read()
31	f.close()
32	return d
33
34def writeFile (filename, data):
35	f = open(filename, 'wb')
36	f.write(data)
37	f.close()
38
39COMMIT	= 0
40REF		= 1
41
42def getCommitOrRef (filename):
43	src = readFile(filename)
44	m = re.search(r'^[a-zA-Z0-9]{40}', src)
45	if m:
46		return (COMMIT, m.group(0))
47	m = re.search(r'^ref:\s+([^\s]+)', src)
48	if m:
49		return (REF, m.group(1))
50	raise Exception("Coulnd't parse %s" % filename)
51
52def getHead (gitDir):
53	curFile = os.path.join(gitDir, "HEAD")
54	while True:
55		type, ptr = getCommitOrRef(curFile)
56		if type == COMMIT:
57			return ptr
58		else:
59			assert type == REF
60			curFile = os.path.join(gitDir, ptr)
61
62def makeReleaseInfo (name, id):
63	return """
64/* WARNING: auto-generated file, use {genFileName} to modify */
65
66#define DEQP_RELEASE_NAME	"{releaseName}"
67#define DEQP_RELEASE_ID		{releaseId}
68"""[1:].format(
69		genFileName	= os.path.basename(__file__),
70		releaseName	= name,
71		releaseId	= id)
72
73def parseArgs ():
74	parser = argparse.ArgumentParser(description="Generate release info for build")
75	parser.add_argument('--name', dest='releaseName', default=None, help="Release name")
76	parser.add_argument('--id', dest='releaseId', default=None, help="Release ID (must be C integer literal)")
77	parser.add_argument('--git', dest='git', action='store_true', default=False, help="Development build, use git HEAD to identify")
78	parser.add_argument('--git-dir', dest='gitDir', default=None, help="Use specific git dir for extracting info")
79	parser.add_argument('--out', dest='out', default=None, help="Output file")
80
81	args = parser.parse_args()
82
83	if (args.releaseName == None) != (args.releaseId == None):
84		print "Both --name and --id must be specified"
85		parser.print_help()
86		sys.exit(-1)
87
88	if (args.releaseName != None) == args.git:
89		print "Either --name and --id, or --git must be specified"
90		parser.print_help()
91		sys.exit(-1)
92
93	return args
94
95if __name__ == "__main__":
96	curDir			= os.path.dirname(__file__)
97	defaultGitDir	= os.path.normpath(os.path.join(curDir, "..", "..", ".git"))
98	defaultDstFile	= os.path.join(curDir, "qpReleaseInfo.inl")
99
100	args = parseArgs()
101
102	if args.git:
103		gitDir		= args.gitDir if args.gitDir != None else defaultGitDir
104		head		= getHead(gitDir)
105		releaseName	= "git-%s" % head
106		releaseId	= "0x%s" % head[0:8]
107	else:
108		releaseName	= args.releaseName
109		releaseId	= args.releaseId
110
111	releaseInfo	= makeReleaseInfo(releaseName, releaseId)
112	dstFile		= args.out if args.out != None else defaultDstFile
113
114	writeFile(dstFile, releaseInfo)
115