Simplify things

This commit is contained in:
René Pfeuffer
2018-06-20 16:08:51 +02:00
parent 7f19b5baff
commit 9d2d70f9df
9 changed files with 190 additions and 592 deletions

View File

@@ -1,54 +0,0 @@
/**
* Copyright (c) 2014, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository.client.spi;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* Add files to subversion repository.
*
* @author Sebastian Sdorra
* @since 1.51
*/
public final class SvnAddCommand extends SvnFileCommand implements AddCommand {
SvnAddCommand(File workingCopy, List<File> pendingFiles) {
super(workingCopy, pendingFiles);
}
@Override
public void add(String path) throws IOException {
append(path);
}
}

View File

@@ -0,0 +1,141 @@
package sonia.scm.repository.client.spi;
import org.tmatesoft.svn.core.SVNCommitInfo;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNWCClient;
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;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
class SvnChangeWorker {
private final File workingCopy;
private final List<File> addedFiles = new ArrayList<>();
private final List<File> removedFiles = new ArrayList<>();
public SvnChangeWorker(File workingCopy) {
this.workingCopy = workingCopy;
}
public AddCommand addCommand() {
return new SvnAddCommand();
}
public RemoveCommand removeCommand() {
return new SvnRemoveCommand();
}
public CommitCommand commitCommand(SVNClientManager client) {
return new SvnCommitCommand(client);
}
private class SvnAddCommand implements AddCommand {
@Override
public void add(String path) throws IOException {
addedFiles.add(toFile(path));
}
}
private class SvnRemoveCommand implements RemoveCommand {
@Override
public void remove(String path) throws IOException {
removedFiles.add(toFile(path));
}
}
private class SvnCommitCommand implements CommitCommand {
private final SVNClientManager client;
private SvnCommitCommand(SVNClientManager client) {
this.client = client;
}
@Override
public Changeset commit(CommitRequest request) throws IOException {
SVNWCClient wClient = client.getWCClient();
// add files
try {
wClient.doAdd(addedFiles.toArray(new File[0]), true, false, false,
SVNDepth.INFINITY, false, false, false);
addedFiles.clear();
} catch (SVNException ex) {
throw new RepositoryClientException("failed to add files", ex);
}
// remove files
try {
Iterator<File> removeIt = removedFiles.iterator();
while (removeIt.hasNext()) {
File file = removeIt.next();
wClient.doDelete(file, false, true, false);
removeIt.remove();
}
} catch (SVNException 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();
commit.setDepth(SVNDepth.INFINITY);
commit.setCommitMessage(request.getMessage());
commit.setSingleTarget(workingCopyTarget);
info = commit.run();
SVNErrorMessage msg = info.getErrorMessage();
if (msg != null) {
throw new IOException(msg.getFullMessage());
}
} catch (SVNException ex) {
throw new RepositoryClientException("failed to commit", ex);
}
// get log for commit
try {
SVNRevision revision = SVNRevision.create(info.getNewRevision());
SvnLog log = client.getOperationFactory().createLog();
log.addRange(SvnRevisionRange.create(revision, revision));
log.setSingleTarget(workingCopyTarget);
changeset = SvnUtil.createChangeset(log.run());
} catch (SVNException ex) {
throw new RepositoryClientException("failed to create log entry for last commit", ex);
}
return changeset;
}
}
protected File toFile(String path) throws FileNotFoundException {
File file = new File(workingCopy, path);
if (!file.exists()) {
throw new FileNotFoundException("could not find file ".concat(path));
}
return file;
}
}

View File

