File: style_format.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 (125 lines) | stat: -rw-r--r-- 3,729 bytes parent folder | download
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# Copyright 2019 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os.path
import subprocess
import sys

_enable_style_format = None
_clang_format_command_path = None
_gn_command_path = None


def init(root_src_dir, enable_style_format=True):
    assert isinstance(root_src_dir, str)
    assert isinstance(enable_style_format, bool)

    global _enable_style_format
    global _clang_format_command_path
    global _gn_command_path

    assert _enable_style_format is None
    assert _clang_format_command_path is None
    assert _gn_command_path is None

    _enable_style_format = enable_style_format

    root_src_dir = os.path.abspath(root_src_dir)

    # Determine //buildtools/<platform>/ directory
    if sys.platform.startswith("linux"):
        platform = "linux64"
        exe_suffix = ""
    elif sys.platform.startswith("darwin"):
        platform = "mac"
        exe_suffix = ""
    elif sys.platform.startswith(("cygwin", "win")):
        platform = "win"
        exe_suffix = ".exe"
    else:
        assert False, "Unknown platform: {}".format(sys.platform)
    buildtools_platform_dir = os.path.join(root_src_dir, "buildtools",
                                           platform)

    # //buildtools/<platform>/clang-format
    _clang_format_command_path = "clang-format-13"

    # //buildtools/<platform>/gn
    _gn_command_path = os.path.join(buildtools_platform_dir,
                                    "gn{}".format(exe_suffix))


def auto_format(contents, filename):
    assert isinstance(filename, str)

    _, ext = os.path.splitext(filename)
    if ext in (".gn", ".gni"):
        return gn_format(contents, filename)

    return clang_format(contents, filename)


def clang_format(contents, filename=None):
    command_line = [_clang_format_command_path]
    if filename is not None:
        command_line.append('-assume-filename={}'.format(filename))

    return _invoke_format_command(command_line, filename, contents)


def gn_format(contents, filename=None):
    command_line = [_gn_command_path, "format", "--stdin"]
    if filename is not None:
        command_line.append('-assume-filename={}'.format(filename))

    return _invoke_format_command(command_line, filename, contents)


def _invoke_format_command(command_line, filename, contents):
    if not _enable_style_format:
        return StyleFormatResult(stdout_output=contents,
                                 stderr_output="",
                                 exit_code=0,
                                 filename=filename)

    kwargs = {}
    if sys.version_info.major != 2:
        kwargs['encoding'] = 'utf-8'
    proc = subprocess.Popen(command_line,
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            **kwargs)
    stdout_output, stderr_output = proc.communicate(input=contents)
    exit_code = proc.wait()

    return StyleFormatResult(
        stdout_output=stdout_output,
        stderr_output=stderr_output,
        exit_code=exit_code,
        filename=filename)


class StyleFormatResult(object):
    def __init__(self, stdout_output, stderr_output, exit_code, filename):
        self._stdout_output = stdout_output
        self._stderr_output = stderr_output
        self._exit_code = exit_code
        self._filename = filename

    @property
    def did_succeed(self):
        return self._exit_code == 0

    @property
    def contents(self):
        assert self.did_succeed
        return self._stdout_output

    @property
    def error_message(self):
        return self._stderr_output

    @property
    def filename(self):
        return self._filename