Skip to content

Commit

Permalink
Add remaining copyright statements, add licenses sanity test (#5098)
Browse files Browse the repository at this point in the history
* Add sanity test (currently fails).

* doc_fragments can also be non-GPLv3+.

* Replace 'Author:' by 'Copyright:' in some specific cases.

* Avoid matching string for license checkers.

* Reformulate not to throw license detection off.

* Add PSF copyright notice for plugins/module_utils/_mount.py.

* Add generic copyright notices.

* Update changelog fragment.
  • Loading branch information
felixfontein committed Aug 8, 2022
1 parent 424d706 commit aab22e7
Show file tree
Hide file tree
Showing 14 changed files with 137 additions and 15 deletions.
2 changes: 1 addition & 1 deletion changelogs/fragments/licenses.yml
@@ -1,3 +1,3 @@
minor_changes:
- "All software licenses are now in the ``LICENSES/`` directory of the collection root (https://github.com/ansible-collections/community.general/pull/5065, https://github.com/ansible-collections/community.general/pull/5079, https://github.com/ansible-collections/community.general/pull/5080, https://github.com/ansible-collections/community.general/pull/5083, https://github.com/ansible-collections/community.general/pull/5087, https://github.com/ansible-collections/community.general/pull/5095)."
- "All software licenses are now in the ``LICENSES/`` directory of the collection root (https://github.com/ansible-collections/community.general/pull/5065, https://github.com/ansible-collections/community.general/pull/5079, https://github.com/ansible-collections/community.general/pull/5080, https://github.com/ansible-collections/community.general/pull/5083, https://github.com/ansible-collections/community.general/pull/5087, https://github.com/ansible-collections/community.general/pull/5095, https://github.com/ansible-collections/community.general/pull/5098)."
- "Added MIT license as ``LICENSES/MIT.txt`` for tests/unit/plugins/modules/packaging/language/test_gem.py (https://github.com/ansible-collections/community.general/pull/5065)."
2 changes: 2 additions & 0 deletions plugins/module_utils/_mount.py
Expand Up @@ -2,6 +2,8 @@
# This code is part of Ansible, but is an independent component.
# This particular file snippet, and this file snippet only, is based on
# Lib/posixpath.py of cpython
#
# Copyright (c) 2001-2022 Python Software Foundation. All rights reserved.
# It is licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
# (See LICENSES/PSF-2.0.txt in this collection)
# SPDX-License-Identifier: PSF-2.0
Expand Down
1 change: 1 addition & 0 deletions plugins/modules/monitoring/datadog/datadog_event.py
Expand Up @@ -6,6 +6,7 @@
#
# This module is proudly sponsored by iGeolise (www.igeolise.com) and
# Tiny Lab Productions (www.tinylabproductions.com).
# Copyright (c) Ansible project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later

Expand Down
1 change: 1 addition & 0 deletions plugins/modules/monitoring/icinga2_host.py
Expand Up @@ -3,6 +3,7 @@

# This module is proudly sponsored by CGI (www.cgi.com) and
# KPN (www.kpn.com).
# Copyright (c) Ansible project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later

Expand Down
1 change: 1 addition & 0 deletions plugins/modules/net_tools/snmp_facts.py
Expand Up @@ -2,6 +2,7 @@
# -*- coding: utf-8 -*-

# This file is part of Networklore's snmp library for Ansible
# Copyright (c) Ansible project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later

Expand Down
4 changes: 2 additions & 2 deletions tests/integration/targets/jboss/tasks/jboss.yml
Expand Up @@ -4,8 +4,8 @@
# Integration tests for jboss module.
# SPDX-License-Identifier: GPL-3.0-or-later

# helloworld.war (got from https://github.com/aeimer/java-example-helloworld-war/) license:
# MIT License
# helloworld.war (got from https://github.com/aeimer/java-example-helloworld-war/) is licensed
# under the MIT license:
#
# Copyright (c) 2017 Alex Eimer
#
Expand Down
6 changes: 3 additions & 3 deletions tests/integration/targets/kernel_blacklist/tasks/main.yml
Expand Up @@ -49,7 +49,7 @@
expected_content: |
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-{{ '' }}License-Identifier: GPL-3.0-or-later
blacklist aaaa
blacklist bbbb
Expand All @@ -76,7 +76,7 @@
content: |
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-{{ '' }}License-Identifier: GPL-3.0-or-later
blacklist aaaa
blacklist bbbb
Expand Down Expand Up @@ -104,7 +104,7 @@
content: |
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-{{ '' }}License-Identifier: GPL-3.0-or-later
blacklist aaaa
blacklist cccc
Expand Down
4 changes: 4 additions & 0 deletions tests/sanity/extra/licenses.json
@@ -0,0 +1,4 @@
{
"include_symlinks": false,
"output": "path-message"
}
113 changes: 113 additions & 0 deletions tests/sanity/extra/licenses.py
@@ -0,0 +1,113 @@
#!/usr/bin/env python
# Copyright (c) 2022, Felix Fontein <felix@fontein.de>
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
"""Prevent files without a correct license identifier from being added to the source tree."""
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type

import os
import glob
import sys


def format_license_list(licenses):
if not licenses:
return '(empty)'
return ', '.join(['"%s"' % license for license in licenses])


def find_licenses(filename, relax=False):
spdx_license_identifiers = []
other_license_identifiers = []
has_copyright = False
try:
with open(filename, 'r', encoding='utf-8') as f:
for line in f:
line = line.rstrip()
if 'Copyright ' in line:
has_copyright = True
if 'Copyright: ' in line:
print('%s: found copyright line with "Copyright:". Please remove the colon.' % (filename, ))
if 'SPDX-FileCopyrightText: ' in line:
has_copyright = True
idx = line.find('SPDX-License-Identifier: ')
if idx >= 0:
spdx_license_identifiers.append(line[idx + len('SPDX-License-Identifier: '):])
if 'GNU General Public License' in line:
if 'v3.0+' in line:
other_license_identifiers.append('GPL-3.0-or-later')
if 'version 3 or later' in line:
other_license_identifiers.append('GPL-3.0-or-later')
if 'Simplified BSD License' in line:
other_license_identifiers.append('BSD-2-Clause')
if 'Apache License 2.0' in line:
other_license_identifiers.append('Apache-2.0')
if 'PSF License' in line or 'Python-2.0' in line:
other_license_identifiers.append('PSF-2.0')
if 'MIT License' in line:
other_license_identifiers.append('MIT')
except Exception as exc:
print('%s: error while processing file: %s' % (filename, exc))
if len(set(spdx_license_identifiers)) < len(spdx_license_identifiers):
print('%s: found identical SPDX-License-Identifier values' % (filename, ))
if other_license_identifiers and set(other_license_identifiers) != set(spdx_license_identifiers):
print('%s: SPDX-License-Identifier yielded the license list %s, while manual guessing yielded the license list %s' % (
filename, format_license_list(spdx_license_identifiers), format_license_list(other_license_identifiers)))
if not has_copyright and not relax:
print('%s: found no copyright notice' % (filename, ))
return sorted(spdx_license_identifiers)


def main():
"""Main entry point."""
paths = sys.argv[1:] or sys.stdin.read().splitlines()

# The following paths are allowed to have no license identifier
no_comments_allowed = [
'changelogs/fragments/*.yml',
'changelogs/fragments/*.yaml',
'tests/sanity/extra/*.json',
'tests/sanity/ignore-2.*.txt',
'COPYING',
]

# These files are completely ignored
ignore_paths = [
'CHANGELOG.rst',
'changelogs/changelog.yaml',
'tests/sanity/extra/licenses.py', # The strings in find_licenses() confuse this code :-)
'.ansible-test-timeout.json',
'LICENSES/*.txt',
]

no_comments_allowed = [fn for pattern in no_comments_allowed for fn in glob.glob(pattern)]
ignore_paths = [fn for pattern in ignore_paths for fn in glob.glob(pattern)]

valid_licenses = [license_file[len('LICENSES/'):-len('.txt')] for license_file in glob.glob('LICENSES/*.txt')]

for path in paths:
if path.startswith('./'):
path = path[2:]
if path in ignore_paths or path.startswith('tests/output/'):
continue
if os.stat(path).st_size == 0:
continue
if not path.endswith('.license') and os.path.exists(path + '.license'):
path = path + '.license'
valid_licenses_for_path = valid_licenses
if path.startswith('plugins/') and not path.startswith(('plugins/modules/', 'plugins/module_utils/', 'plugins/doc_fragments/')):
valid_licenses_for_path = [license for license in valid_licenses if license == 'GPL-3.0-or-later']
licenses = find_licenses(path, relax=path in no_comments_allowed)
if not licenses:
if path not in no_comments_allowed:
print('%s: must have at least one license' % (path, ))
else:
for license in licenses:
if license not in valid_licenses_for_path:
print('%s: found not allowed license "%s", must be one of %s' % (
path, license, format_license_list(valid_licenses_for_path)))


if __name__ == '__main__':
main()
6 changes: 3 additions & 3 deletions tests/unit/plugins/modules/packaging/language/test_cpanm.py
@@ -1,6 +1,6 @@
# Author: Alexei Znamensky (russoz@gmail.com)
# Largely adapted from test_redhat_subscription by
# Jiri Hnidek (jhnidek@redhat.com)
# Copyright (c) Alexei Znamensky (russoz@gmail.com)
# Largely adapted from test_redhat_subscription:
# Copyright (c) Jiri Hnidek (jhnidek@redhat.com)
#
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
Expand Down
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Author: Jiri Hnidek (jhnidek@redhat.com)
# Copyright (c) Jiri Hnidek (jhnidek@redhat.com)
#
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/system/test_gconftool2_info.py
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Author: Alexei Znamensky (russoz@gmail.com)
# Copyright (c) Alexei Znamensky (russoz@gmail.com)
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later

Expand Down
6 changes: 3 additions & 3 deletions tests/unit/plugins/modules/system/test_xfconf.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Author: Alexei Znamensky (russoz@gmail.com)
# Largely adapted from test_redhat_subscription by
# Jiri Hnidek (jhnidek@redhat.com)
# Copyright (c) Alexei Znamensky (russoz@gmail.com)
# Largely adapted from test_redhat_subscription:
# Copyright (c) Jiri Hnidek (jhnidek@redhat.com)
#
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/plugins/modules/system/test_xfconf_info.py
@@ -1,4 +1,4 @@
# Author: Alexei Znamensky (russoz@gmail.com)
# Copyright (c) Alexei Znamensky (russoz@gmail.com)
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later

Expand Down

0 comments on commit aab22e7

Please sign in to comment.