From 321848e98d9e565ee3f78c8c37ca879a8e3c55c1 Mon Sep 17 00:00:00 2001 From: Sloane Hertel <19572925+s-hertel@users.noreply.github.com> Date: Thu, 26 Jan 2023 14:15:18 -0500 Subject: [PATCH] fix installing collections from git repos that contain MANIFEST.json (#79808) * add null 'manifest' key to metadata for git repo collections containing MANIFEST.json changelog * set to Sentinel instead of None * Test installing a collection in a git repo that contains a MANIFEST.json * fix test * Update changelogs/fragments/ansible-galaxy-install-git-src-manifest.yml --- ...nsible-galaxy-install-git-src-manifest.yml | 2 + lib/ansible/galaxy/collection/__init__.py | 1 + .../meta/main.yml | 1 + .../tasks/main.yml | 1 + .../tasks/test_manifest_metadata.yml | 55 +++++++++++++++++++ 5 files changed, 60 insertions(+) create mode 100644 changelogs/fragments/ansible-galaxy-install-git-src-manifest.yml create mode 100644 test/integration/targets/ansible-galaxy-collection-scm/tasks/test_manifest_metadata.yml diff --git a/changelogs/fragments/ansible-galaxy-install-git-src-manifest.yml b/changelogs/fragments/ansible-galaxy-install-git-src-manifest.yml new file mode 100644 index 00000000000..684d978eef3 --- /dev/null +++ b/changelogs/fragments/ansible-galaxy-install-git-src-manifest.yml @@ -0,0 +1,2 @@ +bugfixes: + - ansible-galaxy - fix installing collections in git repositories/directories which contain a MANIFEST.json file (https://github.com/ansible/ansible/issues/79796). diff --git a/lib/ansible/galaxy/collection/__init__.py b/lib/ansible/galaxy/collection/__init__.py index aeb73e84b10..5a3928f88df 100644 --- a/lib/ansible/galaxy/collection/__init__.py +++ b/lib/ansible/galaxy/collection/__init__.py @@ -1625,6 +1625,7 @@ def install_src(collection, b_collection_path, b_collection_output_path, artifac if 'build_ignore' not in collection_meta: # installed collection, not src # FIXME: optimize this? use a different process? copy instead of build? collection_meta['build_ignore'] = [] + collection_meta['manifest'] = Sentinel collection_manifest = _build_manifest(**collection_meta) file_manifest = _build_files_manifest( b_collection_path, diff --git a/test/integration/targets/ansible-galaxy-collection-scm/meta/main.yml b/test/integration/targets/ansible-galaxy-collection-scm/meta/main.yml index e3dd5fb100d..655a62f0d27 100644 --- a/test/integration/targets/ansible-galaxy-collection-scm/meta/main.yml +++ b/test/integration/targets/ansible-galaxy-collection-scm/meta/main.yml @@ -1,3 +1,4 @@ --- dependencies: - setup_remote_tmp_dir +- setup_gnutar diff --git a/test/integration/targets/ansible-galaxy-collection-scm/tasks/main.yml b/test/integration/targets/ansible-galaxy-collection-scm/tasks/main.yml index 546c408395c..dab599b15d9 100644 --- a/test/integration/targets/ansible-galaxy-collection-scm/tasks/main.yml +++ b/test/integration/targets/ansible-galaxy-collection-scm/tasks/main.yml @@ -30,6 +30,7 @@ - include_tasks: ./download.yml - include_tasks: ./setup_collection_bad_version.yml - include_tasks: ./test_invalid_version.yml + - include_tasks: ./test_manifest_metadata.yml always: diff --git a/test/integration/targets/ansible-galaxy-collection-scm/tasks/test_manifest_metadata.yml b/test/integration/targets/ansible-galaxy-collection-scm/tasks/test_manifest_metadata.yml new file mode 100644 index 00000000000..a01551cad84 --- /dev/null +++ b/test/integration/targets/ansible-galaxy-collection-scm/tasks/test_manifest_metadata.yml @@ -0,0 +1,55 @@ +- name: Test installing a collection from a git repo containing a MANIFEST.json + block: + - name: Create a temp directory for building the collection + file: + path: '{{ galaxy_dir }}/scratch' + state: directory + + - name: Initialize a collection + command: 'ansible-galaxy collection init namespace_3.collection_1' + args: + chdir: '{{ galaxy_dir }}/scratch' + + - name: Build the collection + command: 'ansible-galaxy collection build namespace_3/collection_1' + args: + chdir: '{{ galaxy_dir }}/scratch' + + - name: Initialize git repository + command: 'git init {{ scm_path }}/namespace_3' + + - name: Create the destination for the collection + file: + path: '{{ scm_path }}/namespace_3/collection_1' + state: directory + + - name: Unarchive the collection in the git repo + unarchive: + dest: '{{ scm_path }}/namespace_3/collection_1' + src: '{{ galaxy_dir }}/scratch/namespace_3-collection_1-1.0.0.tar.gz' + remote_src: yes + + - name: Commit the changes + shell: git add ./; git commit -m 'add collection' + args: + chdir: '{{ scm_path }}/namespace_3' + + - name: Install the collection in the git repository + command: 'ansible-galaxy collection install git+file://{{ scm_path }}/namespace_3/.git' + register: result + + - name: Assert the collection was installed successfully + assert: + that: + - '"namespace_3.collection_1:1.0.0 was installed successfully" in result.stdout_lines' + + always: + - name: Clean up directories from test + file: + path: '{{ galaxy_dir }}/scratch' + state: absent + loop: + - '{{ galaxy_dir }}/scratch' + - '{{ scm_path }}/namespace_3' + + - include_tasks: ./empty_installed_collections.yml