Skip to content

Commit

Permalink
Remove usage of Maven SCM API
Browse files Browse the repository at this point in the history
Co-authored-by: Olivier Lamy <olamy@apache.org>
  • Loading branch information
basil and olamy committed Jan 13, 2023
1 parent b4f0bb6 commit 1150ee4
Show file tree
Hide file tree
Showing 9 changed files with 127 additions and 255 deletions.
91 changes: 0 additions & 91 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
<changelist>999999-SNAPSHOT</changelist>
<gitHubRepo>jenkinsci/plugin-compat-tester</gitHubRepo>
<logbackVersion>1.4.5</logbackVersion>
<maven.scm.providers.version>1.6</maven.scm.providers.version>
<spotbugs.effort>Max</spotbugs.effort>
</properties>

Expand Down Expand Up @@ -72,11 +71,6 @@
<artifactId>jcommander</artifactId>
<version>1.82</version>
</dependency>
<dependency>
<groupId>com.google.code.maven-scm-provider-svnjava</groupId>
<artifactId>maven-scm-provider-svnjava</artifactId>
<version>1.12</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
Expand All @@ -87,91 +81,6 @@
<artifactId>maven-model</artifactId>
<version>3.8.7</version>
</dependency>
<dependency>
<groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm-manager-plexus</artifactId>
<version>${maven.scm.providers.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm-provider-accurev</artifactId>
<version>${maven.scm.providers.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm-provider-bazaar</artifactId>
<version>${maven.scm.providers.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm-provider-clearcase</artifactId>
<version>${maven.scm.providers.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm-provider-cvsexe</artifactId>
<version>${maven.scm.providers.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm-provider-cvsjava</artifactId>
<version>${maven.scm.providers.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm-provider-gitexe</artifactId>
<version>${maven.scm.providers.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm-provider-hg</artifactId>
<version>${maven.scm.providers.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm-provider-local</artifactId>
<version>${maven.scm.providers.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm-provider-perforce</artifactId>
<version>${maven.scm.providers.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm-provider-starteam</artifactId>
<version>${maven.scm.providers.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm-provider-synergy</artifactId>
<version>${maven.scm.providers.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm-provider-tfs</artifactId>
<version>${maven.scm.providers.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm-provider-vss</artifactId>
<version>${maven.scm.providers.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-container-default</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-slf4j-logging</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-utils</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.jenkins-ci.main</groupId>
<artifactId>jenkins-core</artifactId>
Expand Down
141 changes: 111 additions & 30 deletions src/main/java/org/jenkins/tools/test/PluginCompatTester.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.nio.charset.Charset;
Expand Down Expand Up @@ -81,14 +82,6 @@
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Model;
import org.apache.maven.model.Parent;
import org.apache.maven.scm.ScmException;
import org.apache.maven.scm.ScmFileSet;
import org.apache.maven.scm.ScmTag;
import org.apache.maven.scm.command.checkout.CheckOutScmResult;
import org.apache.maven.scm.manager.ScmManager;
import org.apache.maven.scm.repository.ScmRepository;
import org.codehaus.plexus.PlexusContainerException;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.io.RawInputStreamFacade;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
Expand Down Expand Up @@ -167,7 +160,7 @@ private SortedSet<MavenCoordinates> generateCoreCoordinatesToTest(UpdateSite.Dat
}

public PluginCompatReport testPlugins()
throws PlexusContainerException, IOException, PomExecutionException, XmlPullParserException {
throws IOException, PomExecutionException, XmlPullParserException {
File war = config.getWar();
if (war != null) {
populateSplits(war);
Expand Down Expand Up @@ -258,7 +251,6 @@ public PluginCompatReport testPlugins()
report.setTestJavaVersion(config.getTestJavaVersion());

boolean failed = false;
SCMManagerFactory.getInstance().start();
ROOT_CYCLE: for(MavenCoordinates coreCoordinates : testedCores){
System.out.println("Starting plugin tests on core coordinates : "+coreCoordinates.toString());
for (Plugin plugin : pluginsToCheck.values()) {
Expand Down Expand Up @@ -516,9 +508,6 @@ private TestExecutionResult testPluginAgainst(MavenCoordinates coreCoordinates,
}
System.out.println("The plugin has already been checked out, likely due to a multimodule situation. Continue.");
}
} catch (ComponentLookupException e) {
System.err.println("Error : " + e.getMessage());
throw new PluginSourcesUnavailableException("Problem while creating ScmManager !", e);
} catch (Exception e) {
System.err.println("Error : " + e.getMessage());
throw new PluginSourcesUnavailableException("Problem while checking out plugin sources!", e);
Expand Down Expand Up @@ -613,7 +602,7 @@ private TestExecutionResult testPluginAgainst(MavenCoordinates coreCoordinates,
}
}

public void cloneFromSCM(PomData pomData, String name, String version, File checkoutDirectory, String tag) throws ComponentLookupException, ScmException, IOException {
public void cloneFromSCM(PomData pomData, String name, String version, File checkoutDirectory, String tag) throws IOException {
String scmTag = !(tag.equals("")) ? tag : getScmTag(pomData, name, version);
String connectionURLPomData = pomData.getConnectionUrl();
List<String> connectionURLs = new ArrayList<String>();
Expand All @@ -622,30 +611,122 @@ public void cloneFromSCM(PomData pomData, String name, String version, File chec
connectionURLs = getFallbackConnectionURL(connectionURLs, connectionURLPomData, config.getFallbackGitHubOrganization());
}

Boolean repositoryCloned = false;
String errorMessage = "";
ScmRepository repository;
ScmManager scmManager = SCMManagerFactory.getInstance().createScmManager();
IOException lastException = null;
for (String connectionURL: connectionURLs){
if (connectionURL != null) {
connectionURL = connectionURL.replace("git://", "https://"); // See: https://github.blog/2021-09-01-improving-git-protocol-security-github/
}
System.out.println("Checking out from SCM connection URL : " + connectionURL + " (" + name + "-" + version + ") at tag " + scmTag);
if (checkoutDirectory.isDirectory()) {
FileUtils.deleteDirectory(checkoutDirectory);
}
repository = scmManager.makeScmRepository(connectionURL);
CheckOutScmResult result = scmManager.checkOut(repository, new ScmFileSet(checkoutDirectory), new ScmTag(scmTag));
if(result.isSuccess()){
repositoryCloned = true;
try {
clone(connectionURL, scmTag, checkoutDirectory);
break;
} else {
errorMessage = result.getProviderMessage() + " || " + result.getCommandOutput();
} catch (IOException e) {
if (lastException != null) {
e.addSuppressed(lastException);
}
lastException = e;
}
}

if (!repositoryCloned) {
throw new RuntimeException(errorMessage);
if (lastException != null) {
throw new UncheckedIOException(lastException);
}
}

/**
* Clone the given Git repository in the given checkout directory by running, in order, the
* following CLI operations:
*
* <ul>
* <li><code>git init</code>
* <li><code>git remote add origin url</code>
* <li><code>git fetch origin ${SCM_TAG}</code>
* <li><code>git checkout FETCH_HEAD</code>
* </ul>
*
* @param connectionURL The connection URL, in a format such as
* scm:git:https://github.com/jenkinsci/mailer-plugin.git or
* https://github.com/jenkinsci/mailer-plugin.git
* @param scmTag the tag or sha1 hash to clone
* @param checkoutDirectory the directory in which to clone the Git repository
* @throws IOException if an error occurs
*/
public static void clone(String connectionURL, String scmTag, File checkoutDirectory)
throws IOException {
System.out.println("Checking out from SCM connection URL " + connectionURL + " at " + scmTag);

/*
* We previously used the Maven SCM API to clone the repository, which ran the following
* commands:
*
* git clone --depth 1 --branch ${SCM_TAG} ${CONNECTION_URL}
* git ls-remote ${CONNECTION_URL}
* git fetch ${CONNECTION_URL}
* git checkout ${SCM_TAG}
* git ls-files
*
* This proved to be inefficient, so we instead run only the commands we need to run:
*
* git init
* git fetch ${CONNECTION_URL} ${SCM_TAG} (this will work with a SHA1 hash or a tag)
* git checkout FETCH_HEAD
*/
if (checkoutDirectory.isDirectory()) {
org.apache.commons.io.FileUtils.deleteDirectory(checkoutDirectory);
}
Files.createDirectories(checkoutDirectory.toPath());

// git init
Process p = new ProcessBuilder()
.directory(checkoutDirectory)
.command("git", "init")
.redirectErrorStream(true)
.start();
try {
int exitStatus = p.waitFor();
String output = new String(p.getInputStream().readAllBytes(), Charset.defaultCharset()).trim();
if (exitStatus != 0) {
throw new IOException("git init failed with exit status " + exitStatus + ": " + output);
}
} catch (InterruptedException e) {
throw new IOException("git init was interrupted", e);
}

// git fetch ${CONNECTION_URL} ${SCM_TAG}
String gitUrl;
if (StringUtils.startsWith(connectionURL, "scm:git:")) {
gitUrl = StringUtils.substringAfter(connectionURL, "scm:git:");
} else {
gitUrl = connectionURL;
}
p = new ProcessBuilder()
.directory(checkoutDirectory)
.command("git", "fetch", gitUrl, scmTag)
.redirectErrorStream(true)
.start();
try {
int exitStatus = p.waitFor();
String output = new String(p.getInputStream().readAllBytes(), Charset.defaultCharset()).trim();
if (exitStatus != 0) {
throw new IOException("git fetch origin failed with exit status " + exitStatus + ": " + output);
}
} catch (InterruptedException e) {
throw new IOException("git fetch origin was interrupted", e);
}

// git checkout FETCH_HEAD
p = new ProcessBuilder()
.directory(checkoutDirectory)
.command("git", "checkout", "FETCH_HEAD")
.redirectErrorStream(true)
.start();
try {
int exitStatus = p.waitFor();
String output = new String(p.getInputStream().readAllBytes(), Charset.defaultCharset()).trim();
if (exitStatus != 0) {
throw new IOException("git checkout FETCH_HEAD failed with exit status " + exitStatus + ": " + output);
}
} catch (InterruptedException e) {
throw new IOException("git checkout FETCH_HEAD was interrupted", e);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.codehaus.plexus.PlexusContainerException;
import org.jenkins.tools.test.model.PluginCompatTesterConfig;
import org.jenkins.tools.test.exception.PomExecutionException;
import org.jenkins.tools.test.model.TestStatus;
Expand All @@ -51,7 +50,7 @@ public class PluginCompatTesterCli {
value = "NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE",
justification =
"We're already checking for null in each relevant instance, so why does SpotBugs complain?")
public static void main(String[] args) throws IOException, PlexusContainerException, PomExecutionException, XmlPullParserException {
public static void main(String[] args) throws IOException, PomExecutionException, XmlPullParserException {
CliOptions options = new CliOptions();
JCommander jcommander = null;
try {
Expand Down

0 comments on commit 1150ee4

Please sign in to comment.