{%- set processed_gitdirs = {} %} {%- set processed_gitdir_envs = [] %} {%- set processed_basedirs = [] %} {%- from "salt/map.jinja" import formulas_settings with context %} {%- from "salt/formulas.jinja" import formulas_git_opt with context %} {%- from "salt/formulas.jinja" import formulas_opts_for_git_latest with context %} ## from template-formula {%- set tplroot = tpldir.split('/')[0] %} {%- from tplroot ~ "/map.jinja" import salt_settings with context %} # Loop over all formulas listed in pillar data {%- for env, entries in salt['pillar.get']('salt_formulas:list', {}).items() %} {%- for entry in entries %} {%- set f_name = entry | first if entry is mapping else entry %} {%- set f_opts = entry[f_name] if entry is mapping else {} %} {%- set basedir = formulas_git_opt(env, 'basedir')|load_yaml %} {%- set gitdir = '{0}/{1}'.format(basedir, f_name) %} {%- set update = formulas_git_opt(env, 'update')|load_yaml %} {%- if formulas_settings.checkout_orig_branch %} {%- if not salt['file.directory_exists']('{0}/{1}'.format(gitdir, '.git')) %} {%- set gitdir_branch = '' %} {%- else %} {%- set gitdir_branch = salt['git.current_branch'](gitdir) %} {%- endif %} {%- do processed_gitdirs.update({gitdir:gitdir_branch}) %} {%- endif %} # Setup the directory hosting the Git repository {%- if basedir not in processed_basedirs %} {%- do processed_basedirs.append(basedir) %} {{ basedir }}: file.directory: - parallel: {{ salt_settings.parallel }} {%- for key, value in salt['pillar.get']('salt_formulas:basedir_opts', {'makedirs': True}).items() %} - {{ key }}: {{ value }} - user: {{ salt_settings.rootuser }} {%- if grains.kernel != 'Windows' %} - group: {{ salt_settings.rootgroup }} {%- endif %} {%- endfor %} {%- endif %} # Setup the formula Git repository {%- set gitdir_env = '{0}_{1}'.format(gitdir, env) %} {%- if gitdir_env not in processed_gitdir_envs %} {%- do processed_gitdir_envs.append(gitdir_env) %} {%- set options = formulas_opts_for_git_latest(env)|load_yaml %} {%- do options.update(f_opts) %} {%- set baseurl = formulas_git_opt(env, 'baseurl')|load_yaml %} {{ gitdir_env }}: git.latest: - name: {{ baseurl }}/{{ f_name }}.git - parallel: {{ salt_settings.parallel }} - target: {{ gitdir }} {%- for key, value in options.items() %} - {{ key }}: {{ value }} {%- endfor %} {%- if not update %} - unless: test -e {{ gitdir }} >/dev/null 2>&1 {%- endif %} {%- endif %} {%- endfor %} {%- endfor %} {%- if formulas_settings.checkout_orig_branch %} # For each directory processed, explicitly checkout the original branch before # the `git.latest` state ran {%- for gitdir, original_branch in processed_gitdirs.items() %} {%- if original_branch %} {%- set gitdir_user = salt['file.get_user'](gitdir) %} checkout_original_branch_for_{{ gitdir }}: module.run: - name: git.checkout - order: last - cwd: {{ gitdir }} - rev: {{ original_branch }} - user: {{ gitdir_user }} - unless: test "$(cd {{ gitdir }}; git rev-parse --abbrev-ref HEAD)" = "{{ original_branch }}" {%- endif %} {%- endfor %} {%- endif %}