manifest: minor bugfixes and improvements
- More robust string handling by using Unicode
- Unix line ending in generated files
- Don't call keyword_substitute if
- no keychains in line
- printing to output is disabled due to unmet condition
- Fix handling of list of leaf datatypes in db
Change-Id: Ic9c9bdba12b2f536ffa707342728b1277363e99f
Signed-off-by: Miklos Balint <miklos.balint@arm.com>
diff --git a/tools/generate_from_template.py b/tools/generate_from_template.py
index 5f2153a..a1ab137 100644
--- a/tools/generate_from_template.py
+++ b/tools/generate_from_template.py
@@ -5,8 +5,9 @@
#
#-------------------------------------------------------------------------------
-import os
-from keyword_substitution import keyword_substitute, Verbosity, log_print
+from __future__ import unicode_literals
+import os, re, io
+from keyword_substitution import keyword_substitute, Verbosity, log_print, REkeychain
VERBOSITY = Verbosity.warning
log_print(Verbosity.debug, "Setting verbosity to", VERBOSITY, verbosity=VERBOSITY)
@@ -27,10 +28,17 @@
# All operations assume tf-m repo root as active working directory
# Functions
+def substitute(manifest, line, MISSING_KEYS_ACTION):
+ outlist = keyword_substitute(manifest, line, MISSING_KEYS_ACTION)
+ outstring = ""
+ for outline in outlist:
+ outstring += ''.join(outline)
+ log_print(Verbosity.info, outstring)
+ return outstring
+
def generate(db, outfile_name):
- outfile = \
- open(outfile_name, "w")
- with open(outfile_name + '.template', "r") as template_file:
+ outfile = io.open(outfile_name, "w", newline='\n')
+ with io.open(outfile_name + '.template', "r") as template_file:
template = template_file.readlines()
output = []
@@ -49,24 +57,24 @@
iteration_counter = 0
log_print(Verbosity.info, "Blocklines:", str(blocklines))
for manifest in db:
- print_blocked = False
+ ignore_line = False
for line in blocklines:
- outlist = keyword_substitute(manifest, line, MISSING_KEYS_ACTION)
- outstring = ""
- for outline in outlist:
- outstring += ''.join(outline)
- log_print(Verbosity.info, outstring)
- if controlconditionstart in outstring:
+ if controlconditionstart in line:
+ outstring = substitute(manifest, line, MISSING_KEYS_ACTION)
if 'False' in outstring:
log_print(Verbosity.info, "PRINT BLOCKED")
- print_blocked = True
- elif controlconditionend in outstring:
+ ignore_line = True
+ elif controlconditionend in line:
log_print(Verbosity.info, "PRINT ENABLED")
- print_blocked = False
- elif controlconditionelse in outstring:
- log_print(Verbosity.info, "PRINT " + str(print_blocked))
- print_blocked = not print_blocked
- else:
+ ignore_line = False
+ elif controlconditionelse in line:
+ log_print(Verbosity.info, "PRINT " + str(ignore_line))
+ ignore_line = not ignore_line
+ elif not ignore_line:
+ if re.search(REkeychain, line):
+ outstring = substitute(manifest, line, MISSING_KEYS_ACTION)
+ else:
+ outstring = line
if control_print_iteration_counter in outstring:
outstring = outstring.replace(
control_print_iteration_counter,
@@ -75,8 +83,7 @@
print "Invalid control symbol:", outstring
print "exiting"
exit(1)
- if not print_blocked:
- outfile.write(outstring)
+ outfile.write(outstring)
iteration_counter += 1
# end for manifest in db
blocks.append(blocklines)
@@ -104,4 +111,5 @@
def generate_from_template_file(db, file_list):
for file in file_list:
outfile = file["output"]
+ print "Generating", outfile
generate(db, outfile)
diff --git a/tools/keyword_substitution.py b/tools/keyword_substitution.py
index 9a98aae..1687338 100644
--- a/tools/keyword_substitution.py
+++ b/tools/keyword_substitution.py
@@ -24,6 +24,7 @@
REkeychain = "@@\w+[\.\w+]*@@"
REfirstkeyword = "@@\w+\.?"
+emptychain = "@@@@"
MISSING_KEYS_ACTION = 'halt'
@@ -43,7 +44,7 @@
depth += 1
log_print(Verbosity.info, "substitute(",templist, chains, db, depth,")")
if isinstance(db, type([])):
- # db node is list
+ # db is list
outlist = []
for instance in db:
log_print(Verbosity.info, "Going deeper at", depth, "for db list instance", instance)
@@ -51,8 +52,21 @@
log_print(Verbosity.info, "substitute", depth, "returning from list with", outlist)
return outlist
- # db node is dict/leaf
transientlist = list(templist)
+ if leaftype(db):
+ # db is leaf
+ for chain in chains:
+ if templist[chain] == emptychain:
+ transientlist[chain] = str(db)
+ else:
+ print "keychain not empty but db is"
+ transientlist[chain] = str(db) + templist[chain]
+ continue
+ chains = []
+ log_print(Verbosity.info, "substitute", depth, "returning from leaf with", transientlist)
+ return transientlist
+
+ # db is dict
# find chain groups with same key
chaingroups = {"chains": [], "keys": []}
for chain in chains:
@@ -78,7 +92,7 @@
log_print(Verbosity.info, "key lookup in", db, "for", key)
if key in db.keys():
if leaftype(db[key]):
- # db node is leaf
+ # db entry value is leaf
for chain in chaingroups["chains"][groupidx]:
transientlist[chain] = str(db[key])
chaingroups["chains"][groupidx] = []
diff --git a/tools/tfm_parse_manifest_list.py b/tools/tfm_parse_manifest_list.py
index 76fb310..3129bde 100644
--- a/tools/tfm_parse_manifest_list.py
+++ b/tools/tfm_parse_manifest_list.py
@@ -49,6 +49,7 @@
file_list_yaml = yaml.load(file_list_yaml_file)
file_list = file_list_yaml["file_list"]
generate_from_template_file(db, file_list)
+ print "Generation of files done"
if __name__ == "__main__":
main()