diff --git a/scripts/changelog_generator.py b/scripts/changelog_generator.py index 2e85e5fa94743a6a4100870070f2d2d072f71905..0260121090788654dda6938110e90232a425bf3b 100755 --- a/scripts/changelog_generator.py +++ b/scripts/changelog_generator.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -""" +""" Simple changelog generator for Garz&Fricke gitlab projects. @@ -22,6 +22,7 @@ import sys import gitlab as gl import common +from get_integration_sources import get_integration_sources __author__ = "Jonas Höppner" __email__ = "jonas.hoeppner@garz-fricke.com" @@ -58,7 +59,7 @@ class Tag: self.message = tag.message self.commit = tag.commit """ - The tags timestamp is a little more complicated it normally points + The tags timestamp is a little more complicated it normally points to the tagged commit's timestamps. But the merge happens later. To handle this, the relelated mergerequest is found by comparing the sha's and also take the merged_at timestamp. @@ -182,7 +183,6 @@ class MergeRequest: def main(args): - parser = argparse.ArgumentParser(description=__doc__, usage="%(prog)s [OPTIONS]") parser.add_argument( @@ -213,6 +213,15 @@ def main(args): required=True, ) + parser.add_argument( + "-a", + "--all-projects", + help="""Parse all projects integrated into the listed ones""", + action="store_true", + default=False, + required=False, + ) + parser.add_argument( "-v", "--verbose", @@ -229,10 +238,41 @@ def main(args): logging.debug(options) gitlab = gl.Gitlab(options.gitlab_url, private_token=options.token) - projects = [Project(gitlab.projects.get(project)) for project in options.project] + project_list = {} + manifest_project = options.project[0] + if not options.all_projects: + # Old behaviour: Just a list of all projects from the commandline, + # only one branch name + for project in options.project: + project_list[project] = {"branch": options.branch} + else: + # New behaviour: Go through the project list from the parameters + # and check for all integrated projects + groupname = options.project[0].split("/")[0] + group = gitlab.groups.get(groupname, retry_transient_errors=True) + for project in options.project: + project_list[project] = {"branch": options.branch} + + integration_sources = get_integration_sources( + project, options.branch, group + ) + for source in integration_sources: + project_list[source["project"]] = {"branch": source["branch"]} + + if options.verbose: + print("Projects included in the report:") + for p, b in project_list.items(): + print(f" {p} - {b['branch']}") + + for p in project_list.keys(): + gl_project = Project(gitlab.projects.get(p)) + project_list[p]["gitlab"] = gl_project + releases = [ Release(Tag(t)) - for t in projects[0].project.tags.list(search=options.branch, as_list=False) + for t in project_list[manifest_project]["gitlab"].project.tags.list( + search=project_list[manifest_project]["branch"], as_list=False + ) ] # Add dummy release with date today for new unstaged commits releases.append( @@ -247,11 +287,11 @@ def main(args): # Sort by date, oldest first releases = sorted(releases, key=lambda d: d.tag.timestamp, reverse=False) - for p in projects: - for mr in p.project.mergerequests.list( - scope="all", state="merged", target_branch=options.branch, as_list=False + for p in project_list.values(): + for mr in p["gitlab"].project.mergerequests.list( + scope="all", state="merged", target_branch=p["branch"], as_list=False ): - m = MergeRequest(mr, p) + m = MergeRequest(mr, p["gitlab"]) for r in releases: if r.add_mergerequest(m): break