diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/client/spi/GitCommitCommand.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/client/spi/GitCommitCommand.java index 847e0c5012..3e82bc3567 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/client/spi/GitCommitCommand.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/client/spi/GitCommitCommand.java @@ -82,35 +82,22 @@ public class GitCommitCommand implements CommitCommand @Override public Changeset commit(CommitRequest request) throws IOException { - Changeset changeset = null; - GitChangesetConverter converter = null; - - try + try (GitChangesetConverter converter = new GitChangesetConverter(git.getRepository())) { RevCommit commit = git.commit().setAuthor( request.getAuthor().getName(), request.getAuthor().getMail()).setMessage( request.getMessage()).call(); - converter = new GitChangesetConverter(git.getRepository()); - changeset = converter.createChangeset(commit); + return converter.createChangeset(commit); + } catch (GitAPIException ex) { + throw new RepositoryClientException("could not commit changes to repository", ex); } - catch (GitAPIException ex) - { - throw new RepositoryClientException( - "could not commit changes to repository", ex); - } - finally - { - Closeables.closeQuietly(converter); - } - - return changeset; } //~--- fields --------------------------------------------------------------- /** Field description */ - private Git git; + private final Git git; } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/client/spi/GitRepositoryClientFactoryProvider.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/client/spi/GitRepositoryClientFactoryProvider.java index dca08e80c4..355a2f4b14 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/client/spi/GitRepositoryClientFactoryProvider.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/client/spi/GitRepositoryClientFactoryProvider.java @@ -105,13 +105,18 @@ public class GitRepositoryClientFactoryProvider { Git git = null; - CredentialsProvider credentialsProvider = - new UsernamePasswordCredentialsProvider(username, password); + CredentialsProvider credentialsProvider = null; + if ( username != null && password != null ) { + credentialsProvider = new UsernamePasswordCredentialsProvider(username, password); + } try { - git = Git.cloneRepository().setURI(url).setDirectory( - workingCopy).setCredentialsProvider(credentialsProvider).call(); + git = Git.cloneRepository() + .setURI(url) + .setDirectory(workingCopy) + .setCredentialsProvider(credentialsProvider) + .call(); } catch (GitAPIException ex) { diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/client/spi/GitRepositoryClientProvider.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/client/spi/GitRepositoryClientProvider.java index 9316971c87..2226ad04df 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/client/spi/GitRepositoryClientProvider.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/client/spi/GitRepositoryClientProvider.java @@ -35,6 +35,7 @@ package sonia.scm.repository.client.spi; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.collect.ImmutableSet; +import java.io.File; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.transport.CredentialsProvider; @@ -188,6 +189,11 @@ public class GitRepositoryClientProvider extends RepositoryClientProvider return new GitTagCommand(git); } + @Override + public File getWorkingCopy() { + return git.getRepository().getDirectory(); + } + //~--- fields --------------------------------------------------------------- /** Field description */ diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/client/spi/HgPushCommand.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/client/spi/HgPushCommand.java index 47144dad35..73e0a1f9a4 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/client/spi/HgPushCommand.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/client/spi/HgPushCommand.java @@ -31,7 +31,9 @@ package sonia.scm.repository.client.spi; import com.aragost.javahg.Repository; +import com.aragost.javahg.commands.ExecutionException; import java.io.IOException; +import sonia.scm.repository.client.api.RepositoryClientException; /** * Mercurial implementation of the {@link PushCommand}. @@ -55,7 +57,11 @@ public class HgPushCommand implements PushCommand { com.aragost.javahg.commands.PushCommand cmd = com.aragost.javahg.commands.PushCommand.on(repository); cmd.cmdAppend("--new-branch"); - cmd.execute(url); + try { + cmd.execute(url); + } catch (ExecutionException ex) { + throw new RepositoryClientException("push to repository failed", ex); + } } } diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/client/spi/HgRepositoryClientFactoryProvider.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/client/spi/HgRepositoryClientFactoryProvider.java index ad83abc97b..a6e93ae7ac 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/client/spi/HgRepositoryClientFactoryProvider.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/client/spi/HgRepositoryClientFactoryProvider.java @@ -32,6 +32,7 @@ package sonia.scm.repository.client.spi; import com.aragost.javahg.Repository; import com.aragost.javahg.RepositoryConfiguration; +import com.aragost.javahg.commands.ExecutionException; import com.aragost.javahg.commands.PullCommand; import com.google.common.base.Strings; import java.io.File; @@ -40,6 +41,7 @@ import java.net.URL; import sonia.scm.io.INIConfiguration; import sonia.scm.io.INIConfigurationWriter; import sonia.scm.io.INISection; +import sonia.scm.repository.client.api.RepositoryClientException; import sonia.scm.util.IOUtil; /** @@ -53,19 +55,17 @@ public class HgRepositoryClientFactoryProvider implements RepositoryClientFactor private static final String TYPE = "hg"; @Override - public RepositoryClientProvider create(File main, File workingCopy) throws IOException - { + public RepositoryClientProvider create(File main, File workingCopy) throws IOException { return create(main.toURI().toString(), null, null, workingCopy); } @Override public RepositoryClientProvider create(String url, String username, String password, File workingCopy) - throws IOException - { + throws IOException { RepositoryConfiguration configuration = new RepositoryConfiguration(); String binary = IOUtil.search("hg"); if (Strings.isNullOrEmpty(binary)){ - throw new IOException("could not find mercurial binary (hg)"); + throw new RepositoryClientException("could not find mercurial binary (hg)"); } configuration.setHgBin(binary); @@ -77,13 +77,18 @@ public class HgRepositoryClientFactoryProvider implements RepositoryClientFactor } Repository repository = Repository.create(configuration, workingCopy); - PullCommand.on(repository).execute(url); + try { + PullCommand command = PullCommand.on(repository); + command.cmdAppend("-u"); + command.execute(url); + } catch (ExecutionException ex) { + throw new RepositoryClientException("failed to pull from remote repository", ex); + } return new HgRepositoryClientProvider(repository, hgrc, url); } - private File createHgrc(String url, String username, String password) throws IOException - { + private File createHgrc(String url, String username, String password) throws IOException { URL repositoryUrl = new URL(url); INIConfiguration hgConfig = new INIConfiguration(); @@ -101,8 +106,7 @@ public class HgRepositoryClientFactoryProvider implements RepositoryClientFactor ); authSection.setParameter(prefix + "schemes", repositoryUrl.getProtocol()); authSection.setParameter(prefix + "username", username); - if (!Strings.isNullOrEmpty(password)) - { + if (!Strings.isNullOrEmpty(password)) { authSection.setParameter(prefix + "password", password); } hgConfig.addSection(authSection); @@ -114,8 +118,7 @@ public class HgRepositoryClientFactoryProvider implements RepositoryClientFactor } @Override - public String getType() - { + public String getType() { return TYPE; } diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/client/spi/HgRepositoryClientProvider.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/client/spi/HgRepositoryClientProvider.java index 353e6a5b46..583fe7f488 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/client/spi/HgRepositoryClientProvider.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/client/spi/HgRepositoryClientProvider.java @@ -103,6 +103,11 @@ public class HgRepositoryClientProvider extends RepositoryClientProvider return new HgPushCommand(repository, url); } + @Override + public File getWorkingCopy() { + return repository.getDirectory(); + } + @Override public void close() throws IOException { diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/client/spi/SvnCommitCommand.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/client/spi/SvnCommitCommand.java index 11f848bf84..3142a7be51 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/client/spi/SvnCommitCommand.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/client/spi/SvnCommitCommand.java @@ -32,7 +32,6 @@ package sonia.scm.repository.client.spi; import java.io.File; import java.io.IOException; -import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.tmatesoft.svn.core.SVNCommitInfo; @@ -46,8 +45,10 @@ import org.tmatesoft.svn.core.wc2.SvnCommit; import org.tmatesoft.svn.core.wc2.SvnLog; import org.tmatesoft.svn.core.wc2.SvnRevisionRange; import org.tmatesoft.svn.core.wc2.SvnTarget; + import sonia.scm.repository.Changeset; import sonia.scm.repository.SvnUtil; +import sonia.scm.repository.client.api.RepositoryClientException; /** * @@ -71,18 +72,14 @@ public class SvnCommitCommand implements CommitCommand { public Changeset commit(CommitRequest request) throws IOException { SVNWCClient wClient = client.getWCClient(); - List filesToCommit = new ArrayList<>(); - // add files try { wClient.doAdd(addedFiles.toArray(new File[0]), true, false, false, SVNDepth.INFINITY, false, false, false); - - filesToCommit.addAll(addedFiles); addedFiles.clear(); } catch (SVNException ex) { - throw new IOException("failed to add files", ex); + throw new RepositoryClientException("failed to add files", ex); } // remove files @@ -92,19 +89,15 @@ public class SvnCommitCommand implements CommitCommand { File file = removeIt.next(); wClient.doDelete(file, false, true, false); removeIt.remove(); - filesToCommit.add(file); } } catch (SVNException ex) { - throw new IOException("failed to remove files", ex); + throw new RepositoryClientException("failed to remove files", ex); } - SvnTarget workingCopyTarget = SvnTarget.fromFile(workingCopy); Changeset changeset; SVNCommitInfo info; - - // commit files try { SvnCommit commit = client.getOperationFactory().createCommit(); @@ -120,7 +113,7 @@ public class SvnCommitCommand implements CommitCommand { } } catch (SVNException ex) { - throw new IOException("failed to commit", ex); + throw new RepositoryClientException("failed to commit", ex); } // get log for commit @@ -133,7 +126,7 @@ public class SvnCommitCommand implements CommitCommand { changeset = SvnUtil.createChangeset(log.run()); } catch (SVNException ex) { - throw new IOException("failed to create log entry for last commit", ex); + throw new RepositoryClientException("failed to create log entry for last commit", ex); } return changeset; diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/client/spi/SvnRepositoryClientFactoryProvider.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/client/spi/SvnRepositoryClientFactoryProvider.java index 2acd816382..486a6ae402 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/client/spi/SvnRepositoryClientFactoryProvider.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/client/spi/SvnRepositoryClientFactoryProvider.java @@ -44,6 +44,7 @@ import org.tmatesoft.svn.core.wc.SVNUpdateClient; import org.tmatesoft.svn.core.wc.SVNWCUtil; import org.tmatesoft.svn.core.wc2.SvnOperationFactory; import sonia.scm.repository.SvnRepositoryHandler; +import sonia.scm.repository.client.api.RepositoryClientException; /** * Client provider factory for subversion. @@ -60,7 +61,7 @@ public class SvnRepositoryClientFactoryProvider implements RepositoryClientFacto try { source = SVNURL.fromFile(workingCopy); } catch (SVNException ex) { - throw new IOException("failed to parse svn url", ex); + throw new RepositoryClientException("failed to parse svn url", ex); } // create client @@ -69,11 +70,11 @@ public class SvnRepositoryClientFactoryProvider implements RepositoryClientFacto try { updateClient.doCheckout(source, workingCopy, SVNRevision.HEAD, SVNRevision.HEAD, SVNDepth.INFINITY, true); } catch (SVNException ex) { - throw new IOException("failed to checkout repository", ex); + throw new RepositoryClientException("failed to checkout repository", ex); } // return client provider - return new SvnRepositoryClientProvider(client, source, workingCopy); + return new SvnRepositoryClientProvider(client, workingCopy); } @Override @@ -101,7 +102,7 @@ public class SvnRepositoryClientFactoryProvider implements RepositoryClientFacto try { remoteUrl = SVNURL.parseURIEncoded(url); } catch (SVNException ex) { - throw new IOException("failed to parse svn url", ex); + throw new RepositoryClientException("failed to parse svn url", ex); } // initial checkout @@ -109,11 +110,11 @@ public class SvnRepositoryClientFactoryProvider implements RepositoryClientFacto try { updateClient.doCheckout(remoteUrl, workingCopy, SVNRevision.HEAD, SVNRevision.HEAD, SVNDepth.INFINITY, true); } catch (SVNException ex) { - throw new IOException("failed to checkout repository", ex); + throw new RepositoryClientException("failed to checkout repository", ex); } // return client provider - return new SvnRepositoryClientProvider(client, remoteUrl, workingCopy); + return new SvnRepositoryClientProvider(client, workingCopy); } @Override diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/client/spi/SvnRepositoryClientProvider.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/client/spi/SvnRepositoryClientProvider.java index 6bae8d7483..609ae1441b 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/client/spi/SvnRepositoryClientProvider.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/client/spi/SvnRepositoryClientProvider.java @@ -52,15 +52,13 @@ public class SvnRepositoryClientProvider extends RepositoryClientProvider { ); private final SVNClientManager client; - private final SVNURL remoteRepositoryURL; private final File workingCopy; private final List addedFiles = new ArrayList<>(); private final List removedFiles = new ArrayList<>(); - SvnRepositoryClientProvider(SVNClientManager client, SVNURL remoteRepositoryURL, File workingCopy) { + SvnRepositoryClientProvider(SVNClientManager client, File workingCopy) { this.client = client; - this.remoteRepositoryURL = remoteRepositoryURL; this.workingCopy = workingCopy; } @@ -78,6 +76,11 @@ public class SvnRepositoryClientProvider extends RepositoryClientProvider { public SvnCommitCommand getCommitCommand() { return new SvnCommitCommand(client, workingCopy, addedFiles, removedFiles); } + + @Override + public File getWorkingCopy() { + return workingCopy; + } @Override public Set getSupportedClientCommands() { diff --git a/scm-test/src/main/java/sonia/scm/repository/client/api/RepositoryClient.java b/scm-test/src/main/java/sonia/scm/repository/client/api/RepositoryClient.java index 1be14e9972..d82170c150 100644 --- a/scm-test/src/main/java/sonia/scm/repository/client/api/RepositoryClient.java +++ b/scm-test/src/main/java/sonia/scm/repository/client/api/RepositoryClient.java @@ -44,6 +44,7 @@ import sonia.scm.repository.client.spi.RepositoryClientProvider; //~--- JDK imports ------------------------------------------------------------ import java.io.Closeable; +import java.io.File; /** * @@ -188,6 +189,16 @@ public final class RepositoryClient implements Closeable return new TagCommandBuilder(clientProvider.getTagCommand()); } + /** + * Returns the working copy of the repository. + * + * @return working copy + * @since 1.51 + */ + public File getWorkingCopy() { + return clientProvider.getWorkingCopy(); + } + /** * Method description * @@ -204,5 +215,5 @@ public final class RepositoryClient implements Closeable //~--- fields --------------------------------------------------------------- /** Field description */ - private RepositoryClientProvider clientProvider; + private final RepositoryClientProvider clientProvider; } diff --git a/scm-test/src/main/java/sonia/scm/repository/client/spi/RepositoryClientProvider.java b/scm-test/src/main/java/sonia/scm/repository/client/spi/RepositoryClientProvider.java index 1e2632f589..dd32ee066f 100644 --- a/scm-test/src/main/java/sonia/scm/repository/client/spi/RepositoryClientProvider.java +++ b/scm-test/src/main/java/sonia/scm/repository/client/spi/RepositoryClientProvider.java @@ -40,6 +40,7 @@ import sonia.scm.repository.client.api.ClientCommandNotSupportedException; //~--- JDK imports ------------------------------------------------------------ import java.io.Closeable; +import java.io.File; import java.io.IOException; import java.util.Set; @@ -138,4 +139,12 @@ public abstract class RepositoryClientProvider implements Closeable { throw new ClientCommandNotSupportedException(ClientCommand.TAG); } + + /** + * Returns the working copy of the repository client. + * + * @return working copy + * @since 1.51 + */ + public abstract File getWorkingCopy(); } diff --git a/scm-webapp/src/test/java/sonia/scm/it/AnonymousAccessITCase.java b/scm-webapp/src/test/java/sonia/scm/it/AnonymousAccessITCase.java index 6137cde0ae..740a3419b8 100644 --- a/scm-webapp/src/test/java/sonia/scm/it/AnonymousAccessITCase.java +++ b/scm-webapp/src/test/java/sonia/scm/it/AnonymousAccessITCase.java @@ -52,9 +52,6 @@ import sonia.scm.repository.Permission; import sonia.scm.repository.PermissionType; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryTestData; -import sonia.scm.repository.client.RepositoryClient; -import sonia.scm.repository.client.RepositoryClientException; -import sonia.scm.repository.client.RepositoryClientFactory; import static org.junit.Assert.*; @@ -73,6 +70,9 @@ import java.io.IOException; import java.util.Arrays; import java.util.Collection; +import sonia.scm.repository.client.api.RepositoryClient; +import sonia.scm.repository.client.api.RepositoryClientFactory; + /** * * @author Sebastian Sdorra @@ -189,14 +189,11 @@ public class AnonymousAccessITCase /** * Issue 97 * - * * @throws IOException - * @throws RepositoryClientException */ @Test @Ignore - public void testAllowedAnonymousPush() - throws IOException, RepositoryClientException + public void testAllowedAnonymousPush() throws IOException { Client client = createAdminClient(); WebResource resource = createResource(client, @@ -208,7 +205,7 @@ public class AnonymousAccessITCase RepositoryClient repositoryClient = createAnonymousRepositoryClient(); createRandomFile(repositoryClient); - repositoryClient.commit("added test files"); + commit(repositoryClient, "added test files"); } /** @@ -216,34 +213,30 @@ public class AnonymousAccessITCase * * * @throws IOException - * @throws RepositoryClientException */ @Test - public void testAnonymousClone() throws RepositoryClientException, IOException + public void testAnonymousClone() throws IOException { testSimpleAdminPush(); RepositoryClient client = createAnonymousRepositoryClient(); - client.checkout(); + // client.checkout(); } /** * Method description * - * * @throws IOException - * @throws RepositoryClientException */ @Ignore - @Test(expected = RepositoryClientException.class) - public void testDeniedAnonymousPush() - throws IOException, RepositoryClientException + @Test(expected = IOException.class) + public void testDeniedAnonymousPush() throws IOException { RepositoryClient repositoryClient = createAnonymousRepositoryClient(); createRandomFile(repositoryClient); - repositoryClient.commit("added anonymous test file"); + commit(repositoryClient, "added anonymous test file"); } /** @@ -251,81 +244,30 @@ public class AnonymousAccessITCase * * * @throws IOException - * @throws RepositoryClientException */ @Test - public void testSimpleAdminPush() - throws RepositoryClientException, IOException + public void testSimpleAdminPush() throws IOException { - RepositoryClient client = createAdminRepositoryClient(); + RepositoryClient repositoryClient = createAdminRepositoryClient(); - createRandomFile(client); - client.commit("added random file"); + createRandomFile(repositoryClient); + commit(repositoryClient, "added random file"); } - /** - * Method description - * - * - * @return - * - * @throws IOException - * @throws RepositoryClientException - */ - private RepositoryClient createAdminRepositoryClient() - throws IOException, RepositoryClientException - { + private RepositoryClient createAdminRepositoryClient() throws IOException { return createRepositoryClient(ADMIN_USERNAME, ADMIN_PASSWORD); } - /** - * Method description - * - * - * @return - * - * @throws IOException - * @throws RepositoryClientException - */ - private RepositoryClient createAnonymousRepositoryClient() - throws IOException, RepositoryClientException - { + private RepositoryClient createAnonymousRepositoryClient() throws IOException { return createRepositoryClient(null, null); } - /** - * Method description - * - * - * @param username - * @param password - * - * @return - * - * @throws IOException - * @throws RepositoryClientException - */ - private RepositoryClient createRepositoryClient(String username, - String password) - throws IOException, RepositoryClientException - { + private RepositoryClient createRepositoryClient(String username, String password) throws IOException { File directory = temporaryFolder.newFolder(); - RepositoryClient client = null; + String remoteUrl = repository.createUrl(BASE_URL); - if ((username != null) && (password != null)) - { - client = RepositoryClientFactory.createClient(repositoryType, directory, - repository.getUrl(), username, password); - } - else - { - client = RepositoryClientFactory.createClient(repositoryType, directory, - repository.getUrl()); - } - - client.init(); - - return client; + RepositoryClientFactory factory = new RepositoryClientFactory(); + return factory.create(repositoryType, remoteUrl, username, password, directory); } //~--- fields --------------------------------------------------------------- @@ -338,5 +280,5 @@ public class AnonymousAccessITCase private Repository repository; /** Field description */ - private String repositoryType; + private final String repositoryType; } diff --git a/scm-webapp/src/test/java/sonia/scm/it/ChangesetViewerITCase.java b/scm-webapp/src/test/java/sonia/scm/it/ChangesetViewerITCase.java index 67e09c204b..aa1bcc7638 100644 --- a/scm-webapp/src/test/java/sonia/scm/it/ChangesetViewerITCase.java +++ b/scm-webapp/src/test/java/sonia/scm/it/ChangesetViewerITCase.java @@ -48,9 +48,7 @@ import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.Modifications; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryTestData; -import sonia.scm.repository.client.RepositoryClient; -import sonia.scm.repository.client.RepositoryClientException; -import sonia.scm.repository.client.RepositoryClientFactory; + import sonia.scm.util.IOUtil; import static org.hamcrest.Matchers.*; @@ -72,6 +70,10 @@ import java.io.IOException; import java.util.Collection; import java.util.List; import java.util.Random; +import sonia.scm.repository.client.api.ClientCommand; + +import sonia.scm.repository.client.api.RepositoryClient; +import sonia.scm.repository.client.api.RepositoryClientFactory; /** * @@ -112,16 +114,14 @@ public class ChangesetViewerITCase extends AbstractAdminITCaseBase * * @throws IOException * @throws InterruptedException - * @throws RepositoryClientException */ @Test @Ignore - public void cachingTest() - throws RepositoryClientException, IOException, InterruptedException + public void cachingTest() throws IOException, InterruptedException { RepositoryClient rc = createRepositoryClient(); - rc.checkout(); + // rc.checkout(); addTestFile(rc, "a", 1, false); addTestFile(rc, "b", 2, true); } @@ -161,15 +161,13 @@ public class ChangesetViewerITCase extends AbstractAdminITCaseBase * * @throws IOException * @throws InterruptedException - * @throws RepositoryClientException */ @Test - public void simpleTest() - throws RepositoryClientException, IOException, InterruptedException + public void simpleTest() throws IOException, InterruptedException { RepositoryClient rc = createRepositoryClient(); - rc.init(); + // rc.init(); addTestFile(rc, "a", 1, false); } @@ -188,29 +186,24 @@ public class ChangesetViewerITCase extends AbstractAdminITCaseBase */ private void addTestFile(RepositoryClient rc, String name, int count, boolean sleep) - throws IOException, RepositoryClientException, InterruptedException + throws IOException, InterruptedException { File file = new File(localDirectory, name.concat(".txt")); writeRandomContent(file); - rc.add(name.concat(".txt")); - rc.commit("added-".concat(name).concat(".txt")); - - if (sleep) - { + rc.getAddCommand().add(name.concat(".txt")); + IntegrationTestUtil.commit(rc, "added-".concat(name).concat(".txt")); + if (sleep) { // cache clear is async Thread.sleep(500l); } ChangesetPagingResult cpr = getChangesets(repository); - if ("svn".equals(repositoryType)) - { + if ("svn".equals(repositoryType)) { assertEquals((count + 1), cpr.getTotal()); - } - else - { + } else { assertEquals(count, cpr.getTotal()); } @@ -218,12 +211,9 @@ public class ChangesetViewerITCase extends AbstractAdminITCaseBase assertNotNull(changesets); - if ("svn".equals(repositoryType)) - { + if ("svn".equals(repositoryType)) { assertEquals((count + 1), changesets.size()); - } - else - { + } else { assertEquals(count, changesets.size()); } @@ -253,75 +243,32 @@ public class ChangesetViewerITCase extends AbstractAdminITCaseBase //J+ } - /** - * Method description - * - * - * @return - * - * @throws RepositoryClientException - */ - private RepositoryClient createRepositoryClient() - throws RepositoryClientException - { - return RepositoryClientFactory.createClient(repositoryType, localDirectory, - repository.getUrl(), IntegrationTestUtil.ADMIN_USERNAME, - IntegrationTestUtil.ADMIN_PASSWORD); + private RepositoryClient createRepositoryClient() throws IOException { + RepositoryClientFactory factory = new RepositoryClientFactory(); + return factory.create( + repositoryType, repository.createUrl(BASE_URL), + IntegrationTestUtil.ADMIN_USERNAME, IntegrationTestUtil.ADMIN_PASSWORD, + localDirectory + ); } - /** - * Method description - * - * - * @param file - * - * @throws IOException - */ - private void writeRandomContent(File file) throws IOException - { - FileOutputStream output = null; - - try - { - output = new FileOutputStream(file); - - Random random = new Random(); - byte[] data = new byte[random.nextInt(1024)]; - + private void writeRandomContent(File file) throws IOException { + Random random = new Random(); + byte[] data = new byte[random.nextInt(1024)]; + + try (FileOutputStream output = new FileOutputStream(file)) { random.nextBytes(data); output.write(data); } - finally - { - IOUtil.close(output); - } } //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @param repository - * - * @return - */ - private String getChangesetViewerUri(Repository repository) - { + private String getChangesetViewerUri(Repository repository) { return "repositories/".concat(repository.getId()).concat("/changesets"); } - /** - * Method description - * - * - * @param repository - * - * @return - */ - private ChangesetPagingResult getChangesets(Repository repository) - { + private ChangesetPagingResult getChangesets(Repository repository) { WebResource resource = createResource(client, getChangesetViewerUri(repository)); @@ -348,5 +295,5 @@ public class ChangesetViewerITCase extends AbstractAdminITCaseBase private Repository repository; /** Field description */ - private String repositoryType; + private final String repositoryType; } diff --git a/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java b/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java index 9bb2b4c16d..bb4883bdfe 100644 --- a/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java +++ b/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java @@ -37,8 +37,6 @@ package sonia.scm.it; import sonia.scm.ScmState; import sonia.scm.Type; -import sonia.scm.repository.client.RepositoryClient; -import sonia.scm.repository.client.RepositoryClientException; import sonia.scm.user.User; import sonia.scm.util.IOUtil; @@ -63,6 +61,9 @@ import java.util.Collection; import java.util.UUID; import javax.ws.rs.core.MultivaluedMap; +import sonia.scm.repository.Person; +import sonia.scm.repository.client.api.ClientCommand; +import sonia.scm.repository.client.api.RepositoryClient; /** * @@ -70,6 +71,8 @@ import javax.ws.rs.core.MultivaluedMap; */ public final class IntegrationTestUtil { + + public static final Person AUTHOR = new Person("SCM Administrator", "scmadmin@scm-manager.org"); /** Field description */ public static final String ADMIN_PASSWORD = "scmadmin"; @@ -181,34 +184,41 @@ public final class IntegrationTestUtil return ApacheHttpClient.create(config); } + /** + * Commit and push changes. + * + * @param repositoryClient repository client + * @param message commit message + * + * @throws IOException + * + * @since 1.51 + */ + public static void commit(RepositoryClient repositoryClient, String message) throws IOException { + repositoryClient.getCommitCommand().commit(IntegrationTestUtil.AUTHOR, message); + if ( repositoryClient.isCommandSupported(ClientCommand.PUSH) ) { + repositoryClient.getPushCommand().push(); + } + } + /** * Method description * - * - * * @param client * * @throws IOException - * @throws RepositoryClientException */ - public static void createRandomFile(RepositoryClient client) - throws IOException, RepositoryClientException + public static void createRandomFile(RepositoryClient client) throws IOException { String uuid = UUID.randomUUID().toString(); String name = "file-" + uuid + ".uuid"; - FileOutputStream out = null; - try - { - out = new FileOutputStream(new File(client.getLocalRepository(), name)); + File file = new File(client.getWorkingCopy(), name); + try (FileOutputStream out = new FileOutputStream(file)) { out.write(uuid.getBytes()); } - finally - { - IOUtil.close(out); - } - client.add(name); + client.getAddCommand().add(name); } /** @@ -219,7 +229,7 @@ public final class IntegrationTestUtil */ public static Collection createRepositoryTypeParameters() { - Collection params = new ArrayList(); + Collection params = new ArrayList<>(); params.add(new String[] { "git" }); params.add(new String[] { "svn" }); @@ -258,7 +268,7 @@ public final class IntegrationTestUtil { return REST_BASE_URL.concat(url).concat(EXTENSION); } - + /** * Method description * diff --git a/scm-webapp/src/test/java/sonia/scm/it/RepositoryExtendedITCase.java b/scm-webapp/src/test/java/sonia/scm/it/RepositoryExtendedITCase.java index 4b54c14485..de508627c8 100644 --- a/scm-webapp/src/test/java/sonia/scm/it/RepositoryExtendedITCase.java +++ b/scm-webapp/src/test/java/sonia/scm/it/RepositoryExtendedITCase.java @@ -42,8 +42,6 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import sonia.scm.repository.Repository; -import sonia.scm.repository.client.RepositoryClient; -import sonia.scm.repository.client.RepositoryClientException; import sonia.scm.user.User; import sonia.scm.util.IOUtil; @@ -56,6 +54,9 @@ import static sonia.scm.it.IntegrationTestUtil.*; import java.io.File; import java.io.IOException; +import sonia.scm.repository.client.api.RepositoryClient; +import sonia.scm.repository.client.api.RepositoryClientException; + /** * * @author Sebastian Sdorra @@ -100,14 +101,14 @@ public class RepositoryExtendedITCase extends RepositoryITCaseBase * Method description * * - * @throws RepositoryClientException + * @throws IOException */ @Test(expected = RepositoryClientException.class) - public void readFailed() throws RepositoryClientException + public void readFailed() throws IOException { RepositoryClient rc = createRepositoryClient(nopermUser, directory); - rc.checkout(); + // rc.checkout(); // ugly workaround if (repository.getType().equals("git")) @@ -120,7 +121,7 @@ public class RepositoryExtendedITCase extends RepositoryITCaseBase } } - throw new RepositoryClientException("checkout failed"); + throw new IOException("checkout failed"); } } @@ -139,47 +140,40 @@ public class RepositoryExtendedITCase extends RepositoryITCaseBase * * * @throws IOException - * @throws RepositoryClientException */ @Test - public void simpleRead() throws RepositoryClientException, IOException + public void simpleRead() throws IOException { RepositoryClient rc = createRepositoryClient(readUser, directory); - rc.checkout(); + // rc.checkout(); } /** * Method description * - * - * * @throws IOException - * @throws RepositoryClientException */ @Test - public void simpleWrite() throws RepositoryClientException, IOException + public void simpleWrite() throws IOException { RepositoryClient rc = createRepositoryClient(writeUser, directory); - rc.checkout(); + // rc.checkout(); addTestFiles(rc); } /** * Method description * - * - * * @throws IOException - * @throws RepositoryClientException */ - @Test(expected = RepositoryClientException.class) - public void writeFailed() throws RepositoryClientException, IOException + @Test(expected = IOException.class) + public void writeFailed() throws IOException { RepositoryClient rc = createRepositoryClient(readUser, directory); - rc.checkout(); + // rc.checkout(); addTestFiles(rc); } diff --git a/scm-webapp/src/test/java/sonia/scm/it/RepositoryITCaseBase.java b/scm-webapp/src/test/java/sonia/scm/it/RepositoryITCaseBase.java index c57f85237e..ab8b598bdf 100644 --- a/scm-webapp/src/test/java/sonia/scm/it/RepositoryITCaseBase.java +++ b/scm-webapp/src/test/java/sonia/scm/it/RepositoryITCaseBase.java @@ -44,9 +44,6 @@ import sonia.scm.repository.Permission; import sonia.scm.repository.PermissionType; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryTestData; -import sonia.scm.repository.client.RepositoryClient; -import sonia.scm.repository.client.RepositoryClientException; -import sonia.scm.repository.client.RepositoryClientFactory; import sonia.scm.user.User; import sonia.scm.user.UserTestData; import sonia.scm.util.IOUtil; @@ -69,6 +66,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import sonia.scm.repository.client.api.RepositoryClient; +import sonia.scm.repository.client.api.RepositoryClientFactory; + /** * * @author Sebastian Sdorra @@ -107,45 +107,40 @@ public class RepositoryITCaseBase * @param client * * @throws IOException - * @throws RepositoryClientException */ - public static void addTestFiles(RepositoryClient client) - throws RepositoryClientException, IOException + public static void addTestFiles(RepositoryClient client) throws IOException { for (int i = 0; i < 5; i++) { createRandomFile(client); } - client.commit("added some test files"); + commit(client, "added some test files"); } /** * Method description * - * - * * @param repository * @param username * @param password * * @throws IOException - * @throws RepositoryClientException */ public static void addTestFiles(Repository repository, String username, String password) - throws RepositoryClientException, IOException + throws IOException { File directory = createTempDirectory(); try { - RepositoryClient rc = - RepositoryClientFactory.createClient(repository.getType(), directory, - repository.getUrl(), username, password); - - rc.init(); - addTestFiles(rc); + RepositoryClientFactory clientFactory = new RepositoryClientFactory(); + RepositoryClient client = clientFactory.create( + repository.getType(), repository.createUrl(BASE_URL), username, password, directory + ); + + addTestFiles(client); } finally { @@ -190,11 +185,9 @@ public class RepositoryITCaseBase * @return * * @throws IOException - * @throws RepositoryClientException */ @Parameters - public static Collection createParameters() - throws RepositoryClientException, IOException + public static Collection createParameters() throws IOException { Client client = createClient(); ScmState state = authenticateAdmin(client); @@ -202,7 +195,7 @@ public class RepositoryITCaseBase assertNotNull(state); assertTrue(state.isSuccess()); - Collection params = new ArrayList(); + Collection params = new ArrayList<>(); User owner = UserTestData.createTrillian(); createUser(owner); @@ -242,16 +235,14 @@ public class RepositoryITCaseBase * @throws RepositoryClientException */ private static void appendTestParemeter(Collection params, - String type, User owner, User write, User read, User noperm) - throws RepositoryClientException, IOException + String type, User owner, User write, User read, User noperm) throws IOException { - Repository repository = createTestRepository(null, type, owner, write, - read); - + Repository repository = createTestRepository(null, type, owner, write, read); params.add(new Object[] { repository, owner, write, read, noperm, "secret" }); + repository = createTestRepository("test", type, owner, write, read); params.add(new Object[] { @@ -276,8 +267,7 @@ public class RepositoryITCaseBase * @throws RepositoryClientException */ private static Repository createTestRepository(String prefix, String type, - User owner, User write, User read) - throws RepositoryClientException, IOException + User owner, User write, User read) throws IOException { Client client = createAdminClient(); Repository repository = RepositoryTestData.createHeartOfGold(type); @@ -296,6 +286,7 @@ public class RepositoryITCaseBase //J+ repository = createRepository(client, repository); client.destroy(); + addTestFiles(repository, ADMIN_USERNAME, ADMIN_PASSWORD); return repository; @@ -336,14 +327,14 @@ public class RepositoryITCaseBase * @param directory * * @return - * - * @throws RepositoryClientException + * + * @throws IOException */ - protected RepositoryClient createRepositoryClient(User user, File directory) - throws RepositoryClientException + protected RepositoryClient createRepositoryClient(User user, File directory) throws IOException { - return RepositoryClientFactory.createClient(repository.getType(), - directory, repository.getUrl(), user.getName(), password); + RepositoryClientFactory clientFactory = new RepositoryClientFactory(); + return clientFactory.create(repository.getType(), repository.createUrl(BASE_URL), + user.getName(), password, directory); } //~--- fields --------------------------------------------------------------- diff --git a/scm-webapp/src/test/java/sonia/scm/it/RepositoryITUtil.java b/scm-webapp/src/test/java/sonia/scm/it/RepositoryITUtil.java index 70d53ff296..e3111502cc 100644 --- a/scm-webapp/src/test/java/sonia/scm/it/RepositoryITUtil.java +++ b/scm-webapp/src/test/java/sonia/scm/it/RepositoryITUtil.java @@ -65,12 +65,10 @@ public final class RepositoryITUtil /** * Method description * - * * @param repository * @param other */ - public static void assertRepositoriesEquals(Repository repository, - Repository other) + public static void assertRepositoriesEquals(Repository repository, Repository other) { assertEquals(repository.getName(), other.getName()); assertEquals(repository.getDescription(), other.getDescription()); @@ -82,8 +80,6 @@ public final class RepositoryITUtil /** * Method description * - * - * * @param client * @param repository * @@ -116,8 +112,6 @@ public final class RepositoryITUtil /** * Method description * - * - * * @param client * @param id */ @@ -141,10 +135,6 @@ public final class RepositoryITUtil /** * Method description * - * - * - * - * * @param client * @param url * @@ -168,11 +158,6 @@ public final class RepositoryITUtil /** * Method description * - * - * - * - * - * * @param client * @param id *