Auto generate AUTHORS for python-keystoneclient.

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.

  Remove this file.

* .gitignore
  Add AUTHORS file.

* keystoneclient/openstack/common/
  generate_authors(): New method to create AUTHORS file. If file exists, append it's content to AUTHORS file.

  Import the new method.
  Generate AUTHORS file before creating the package.

* openstack-common.conf
  Add config file to copy libraries from openstack-common project,
  using script.

* keystoneclient/openstack/
* keystoneclient/openstack/common/
  Add new placeholders.

Change-Id: I1a17ee8f1e19e8ad522f0d2e37c04fffba5e16cb
Bhuvan Arumugam 2012-05-04 21:43:43 -07:00
parent 562ee8c270
commit a393258a66
6 changed files with 155 additions and 0 deletions

.gitignore vendored
View File

@ -6,6 +6,7 @@ cover

View File

View File

@ -0,0 +1,145 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2011 OpenStack LLC.
# All Rights Reserved.
# 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
# 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.
Utilities with minimum-depends for use in
import os
import re
import subprocess
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 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.
for alias, email in mapping.iteritems():
changelog = changelog.replace(alias, email)
return changelog
# Get requirements from the first file that exists
def get_reqs_from_files(requirements_files):
reqs_in = []
for requirements_file in requirements_files:
if os.path.exists(requirements_file):
return open(requirements_file, 'r').read().split('\n')
return []
def parse_requirements(requirements_files=['requirements.txt',
requirements = []
for line in get_reqs_from_files(requirements_files):
if re.match(r'\s*-e\s+', line):
requirements.append(re.sub(r'\s*-e\s+.*#egg=(.*)$', r'\1',
elif re.match(r'\s*-f\s+', line):
return requirements
def parse_dependency_links(requirements_files=['requirements.txt',
dependency_links = []
for line in get_reqs_from_files(requirements_files):
if re.match(r'(\s*#)|(\s*$)', line):
if re.match(r'\s*-[ef]\s+', line):
dependency_links.append(re.sub(r'\s*-[ef]\s+', '', line))
return dependency_links
def write_requirements():
venv = os.environ.get('VIRTUAL_ENV', None)
if venv is not None:
with open("requirements.txt", "w") as req_file:
output = subprocess.Popen(["pip", "-E", venv, "freeze", "-l"],
requirements = output.communicate()[0].strip()
def _run_shell_command(cmd):
output = subprocess.Popen(["/bin/sh", "-c", cmd],
return output.communicate()[0].strip()
def write_vcsversion(location):
"""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" "'
branch_nick = _run_shell_command(branch_nick_cmd)
revid_cmd = "git rev-parse HEAD"
revid = _run_shell_command(revid_cmd).split()[0]
revno_cmd = "git log --oneline | wc -l"
revno = _run_shell_command(revno_cmd)
with open(location, 'w') as version_file:
# This file is automatically generated by, So don't edit it. :)
version_info = {
'branch_nick': '%s',
'revision_id': '%s',
'revno': %s
""" % (branch_nick, revid, revno))
def write_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)
mailmap = parse_mailmap()
with open("ChangeLog", "w") as changelog_file:
changelog_file.write(canonicalize_emails(changelog, mailmap))
def generate_authors():
"""Create AUTHORS file using git commits."""
jenkins_email = ''
old_authors = ''
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(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' +

openstack-common.conf Normal file
View File

@ -0,0 +1,7 @@
# The list of modules to copy from openstack-common
# The base module to hold the copy of openstack.common

View File

@ -1,6 +1,7 @@
import os
import sys
from setuptools import setup, find_packages
from keystoneclient.openstack.common.setup import generate_authors
def read(fname):
@ -12,6 +13,7 @@ if sys.version_info < (2, 6):
if sys.version_info < (2, 7):