From 9a5e73fb734712ad154cc5dbedfc18c59873515f Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Fri, 10 Jan 2020 11:28:54 +0000 Subject: [PATCH 1/2] JENKINS-60727 Add cleanSubmodule parameter to submoduleClean to add clean a submodule's untracked submodules. --- .../plugins/gitclient/CliGitAPIImpl.java | 22 +++++++-- .../plugins/gitclient/GitClient.java | 10 ++++ .../plugins/gitclient/JGitAPIImpl.java | 12 +++-- .../plugins/gitclient/RemoteGitImpl.java | 5 ++ .../plugins/gitclient/GitAPITestCase.java | 46 +++++++++++++++++++ 5 files changed, 87 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/gitclient/CliGitAPIImpl.java b/src/main/java/org/jenkinsci/plugins/gitclient/CliGitAPIImpl.java index 8a27dfa455..74b7be45cf 100644 --- a/src/main/java/org/jenkinsci/plugins/gitclient/CliGitAPIImpl.java +++ b/src/main/java/org/jenkinsci/plugins/gitclient/CliGitAPIImpl.java @@ -1482,16 +1482,28 @@ public void submoduleReset(boolean recursive, boolean hard) throws GitException, * Cleans submodules */ @Override - public void submoduleClean(boolean recursive) throws GitException, InterruptedException { + public void submoduleClean(boolean recursive, boolean cleanSubmodule) throws GitException, InterruptedException { submoduleReset(true, true); ArgumentListBuilder args = new ArgumentListBuilder(); args.add("submodule", "foreach"); - if (recursive) { + if (recursive) { args.add("--recursive"); - } - args.add("git clean -fdx"); + } + String cmd = "git clean -fdx"; + if (cleanSubmodule) cmd = "git clean -ffdx"; + args.add(cmd); + + launchCommand(args); + } - launchCommand(args); + /** + * {@inheritDoc} + * + * Cleans submodules + */ + @Override + public void submoduleClean(boolean recursive) throws GitException, InterruptedException { + this.submoduleClean(recursive, false); } /** diff --git a/src/main/java/org/jenkinsci/plugins/gitclient/GitClient.java b/src/main/java/org/jenkinsci/plugins/gitclient/GitClient.java index f3a412bd5e..0ea6cd81c3 100644 --- a/src/main/java/org/jenkinsci/plugins/gitclient/GitClient.java +++ b/src/main/java/org/jenkinsci/plugins/gitclient/GitClient.java @@ -785,6 +785,16 @@ public interface GitClient { */ void submoduleClean(boolean recursive) throws GitException, InterruptedException; + /** + * submoduleClean. + * + * @param recursive a boolean. + * @param cleanSubmodule flag to add extra -f + * @throws hudson.plugins.git.GitException if underlying git operation fails. + * @throws java.lang.InterruptedException if interrupted. + */ + void submoduleClean(boolean recursive, boolean cleanSubmodule) throws GitException, InterruptedException; + /** * submoduleInit. * diff --git a/src/main/java/org/jenkinsci/plugins/gitclient/JGitAPIImpl.java b/src/main/java/org/jenkinsci/plugins/gitclient/JGitAPIImpl.java index 7064c33b18..4f0335d36e 100644 --- a/src/main/java/org/jenkinsci/plugins/gitclient/JGitAPIImpl.java +++ b/src/main/java/org/jenkinsci/plugins/gitclient/JGitAPIImpl.java @@ -2136,12 +2136,12 @@ private Iterable submodules() throws IOException { /** {@inheritDoc} */ @Override - public void submoduleClean(boolean recursive) throws GitException { + public void submoduleClean(boolean recursive, boolean cleanSubmodule) throws GitException { try { for (JGitAPIImpl sub : submodules()) { - sub.clean(); + sub.clean(cleanSubmodule); if (recursive) { - sub.submoduleClean(true); + sub.submoduleClean(true, cleanSubmodule); } } } catch (IOException e) { @@ -2149,6 +2149,12 @@ public void submoduleClean(boolean recursive) throws GitException { } } + /** {@inheritDoc} */ + @Override + public void submoduleClean(boolean recursive) throws GitException { + this.submoduleClean(recursive, false); + } + /** * Update submodules. * diff --git a/src/main/java/org/jenkinsci/plugins/gitclient/RemoteGitImpl.java b/src/main/java/org/jenkinsci/plugins/gitclient/RemoteGitImpl.java index 0c8f9aebe6..aa8ea2eb65 100644 --- a/src/main/java/org/jenkinsci/plugins/gitclient/RemoteGitImpl.java +++ b/src/main/java/org/jenkinsci/plugins/gitclient/RemoteGitImpl.java @@ -665,6 +665,11 @@ public void submoduleClean(boolean recursive) throws GitException, InterruptedEx proxy.submoduleClean(recursive); } + /** {@inheritDoc} */ + public void submoduleClean(boolean recursive, boolean cleanSubmodule) throws GitException, InterruptedException { + proxy.submoduleClean(recursive, cleanSubmodule); + } + /** {@inheritDoc} */ public void setupSubmoduleUrls(Revision rev, TaskListener listener) throws GitException, InterruptedException { proxy.setupSubmoduleUrls(rev, listener); diff --git a/src/test/java/org/jenkinsci/plugins/gitclient/GitAPITestCase.java b/src/test/java/org/jenkinsci/plugins/gitclient/GitAPITestCase.java index 4cabbad1ba..28822c573c 100644 --- a/src/test/java/org/jenkinsci/plugins/gitclient/GitAPITestCase.java +++ b/src/test/java/org/jenkinsci/plugins/gitclient/GitAPITestCase.java @@ -906,6 +906,52 @@ public void test_clean_with_parameter() throws Exception { } + public void test_submodule_clean_with_parameter() throws Exception { + w = clone(localMirror()); + + // Checkout a branch with submodules + String subBranch = "tests/getSubmodules"; + String subRefName = "origin/" + subBranch; + String ntpDirName = "modules/ntp"; + w.git.checkout().ref(subRefName).branch(subBranch).execute(); + w.git.submoduleUpdate().recursive(true).execute(); + + // Create a submodule in the ntp submodule + String subSubModuleDirname = ntpDirName + File.separator + "sub"; + String fileName = "file"; + String fileLocation = subSubModuleDirname + File.separator + fileName; + assertTrue("Did not create dir " + subSubModuleDirname, w.file(subSubModuleDirname).mkdir()); + w.touch(fileLocation); + + WorkingArea subSubModuleWorkingArea = new WorkingArea(w.file(subSubModuleDirname)); + subSubModuleWorkingArea.init(); + subSubModuleWorkingArea.git.add(fileName); + subSubModuleWorkingArea.git.commit("init"); + + if (w.git instanceof CliGitAPIImpl || !isWindows()) { + // JGit 5.6.0 on Windows throws exception trying to clean submodule, even if you haven't asked it to + // clean a submodule. + // Check that a standard git clean doesn't remove the untracked subsubmodule + w.git.clean(false); + assertTrue(w.exists(fileLocation)); + + // Check that a standard git clean with submodule cleaning doesn't remove the untracked subsubmodule + w.git.clean(true); + assertTrue(w.exists(fileLocation)); + } + + // Check that a standard submodule clean doesn't remove the untracked subsubmodule + w.git.submoduleClean(true); + assertTrue(w.exists(fileLocation)); + + if (w.git instanceof CliGitAPIImpl || !isWindows()) { + // JGit 5.6.0 on Windows throws exception trying to clean submodule + // Check that a submodule clean with submodule cleaning does remove the untracked subsubmodule + w.git.submoduleClean(true, true); + assertFalse(w.exists(fileLocation)); + } + } + @Issue({"JENKINS-20410", "JENKINS-27910", "JENKINS-22434"}) public void test_clean() throws Exception { w.init(); From 7f9a5b6e60bf56918103e6f205ef8f71c56ca185 Mon Sep 17 00:00:00 2001 From: Mark Waite Date: Tue, 11 Apr 2023 12:12:17 -0600 Subject: [PATCH 2/2] Format source changes --- src/main/java/org/jenkinsci/plugins/gitclient/GitClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jenkinsci/plugins/gitclient/GitClient.java b/src/main/java/org/jenkinsci/plugins/gitclient/GitClient.java index ea12682168..c71e923004 100644 --- a/src/main/java/org/jenkinsci/plugins/gitclient/GitClient.java +++ b/src/main/java/org/jenkinsci/plugins/gitclient/GitClient.java @@ -814,7 +814,7 @@ void submoduleUpdate(boolean recursive, boolean remoteTracking, String reference * @throws hudson.plugins.git.GitException if underlying git operation fails. * @throws java.lang.InterruptedException if interrupted. */ - void submoduleClean(boolean recursive, boolean cleanSubmodule) throws GitException, InterruptedException; + void submoduleClean(boolean recursive, boolean cleanSubmodule) throws GitException, InterruptedException; /** * submoduleInit.