diff options
Diffstat (limited to 'chromium/tools/resources/find_unused_resources.py')
-rwxr-xr-x | chromium/tools/resources/find_unused_resources.py | 194 |
1 files changed, 0 insertions, 194 deletions
diff --git a/chromium/tools/resources/find_unused_resources.py b/chromium/tools/resources/find_unused_resources.py deleted file mode 100755 index dfd1bba4b06..00000000000 --- a/chromium/tools/resources/find_unused_resources.py +++ /dev/null @@ -1,194 +0,0 @@ -#!/usr/bin/env python -# Copyright 2013 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. - -"""This script searches for unused art assets listed in a .grd file. - -It uses git grep to look for references to the IDR resource id or the base -filename. If neither is found, the file is reported unused. - -Requires a git checkout. Must be run from your checkout's "src" root. - -Example: - cd /work/chrome/src - tools/resources/find_unused_resouces.py ash/resources/ash_resources.grd -""" - -__author__ = 'jamescook@chromium.org (James Cook)' - - -import os -import re -import subprocess -import sys - - -def GetBaseResourceId(resource_id): - """Removes common suffixes from a resource ID. - - Removes suffixies that may be added by macros like IMAGE_GRID or IMAGE_BORDER. - For example, converts IDR_FOO_LEFT and IDR_FOO_RIGHT to just IDR_FOO. - - Args: - resource_id: String resource ID. - - Returns: - A string with the base part of the resource ID. - """ - suffixes = [ - '_TOP_LEFT', '_TOP', '_TOP_RIGHT', - '_LEFT', '_CENTER', '_RIGHT', - '_BOTTOM_LEFT', '_BOTTOM', '_BOTTOM_RIGHT', - '_TL', '_T', '_TR', - '_L', '_M', '_R', - '_BL', '_B', '_BR'] - # Note: This does not check _HOVER, _PRESSED, _HOT, etc. as those are never - # used in macros. - for suffix in suffixes: - if resource_id.endswith(suffix): - resource_id = resource_id[:-len(suffix)] - return resource_id - - -def FindFilesWithContents(string_a, string_b): - """Returns list of paths of files that contain |string_a| or |string_b|. - - Uses --name-only to print the file paths. The default behavior of git grep - is to OR together multiple patterns. - - Args: - string_a: A string to search for (not a regular expression). - string_b: As above. - - Returns: - A list of file paths as strings. - """ - matching_files = subprocess.check_output([ - 'git', 'grep', '--name-only', '--fixed-strings', '-e', string_a, - '-e', string_b]) - files_list = matching_files.split('\n') - # The output ends in a newline, so slice that off. - files_list = files_list[:-1] - return files_list - - -def GetUnusedResources(grd_filepath): - """Returns a list of resources that are unused in the code. - - Prints status lines to the console because this function is quite slow. - - Args: - grd_filepath: Path to a .grd file listing resources. - - Returns: - A list of pairs of [resource_id, filepath] for the unused resources. - """ - unused_resources = [] - grd_file = open(grd_filepath, 'r') - grd_data = grd_file.read() - print 'Checking:' - # Match the resource id and file path out of substrings like: - # ...name="IDR_FOO_123" file="common/foo.png"... - # by matching between the quotation marks. - pattern = re.compile( - r"""name="([^"]*)" # Match resource ID between quotes. - \s* # Run of whitespace, including newlines. - file="([^"]*)" # Match file path between quotes.""", - re.VERBOSE) - # Use finditer over the file contents because there may be newlines between - # the name and file attributes. - for result in pattern.finditer(grd_data): - # Extract the IDR resource id and file path. - resource_id = result.group(1) - filepath = result.group(2) - filename = os.path.basename(filepath) - # Print progress as we go along. - print resource_id - # Ensure the resource isn't used anywhere by checking both for the resource - # id (which should appear in C++ code) and the raw filename (in case the - # file is referenced in a script, test HTML file, etc.). - base_resource_id = GetBaseResourceId(resource_id) - matching_files = FindFilesWithContents(base_resource_id, filename) - # Each file is matched once in the resource file itself. If there are no - # other matching files, it is unused. - if len(matching_files) == 1: - # Give the user some happy news. - print 'Unused!' - unused_resources.append([resource_id, filepath]) - - return unused_resources - - -def GetScaleDirectories(resources_path): - """Returns a list of paths to per-scale-factor resource directories. - - Assumes the directory names end in '_percent', for example, - ash/resources/default_200_percent or - chrome/app/theme/resources/touch_140_percent - - Args: - resources_path: The base path of interest. - - Returns: - A list of paths relative to the 'src' directory. - """ - file_list = os.listdir(resources_path) - scale_directories = [] - for file_entry in file_list: - file_path = os.path.join(resources_path, file_entry) - if os.path.isdir(file_path) and file_path.endswith('_percent'): - scale_directories.append(file_path) - - scale_directories.sort() - return scale_directories - - -def main(): - # The script requires exactly one parameter, the .grd file path. - if len(sys.argv) != 2: - print 'Usage: tools/resources/find_unused_resources.py <path/to/grd>' - sys.exit(1) - grd_filepath = sys.argv[1] - - # Try to ensure we are in a source checkout. - current_dir = os.getcwd() - if os.path.basename(current_dir) != 'src': - print 'Script must be run in your "src" directory.' - sys.exit(1) - - # We require a git checkout to use git grep. - if not os.path.exists(current_dir + '/.git'): - print 'You must use a git checkout for this script to run.' - print current_dir + '/.git', 'not found.' - sys.exit(1) - - # Look up the scale-factor directories. - resources_path = os.path.dirname(grd_filepath) - scale_directories = GetScaleDirectories(resources_path) - if not scale_directories: - print 'No scale directories (like "default_100_percent") found.' - sys.exit(1) - - # |unused_resources| stores pairs of [resource_id, filepath] for resource ids - # that are not referenced in the code. - unused_resources = GetUnusedResources(grd_filepath) - if not unused_resources: - print 'All resources are used.' - sys.exit(0) - - # Dump our output for the user. - print - print 'Unused resource ids:' - for resource_id, filepath in unused_resources: - print resource_id - # Print a list of 'git rm' command lines to remove unused assets. - print - print 'Unused files:' - for resource_id, filepath in unused_resources: - for directory in scale_directories: - print 'git rm ' + os.path.join(directory, filepath) - - -if __name__ == '__main__': - main() |