mirror of
https://github.com/servo/servo.git
synced 2025-07-22 23:03:42 +01:00
Improve tidy's license validation logic
fixes https://github.com/servo/servo/issues/10716 I took the lazy way out and hardcoded the size of block we examine for licenses. fixes https://github.com/servo/servo/issues/10719 Includes tests for new functionality.
This commit is contained in:
parent
1f4dd8765f
commit
48ace17b54
7 changed files with 73 additions and 102 deletions
|
@ -7,97 +7,29 @@
|
|||
# option. This file may not be copied, modified, or distributed
|
||||
# except according to those terms.
|
||||
|
||||
# when wrapped to 80 chars, the longest license is 10 lines.
|
||||
# TODO actually grab whatever commented block is before the second blank line
|
||||
# of the file instead of hard-coding this.
|
||||
MAX_LICENSE_LINESPAN = 12
|
||||
|
||||
# These licenses are valid for use in Servo
|
||||
licenses = [
|
||||
MPL = """\
|
||||
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/.\
|
||||
"""
|
||||
|
||||
"""\
|
||||
/* 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/. */
|
||||
""",
|
||||
APACHE = """\
|
||||
Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or \
|
||||
http://www.apache.org/licenses/LICENSE-2.0> or the MIT license \
|
||||
<LICENSE-MIT or http://opensource.org/licenses/MIT>, at your \
|
||||
option. This file may not be copied, modified, or distributed \
|
||||
except according to those terms.\
|
||||
"""
|
||||
|
||||
"""\
|
||||
# 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/.
|
||||
""",
|
||||
|
||||
"""\
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# 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/.
|
||||
""",
|
||||
|
||||
"""\
|
||||
#!/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/.
|
||||
""",
|
||||
|
||||
"""\
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# 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/.
|
||||
""",
|
||||
|
||||
"""\
|
||||
// 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/.
|
||||
""",
|
||||
|
||||
"""\
|
||||
// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
""",
|
||||
|
||||
"""\
|
||||
# Copyright 2013 The Servo Project Developers. See the COPYRIGHT
|
||||
# file at the top-level directory of this distribution.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
# option. This file may not be copied, modified, or distributed
|
||||
# except according to those terms.
|
||||
""",
|
||||
|
||||
"""\
|
||||
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
""",
|
||||
|
||||
"""\
|
||||
// Copyright 2012-2014 The Rust Project Developers.
|
||||
// See http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
""",
|
||||
] # noqa: Indicate to flake8 that we do not want to check indentation here
|
||||
COPYRIGHT = [
|
||||
"See the COPYRIGHT file at the top-level directory of this distribution",
|
||||
"See http://rust-lang.org/COPYRIGHT",
|
||||
]
|
||||
|
||||
# The valid licenses, in the form we'd expect to see them in a Cargo.toml file.
|
||||
licenses_toml = [
|
||||
|
|
|
@ -17,12 +17,9 @@ import site
|
|||
import StringIO
|
||||
import subprocess
|
||||
import sys
|
||||
from licenseck import licenses, licenses_toml, licenses_dep_toml
|
||||
from licenseck import MPL, APACHE, COPYRIGHT, licenses_toml, licenses_dep_toml
|
||||
|
||||
# License and header checks
|
||||
EMACS_HEADER = "/* -*- Mode:"
|
||||
VIM_HEADER = "/* vim:"
|
||||
MAX_LICENSE_LINESPAN = max(len(license.splitlines()) for license in licenses)
|
||||
COMMENTS = ["// ", "# ", " *", "/* "]
|
||||
|
||||
# File patterns to include in the non-WPT tidy check.
|
||||
FILE_PATTERNS_TO_CHECK = ["*.rs", "*.rc", "*.cpp", "*.c",
|
||||
|
@ -55,7 +52,6 @@ IGNORED_FILES = [
|
|||
IGNORED_DIRS = [
|
||||
# Upstream
|
||||
os.path.join(".", "support", "android", "apk"),
|
||||
os.path.join(".", "support", "rust-task_info"),
|
||||
os.path.join(".", "tests", "wpt", "css-tests"),
|
||||
os.path.join(".", "tests", "wpt", "harness"),
|
||||
os.path.join(".", "tests", "wpt", "update"),
|
||||
|
@ -147,13 +143,35 @@ def filter_files(start_dir, only_changed_files, progress):
|
|||
yield file_name
|
||||
|
||||
|
||||
def uncomment(line):
|
||||
for c in COMMENTS:
|
||||
if line.startswith(c):
|
||||
if line.endswith("*/"):
|
||||
return line[len(c):(len(line) - 3)].strip()
|
||||
return line[len(c):].strip()
|
||||
|
||||
|
||||
def licensed_mpl(header):
|
||||
return MPL in header
|
||||
|
||||
|
||||
def licensed_apache(header):
|
||||
if APACHE in header:
|
||||
return any(c in header for c in COPYRIGHT)
|
||||
|
||||
|
||||
def check_license(file_name, lines):
|
||||
if any(file_name.endswith(ext) for ext in (".toml", ".lock", ".json")):
|
||||
raise StopIteration
|
||||
while lines and (lines[0].startswith(EMACS_HEADER) or lines[0].startswith(VIM_HEADER)):
|
||||
lines = lines[1:]
|
||||
contents = "".join(lines[:MAX_LICENSE_LINESPAN])
|
||||
valid_license = any(contents.startswith(license) for license in licenses)
|
||||
block = min(len(lines), licenseck.MAX_LICENSE_LINESPAN)
|
||||
license_block = []
|
||||
for l in lines[:block]:
|
||||
l = l.rstrip('\n')
|
||||
line = uncomment(l)
|
||||
if line is not None:
|
||||
license_block += [line]
|
||||
contents = " ".join(license_block)
|
||||
valid_license = licensed_mpl(contents) or licensed_apache(contents)
|
||||
acknowledged_bad_license = "xfail-license" in contents
|
||||
if not (valid_license or acknowledged_bad_license):
|
||||
yield (1, "incorrect license")
|
||||
|
@ -305,8 +323,8 @@ def check_toml(file_name, lines):
|
|||
for idx, line in enumerate(lines):
|
||||
if line.find("*") != -1:
|
||||
yield (idx + 1, "found asterisk instead of minimum version number")
|
||||
for license in licenses_toml:
|
||||
ok_licensed |= (license in line)
|
||||
for license_line in licenses_toml:
|
||||
ok_licensed |= (license_line in line)
|
||||
if not ok_licensed:
|
||||
yield (0, ".toml file should contain a valid license.")
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue