diff --git a/scripts/changelog_generator.py b/scripts/changelog_generator.py index 2e85e5fa94743a6a4100870070f2d2d072f71905..1a80e522b8450f14699cbb3d05aa8c54217a005e 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,25 @@ 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( + "-s", + "--skip-project", + help="""Projects to not include into the change log. + (can be passed multiple times)""", + dest="skip_project", + action="append", + default=[], + required=False, + ) + parser.add_argument( "-v", "--verbose", @@ -229,10 +248,54 @@ 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: + if project in options.skip_project: + continue + 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: + if project in options.skip_project: + continue + project_list[project] = {"branch": options.branch} + + integration_sources = get_integration_sources( + project, options.branch, group + ) + for source in integration_sources: + if source["project"] in options.skip_project: + continue + if ( + source["project"] in project_list.keys() + ): # Only add the first included branch + continue + 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']}") + print("Skip list:") + for p in options.skip_project: + print(f"{p}") + + 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 +310,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