diff --git a/openstack/common/setup.py b/openstack/common/setup.py index 030df61c9..dec74fd0d 100644 --- a/openstack/common/setup.py +++ b/openstack/common/setup.py @@ -171,6 +171,14 @@ def generate_authors(): " log --format='%aN <%aE>' | sort -u | " "egrep -v '" + jenkins_email + "'") changelog = _run_shell_command(git_log_cmd) + signed_cmd = ("git log --git-dir=" + git_dir + + " | grep -i Co-authored-by: | sort -u") + signed_entries = _run_shell_command(signed_cmd) + if signed_entries: + new_entries = "\n".join( + [signed.split(":", 1)[1].strip() + for signed in signed_entries.split("\n") if signed]) + changelog = "\n".join((changelog, new_entries)) mailmap = _parse_git_mailmap(git_dir) with open(new_authors, 'w') as new_authors_fh: new_authors_fh.write(canonicalize_emails(changelog, mailmap)) diff --git a/tests/unit/test_setup.py b/tests/unit/test_setup.py index 62decc89a..64ca0e21c 100644 --- a/tests/unit/test_setup.py +++ b/tests/unit/test_setup.py @@ -119,23 +119,38 @@ def _fake_open(name, mode): with open(os.path.join(root_dir, "ChangeLog"), "r") as ch_fh: self.assertTrue("email@foo.com" in ch_fh.read()) + def _fake_log_output(self, cmd, mapping): + for (k, v) in mapping.items(): + if cmd.startswith(k): + return v + return "" + def test_generate_authors(self): author_old = "Foo Foo " author_new = "Bar Bar " + co_author = "Foo Bar " + co_author_by = "Co-authored-by: " + co_author root_dir = self._root_dir() + + git_log_cmd = ("git --git-dir=%s log --format" % + os.path.join(root_dir, '.git')) + git_co_log_cmd = ("git log --git-dir=%s" % + os.path.join(root_dir, '.git')) + cmd_map = { + git_log_cmd: author_new, + git_co_log_cmd: co_author_by, + } + exist_files = [os.path.join(root_dir, ".git"), os.path.abspath("AUTHORS.in")] self.useFixture(fixtures.MonkeyPatch( "os.path.exists", lambda path: os.path.abspath(path) in exist_files)) - git_log_cmd = "git --git-dir=%s log" % os.path.join(root_dir, '.git') self.useFixture(fixtures.FakePopen(lambda proc_args: { "stdout": StringIO.StringIO( - author_new - if proc_args["args"][2].startswith(git_log_cmd) - else "") + self._fake_log_output(proc_args["args"][2], cmd_map)) })) with open("AUTHORS.in", "w") as auth_fh: @@ -147,6 +162,7 @@ def test_generate_authors(self): authors = auth_fh.read() self.assertTrue(author_old in authors) self.assertTrue(author_new in authors) + self.assertTrue(co_author in authors) class GetCmdClassTest(utils.BaseTestCase):