Index: chrome/browser/metrics/variations/generate_resources_map.py |
diff --git a/chrome/browser/metrics/variations/generate_resources_map.py b/chrome/browser/metrics/variations/generate_resources_map.py |
deleted file mode 100755 |
index 6cf535b857883f1fe51edcaf1b393e2374eaa2cb..0000000000000000000000000000000000000000 |
--- a/chrome/browser/metrics/variations/generate_resources_map.py |
+++ /dev/null |
@@ -1,183 +0,0 @@ |
-#!/usr/bin/python |
-# Copyright 2014 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-import collections |
-import hashlib |
-import operator |
-import os |
-import re |
-import sys |
- |
- |
-RESOURCE_EXTRACT_REGEX = re.compile('^#define (\S*) (\d*)$', re.MULTILINE) |
- |
-class Error(Exception): |
- """Base error class for all exceptions in generated_resources_map.""" |
- |
- |
-class HashCollisionError(Error): |
- """Multiple resource names hash to the same value.""" |
- |
- |
-Resource = collections.namedtuple("Resource", ['hash', 'name', 'index']) |
- |
- |
-def _HashName(name): |
- """Returns the hash id for a name. |
- |
- Args: |
- name: The name to hash. |
- |
- Returns: |
- An int that is at most 32 bits. |
- """ |
- md5hash = hashlib.md5() |
- md5hash.update(name) |
- return int(md5hash.hexdigest()[:8], 16) |
- |
- |
-def _GetNameIndexPairsIter(string_to_scan): |
- """Gets an iterator of the resource name and index pairs of the given string. |
- |
- Scans the input string for lines of the form "#define NAME INDEX" and returns |
- an iterator over all matching (NAME, INDEX) pairs. |
- |
- Args: |
- string_to_scan: The input string to scan. |
- |
- Yields: |
- A tuple of name and index. |
- """ |
- for match in RESOURCE_EXTRACT_REGEX.finditer(string_to_scan): |
- yield match.group(1, 2) |
- |
- |
-def _GetResourceListFromString(resources_content): |
- """Produces a list of |Resource| objects from a string. |
- |
- The input string conaints lines of the form "#define NAME INDEX". The returned |
- list is sorted primarily by hash, then name, and then index. |
- |
- Args: |
- resources_content: The input string to process, contains lines of the form |
- "#define NAME INDEX". |
- |
- Returns: |
- A sorted list of |Resource| objects. |
- """ |
- resources = [Resource(_HashName(name), name, index) for name, index in |
- _GetNameIndexPairsIter(resources_content)] |
- |
- # The default |Resource| order makes |resources| sorted by the hash, then |
- # name, then index. |
- resources.sort() |
- |
- return resources |
- |
- |
-def _CheckForHashCollisions(sorted_resource_list): |
- """Checks a sorted list of |Resource| objects for hash collisions. |
- |
- Args: |
- sorted_resource_list: A sorted list of |Resource| objects. |
- |
- Returns: |
- A set of all |Resource| objects with collisions. |
- """ |
- collisions = set() |
- for i in xrange(len(sorted_resource_list) - 1): |
- resource = sorted_resource_list[i] |
- next_resource = sorted_resource_list[i+1] |
- if resource.hash == next_resource.hash: |
- collisions.add(resource) |
- collisions.add(next_resource) |
- |
- return collisions |
- |
- |
-def _GenDataArray( |
- resources, entry_pattern, array_name, array_type, data_getter): |
- """Generates a C++ statement defining a literal array containing the hashes. |
- |
- Args: |
- resources: A sorted list of |Resource| objects. |
- entry_pattern: A pattern to be used to generate each entry in the array. The |
- pattern is expected to have a place for data and one for a comment, in |
- that order. |
- array_name: The name of the array being generated. |
- array_type: The type of the array being generated. |
- data_getter: A function that gets the array data from a |Resource| object. |
- |
- Returns: |
- A string containing a C++ statement defining the an array. |
- """ |
- lines = [entry_pattern % (data_getter(r), r.name) for r in resources] |
- pattern = """const %(type)s %(name)s[] = { |
-%(content)s |
-}; |
-""" |
- return pattern % {'type': array_type, |
- 'name': array_name, |
- 'content': '\n'.join(lines)} |
- |
- |
-def _GenerateFileContent(resources_content): |
- """Generates the .cc content from the given generated_resources.h content. |
- |
- Args: |
- resources_content: The input string to process, contains lines of the form |
- "#define NAME INDEX". |
- |
- Returns: |
- .cc file content defining the kResourceHashes and kResourceIndices arrays. |
- """ |
- hashed_tuples = _GetResourceListFromString(resources_content) |
- |
- collisions = _CheckForHashCollisions(hashed_tuples) |
- if collisions: |
- error_message = "\n".join( |
- ["hash: %i, name: %s" % (i[0], i[1]) for i in sorted(collisions)]) |
- error_message = ("\nThe following names had hash collisions " |
- "(sorted by the hash value):\n%s\n" %(error_message)) |
- raise HashCollisionError(error_message) |
- |
- hashes_array = _GenDataArray( |
- hashed_tuples, " %iU, // %s", 'kResourceHashes', 'uint32_t', |
- operator.attrgetter('hash')) |
- indices_array = _GenDataArray( |
- hashed_tuples, " %s, // %s", 'kResourceIndices', 'int', |
- operator.attrgetter('index')) |
- |
- return ( |
- "// This file was generated by generate_resources_map.py. Do not edit.\n" |
- "\n\n" |
- "#include " |
- "\"chrome/browser/metrics/variations/generated_resources_map.h\"\n\n" |
- "namespace chrome_variations {\n\n" |
- "const size_t kNumResources = %i;\n\n" |
- "%s" |
- "\n" |
- "%s" |
- "\n" |
- "} // namespace chrome_variations\n") % ( |
- len(hashed_tuples), hashes_array, indices_array) |
- |
- |
-def main(resources_file, map_file): |
- generated_resources_h = "" |
- with open(resources_file, "r") as resources: |
- generated_resources_h = resources.read() |
- |
- if len(generated_resources_h) == 0: |
- raise Error("No content loaded for %s." % (resources_file)) |
- |
- file_content = _GenerateFileContent(generated_resources_h) |
- |
- with open(map_file, "w") as generated_file: |
- generated_file.write(file_content) |
- |
- |
-if __name__ == '__main__': |
- sys.exit(main(sys.argv[1], sys.argv[2])) |