From 6a54633796cc7e436a35662a5c3c12a04707df0c Mon Sep 17 00:00:00 2001 From: Christopher Ferris Date: Wed, 8 Sep 2021 13:59:04 -0700 Subject: [PATCH] Make the script python3. Test: Ran the python version of the script and the python3 version Test: and verified the output is the same. This is for all three Test: outputs (html, text, xml). Test: Builds without an error. Change-Id: I5138b0a1efbbc3ab764c644afc1783c79fd7e250 --- tools/generate-notice-files.py | 116 +++++++++++++++++---------------- 1 file changed, 61 insertions(+), 55 deletions(-) diff --git a/tools/generate-notice-files.py b/tools/generate-notice-files.py index bf958fbae4..5e3010facc 100755 --- a/tools/generate-notice-files.py +++ b/tools/generate-notice-files.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # Copyright (C) 2012 The Android Open Source Project # @@ -30,20 +30,18 @@ import itertools import os import os.path import re +import struct import sys MD5_BLOCKSIZE = 1024 * 1024 HTML_ESCAPE_TABLE = { - "&": "&", - '"': """, - "'": "'", - ">": ">", - "<": "<", + b"&": b"&", + b'"': b""", + b"'": b"'", + b">": b">", + b"<": b"<", } -def hexify(s): - return ("%02x"*len(s)) % tuple(map(ord, s)) - def md5sum(filename): """Calculate an MD5 of the file given by FILENAME, and return hex digest as a string. @@ -57,20 +55,26 @@ def md5sum(filename): break sum.update(block) f.close() - return hexify(sum.digest()) + return sum.hexdigest() def html_escape(text): """Produce entities within text.""" - return "".join(HTML_ESCAPE_TABLE.get(c,c) for c in text) + # Using for i in text doesn't work since i will be an int, not a byte. + # There are multiple ways to solve this, but the most performant way + # to iterate over a byte array is to use unpack. Using the + # for i in range(len(text)) and using that to get a byte using array + # slices is twice as slow as this method. + return b"".join(HTML_ESCAPE_TABLE.get(i,i) for i in struct.unpack(str(len(text)) + 'c', text)) -HTML_OUTPUT_CSS=""" +HTML_OUTPUT_CSS=b""" + """ def combine_notice_files_html(file_hash, input_dirs, output_filename): @@ -90,13 +94,13 @@ def combine_notice_files_html(file_hash, input_dirs, output_filename): # Open the output file, and output the header pieces output_file = open(output_filename, "wb") - print >> output_file, "" - print >> output_file, HTML_OUTPUT_CSS - print >> output_file, '' + output_file.write(b"\n") + output_file.write(HTML_OUTPUT_CSS) + output_file.write(b'\n') # Output our table of contents - print >> output_file, '
' - print >> output_file, "\n") + output_file.write(b"
\n") # Output the individual notice file lists - print >>output_file, '' + output_file.write(b'
\n') for value in file_hash: - print >> output_file, '" - print >> output_file - print >> output_file - print >> output_file + output_file.write(("%s
\n" % SRC_DIR_STRIP_RE.sub(r"\1", filename)).encode()) + output_file.write(b"\n") + output_file.write(b"\n") + output_file.write(b'
\n')
+        with open(value[0], "rb") as notice_file:
+            output_file.write(html_escape(notice_file.read()))
+        output_file.write(b"\n
\n") + output_file.write(b"\n\n\n\n") # Finish off the file output - print >> output_file, "
' % id_table.get(value[0]) - print >> output_file, '
Notices for file(s):
' - print >> output_file, '
' + output_file.write(b'
\n' % id_table.get(value[0])) + output_file.write(b'
Notices for file(s):
\n') + output_file.write(b'
\n') for filename in value: - print >> output_file, "%s
" % (SRC_DIR_STRIP_RE.sub(r"\1", filename)) - print >> output_file, "
" - print >> output_file - print >> output_file, '
'
-        print >> output_file, html_escape(open(value[0]).read())
-        print >> output_file, "
" - print >> output_file, "
" - print >> output_file, "" + output_file.write(b"\n") + output_file.write(b"\n") output_file.close() def combine_notice_files_text(file_hash, input_dirs, output_filename, file_title): @@ -136,14 +138,18 @@ def combine_notice_files_text(file_hash, input_dirs, output_filename, file_title SRC_DIR_STRIP_RE = re.compile("(?:" + "|".join(input_dirs) + ")(/.*).txt") output_file = open(output_filename, "wb") - print >> output_file, file_title + output_file.write(file_title.encode()) + output_file.write(b"\n") for value in file_hash: - print >> output_file, "============================================================" - print >> output_file, "Notices for file(s):" - for filename in value: - print >> output_file, SRC_DIR_STRIP_RE.sub(r"\1", filename) - print >> output_file, "------------------------------------------------------------" - print >> output_file, open(value[0]).read() + output_file.write(b"============================================================\n") + output_file.write(b"Notices for file(s):\n") + for filename in value: + output_file.write(SRC_DIR_STRIP_RE.sub(r"\1", filename).encode()) + output_file.write(b"\n") + output_file.write(b"------------------------------------------------------------\n") + with open(value[0], "rb") as notice_file: + output_file.write(notice_file.read()) + output_file.write(b"\n") output_file.close() def combine_notice_files_xml(files_with_same_hash, input_dirs, output_filename): @@ -154,15 +160,15 @@ def combine_notice_files_xml(files_with_same_hash, input_dirs, output_filename): # Set up a filename to row id table (anchors inside tables don't work in # most browsers, but href's to table row ids do) id_table = {} - for file_key in files_with_same_hash.keys(): - for filename in files_with_same_hash[file_key]: + for file_key, files in files_with_same_hash.items(): + for filename in files: id_table[filename] = file_key # Open the output file, and output the header pieces output_file = open(output_filename, "wb") - print >> output_file, '' - print >> output_file, "" + output_file.write(b'\n') + output_file.write(b"\n") # Flatten the list of lists into a single list of filenames sorted_filenames = sorted(id_table.keys()) @@ -170,10 +176,8 @@ def combine_notice_files_xml(files_with_same_hash, input_dirs, output_filename): # Print out a nice table of contents for filename in sorted_filenames: stripped_filename = SRC_DIR_STRIP_RE.sub(r"\1", filename) - print >> output_file, '%s' % (id_table.get(filename), stripped_filename) - - print >> output_file - print >> output_file + output_file.write(('%s\n' % (id_table.get(filename), stripped_filename)).encode()) + output_file.write(b"\n\n") processed_file_keys = [] # Output the individual notice file lists @@ -183,11 +187,13 @@ def combine_notice_files_xml(files_with_same_hash, input_dirs, output_filename): continue processed_file_keys.append(file_key) - print >> output_file, '' % (file_key, html_escape(open(filename).read())) - print >> output_file + output_file.write(('\n\n") # Finish off the file output - print >> output_file, "" + output_file.write(b"\n") output_file.close() def get_args(): @@ -254,7 +260,7 @@ def main(argv): file_md5sum = md5sum(filename) files_with_same_hash[file_md5sum].append(filename) - filesets = [sorted(files_with_same_hash[md5]) for md5 in sorted(files_with_same_hash.keys())] + filesets = [sorted(files_with_same_hash[md5]) for md5 in sorted(list(files_with_same_hash))] combine_notice_files_text(filesets, input_dirs, txt_output_file, file_title) if html_output_file is not None: