| - name: Prepare project |
| debug: |
| msg: "{{ project.name }} {{ project_dest }}" |
| |
| - name: Check if zuul.branch exists in repo |
| set_fact: |
| # If zuul checked out the branch we're testing (ie, gerrit's |
| # branch), then it exists. |
| project_branch_exists: "{{ zuul.projects[gerrit_project_name].checkout == project.checkout }}" |
| |
| - name: Check if repo has a dependent change |
| set_fact: |
| repo_has_dependent_change: "{{ zuul['items'] | selectattr('project.canonical_name', 'eq', project.canonical_name) | list | length | bool }}" |
| |
| - name: Check if repo is in submodules |
| ignore_errors: true |
| set_fact: |
| project_in_gitmodules: "{{ lookup ('ini', 'path section=submodule \"' + project_dest + '\" file=' + zuul.executor.work_root + '/' + zuul.projects[gerrit_project_name].src_dir + '/.gitmodules', errors='ignore') }}" |
| - name: Coerce submodule check to boolean |
| set_fact: |
| project_in_gitmodules: "{{ project_in_gitmodules | default('') | length > 0 | bool }}" |
| |
| - name: Check if repo is a tracking branch |
| ignore_errors: true |
| set_fact: |
| tracking_branch: "{{ lookup ('ini', 'branch section=submodule \"' + project_dest + '\" file=' + zuul.executor.work_root + '/' + zuul.projects[gerrit_project_name].src_dir + '/.gitmodules', errors='ignore') }}" |
| - name: Coerce tracking branch to boolean |
| set_fact: |
| tracking_branch: "{{ ((tracking_branch | default('')) == '.') | bool }}" |
| |
| - name: Check for unsatisfiable source repo condition |
| when: |
| - "project_in_gitmodules" |
| - "project.canonical_name != zuul.project.canonical_name" |
| - "not project_branch_exists or not tracking_branch" |
| - "repo_has_dependent_change" |
| fail: |
| msg: >- |
| The repository {{ project.name }} does not contain the branch |
| under test ({{ zuul.projects[gerrit_project_name].checkout }}), |
| but this change depends on a change to that project and branch. |
| While Zuul is able to check out the repos in the requested |
| state, the branch mismatch means that Gerrit's submodule |
| subscription would not automatically update the submodule |
| pointer, and the merged state would not reflect the tested |
| state. |
| |
| This configuration would be testable by creating a {{ |
| zuul.projects[gerrit_project_name].checkout }} branch in the {{ |
| project.name }} repo. Alternatively, you can merge the |
| dependent change, manually update the submodule pointer, then |
| test this change again. |
| |
| # If there is no matching branch we need to check out the actual sha |
| # defined in the parent repo. |
| - name: Update submodule |
| when: "project_in_gitmodules and (not project_branch_exists or not tracking_branch)" |
| # Set protocol.file.allow=always while submodule init, which lets |
| # the submodule command to clone from a local directory. It's |
| # necessary as of Git 2.38.1, where the default was changed to |
| # "user" in response to CVE-2022-39253. |
| command: "git -c protocol.file.allow=always submodule update --init {{ project_dest }}" |
| args: |
| chdir: "{{ gerrit_root }}" |
| |
| # Else: |
| - name: Move repo into place |
| when: "not (project_in_gitmodules and (not project_branch_exists or not tracking_branch))" |
| command: "mv -T -f {{ ansible_user_dir }}/{{ project.src_dir }} {{ gerrit_root }}/{{ project_dest }}" |