From 3c7350b3c97fcbc4d2dbad9cd49b50282a4a4047 Mon Sep 17 00:00:00 2001 From: Bhuvan Arumugam Date: Tue, 1 May 2012 16:27:58 -0700 Subject: [PATCH] Auto generate AUTHORS for python-openstackclient. Bug: 976267 Now that git commits are gated by CLA, we shouldn't enforce committers to add an entry in AUTHORS file. The AUTHORS file should be generated automatically, based on git commits. This commit fixes the problem. * AUTHORS Remove this file. * tests/test_authors.py Remove this test case. * .gitignore Add AUTHORS file. * openstackclient/openstack/common/setup.py generate_authors(): New method to create AUTHORS file. If AUTHORS.in file exists, append it's content to AUTHORS file. * setup.py Import the new method. Generate AUTHORS file before creating the package. Change-Id: Ia5488a43f88e13a0fb1f7a5d8d10a576b9034dc8 --- .gitignore | 1 + AUTHORS | 3 -- openstackclient/openstack/common/setup.py | 19 ++++--- setup.py | 2 + tests/test_authors.py | 63 ----------------------- 5 files changed, 15 insertions(+), 73 deletions(-) delete mode 100644 AUTHORS delete mode 100644 tests/test_authors.py diff --git a/.gitignore b/.gitignore index 2c05c8e27c..7b6d518c6a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *~ .openstackclient-venv .venv +AUTHORS build dist python_openstackclient.egg-info diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index f5bdf67198..0000000000 --- a/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -Dean Troyer -James E. Blair -Matt Joyce diff --git a/openstackclient/openstack/common/setup.py b/openstackclient/openstack/common/setup.py index 437610273f..60c731a9a2 100644 --- a/openstackclient/openstack/common/setup.py +++ b/openstackclient/openstack/common/setup.py @@ -37,8 +37,8 @@ def parse_mailmap(mailmap='.mailmap'): def canonicalize_emails(changelog, mapping): - """ Takes in a string and an email alias mapping and replaces all - instances of the aliases in the string with their real email + """Takes in a string and an email alias mapping and replaces all + instances of the aliases in the string with their real email. """ for alias, email in mapping.iteritems(): changelog = changelog.replace(alias, email) @@ -97,7 +97,7 @@ def _run_shell_command(cmd): def write_vcsversion(location): - """ Produce a vcsversion dict that mimics the old one produced by bzr + """Produce a vcsversion dict that mimics the old one produced by bzr. """ if os.path.isdir('.git'): branch_nick_cmd = 'git branch | grep -Ei "\* (.*)" | cut -f2 -d" "' @@ -118,7 +118,7 @@ version_info = { def write_git_changelog(): - """Write a changelog based on the git changelog""" + """Write a changelog based on the git changelog.""" if os.path.isdir('.git'): git_log_cmd = 'git log --stat' changelog = _run_shell_command(git_log_cmd) @@ -128,13 +128,18 @@ def write_git_changelog(): def generate_authors(): - """Create AUTHORS file using git commits""" + """Create AUTHORS file using git commits.""" jenkins_email = 'jenkins@review.openstack.org' + old_authors = 'AUTHORS.in' + new_authors = 'AUTHORS' if os.path.isdir('.git'): # don't include jenkins email address in AUTHORS file git_log_cmd = "git log --format='%aN <%aE>' | sort -u | " \ "grep -v " + jenkins_email changelog = _run_shell_command(git_log_cmd) mailmap = parse_mailmap() - with open("AUTHORS", "w") as authors_file: - authors_file.write(canonicalize_emails(changelog, mailmap)) + with open(new_authors, 'w') as new_authors_fh: + new_authors_fh.write(canonicalize_emails(changelog, mailmap)) + if os.path.exists(old_authors): + with open(old_authors, "r") as old_authors_fh: + new_authors_fh.write('\n' + old_authors_fh.read()) diff --git a/setup.py b/setup.py index adba47a1fd..9a9eca9f6c 100644 --- a/setup.py +++ b/setup.py @@ -2,6 +2,7 @@ import os import setuptools +from openstackclient.openstack.common.setup import generate_authors from openstackclient.openstack.common.setup import parse_requirements from openstackclient.openstack.common.setup import parse_dependency_links from openstackclient.openstack.common.setup import write_git_changelog @@ -10,6 +11,7 @@ from openstackclient.openstack.common.setup import write_git_changelog requires = parse_requirements() dependency_links = parse_dependency_links() write_git_changelog() +generate_authors() def read(fname): diff --git a/tests/test_authors.py b/tests/test_authors.py deleted file mode 100644 index b9c3d101da..0000000000 --- a/tests/test_authors.py +++ /dev/null @@ -1,63 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 OpenStack LLC -# Copyright 2012 Nebula Inc -# -# 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. - -import commands -import os -import unittest - - -def parse_mailmap(mailmap='.mailmap'): - mapping = {} - if os.path.exists(mailmap): - fp = open(mailmap, 'r') - for l in fp: - l = l.strip() - if not l.startswith('#') and ' ' in l: - canonical_email, alias = l.split(' ') - mapping[alias] = canonical_email - return mapping - - -def str_dict_replace(s, mapping): - for s1, s2 in mapping.iteritems(): - s = s.replace(s1, s2) - return s - - -class AuthorsTestCase(unittest.TestCase): - def test_authors_up_to_date(self): - root = os.path.normpath(os.path.join(os.path.dirname(__file__), '..')) - contributors = set() - missing = set() - authors_file = open(os.path.join(root, 'AUTHORS'), 'r').read() - - if os.path.exists(os.path.join(root, '.git')): - mailmap = parse_mailmap(os.path.join(root, '.mailmap')) - for email in commands.getoutput('git log --format=%ae').split(): - if not email: - continue - if "jenkins" in email and "openstack.org" in email: - continue - email = '<' + email + '>' - contributors.add(str_dict_replace(email, mailmap)) - - for contributor in contributors: - if not contributor in authors_file: - missing.add(contributor) - - self.assertTrue(len(missing) == 0, - '%r not listed in AUTHORS file.' % missing)