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