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