config/check_source_count.py
author Wes Kocher <wkocher@mozilla.com>
Thu, 19 Sep 2013 17:56:18 -0700
changeset 162779 1f6d484652904ce39c0145050c9c2a69dffe4d3a
parent 134655 8f83edc05fa4d458d82668a95853c907544d0b8d
child 476322 fba6f974041a3d3c22ef95c44f6e4262e8e5c52f
permissions -rwxr-xr-x
Backed out 5 changesets (bug 907926, bug 911393, bug 917703) due to OSX reftest bustage during an unrelated CLOSED TREE Backed out changeset 94a6733b01dc (bug 907926) Backed out changeset 44108fb6f7cc (bug 917703) Backed out changeset f2dd2a27af69 (bug 911393) Backed out changeset fdb0d1053128 (bug 907926) Backed out changeset b3616b786e8f (bug 907926)

#!/usr/bin/env python
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.


# Usage: check_source_count.py SEARCH_TERM COUNT ERROR_LOCATION REPLACEMENT [FILES...]
#   Checks that FILES contains exactly COUNT matches of SEARCH_TERM. If it does
#   not, an error message is printed, quoting ERROR_LOCATION, which should
#   probably be the filename and line number of the erroneous call to
#   check_source_count.py.
from __future__ import print_function
import sys
import os
import re

search_string = sys.argv[1]
expected_count = int(sys.argv[2])
error_location = sys.argv[3]
replacement = sys.argv[4]
files = sys.argv[5:]

details = {}

count = 0
for f in files:
    text = file(f).read()
    match = re.findall(search_string, text)
    if match:
        num = len(match)
        count += num
        details[f] = num

if count == expected_count:
    print("TEST-PASS | check_source_count.py {0} | {1}"
          .format(search_string, expected_count))

else:
    print("TEST-UNEXPECTED-FAIL | check_source_count.py {0} | "
          .format(search_string),
          end='')
    if count < expected_count:
        print("There are fewer occurrences of /{0}/ than expected. "
              "This may mean that you have removed some, but forgotten to "
              "account for it {1}.".format(search_string, error_location))
    else:
        print("There are more occurrences of /{0}/ than expected. We're trying "
              "to prevent an increase in the number of {1}'s, using {2} if "
              "possible. If it is unavoidable, you should update the expected "
              "count {3}.".format(search_string, search_string, replacement, 
                                 error_location))

    print("Expected: {0}; found: {1}".format(expected_count, count))
    for k in sorted(details):
        print("Found {0} occurences in {1}".format(details[k],k))
    sys.exit(-1)