Files
ansible/test/integration/targets/git/tasks/setup.yml
Sviatoslav Sydorenko c0e0550bce 🐛 Make integration tests compatible w/ modern Git (#80122)
* 🐛 Make integration tests compatible w/ modern Git

This patch makes use of the `init.defaultBranch` setting to unify
the test across new and old Git versions since one defaults to
`master` and the other uses `main` for the default branch.

Where possible, it uses the `HEAD` committish to avoid having to
normalize the branch name.

The change fixes the following integration tests:

  * `ansible-galaxy`

  * `ansible-galaxy-collection-scm` (recursive collection)

  * `git`

* 🐛Replace `git-symbolic-ref` with a repo template

This custom Git repository template emulates the `init.defaultBranch` setting
on Git versions below 2.28. Ref: https://superuser.com/a/1559582.
Other workarounds mentioned there, like invoking
`git symbolic-ref HEAD refs/heads/main` after each `git init` turned
out to have mysterious side effects that break the tests in surprising ways.

* 🎨 Make Git integration test non-destructive

This patch makes use of the `$HOME` environment variable to trick Git
into using a user-global config generated in the temporary directory.
2023-03-03 02:34:29 +01:00

78 lines
2.6 KiB
YAML

- name: SETUP | clean out the remote_tmp_dir
file:
path: "{{ remote_tmp_dir }}"
state: absent
- name: SETUP | create clean remote_tmp_dir
file:
path: "{{ remote_tmp_dir }}"
state: directory
- name: SETUP | install git
package:
name: '{{ item }}'
when: ansible_distribution not in ["MacOSX", "Alpine"]
notify:
- cleanup
with_items: "{{ git_required_packages[ansible_os_family | default('default') ] | default(git_required_packages.default) }}"
- name: SETUP | verify that git is installed so this test can continue
shell: which git
- name: SETUP | get git version, only newer than {{git_version_supporting_depth}} has fixed git depth
shell: git --version | grep 'git version' | sed 's/git version //'
register: git_version
- name: SETUP | get gpg version
shell: gpg --version 2>1 | head -1 | sed -e 's/gpg (GnuPG) //'
register: gpg_version
- name: SETUP | set git global user.email if not already set
shell: git config --global user.email 'noreply@example.com'
- name: SETUP | set git global user.name if not already set
shell: git config --global user.name 'Ansible Test Runner'
- name: SETUP | set git global init.defaultBranch
shell: >-
git config --global init.defaultBranch '{{ git_default_branch }}'
- name: SETUP | set git global init.templateDir
# NOTE: This custom Git repository template emulates the `init.defaultBranch`
# NOTE: setting on Git versions below 2.28.
# NOTE: Ref: https://superuser.com/a/1559582.
# NOTE: Other workarounds mentioned there, like invoking
# NOTE: `git symbolic-ref HEAD refs/heads/main` after each `git init` turned
# NOTE: out to have mysterious side effects that break the tests in surprising
# NOTE: ways.
shell: |
set -eEu
git config --global \
init.templateDir '{{ remote_tmp_dir }}/git-templates/git.git'
mkdir -pv '{{ remote_tmp_dir }}/git-templates'
set +e
GIT_TEMPLATES_DIR=$(\
2>/dev/null \
ls -1d \
'/Library/Developer/CommandLineTools/usr/share/git-core/templates' \
'/usr/local/share/git-core/templates' \
'/usr/share/git-core/templates' \
)
set -e
>&2 echo "Found Git's default templates directory: ${GIT_TEMPLATES_DIR}"
cp -r "${GIT_TEMPLATES_DIR}" '{{ remote_tmp_dir }}/git-templates/git.git'
echo 'ref: refs/heads/{{ git_default_branch }}' \
> '{{ remote_tmp_dir }}/git-templates/git.git/HEAD'
- name: SETUP | create repo_dir
file:
path: "{{ repo_dir }}"
state: directory
- name: SETUP | show git version
debug:
msg: "Running test with git {{ git_version.stdout }}"