@@ -1,135 +0,0 @@
/**
* Copyright (c) 2014, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository.client.spi;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.tmatesoft.svn.core.SVNCommitInfo;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNWCClient;
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;
/**
*
* @author Sebastian Sdorra
*/
public class SvnCommitCommand implements CommitCommand {
private final SVNClientManager client;
private final File workingCopy;
private final List<File> addedFiles;
private final List<File> removedFiles;
SvnCommitCommand(SVNClientManager client, File workingCopy, List<File> addedFiles, List<File> removedFiles) {
this.client = client;
this.workingCopy = workingCopy;
this.addedFiles = addedFiles;
this.removedFiles = removedFiles;
}
@Override
public Changeset commit(CommitRequest request) throws IOException {
SVNWCClient wClient = client.getWCClient();
// add files
try {
wClient.doAdd(addedFiles.toArray(new File[0]), true, false, false,
SVNDepth.INFINITY, false, false, false);
addedFiles.clear();
} catch (SVNException ex) {
throw new RepositoryClientException("failed to add files", ex);
}
// remove files
try {
Iterator<File> removeIt = removedFiles.iterator();
while (removeIt.hasNext()) {
File file = removeIt.next();
wClient.doDelete(file, false, true, false);
removeIt.remove();
}
} catch (SVNException 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();
commit.setDepth(SVNDepth.INFINITY);
commit.setCommitMessage(request.getMessage());
commit.setSingleTarget(workingCopyTarget);
info = commit.run();
SVNErrorMessage msg = info.getErrorMessage();
if (msg != null) {
throw new IOException(msg.getFullMessage());
}
} catch (SVNException ex) {
throw new RepositoryClientException("failed to commit", ex);
}
// get log for commit
try {
SVNRevision revision = SVNRevision.create(info.getNewRevision());
SvnLog log = client.getOperationFactory().createLog();
log.addRange(SvnRevisionRange.create(revision, revision));
log.setSingleTarget(workingCopyTarget);
changeset = SvnUtil.createChangeset(log.run());
} catch (SVNException ex) {
throw new RepositoryClientException("failed to create log entry for last commit", ex);
}
return changeset;
}
}

View File

@@ -1,62 +0,0 @@
/**
* Copyright (c) 2014, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository.client.spi;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.List;
/**
* Abstract file based svn command.
*
* @author Sebastian Sdorra
* @since 1.51
*/
public abstract class SvnFileCommand {
private final File workingCopy;
private final List<File> pendingFiles;
protected SvnFileCommand(File workingCopy, List<File> pendingFiles) {
this.workingCopy = workingCopy;
this.pendingFiles = pendingFiles;
}
protected void append(String path) throws FileNotFoundException {
File file = new File(workingCopy, path);
if (!file.exists()) {
throw new FileNotFoundException("could not find file ".concat(path));
}
pendingFiles.add(file);
}
}

View File

@@ -1,54 +0,0 @@
/**
* Copyright (c) 2014, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.repository.client.spi;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* Remove files from subversion repository.
*
* @author Sebastian Sdorra
* @since 1.51
*/
public class SvnRemoveCommand extends SvnFileCommand implements RemoveCommand {
SvnRemoveCommand(File workingCopy, List<File> pendingFiles) {
super(workingCopy, pendingFiles);
}
@Override
public void remove(String path) throws IOException {
append(path);
}
}

View File

@@ -31,14 +31,12 @@
package sonia.scm.repository.client.spi;
import com.google.common.collect.ImmutableSet;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import sonia.scm.repository.client.api.ClientCommand;
import java.io.File;
import java.util.Set;
/**
* Subversion repository client provider.
*
@@ -54,27 +52,27 @@ public class SvnRepositoryClientProvider extends RepositoryClientProvider {
private final SVNClientManager client;
private final File workingCopy;
private final List<File> addedFiles = new ArrayList<>();
private final List<File> removedFiles = new ArrayList<>();
private final SvnChangeWorker changeWorker;
SvnRepositoryClientProvider(SVNClientManager client, File workingCopy) {
changeWorker = new SvnChangeWorker(workingCopy);
this.client = client;
this.workingCopy = workingCopy;
}
@Override
public SvnAddCommand getAddCommand() {
return new SvnAddCommand(workingCopy, addedFiles);
public AddCommand getAddCommand() {
return changeWorker.addCommand();
}
@Override
public SvnRemoveCommand getRemoveCommand() {
return new SvnRemoveCommand(workingCopy, removedFiles);
public RemoveCommand getRemoveCommand() {
return changeWorker.removeCommand();
}
@Override
public SvnCommitCommand getCommitCommand() {
return new SvnCommitCommand(client, workingCopy, addedFiles, removedFiles);
public CommitCommand getCommitCommand() {
return changeWorker.commitCommand(client);
}
@Override