1# Copyright 2014 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Blink frame presubmit script
6
7See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
8for more details about the presubmit API built into gcl.
9"""
10
11
12def _RunUseCounterChecks(input_api, output_api):
13    for f in input_api.AffectedFiles():
14        if f.LocalPath().endswith('UseCounter.cpp'):
15            useCounterCpp = f
16            break
17    else:
18        return []
19
20    largestFoundBucket = 0
21    maximumBucket = 0
22    # Looking for a line like "case CSSPropertyGrid: return 453;"
23    bucketFinder = input_api.re.compile(r'.*CSSProperty.*return\s*([0-9]+).*')
24    # Looking for a line like "static int maximumCSSSampleId() { return 452; }"
25    maximumFinder = input_api.re.compile(
26        r'static int maximumCSSSampleId\(\) { return ([0-9]+)')
27    for line in useCounterCpp.NewContents():
28        bucketMatch = bucketFinder.match(line)
29        if bucketMatch:
30            bucket = int(bucketMatch.group(1))
31            largestFoundBucket = max(largestFoundBucket, bucket)
32        else:
33            maximumMatch = maximumFinder.match(line)
34            if maximumMatch:
35                maximumBucket = int(maximumMatch.group(1))
36
37    if largestFoundBucket != maximumBucket:
38        if input_api.is_committing:
39            message_type = output_api.PresubmitError
40        else:
41            message_type = output_api.PresubmitPromptWarning
42
43        return [message_type(
44            'Largest found CSSProperty bucket Id (%d) does not match '
45            'maximumCSSSampleId (%d)' %
46                    (largestFoundBucket, maximumBucket),
47            items=[useCounterCpp.LocalPath()])]
48
49    return []
50
51
52def CheckChangeOnUpload(input_api, output_api):
53    return _RunUseCounterChecks(input_api, output_api)
54
55
56def CheckChangeOnCommit(input_api, output_api):
57    return _RunUseCounterChecks(input_api, output_api)
58