File: presubmit_support.py

package info (click to toggle)
chromium 120.0.6099.224-1~deb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 6,112,112 kB
  • sloc: cpp: 32,907,025; ansic: 8,148,123; javascript: 3,679,536; python: 2,031,248; asm: 959,718; java: 804,675; xml: 617,256; sh: 111,417; objc: 100,835; perl: 88,443; cs: 53,032; makefile: 29,579; fortran: 24,137; php: 21,162; tcl: 21,147; sql: 20,809; ruby: 17,735; pascal: 12,864; yacc: 8,045; lisp: 3,388; lex: 1,323; ada: 727; awk: 329; jsp: 267; csh: 117; exp: 43; sed: 37
file content (83 lines) | stat: -rw-r--r-- 2,899 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# Copyright 2020 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import os
import subprocess
import sys
from style_variable_generator.css_generator import CSSStyleGenerator
import re

JSON5_EXCLUDES = [
    # We can't check both the legacy typography set AND the new typography
    # set since they both declare the same variables causing a duplicate key
    # error to be thrown from the syle variable generator. As such we drop
    # presubmit checking for the legacy set to focus on catching issues with the
    # new token set.
    "ui/chromeos/styles/cros_typography.json5"
]


def BuildGrepQuery(deleted_names):
    # Query is built as \--var-1|--var-2|... The first backslash is necessary to
    # prevent --var-1 from being read as an argument. The pipes make a big OR
    # query.
    return '\\' + '|'.join(deleted_names)


def RunGit(command):
    """Run a git subcommand, returning its output."""
    command = ['git'] + command
    proc = subprocess.Popen(command, stdout=subprocess.PIPE)
    out = proc.communicate()[0].strip()
    return out


def FindDeletedCSSVariables(input_api, output_api, input_file_filter):
    def IsInputFile(file):
        file_path = file.LocalPath()
        if file_path in JSON5_EXCLUDES:
            return False
        # Normalise windows file paths to unix format.
        file_path = "/".join(os.path.split(file_path))
        return any([
            re.search(pattern, file_path) != None
            for pattern in input_file_filter
        ])

    files = input_api.AffectedFiles(file_filter=IsInputFile)

    def get_css_var_names_for_contents(contents_function):
        style_generator = CSSStyleGenerator()
        for f in files:
            file_contents = contents_function(f)
            if len(file_contents) == 0:
                continue
            style_generator.AddJSONToModel('\n'.join(file_contents),
                                           in_file=f.LocalPath())
        return set(style_generator.GetCSSVarNames().keys())

    old_names = get_css_var_names_for_contents(lambda f: f.OldContents())
    new_names = get_css_var_names_for_contents(lambda f: f.NewContents())

    deleted_names = old_names.difference(new_names)
    if not deleted_names:
        return []

    # Use --full-name and -n for formatting, -E for extended regexp, and :/
    # as pathspec for grepping across entire repository (assumes git > 1.9.1)
    problems = RunGit([
        'grep', '--full-name', '-En',
        BuildGrepQuery(deleted_names), '--', ':/'
    ]).splitlines()

    if not problems:
        return []

    return [
        output_api.PresubmitPromptWarning(
            'style_variable_generator variables were deleted but usages of ' +
            'generated CSS variables were found in the codebase:',
            items=problems)
    ]