Commit be643784 authored by mamunozgil's avatar mamunozgil
Browse files

Refactor RepoUtil for SVN Checkout

parent c5229b90
1 merge request!2SVN functionality support.
Pipeline #10751 passed with stage
in 19 seconds
This commit is part of merge request !2. Comments created here will be created in the context of that merge request.
Showing with 75 additions and 63 deletions
+75 -63
......@@ -13,9 +13,6 @@ import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.BasicAuthenticationManager;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.SVNUpdateClient;
import org.tmatesoft.svn.core.wc.SVNWCUtil;
import org.tmatesoft.svn.core.wc2.SvnCheckout;
import org.tmatesoft.svn.core.wc2.SvnOperationFactory;
......@@ -23,7 +20,6 @@ import org.tmatesoft.svn.core.wc2.SvnTarget;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Matcher;
......@@ -35,86 +31,102 @@ public class RepoUtil {
public RepoUtil() {}
public void cloneRepository(Matcher config, String targetPath, String subDir) {
LOG.debug(String.format("cloning repository: %s", config.group(1)));
LOG.info(String.format("Cloning repository: %s", config.group(1)));
File targetDirectory = new File(targetPath);
if (targetDirectory.exists()) {
LOG.debug("clone target directory existing yet, deleting now");
LOG.info("Target directory exists. Deleting...");
FileSystemUtils.deleteRecursively(targetDirectory);
}
File checkoutDirectory = targetDirectory;
//if an optional directory parameter was given
if(subDir!="")
{
//create companion checkout dir "targetPath"+"_checkout"
checkoutDirectory = new File(targetPath+"_checkout");
// If an optional subdirectory parameter is provided
if (!subDir.isEmpty()) {
checkoutDirectory = new File(targetPath + "_checkout");
if (checkoutDirectory.exists()) {
LOG.debug("clone checkout directory existing yet, deleting now");
FileSystemUtils.deleteRecursively(checkoutDirectory);
LOG.info("Checkout directory exists. Deleting...");
FileSystemUtils.deleteRecursively(checkoutDirectory);
}
}
try {
LOG.debug("preparing clone");
if (config.group(1).endsWith(".git")) {
CloneCommand cloneCommand = Git.cloneRepository()
.setDirectory(checkoutDirectory)
.setURI(config.group(1));
if (!config.group(2).equals("none") && !config.group(3).equals("none")) {
LOG.debug("setting credentials");
cloneCommand.setCredentialsProvider(new UsernamePasswordCredentialsProvider(config.group(2), config.group(3)));
}
LOG.debug("cloning...");
cloneCommand.call().close();
}
else {
URL sourceUrl=new URL(config.group(1));
LOG.info("Preparing to clone...");
if (config.group(1).endsWith(".git") || config.group(1).contains("git")) {
// Git cloning
CloneCommand cloneCommand = Git.cloneRepository()
.setDirectory(checkoutDirectory)
.setURI(config.group(1));
if (!config.group(2).equals("none") && !config.group(3).equals("none")) {
LOG.info("Setting Git credentials...");
cloneCommand.setCredentialsProvider(new UsernamePasswordCredentialsProvider(config.group(2), config.group(3)));
}
LOG.info("Cloning Git repository...");
cloneCommand.call().close();
} else {
// SVN Checkout
URL sourceUrl = new URL(config.group(1));
SVNURL url = SVNURL.create(sourceUrl.getProtocol(), null, sourceUrl.getHost(), sourceUrl.getPort(), sourceUrl.getPath(), false);
SvnOperationFactory operationFactory = new SvnOperationFactory();
SvnCheckout checkout = operationFactory.createCheckout();
checkout.setSingleTarget(SvnTarget.fromFile(new File(checkoutDirectory)));
String directoryString = checkoutDirectory.toString();
File directory = new File(directoryString);
if (!directory.exists()) {
LOG.info("Target directory does not exist. Creating: " + directoryString);
if (!directory.mkdirs()) {
throw new IOException("Failed to create target directory: " + directoryString);
}
}
checkout.setSingleTarget(SvnTarget.fromFile(directory));
checkout.setSource(SvnTarget.fromURL(url));
checkout.setDepth(SVNDepth.INFINITY);
String protocol = url.getProtocol();
String protocol = url.getProtocol();
if (!config.group(2).equals("none") && !config.group(3).equals("none")) {
if (protocol.equals("https")) {
LOG.debug("Setting SVN credentials for HTTPS checkout with username/password");
operationFactory.setAuthenticationManager(new BasicAuthenticationManager(config.group(2), config.group(3)));
}
else if (protocol.equals("svn+ssh")) {
LOG.debug("Setting credentials for SVN+SSH Authentication with username/password");
//ISVNAuthenticationManager authManager = new BasicAuthenticationManager(new SVNAuthentication[] { new SVNSSHAuthentication(username, password, -1, false)});//SVNWCUtil.createDefaultAuthenticationManager(username, password);
ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(config.group(2), config.group(3).toCharArray());
operationFactory.setAuthenticationManager(authManager);
}
if (protocol.equalsIgnoreCase("https")) {
LOG.info("Setting SVN credentials for HTTPS...");
operationFactory.setAuthenticationManager(BasicAuthenticationManager.newInstance(config.group(2), config.group(3).toCharArray()));
} else if (protocol.equalsIgnoreCase("svn+ssh")) {
LOG.info("Setting SVN credentials for SVN+SSH...");
ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(config.group(2), config.group(3).toCharArray());
operationFactory.setAuthenticationManager(authManager);
}
}
checkout.run();
LOG.debug("SVN checkout completed successfully.");
}
//if an optional directory parameter was given
if(subDir!="")
{
//copy appropriate path from checkout directory to target directory
FileSystemUtils.copyRecursively(new File(checkoutDirectory+subDir), new File(targetPath));
try {
LOG.info("Performing SVN checkout...");
checkout.run();
LOG.info("SVN checkout completed successfully.");
} catch (Exception e) {
LOG.error("Error during SVN checkout: " + e.getMessage(), e);
throw e;
}
}
LOG.debug(String.format("cloned from %s via %s to %s", config.group(1), checkoutDirectory+subDir, targetDirectory));
}
catch (IOException e) {
LOG.error(String.format("Error while cloning from %s: could not copy to unit test dir", config.group(1)), e);
}
catch (GitAPIException e) {
LOG.error(String.format("Error while cloning from %s: could not read from Git", config.group(1)), e);
}
catch (SVNException e) {
LOG.error(String.format("Error while cloning from %s: could not read from Svn", config.group(1)), e);
// If an optional subdirectory parameter is provided
if (!subDir.isEmpty()) {
File subDirPath = new File(checkoutDirectory, subDir);
if (!subDirPath.exists() || !subDirPath.isDirectory()) {
LOG.error("Specified subdirectory does not exist in the repository: " + subDirPath.getPath());
throw new IllegalArgumentException("Invalid subdirectory: " + subDirPath.getPath());
}
LOG.info("Copying subdirectory to target...");
FileSystemUtils.copyRecursively(subDirPath, new File(targetPath));
}
LOG.info(String.format("Cloned from %s via %s to %s", config.group(1), checkoutDirectory + subDir, targetDirectory));
} catch (IOException e) {
LOG.error(String.format("Error while cloning from %s: could not copy to target directory", config.group(1)), e);
} catch (GitAPIException e) {
LOG.error(String.format("Error while cloning Git repository %s: %s", config.group(1), e.getMessage()), e);
} catch (SVNException e) {
LOG.error(String.format("Error while cloning SVN repository %s: %s", config.group(1), e.getMessage()), e);
}
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment