181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#!/usr/bin/env python 281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# Copyright (c) 2011 Google Inc. All rights reserved. 381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# 481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# Redistribution and use in source and binary forms, with or without 581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# modification, are permitted provided that the following conditions are 681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# met: 781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# 881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# * Redistributions of source code must retain the above copyright 981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# notice, this list of conditions and the following disclaimer. 1081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# * Redistributions in binary form must reproduce the above 1181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# copyright notice, this list of conditions and the following disclaimer 1281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# in the documentation and/or other materials provided with the 1381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# distribution. 1481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# * Neither the name of Google Inc. nor the names of its 1581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# contributors may be used to endorse or promote products derived from 1681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# this software without specific prior written permission. 1781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# 1881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 3081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch"""Finds .png expectations without .checksums or .checksum expectations 3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochwithout .pngs.""" 3281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 3381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochimport optparse 3481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochimport os 3581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 3681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochfrom webkitpy.common.checkout import scm 3781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochdef parse_args(): 3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch """Returns a 2-tuple (options, paths) where options contains the 4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch parsed arguments and paths is a list of directories to search.""" 4181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch option_list = [ 4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch optparse.make_option("-p", "--missing-pngs", dest="missing_pngs", 4381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch action="store_true", default=False, help="Only list missing pngs."), 4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch optparse.make_option("-c", "--missing-checksums", 4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch dest="missing_checksums", action="store_true", default=False, 4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch help="Only list missing checksums."), 4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ] 4881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch option_parser = optparse.OptionParser(option_list=option_list, 5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch description=__doc__) 5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch options, paths = option_parser.parse_args() 5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if not options.missing_pngs and not options.missing_checksums: 5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch option_parser.error( 5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch "Please specify either --missing-pngs or --missing-checksums.") 5581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if not paths: 5781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch paths = [os.path.join(scm.find_checkout_root(), 'LayoutTests')] 5881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return options, paths 5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochdef find_mismatched_results(dirpath, filenames, options): 6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch """Prints mismatched results to stdout. 6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch dirpath is the directory we are searching 6381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch filenames is a list of the filenames in dirpath. 6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch options is the parsed arguments.""" 6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch checksum_files = set() 6681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch png_files = set() 6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for filename in filenames: 6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch name, extension = os.path.splitext(filename) 7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if not name.endswith("-expected"): 7181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch continue 7281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if extension == ".checksum": 7381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch checksum_files.add(name) 7481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch elif extension == ".png": 7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch png_files.add(name) 7681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 7781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if options.missing_pngs: 7881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch missing_pngs = checksum_files.difference(png_files) 7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for missing_png in missing_pngs: 8081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch print os.path.normpath(os.path.join(dirpath, missing_png) 8181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ) + '.checksum' 8281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 8381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if options.missing_checksums: 8481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch missing_checksums = png_files.difference(checksum_files) 8581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for missing_checksum in missing_checksums: 8681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch print os.path.normpath(os.path.join(dirpath, missing_checksum) 8781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ) + '.png' 8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 8981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochdef main(): 9081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch options, paths = parse_args() 9181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for path in paths: 9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for dirpath, dirnames, filenames in os.walk(path): 9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch find_mismatched_results(dirpath, filenames, options) 9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochif __name__ == "__main__": 9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch main() 97