diff --git a/jenkins_jobs/modules/project_githuborg.py b/jenkins_jobs/modules/project_githuborg.py index 45577e990..75a8fa6b7 100644 --- a/jenkins_jobs/modules/project_githuborg.py +++ b/jenkins_jobs/modules/project_githuborg.py @@ -246,8 +246,14 @@ def github_org(xml_parent, data): :extensions: * **clean** (`dict`) - * **after** (`bool`) - Clean the workspace after checkout - * **before** (`bool`) - Clean the workspace before checkout + * **after** (`dict`) - Clean the workspace after checkout + * **remove-stale-nested-repos** (`bool`) - Deletes untracked + submodules and any other subdirectories which contain .git directories + (default false) + * **before** (`dict`) - Clean the workspace before checkout + * **remove-stale-nested-repos** (`bool`) - Deletes untracked + submodules and any other subdirectories which contain .git directories + (default false) * **depth** (`int`) - Set shallow clone depth (default 1) * **disable-pr-notifications** (`bool`) - Disable default github status notifications on pull requests (default false) (Requires the diff --git a/jenkins_jobs/modules/project_multibranch.py b/jenkins_jobs/modules/project_multibranch.py index ac85974fb..44d87a3bb 100644 --- a/jenkins_jobs/modules/project_multibranch.py +++ b/jenkins_jobs/modules/project_multibranch.py @@ -427,8 +427,14 @@ def bitbucket_scm(xml_parent, data): :extensions: * **clean** (`dict`) - * **after** (`bool`) - Clean the workspace after checkout - * **before** (`bool`) - Clean the workspace before checkout + * **after** (`dict`) - Clean the workspace after checkout + * **remove-stale-nested-repos** (`bool`) - Deletes untracked + submodules and any other subdirectories which contain .git directories + (default false) + * **before** (`dict`) - Clean the workspace before checkout + * **remove-stale-nested-repos** (`bool`) - Deletes untracked + submodules and any other subdirectories which contain .git directories + (default false) * **prune** (`bool`) - Prune remote branches (default false) * **shallow-clone** (`bool`) - Perform shallow clone (default false) * **sparse-checkout** (dict) @@ -678,8 +684,14 @@ def gerrit_scm(xml_parent, data): :extensions: * **clean** (`dict`) - * **after** (`bool`) - Clean the workspace after checkout - * **before** (`bool`) - Clean the workspace before checkout + * **after** (`dict`) - Clean the workspace after checkout + * **remove-stale-nested-repos** (`bool`) - Deletes untracked + submodules and any other subdirectories which contain .git directories + (default false) + * **before** (`dict`) - Clean the workspace before checkout + * **remove-stale-nested-repos** (`bool`) - Deletes untracked + submodules and any other subdirectories which contain .git directories + (default false) * **prune** (`bool`) - Prune remote branches (default false) * **shallow-clone** (`bool`) - Perform shallow clone (default false) * **sparse-checkout** (dict) @@ -848,8 +860,14 @@ def git_scm(xml_parent, data): :extensions: * **clean** (`dict`) - * **after** (`bool`) - Clean the workspace after checkout - * **before** (`bool`) - Clean the workspace before checkout + * **after** (`dict`) - Clean the workspace after checkout + * **remove-stale-nested-repos** (`bool`) - Deletes untracked + submodules and any other subdirectories which contain .git directories + (default false) + * **before** (`dict`) - Clean the workspace before checkout + * **remove-stale-nested-repos** (`bool`) - Deletes untracked + submodules and any other subdirectories which contain .git directories + (default false) * **prune** (`bool`) - Prune remote branches (default false) * **shallow-clone** (`bool`) - Perform shallow clone (default false) * **sparse-checkout** (dict) @@ -1006,8 +1024,14 @@ def github_scm(xml_parent, data): :extensions: * **clean** (`dict`) - * **after** (`bool`) - Clean the workspace after checkout - * **before** (`bool`) - Clean the workspace before checkout + * **after** (`dict`) - Clean the workspace after checkout + * **remove-stale-nested-repos** (`bool`) - Deletes untracked + submodules and any other subdirectories which contain .git directories + (default false) + * **before** (`dict`) - Clean the workspace before checkout + * **remove-stale-nested-repos** (`bool`) - Deletes untracked + submodules and any other subdirectories which contain .git directories + (default false) * **prune** (`bool`) - Prune remote branches (default false) * **shallow-clone** (`bool`) - Perform shallow clone (default false) * **sparse-checkout** (dict) diff --git a/jenkins_jobs/modules/scm.py b/jenkins_jobs/modules/scm.py index d5681e718..53716a481 100644 --- a/jenkins_jobs/modules/scm.py +++ b/jenkins_jobs/modules/scm.py @@ -262,8 +262,14 @@ def git(registry, xml_parent, data): to build. Can be one of `default`,`inverse`, or `gerrit` (default 'default') * **clean** (`dict`) - * **after** (`bool`) - Clean the workspace after checkout - * **before** (`bool`) - Clean the workspace before checkout + * **after** (`dict`) - Clean the workspace after checkout + * **remove-stale-nested-repos** (`bool`) - Deletes untracked + submodules and any other subdirectories which contain .git directories + (default false) + * **before** (`dict`) - Clean the workspace before checkout + * **remove-stale-nested-repos** (`bool`) - Deletes untracked + submodules and any other subdirectories which contain .git directories + (default false) * **committer** (`dict`) * **name** (`str`) - Name to use as author of new commits * **email** (`str`) - E-mail address to use for new commits @@ -518,7 +524,17 @@ def git_extensions(xml_parent, data): else: clean_after = data["clean"].get("after", False) clean_before = data["clean"].get("before", False) - if clean_after: + if clean_after is not False: + if isinstance(clean_after, bool): + clean_after_opts = {} + logger.warning( + "'clean: after: bool' configuration format is deprecated, " + "after should be an empty dict or filled with accepted " + "options." + ) + else: + clean_after_opts = clean_after + ext_name = impl_prefix + "CleanCheckout" if trait: trait_name = "CleanAfterCheckoutTrait" @@ -526,7 +542,20 @@ def git_extensions(xml_parent, data): ext = XML.SubElement(tr, "extension", {"class": ext_name}) else: ext = XML.SubElement(xml_parent, ext_name) - if clean_before: + if "remove-stale-nested-repos" in clean_after_opts: + elm = XML.SubElement(ext, "deleteUntrackedNestedRepositories") + elm.text = "true" + if clean_before is not False: + if isinstance(clean_before, bool): + clean_before_opts = {} + logger.warning( + "'clean: before: bool' configuration format is deprecated, " + "before should be an empty dict or filled with accepted " + "options." + ) + else: + clean_before_opts = clean_before + ext_name = impl_prefix + "CleanBeforeCheckout" if trait: trait_name = "CleanBeforeCheckoutTrait" @@ -534,6 +563,9 @@ def git_extensions(xml_parent, data): ext = XML.SubElement(tr, "extension", {"class": ext_name}) else: ext = XML.SubElement(xml_parent, ext_name) + if "remove-stale-nested-repos" in clean_before_opts: + elm = XML.SubElement(ext, "deleteUntrackedNestedRepositories") + elm.text = "true" committer = data.get("committer", {}) if committer: ext_name = impl_prefix + "UserIdentity" diff --git a/tests/scm/fixtures/git-clean02.xml b/tests/scm/fixtures/git-clean02.xml new file mode 100644 index 000000000..11c9223d9 --- /dev/null +++ b/tests/scm/fixtures/git-clean02.xml @@ -0,0 +1,36 @@ + + + + 2 + + + origin + +refs/heads/*:refs/remotes/origin/* + https://github.com/openstack-infra/jenkins-job-builder.git + + + + + ** + + + false + false + false + false + Default + + + + + + + true + + + true + + + + + diff --git a/tests/scm/fixtures/git-clean02.yaml b/tests/scm/fixtures/git-clean02.yaml new file mode 100644 index 000000000..8e2ae767b --- /dev/null +++ b/tests/scm/fixtures/git-clean02.yaml @@ -0,0 +1,8 @@ +scm: + - git: + url: https://github.com/openstack-infra/jenkins-job-builder.git + clean: + after: + remove-stale-nested-repos: true + before: + remove-stale-nested-repos: true diff --git a/tests/scm/fixtures/git-clean03.xml b/tests/scm/fixtures/git-clean03.xml new file mode 100644 index 000000000..f742cf4fb --- /dev/null +++ b/tests/scm/fixtures/git-clean03.xml @@ -0,0 +1,32 @@ + + + + 2 + + + origin + +refs/heads/*:refs/remotes/origin/* + https://github.com/openstack-infra/jenkins-job-builder.git + + + + + ** + + + false + false + false + false + Default + + + + + + + + + + + diff --git a/tests/scm/fixtures/git-clean03.yaml b/tests/scm/fixtures/git-clean03.yaml new file mode 100644 index 000000000..49a3e25f1 --- /dev/null +++ b/tests/scm/fixtures/git-clean03.yaml @@ -0,0 +1,6 @@ +scm: + - git: + url: https://github.com/openstack-infra/jenkins-job-builder.git + clean: + after: {} + before: {}