-
Notifications
You must be signed in to change notification settings - Fork 56
/
pretty_format_java.py
148 lines (131 loc) · 5.48 KB
/
pretty_format_java.py
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# -*- coding: utf-8 -*-
import argparse
import sys
import typing
import requests
from packaging.version import Version
from language_formatters_pre_commit_hooks import _get_default_version
from language_formatters_pre_commit_hooks.pre_conditions import assert_max_jdk_version
from language_formatters_pre_commit_hooks.pre_conditions import java_required
from language_formatters_pre_commit_hooks.utils import does_checksum_match
from language_formatters_pre_commit_hooks.utils import download_url
from language_formatters_pre_commit_hooks.utils import run_command
def _download_google_java_formatter_jar(version: str) -> str: # pragma: no cover
def get_urls(_version: str) -> typing.List[str]:
# Links extracted from https://github.com/google/google-java-format/
return [
"https://github.com/google/google-java-format/releases/download/"
"v{version}/google-java-format-{version}-all-deps.jar".format(
version=_version,
),
# Versions older than 1.10 have a different template
"https://github.com/google/google-java-format/releases/download/"
"google-java-format-{version}/google-java-format-{version}-all-deps.jar".format(
version=_version,
),
]
possible_urls = get_urls(version)
try:
for url_to_download in possible_urls:
try:
return download_url(url_to_download, "google-java-formatter{version}.jar".format(version=version))
except requests.HTTPError as e:
if e.response is None or e.response.status_code != 404:
# If the url was not found then move forward with the next links
raise
raise RuntimeError("Failed to load any of the provided links")
except: # noqa: E722 (allow usage of bare 'except')
raise RuntimeError(
"Failed to download any of: {urls}. Probably the requested version, "
"{version}, is not valid or you have some network issue.".format(
urls=", ".join(possible_urls),
version=version,
),
)
@java_required
def pretty_format_java(argv: typing.Optional[typing.List[str]] = None) -> int:
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument(
"--google-java-formatter-version",
dest="google_java_formatter_version",
default=_get_default_version("google_java_formatter"),
help="Google Java Formatter version to use (default %(default)s)",
)
group.add_argument(
"--google-java-formatter-jar",
dest="google_java_formatter_jar",
default=None,
help="Path to Google Java Formatter jar file. Will be downloaded if not defined. Note that --google-java-formatter-version will be ignored if this parameter is defined (default: %(default)).",
)
parser.add_argument(
"--formatter-jar-checksum",
dest="checksum",
default=None,
help="The SHA256 checksum of the jar",
)
parser.add_argument(
"--autofix",
action="store_true",
dest="autofix",
help="Automatically fixes encountered not-pretty-formatted files",
)
parser.add_argument(
"--aosp",
action="store_true",
dest="aosp",
help="Formats Java code into AOSP format",
)
parser.add_argument("filenames", nargs="*", help="Filenames to fix")
args = parser.parse_args(argv)
# Google Java Formatter 1.10+ does support Java 16+, before that version
# the tool can only be executed on Java up to version 15.
# Context: https://github.com/google/google-java-format/releases/tag/v1.10.0
if Version(args.google_java_formatter_version) <= Version("1.9"):
assert_max_jdk_version(Version("16.0"), inclusive=False) # pragma: no cover
if args.google_java_formatter_jar is None:
google_java_formatter_jar = _download_google_java_formatter_jar(
args.google_java_formatter_version,
)
else:
google_java_formatter_jar = args.google_java_formatter_jar
if args.checksum and not does_checksum_match(google_java_formatter_jar, args.checksum):
return 1
cmd_args = [
"java",
# export JDK internal classes for Java 16+
"--add-exports",
"jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
"--add-exports",
"jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED",
"--add-exports",
"jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED",
"--add-exports",
"jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED",
"--add-exports",
"jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
"-jar",
google_java_formatter_jar,
"--set-exit-if-changed",
]
if args.aosp: # pragma: no cover
cmd_args.append("--aosp")
if args.autofix:
cmd_args.append("--replace")
else:
cmd_args.append("--dry-run")
status, output, _ = run_command(*(cmd_args + args.filenames))
if output:
print(
"{}: {}".format(
(
"The following files have been fixed by google-java-formatter"
if args.autofix
else "The following files are not properly formatted"
), # noqa
", ".join(output.splitlines()),
),
)
return 0 if status == 0 else 1
if __name__ == "__main__":
sys.exit(pretty_format_java())