From 892c0dd6f0feb789599b0bb66c6f6c7cb46d3fbe Mon Sep 17 00:00:00 2001 From: Thomas Woerner <twoerner@redhat.com> Date: Fri, 14 Apr 2023 18:49:39 +0200 Subject: [PATCH] utils/galaxyfy.py: Handle module_defaults, match roles and modules The section module_defaults was not handled by utils/galaxyfy.py, also there was no verification that only roles and modules provided by ansible-freeipa are matched for prepending the collection prefix. --- utils/galaxyfy.py | 78 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 62 insertions(+), 16 deletions(-) diff --git a/utils/galaxyfy.py b/utils/galaxyfy.py index bc5c16da..7fef0515 100644 --- a/utils/galaxyfy.py +++ b/utils/galaxyfy.py @@ -4,7 +4,7 @@ # Authors: # Thomas Woerner <twoerner@redhat.com> # -# Copyright (C) 2019,2020 Red Hat +# Copyright (C) 2019-2023 Red Hat # see file 'COPYING' for use and warranty information # # This program is free software; you can redistribute it and/or modify @@ -21,49 +21,95 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. import re +from facts import ROLES, ALL_MODULES + + +def get_indent(txt): + return len(txt) - len(txt.lstrip()) def galaxyfy_playbook(project_prefix, collection_prefix, lines): - po1 = re.compile('(%s.*:)$' % project_prefix) - po2 = re.compile('(.*:) (%s.*)$' % project_prefix) - out_lines = [] + po_module = re.compile('(%s.*):$' % project_prefix) + po_module_arg = re.compile('(%s.*): (.*)$' % project_prefix) + po_module_unnamed = re.compile('- (%s.*):$' % project_prefix) + po_role = re.compile('(.*:) (%s.*)$' % project_prefix) - pattern1 = r'%s.\1' % collection_prefix - pattern2 = r'\1 %s.\2' % collection_prefix + pattern_module = r'%s.\1:' % collection_prefix + pattern_module_arg = r'%s.\1: \2' % collection_prefix + pattern_module_unnamed = r'- %s.\1:' % collection_prefix + pattern_role = r'\1 %s.\2' % collection_prefix + out_lines = [] changed = False changeable = False include_role = False + module_defaults = False + module_defaults_indent = -1 for line in lines: stripped = line.strip() if stripped.startswith("- name:") or \ stripped.startswith("- block:"): changeable = True + module_defaults = False + module_defaults_indent = -1 elif stripped in ["set_fact:", "ansible.builtin.set_fact:", "vars:"]: changeable = False include_role = False + module_defaults = False + module_defaults_indent = -1 elif stripped == "roles:": changeable = True include_role = False + module_defaults = False + module_defaults_indent = -1 elif (stripped.startswith("include_role:") or stripped.startswith("ansible.builtin.include_role:")): include_role = True + module_defaults = False + module_defaults_indent = -1 elif include_role and stripped.startswith("name:"): - line = po2.sub(pattern2, line) - changed = True + match = po_role.search(line) + if match and match.group(2) in ROLES: + line = po_role.sub(pattern_role, line) + changed = True + elif stripped == "module_defaults:": + changeable = True + include_role = False + module_defaults = True + module_defaults_indent = -1 + elif module_defaults: + _indent = get_indent(line) + if module_defaults_indent == -1: + module_defaults_indent = _indent + if _indent == module_defaults_indent: + # only module, no YAML anchor or alias + match = po_module.search(line) + if match and match.group(1) in ALL_MODULES: + line = po_module.sub(pattern_module, line) + changed = True + # module with YAML anchor or alias + match = po_module_arg.search(line) + if match and match.group(1) in ALL_MODULES: + line = po_module_arg.sub(pattern_module_arg, line) + changed = True elif changeable and stripped.startswith("- role:"): - line = po2.sub(pattern2, line) - changed = True + match = po_role.search(line) + if match and match.group(2) in ROLES: + line = po_role.sub(pattern_role, line) + changed = True elif (changeable and stripped.startswith(project_prefix) - and not stripped.startswith(collection_prefix) # noqa and stripped.endswith(":")): # noqa - line = po1.sub(pattern1, line) - changed = True - changeable = False # Only change first line in task + match = po_module.search(line) + if match and match.group(1) in ALL_MODULES: + line = po_module.sub(pattern_module, line) + changed = True + changeable = False # Only change first line in task elif (stripped.startswith("- %s" % project_prefix) and stripped.endswith(":")): # noqa - line = po1.sub(pattern1, line) - changed = True + match = po_module_unnamed.search(line) + if match and match.group(1) in ALL_MODULES: + line = po_module_unnamed.sub(pattern_module_unnamed, line) + changed = True out_lines.append(line) -- GitLab