From 18d298d65e127384d46d01de845a4a76daee9103 Mon Sep 17 00:00:00 2001 From: wuwen Date: Sun, 2 Jul 2023 13:25:22 +0800 Subject: [PATCH] [SCM-530] Add support for git submodules to git SCM provider --- .../command/checkout/GitCheckOutCommand.java | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommand.java index ddb8bd8df..001cf23ea 100644 --- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommand.java +++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommand.java @@ -70,6 +70,7 @@ public ScmResult executeCommand(ScmProviderRepository repo, ScmFileSet fileSet, ScmVersion version = parameters.getScmVersion(CommandParameter.SCM_VERSION, null); boolean binary = parameters.getBoolean(CommandParameter.BINARY, false); boolean shallow = parameters.getBoolean(CommandParameter.SHALLOW, false); + boolean recursive = parameters.getBoolean(CommandParameter.RECURSIVE, false); GitScmProviderRepository repository = (GitScmProviderRepository) repo; @@ -135,11 +136,30 @@ && new File(fileSet.getBasedir(), ".git").exists() lastCommandLine = clCheckout.toString(); } + if (recursive) { + // and now lets do the git-submodule update + Commandline clSubmoduleUpdate = createSubmoduleUpdateCommand(fileSet.getBasedir()); + + exitCode = GitCommandLineUtils.execute(clSubmoduleUpdate, stdout, stderr); + if (exitCode != 0) { + return new CheckOutScmResult( + clSubmoduleUpdate.toString(), + "The git-submodule update command failed.", + stderr.getOutput(), + false); + } + lastCommandLine = clSubmoduleUpdate.toString(); + } + // and now search for the files GitListConsumer listConsumer = new GitListConsumer(fileSet.getBasedir(), ScmFileStatus.CHECKED_IN); Commandline clList = GitListCommand.createCommandLine(repository, fileSet.getBasedir()); + if (recursive) { + clList.createArg().setValue("--recurse-submodules"); + } + exitCode = GitCommandLineUtils.execute(clList, listConsumer, stderr); if (exitCode != 0) { return new CheckOutScmResult( @@ -164,6 +184,19 @@ public static Commandline createCommandLine( return cl; } + /** + * create a git-submodule update command + */ + Commandline createSubmoduleUpdateCommand(File workingDirectory) { + Commandline cl = GitCommandLineUtils.getBaseGitCommandLine(workingDirectory, "submodule"); + + cl.createArg().setValue("update"); + cl.createArg().setValue("--init"); + cl.createArg().setValue("--recursive"); + + return cl; + } + /** * create a git-clone repository command */ @@ -184,7 +217,7 @@ private Commandline createCloneCommand( cl.createArg().setValue("1"); } - if (version != null && (version instanceof ScmBranch)) { + if (version instanceof ScmBranch) { cl.createArg().setValue("--branch");