package org.tmatesoft.svn.test;
import java.io.File;
import java.util.Map;
import org.junit.Assert;
import org.junit.Test;
import org.tmatesoft.svn.core.SVNCommitInfo;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNStatusType;
import org.tmatesoft.svn.core.wc2.SvnCopy;
import org.tmatesoft.svn.core.wc2.SvnCopySource;
import org.tmatesoft.svn.core.wc2.SvnOperationFactory;
import org.tmatesoft.svn.core.wc2.SvnRemoteCopy;
import org.tmatesoft.svn.core.wc2.SvnStatus;
import org.tmatesoft.svn.core.wc2.SvnTarget;
public class SvnCopyDisableLocalModificationsTest {
@Test
public void testCopyFile() throws Exception {
final TestOptions options = TestOptions.getInstance();
final SvnOperationFactory svnOperationFactory = new SvnOperationFactory();
final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testCopyFile", options);
try {
final SVNURL url = sandbox.createSvnRepository();
final CommitBuilder commitBuilder = new CommitBuilder(url);
commitBuilder.addFile("source/file");
commitBuilder.addDirectory("target");
commitBuilder.commit();
final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber());
final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory();
final File source = new File(workingCopyDirectory, "source");
final File target = new File(workingCopyDirectory, "target");
final File sourceFile = new File(source, "file");
final File targetFile = new File(target, "file");
final String sourceFileContents = "local modifications" + "\n";
TestUtil.writeFileContentsString(sourceFile, sourceFileContents);
final SvnRemoteCopy remoteCopy = svnOperationFactory.createRemoteCopy();
remoteCopy.addCopySource(SvnCopySource.create(SvnTarget.fromFile(sourceFile, SVNRevision.WORKING), SVNRevision.WORKING));
remoteCopy.setSingleTarget(SvnTarget.fromURL(url.appendPath(target.getName(), false).appendPath(targetFile.getName(), false)));
remoteCopy.setDisableLocalModifications(true);
final SVNCommitInfo commitInfo = remoteCopy.run();
workingCopy.revert();
workingCopy.updateToRevision(commitInfo.getNewRevision());
final String targetFileContents = TestUtil.readFileContentsString(targetFile);
Assert.assertEquals("", targetFileContents);//should not be equal to sourceFileContents
} finally {
svnOperationFactory.dispose();
sandbox.dispose();
}
}
@Test
public void testCopyDirectory() throws Exception {
final TestOptions options = TestOptions.getInstance();
final SvnOperationFactory svnOperationFactory = new SvnOperationFactory();
final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testCopyDirectory", options);
try {
final SVNURL url = sandbox.createSvnRepository();
final CommitBuilder commitBuilder = new CommitBuilder(url);
commitBuilder.addFile("source/directory/deletedFile");
commitBuilder.addFile("source/directory/modifiedFile");
commitBuilder.addFile("source/directory/sourceFile");
commitBuilder.addDirectory("target");
commitBuilder.commit();
final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber());
final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory();
final File source = new File(workingCopyDirectory, "source");
final File target = new File(workingCopyDirectory, "target");
final File sourceDirectory = new File(source, "directory");
final File targetDirectory = new File(target, "directory");
final File sourceModifiedFile = new File(sourceDirectory, "modifiedFile");
final File targetModifiedFile = new File(targetDirectory, "modifiedFile");
final File sourceAddedFile = new File(sourceDirectory, "addedFile");
final File targetAddedFile = new File(targetDirectory, "addedFile");
final File sourceDeletedFile = new File(sourceDirectory, "deletedFile");
final File targetDeletedFile = new File(targetDirectory, "deletedFile");
final File sourceSourceFile = new File(sourceDirectory, "sourceFile");
final File targetSourceFile = new File(targetDirectory, "sourceFile");
final File sourceCopiedFile = new File(sourceDirectory, "copiedFile");
final File targetCopiedFile = new File(targetDirectory, "copiedFile");
final String sourceFileContents = "local modifications" + "\n";
TestUtil.writeFileContentsString(sourceModifiedFile, sourceFileContents);
copy(svnOperationFactory, sourceSourceFile, sourceCopiedFile);
//noinspection ResultOfMethodCallIgnored
sourceAddedFile.createNewFile();
workingCopy.add(sourceAddedFile);
workingCopy.delete(sourceDeletedFile);
final SvnRemoteCopy remoteCopy = svnOperationFactory.createRemoteCopy();
remoteCopy.addCopySource(SvnCopySource.create(SvnTarget.fromFile(sourceDirectory, SVNRevision.WORKING), SVNRevision.WORKING));
remoteCopy.setSingleTarget(SvnTarget.fromURL(url.appendPath(target.getName(), false).appendPath(targetDirectory.getName(), false)));
remoteCopy.setDisableLocalModifications(true);
final SVNCommitInfo commitInfo = remoteCopy.run();
workingCopy.revert();
workingCopy.updateToRevision(commitInfo.getNewRevision());
final String targetModifiedFileContents = TestUtil.readFileContentsString(targetModifiedFile);
Assert.assertEquals("", targetModifiedFileContents);//should not be equal to sourceFileContents
final Map<File,SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory);
Assert.assertEquals(null, statuses.get(targetAddedFile));
Assert.assertEquals(null, statuses.get(targetCopiedFile));
Assert.assertEquals(SVNStatusType.STATUS_NORMAL, statuses.get(targetModifiedFile).getNodeStatus());
Assert.assertEquals(SVNStatusType.STATUS_NORMAL, statuses.get(targetDeletedFile).getNodeStatus());
Assert.assertEquals(SVNStatusType.STATUS_NORMAL, statuses.get(targetSourceFile).getNodeStatus());
} finally {
svnOperationFactory.dispose();
sandbox.dispose();
}
}
@Test
public void testCopyEmptyDirectoryNoLocalModifications() throws Exception {
final TestOptions options = TestOptions.getInstance();
final SvnOperationFactory svnOperationFactory = new SvnOperationFactory();
final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testCopyEmptyDirectoryNoLocalModifications", options);
try {
final SVNURL url = sandbox.createSvnRepository();
final CommitBuilder commitBuilder = new CommitBuilder(url);
commitBuilder.addDirectory("source/directory");
commitBuilder.addDirectory("target");
commitBuilder.commit();
final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber());
final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory();
final File source = new File(workingCopyDirectory, "source");
final File target = new File(workingCopyDirectory, "target");
final File sourceDirectory = new File(source, "directory");
final File targetDirectory = new File(target, "directory");
final SvnRemoteCopy remoteCopy = svnOperationFactory.createRemoteCopy();
remoteCopy.addCopySource(SvnCopySource.create(SvnTarget.fromFile(sourceDirectory, SVNRevision.WORKING), SVNRevision.WORKING));
remoteCopy.setSingleTarget(SvnTarget.fromURL(url.appendPath(target.getName(), false).appendPath(targetDirectory.getName(), false)));
remoteCopy.setDisableLocalModifications(true);
remoteCopy.setMove(false);
remoteCopy.setFailWhenDstExists(true);
remoteCopy.setMakeParents(true);
final SVNCommitInfo commitInfo = remoteCopy.run();
Assert.assertEquals(2, commitInfo.getNewRevision());
} finally {
svnOperationFactory.dispose();
sandbox.dispose();
}
}
private void copy(SvnOperationFactory svnOperationFactory, File sourceSourceFile, File sourceCopiedFile) throws SVNException {
final SvnCopy copy = svnOperationFactory.createCopy();
copy.addCopySource(SvnCopySource.create(SvnTarget.fromFile(sourceSourceFile), SVNRevision.WORKING));
copy.setSingleTarget(SvnTarget.fromFile(sourceCopiedFile));
copy.run();
}
private String getTestName() {
return "SvnCopyDisableLocalModifications";
}
}