Merge "Add support for detecting SPDX license headers"
This commit is contained in:
commit
f35a26f44b
@ -373,6 +373,11 @@ OpenStack Licensing
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
Alternately also check for the
|
||||||
|
`SPDX license header <https://spdx.org/licenses/Apache-2.0.html>`__ for Apache 2.0::
|
||||||
|
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
- [H104] Files with no code shouldn't contain any license header nor comments,
|
- [H104] Files with no code shouldn't contain any license header nor comments,
|
||||||
and must be left completely empty.
|
and must be left completely empty.
|
||||||
|
|
||||||
|
@ -65,6 +65,8 @@ def hacking_has_license(physical_line, filename, lines, line_number):
|
|||||||
# header
|
# header
|
||||||
if 0 <= line.find('Licensed under the Apache License') < 10:
|
if 0 <= line.find('Licensed under the Apache License') < 10:
|
||||||
license_found = True
|
license_found = True
|
||||||
|
if 0 <= line.find('SPDX-License-Identifier:') < 10:
|
||||||
|
license_found = True
|
||||||
if not license_found:
|
if not license_found:
|
||||||
return (0, "H102: Apache 2.0 license header not found")
|
return (0, "H102: Apache 2.0 license header not found")
|
||||||
|
|
||||||
@ -86,8 +88,9 @@ def hacking_has_correct_license(physical_line, filename, lines, line_number):
|
|||||||
column = line.find('Licensed under the Apache License')
|
column = line.find('Licensed under the Apache License')
|
||||||
if (0 < column < 10 and not
|
if (0 < column < 10 and not
|
||||||
_check_for_exact_apache(idx, lines)):
|
_check_for_exact_apache(idx, lines)):
|
||||||
return (column, "H103: Header does not match Apache 2.0 "
|
if (line.find('SPDX-License-Identifier: Apache-2.0') <= 0):
|
||||||
"License notice")
|
return (column, "H103: Header does not match Apache 2.0 "
|
||||||
|
"License notice")
|
||||||
|
|
||||||
|
|
||||||
EMPTY_LINE_RE = re.compile("^\s*(#.*|$)")
|
EMPTY_LINE_RE = re.compile("^\s*(#.*|$)")
|
||||||
|
@ -18,6 +18,145 @@ from hacking import tests
|
|||||||
|
|
||||||
|
|
||||||
class CoreTestCase(tests.TestCase):
|
class CoreTestCase(tests.TestCase):
|
||||||
|
def test_H102_none(self):
|
||||||
|
"""Verify that the H102 check finds an SPDX header"""
|
||||||
|
self.assertEqual(
|
||||||
|
(0, 'H102: Apache 2.0 license header not found'),
|
||||||
|
comments.hacking_has_license(
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
[
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
],
|
||||||
|
1,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_H102_full(self):
|
||||||
|
"""Verify that the H102 check finds an SPDX header"""
|
||||||
|
self.assertIsNone(comments.hacking_has_license(
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
[
|
||||||
|
'# foo',
|
||||||
|
'# Licensed under the Apache License, Version 2.0',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
],
|
||||||
|
1,
|
||||||
|
))
|
||||||
|
|
||||||
|
def test_H102_SPDX(self):
|
||||||
|
"""Verify that the H102 check finds an SPDX header"""
|
||||||
|
self.assertIsNone(comments.hacking_has_license(
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
[
|
||||||
|
'# foo',
|
||||||
|
'# SPDX-License-Identifier: Apache-2.0',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
],
|
||||||
|
1,
|
||||||
|
))
|
||||||
|
|
||||||
|
def test_H103_full_fail(self):
|
||||||
|
"""Verify that the H103 check finds an SPDX header"""
|
||||||
|
self.assertEqual(
|
||||||
|
(2, 'H103: Header does not match Apache 2.0 License notice'),
|
||||||
|
comments.hacking_has_correct_license(
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
[
|
||||||
|
'# foo',
|
||||||
|
'# Licensed under the Apache License, Version 2.0',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
],
|
||||||
|
1,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_H103_full(self):
|
||||||
|
"""Verify that the H103 check finds an SPDX header"""
|
||||||
|
self.assertIsNone(comments.hacking_has_correct_license(
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
[
|
||||||
|
"""
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
""" # noqa
|
||||||
|
],
|
||||||
|
1,
|
||||||
|
))
|
||||||
|
|
||||||
|
def test_H103_SPDX(self):
|
||||||
|
"""Verify that the H103 check finds an SPDX header"""
|
||||||
|
self.assertIsNone(comments.hacking_has_correct_license(
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
[
|
||||||
|
'# foo',
|
||||||
|
'# SPDX-License-Identifier: Apache-2.0',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
'# foo',
|
||||||
|
'# bar',
|
||||||
|
],
|
||||||
|
1,
|
||||||
|
))
|
||||||
|
|
||||||
def test_H104_regex(self):
|
def test_H104_regex(self):
|
||||||
"""Verify that the H104 regex matches correct lines."""
|
"""Verify that the H104 regex matches correct lines."""
|
||||||
self.assertTrue(comments.hacking_has_only_comments(
|
self.assertTrue(comments.hacking_has_only_comments(
|
||||||
|
Loading…
Reference in New Issue
Block a user