package org.tmatesoft.svn.test; import java.io.File; import java.util.Map; import junit.framework.Assert; import org.junit.Assume; import org.junit.Test; import org.tmatesoft.svn.core.SVNErrorCode; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.wc.SVNFileUtil; 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.SvnScheduleForAddition; import org.tmatesoft.svn.core.wc2.SvnScheduleForRemoval; import org.tmatesoft.svn.core.wc2.SvnStatus; import org.tmatesoft.svn.core.wc2.SvnTarget; public class VirtualCopyTest { @Test public void testFileMovedVirtuallyMoved() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testFileMovedVirtuallyMoved", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String unversionedFile = "directory3/unversionedFile.txt"; final String fileNotToAdd = "directory3/fileNotToAdd.txt"; //if makeParents for unversionedFile calls "svn add" with infinite depth, this file will be added (that is not expected) final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcUnversionedFile = new File(workingCopyDirectory, unversionedFile); final File wcFileNotToAdd = new File(workingCopyDirectory, fileNotToAdd); SVNFileUtil.ensureDirectoryExists(wcUnversionedFile.getParentFile()); add(svnOperationFactory, wcUnversionedFile.getParentFile()); SVNFileUtil.rename(wcVersionedFile, wcUnversionedFile); moveVirtual(svnOperationFactory, wcVersionedFile, wcUnversionedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_DELETED, wcVersionedFile, statuses); assertStatus(SVNStatusType.STATUS_NONE, wcFileNotToAdd, statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile.getParentFile(), statuses); Assert.assertEquals(url.appendPath(versionedFile, false), statuses.get(wcUnversionedFile).getCopyFromUrl()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testFileMovedVirtuallyCopied() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testFileMovedVirtuallyCopied", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String unversionedFile = "directory3/unversionedFile.txt"; final String fileNotToAdd = "directory3/fileNotToAdd.txt"; //if makeParents for unversionedFile calls "svn add" with infinite depth, this file will be added (that is not expected) final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcUnversionedFile = new File(workingCopyDirectory, unversionedFile); final File wcFileNotToAdd = new File(workingCopyDirectory, fileNotToAdd); SVNFileUtil.ensureDirectoryExists(wcUnversionedFile.getParentFile()); add(svnOperationFactory, wcUnversionedFile.getParentFile()); SVNFileUtil.rename(wcVersionedFile, wcUnversionedFile); copyVirtual(svnOperationFactory, wcVersionedFile, wcUnversionedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_MISSING, wcVersionedFile, statuses); assertStatus(SVNStatusType.STATUS_NONE, wcFileNotToAdd, statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile.getParentFile(), statuses); Assert.assertEquals(url.appendPath(versionedFile, false), statuses.get(wcUnversionedFile).getCopyFromUrl()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testFileCopiedVirtuallyCopied() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testFileCopiedVirtuallyCopied", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String unversionedFile = "directory3/unversionedFile.txt"; final String fileNotToAdd = "directory3/fileNotToAdd.txt"; //if makeParents for unversionedFile calls "svn add" with infinite depth, this file will be added (that is not expected) final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcUnversionedFile = new File(workingCopyDirectory, unversionedFile); final File wcFileNotToAdd = new File(workingCopyDirectory, fileNotToAdd); SVNFileUtil.ensureDirectoryExists(wcUnversionedFile.getParentFile()); add(svnOperationFactory, wcUnversionedFile.getParentFile()); SVNFileUtil.copyFile(wcVersionedFile, wcUnversionedFile, false); copyVirtual(svnOperationFactory, wcVersionedFile, wcUnversionedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_NONE, wcFileNotToAdd, statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile.getParentFile(), statuses); Assert.assertEquals(url.appendPath(versionedFile, false), statuses.get(wcUnversionedFile).getCopyFromUrl()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testFileCopiedVirtualMoveFailed() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testFileCopiedVirtualMoveFailed", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String unversionedFile = "directory3/unversionedFile.txt"; final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcUnversionedFile = new File(workingCopyDirectory, unversionedFile); SVNFileUtil.ensureDirectoryExists(wcUnversionedFile.getParentFile()); add(svnOperationFactory, wcUnversionedFile.getParentFile()); SVNFileUtil.copyFile(wcVersionedFile, wcUnversionedFile, false); Assert.assertTrue(wcUnversionedFile.exists()); try { moveVirtual(svnOperationFactory, wcVersionedFile, wcUnversionedFile); Assert.fail("An exception should be thrown"); } catch (SVNException e) { e.printStackTrace(); Assert.assertEquals(SVNErrorCode.ENTRY_EXISTS, e.getErrorMessage().getErrorCode()); //expected } final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile, statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_UNVERSIONED, wcUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile.getParentFile(), statuses); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testFileUnversionedToVersionedVirutalMoveFailed() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testFileUnversionedToVersionedVirutalMoveFailed", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String unversionedFile = "directory3/unversionedFile.txt"; final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcUnversionedFile = new File(workingCopyDirectory, unversionedFile); try { moveVirtual(svnOperationFactory, wcUnversionedFile, wcVersionedFile); Assert.fail("An exception should be thrown"); } catch (SVNException e) { e.printStackTrace(); Assert.assertEquals(SVNErrorCode.ENTRY_ATTRIBUTE_INVALID, e.getErrorMessage().getErrorCode()); //expected } final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_NONE, wcUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_NONE, wcUnversionedFile.getParentFile(), statuses); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testFileUnversionedToUnversionedVirutalMoveFailed() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testFileUnversionedToUnversionedVirutalMoveFailed", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String unversionedFile = "directory3/unversionedFile.txt"; final String anotherUnversionedFile = "directory4/anotherUnversionedFile.txt"; final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcUnversionedFile = new File(workingCopyDirectory, unversionedFile); final File wcAnotherUnversionedFile = new File(workingCopyDirectory, anotherUnversionedFile); SVNFileUtil.ensureDirectoryExists(wcAnotherUnversionedFile.getParentFile()); SVNFileUtil.ensureDirectoryExists(wcUnversionedFile.getParentFile()); add(svnOperationFactory, wcAnotherUnversionedFile.getParentFile()); add(svnOperationFactory, wcUnversionedFile.getParentFile()); Assert.assertTrue(wcAnotherUnversionedFile.createNewFile()); try { moveVirtual(svnOperationFactory, wcUnversionedFile, wcAnotherUnversionedFile); Assert.fail("An exception should be thrown"); } catch (SVNException e) { e.printStackTrace(); Assert.assertEquals(SVNErrorCode.ENTRY_NOT_FOUND, e.getErrorMessage().getErrorCode()); //expected } final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_NONE, wcUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_UNVERSIONED, wcAnotherUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherUnversionedFile.getParentFile(), statuses); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testCopyingAlreadyCopied() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testCopyingAlreadyCopied", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String unversionedFile = "directory3/unversionedFile.txt"; final String anotherUnversionedFile = "directory4/anotherUnversionedFile.txt"; final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcUnversionedFile = new File(workingCopyDirectory, unversionedFile); final File wcAnotherUnversionedFile = new File(workingCopyDirectory, anotherUnversionedFile); SVNFileUtil.ensureDirectoryExists(wcAnotherUnversionedFile.getParentFile()); add(svnOperationFactory, wcAnotherUnversionedFile.getParentFile()); SVNFileUtil.ensureDirectoryExists(wcUnversionedFile.getParentFile()); add(svnOperationFactory, wcUnversionedFile.getParentFile()); copy(svnOperationFactory, wcVersionedFile, wcUnversionedFile); SVNFileUtil.copyFile(wcUnversionedFile, wcAnotherUnversionedFile, false); copyVirtual(svnOperationFactory, wcUnversionedFile, wcAnotherUnversionedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile, statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherUnversionedFile.getParentFile(), statuses); Assert.assertEquals(url.appendPath(versionedFile, false), statuses.get(wcUnversionedFile).getCopyFromUrl()); Assert.assertEquals(url.appendPath(versionedFile, false), statuses.get(wcAnotherUnversionedFile).getCopyFromUrl()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testMovingAlreadyCopied() throws Exception { Assume.assumeTrue(TestUtil.isNewWorkingCopyTest()); final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testMovingAlreadyCopied", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String unversionedFile = "directory3/unversionedFile.txt"; final String anotherUnversionedFile = "directory4/anotherUnversionedFile.txt"; final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcUnversionedFile = new File(workingCopyDirectory, unversionedFile); final File wcAnotherUnversionedFile = new File(workingCopyDirectory, anotherUnversionedFile); SVNFileUtil.ensureDirectoryExists(wcAnotherUnversionedFile.getParentFile()); add(svnOperationFactory, wcAnotherUnversionedFile.getParentFile()); SVNFileUtil.ensureDirectoryExists(wcUnversionedFile.getParentFile()); add(svnOperationFactory, wcUnversionedFile.getParentFile()); copy(svnOperationFactory, wcVersionedFile, wcUnversionedFile); SVNFileUtil.rename(wcUnversionedFile, wcAnotherUnversionedFile); moveVirtual(svnOperationFactory, wcUnversionedFile, wcAnotherUnversionedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile, statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_NONE, wcUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherUnversionedFile.getParentFile(), statuses); Assert.assertEquals(url.appendPath(versionedFile, false), statuses.get(wcAnotherUnversionedFile).getCopyFromUrl()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testCopyingAlreadyMoved() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testCopyingAlreadyMoved", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String unversionedFile = "directory3/unversionedFile.txt"; final String anotherUnversionedFile = "directory4/anotherUnversionedFile.txt"; final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcUnversionedFile = new File(workingCopyDirectory, unversionedFile); final File wcAnotherUnversionedFile = new File(workingCopyDirectory, anotherUnversionedFile); SVNFileUtil.ensureDirectoryExists(wcAnotherUnversionedFile.getParentFile()); add(svnOperationFactory, wcAnotherUnversionedFile.getParentFile()); SVNFileUtil.ensureDirectoryExists(wcUnversionedFile.getParentFile()); add(svnOperationFactory, wcUnversionedFile.getParentFile()); move(svnOperationFactory, wcVersionedFile, wcUnversionedFile); SVNFileUtil.copyFile(wcUnversionedFile, wcAnotherUnversionedFile, false); copyVirtual(svnOperationFactory, wcUnversionedFile, wcAnotherUnversionedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_DELETED, wcVersionedFile, statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherUnversionedFile.getParentFile(), statuses); Assert.assertEquals(url.appendPath(versionedFile, false), statuses.get(wcUnversionedFile).getCopyFromUrl()); Assert.assertEquals(url.appendPath(versionedFile, false), statuses.get(wcAnotherUnversionedFile).getCopyFromUrl()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testMovingAlreadyMoved() throws Exception { Assume.assumeTrue(TestUtil.isNewWorkingCopyTest()); final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testMovingAlreadyMoved", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String unversionedFile = "directory3/unversionedFile.txt"; final String anotherUnversionedFile = "directory4/anotherUnversionedFile.txt"; final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcUnversionedFile = new File(workingCopyDirectory, unversionedFile); final File wcAnotherUnversionedFile = new File(workingCopyDirectory, anotherUnversionedFile); SVNFileUtil.ensureDirectoryExists(wcAnotherUnversionedFile.getParentFile()); add(svnOperationFactory, wcAnotherUnversionedFile.getParentFile()); SVNFileUtil.ensureDirectoryExists(wcUnversionedFile.getParentFile()); add(svnOperationFactory, wcUnversionedFile.getParentFile()); move(svnOperationFactory, wcVersionedFile, wcUnversionedFile); SVNFileUtil.rename(wcUnversionedFile, wcAnotherUnversionedFile); moveVirtual(svnOperationFactory, wcUnversionedFile, wcAnotherUnversionedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_DELETED, wcVersionedFile, statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_NONE, wcUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherUnversionedFile.getParentFile(), statuses); Assert.assertEquals(url.appendPath(versionedFile, false), statuses.get(wcAnotherUnversionedFile).getCopyFromUrl()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testCopyingWronglyCopied() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testCopyingWronglyCopied", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String unversionedFile = "directory3/unversionedFile.txt"; final String anotherUnversionedFile = "directory4/anotherUnversionedFile.txt"; final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcUnversionedFile = new File(workingCopyDirectory, unversionedFile); final File wcAnotherUnversionedFile = new File(workingCopyDirectory, anotherUnversionedFile); SVNFileUtil.ensureDirectoryExists(wcAnotherUnversionedFile.getParentFile()); add(svnOperationFactory, wcAnotherUnversionedFile.getParentFile()); wronglyCopy(svnOperationFactory, wcVersionedFile, wcUnversionedFile); SVNFileUtil.copyFile(wcUnversionedFile, wcAnotherUnversionedFile, false); copyVirtual(svnOperationFactory, wcUnversionedFile, wcAnotherUnversionedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile, statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherUnversionedFile.getParentFile(), statuses); Assert.assertNull(statuses.get(wcUnversionedFile).getCopyFromUrl()); Assert.assertNull(statuses.get(wcAnotherUnversionedFile).getCopyFromUrl()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testMovingWronglyCopied() throws Exception { Assume.assumeTrue(TestUtil.isNewWorkingCopyTest()); final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testMovingWronglyCopied", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String unversionedFile = "directory3/unversionedFile.txt"; final String anotherUnversionedFile = "directory4/anotherUnversionedFile.txt"; final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcUnversionedFile = new File(workingCopyDirectory, unversionedFile); final File wcAnotherUnversionedFile = new File(workingCopyDirectory, anotherUnversionedFile); SVNFileUtil.ensureDirectoryExists(wcAnotherUnversionedFile.getParentFile()); add(svnOperationFactory, wcAnotherUnversionedFile.getParentFile()); wronglyCopy(svnOperationFactory, wcVersionedFile, wcUnversionedFile); SVNFileUtil.rename(wcUnversionedFile, wcAnotherUnversionedFile); moveVirtual(svnOperationFactory, wcUnversionedFile, wcAnotherUnversionedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile, statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_NONE, wcUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherUnversionedFile.getParentFile(), statuses); Assert.assertNull(statuses.get(wcAnotherUnversionedFile).getCopyFromUrl()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testCopyingWronglyMoved() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testCopyingWronglyMoved", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String unversionedFile = "directory3/unversionedFile.txt"; final String anotherUnversionedFile = "directory4/anotherUnversionedFile.txt"; final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcUnversionedFile = new File(workingCopyDirectory, unversionedFile); final File wcAnotherUnversionedFile = new File(workingCopyDirectory, anotherUnversionedFile); SVNFileUtil.ensureDirectoryExists(wcAnotherUnversionedFile.getParentFile()); add(svnOperationFactory, wcAnotherUnversionedFile.getParentFile()); wronglyMove(svnOperationFactory, wcVersionedFile, wcUnversionedFile); SVNFileUtil.copyFile(wcUnversionedFile, wcAnotherUnversionedFile, false); copyVirtual(svnOperationFactory, wcUnversionedFile, wcAnotherUnversionedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_DELETED, wcVersionedFile, statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherUnversionedFile.getParentFile(), statuses); Assert.assertNull(statuses.get(wcUnversionedFile).getCopyFromUrl()); Assert.assertNull(statuses.get(wcAnotherUnversionedFile).getCopyFromUrl()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testMovingWronglyMoved() throws Exception { Assume.assumeTrue(TestUtil.isNewWorkingCopyTest()); final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testMovingWronglyMoved", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String unversionedFile = "directory3/unversionedFile.txt"; final String anotherUnversionedFile = "directory4/anotherUnversionedFile.txt"; final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcUnversionedFile = new File(workingCopyDirectory, unversionedFile); final File wcAnotherUnversionedFile = new File(workingCopyDirectory, anotherUnversionedFile); SVNFileUtil.ensureDirectoryExists(wcAnotherUnversionedFile.getParentFile()); add(svnOperationFactory, wcAnotherUnversionedFile.getParentFile()); wronglyMove(svnOperationFactory, wcVersionedFile, wcUnversionedFile); SVNFileUtil.rename(wcUnversionedFile, wcAnotherUnversionedFile); moveVirtual(svnOperationFactory, wcUnversionedFile, wcAnotherUnversionedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_DELETED, wcVersionedFile, statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_NONE, wcUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherUnversionedFile.getParentFile(), statuses); Assert.assertNull(statuses.get(wcAnotherUnversionedFile).getCopyFromUrl()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testDirectoryCopiedFileVirtuallyCopied() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testDirectoryCopiedFileVirtuallyCopied", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String targetFile = "directory3/versionedFile.txt"; final String anotherTargetFile = "directory4/anotherTargetFile.txt"; final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcTargetFile = new File(workingCopyDirectory, targetFile); final File wcAnotherTargetFile = new File(workingCopyDirectory, anotherTargetFile); SVNFileUtil.ensureDirectoryExists(wcAnotherTargetFile.getParentFile()); add(svnOperationFactory, wcAnotherTargetFile.getParentFile()); copy(svnOperationFactory, wcVersionedFile.getParentFile(), wcTargetFile.getParentFile()); SVNFileUtil.copyFile(wcTargetFile, wcAnotherTargetFile, false); copyVirtual(svnOperationFactory, wcTargetFile, wcAnotherTargetFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile, statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcTargetFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcTargetFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherTargetFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherTargetFile.getParentFile(), statuses); Assert.assertEquals(url.appendPath(versionedFile, false), statuses.get(wcAnotherTargetFile).getCopyFromUrl()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testDirectoryMovedFileVirtuallyCopied() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testDirectoryMovedFileVirtuallyCopied", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String targetFile = "directory3/versionedFile.txt"; final String anotherTargetFile = "directory4/anotherTargetFile.txt"; final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcTargetFile = new File(workingCopyDirectory, targetFile); final File wcAnotherTargetFile = new File(workingCopyDirectory, anotherTargetFile); SVNFileUtil.ensureDirectoryExists(wcAnotherTargetFile.getParentFile()); add(svnOperationFactory, wcAnotherTargetFile.getParentFile()); move(svnOperationFactory, wcVersionedFile.getParentFile(), wcTargetFile.getParentFile()); SVNFileUtil.copyFile(wcTargetFile, wcAnotherTargetFile, false); copyVirtual(svnOperationFactory, wcTargetFile, wcAnotherTargetFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_DELETED, wcVersionedFile, statuses); assertStatus(SVNStatusType.STATUS_DELETED, wcVersionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcTargetFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcTargetFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherTargetFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherTargetFile.getParentFile(), statuses); Assert.assertEquals(url.appendPath(versionedFile, false), statuses.get(wcAnotherTargetFile).getCopyFromUrl()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testDirectoryCopiedFileVirtuallyMoved() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testDirectoryCopiedFileVirtuallyMoved", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String targetFile = "directory3/versionedFile.txt"; final String anotherTargetFile = "directory4/anotherTargetFile.txt"; final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcTargetFile = new File(workingCopyDirectory, targetFile); final File wcAnotherTargetFile = new File(workingCopyDirectory, anotherTargetFile); SVNFileUtil.ensureDirectoryExists(wcAnotherTargetFile.getParentFile()); add(svnOperationFactory, wcAnotherTargetFile.getParentFile()); copy(svnOperationFactory, wcVersionedFile.getParentFile(), wcTargetFile.getParentFile()); SVNFileUtil.rename(wcTargetFile, wcAnotherTargetFile); moveVirtual(svnOperationFactory, wcTargetFile, wcAnotherTargetFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile, statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_DELETED, wcTargetFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcTargetFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherTargetFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherTargetFile.getParentFile(), statuses); Assert.assertEquals(url.appendPath(versionedFile, false), statuses.get(wcAnotherTargetFile).getCopyFromUrl()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testDirectoryMovedFileVirtuallyMoved() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testDirectoryMovedFileVirtuallyMoved", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String targetFile = "directory3/versionedFile.txt"; final String anotherTargetFile = "directory4/anotherTargetFile.txt"; final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcTargetFile = new File(workingCopyDirectory, targetFile); final File wcAnotherTargetFile = new File(workingCopyDirectory, anotherTargetFile); SVNFileUtil.ensureDirectoryExists(wcAnotherTargetFile.getParentFile()); add(svnOperationFactory, wcAnotherTargetFile.getParentFile()); move(svnOperationFactory, wcVersionedFile.getParentFile(), wcTargetFile.getParentFile()); SVNFileUtil.rename(wcTargetFile, wcAnotherTargetFile); moveVirtual(svnOperationFactory, wcTargetFile, wcAnotherTargetFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_DELETED, wcVersionedFile, statuses); assertStatus(SVNStatusType.STATUS_DELETED, wcVersionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_DELETED, wcTargetFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcTargetFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherTargetFile, statuses); assertStatus(SVNStatusType.STATUS_ADDED, wcAnotherTargetFile.getParentFile(), statuses); Assert.assertEquals(url.appendPath(versionedFile, false), statuses.get(wcAnotherTargetFile).getCopyFromUrl()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testFileMovedVirtuallyMovedParentIsVersioned() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testFileMovedVirtuallyMoved", options); try { final SVNURL url = sandbox.createSvnRepository(); final String versionedFile = "directory1/versionedFile.txt"; final String unversionedFile = "directory3/unversionedFile.txt"; final String fileInSameDirectory = "directory3/fileInSameDirectory.txt"; //if makeParents for unversionedFile calls "svn add" with infinite depth, this file will be added (that is not expected) final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.setCommitMessage("Added a file into repository."); commitBuilder.addFile(versionedFile); commitBuilder.addFile(fileInSameDirectory); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File wcVersionedFile = new File(workingCopyDirectory, versionedFile); final File wcUnversionedFile = new File(workingCopyDirectory, unversionedFile); final File wcFileInSameDirectory = new File(workingCopyDirectory, fileInSameDirectory); SVNFileUtil.rename(wcVersionedFile, wcUnversionedFile); moveVirtual(svnOperationFactory, wcVersionedFile, wcUnversionedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, wcUnversionedFile, statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcUnversionedFile.getParentFile(), statuses); assertStatus(SVNStatusType.STATUS_DELETED, wcVersionedFile, statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcFileInSameDirectory, statuses); assertStatus(SVNStatusType.STATUS_NORMAL, wcVersionedFile.getParentFile(), statuses); Assert.assertEquals(url.appendPath(versionedFile, false), statuses.get(wcUnversionedFile).getCopyFromUrl()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testVirtualCopyBetweenDifferentWorkingCopiesFailed() throws Exception { Assume.assumeTrue(TestUtil.isNewWorkingCopyTest()); final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualCopyBetweenDifferentWorkingCopiesFailed", options); try { final SVNURL url1 = sandbox.createSvnRepository(); final SVNURL url2 = sandbox.createSvnRepository(); final String filePath = "directory1/file1.txt"; //we commit only to the first repository final CommitBuilder commitBuilder1 = new CommitBuilder(url1); commitBuilder1.setCommitMessage("Added a file into repository."); commitBuilder1.addFile(filePath); commitBuilder1.commit(); final WorkingCopy workingCopy1 = sandbox.checkoutNewWorkingCopy(url1, SVNRevision.HEAD.getNumber()); final WorkingCopy workingCopy2 = sandbox.checkoutNewWorkingCopy(url2, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory1 = workingCopy1.getWorkingCopyDirectory(); final File workingCopyDirectory2 = workingCopy2.getWorkingCopyDirectory(); Assert.assertNotSame(workingCopyDirectory1, workingCopyDirectory2); final File file1 = new File(workingCopyDirectory1, filePath); final File file2 = new File(workingCopyDirectory2, filePath); SVNFileUtil.ensureDirectoryExists(file1.getParentFile()); SVNFileUtil.ensureDirectoryExists(file2.getParentFile()); add(svnOperationFactory, file2.getParentFile()); SVNFileUtil.copyFile(file1, file2, false); try { copyVirtual(svnOperationFactory, file1, file2); Assert.fail("An exception should be thrown"); } catch (SVNException e) { e.printStackTrace(); Assert.assertEquals(SVNErrorCode.WC_INVALID_SCHEDULE, e.getErrorMessage().getErrorCode()); //expected } } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testVirtualCopyMissingToUnversioned() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualCopyMissingToUnversioned", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("missing"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File unversionedFile = new File(workingCopyDirectory, "unversioned"); //noinspection ResultOfMethodCallIgnored unversionedFile.createNewFile(); final File missingFile = new File(workingCopyDirectory, "missing"); SVNFileUtil.deleteFile(missingFile); copyVirtual(svnOperationFactory, missingFile, unversionedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, unversionedFile, statuses); assertStatus(SVNStatusType.STATUS_MISSING, missingFile, statuses); Assert.assertEquals(url.appendPath("missing", false), statuses.get(unversionedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualCopyDeletedToUnversioned() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualCopyDeletedToUnversioned", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("deleted"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File unversionedFile = new File(workingCopyDirectory, "unversioned"); //noinspection ResultOfMethodCallIgnored unversionedFile.createNewFile(); final File deletedFile = new File(workingCopyDirectory, "deleted"); workingCopy.delete(deletedFile); copyVirtual(svnOperationFactory, deletedFile, unversionedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, unversionedFile, statuses); assertStatus(SVNStatusType.STATUS_DELETED, deletedFile, statuses); Assert.assertEquals(url.appendPath("deleted", false), statuses.get(unversionedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualCopyReplacedToUnversioned() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualCopyReplacedToUnversioned", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("replaced"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File unversionedFile = new File(workingCopyDirectory, "unversioned"); //noinspection ResultOfMethodCallIgnored unversionedFile.createNewFile(); final File replacedFile = new File(workingCopyDirectory, "replaced"); workingCopy.delete(replacedFile); //noinspection ResultOfMethodCallIgnored replacedFile.createNewFile(); workingCopy.add(replacedFile); copyVirtual(svnOperationFactory, replacedFile, unversionedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, unversionedFile, statuses); assertStatus(SVNStatusType.STATUS_REPLACED, replacedFile, statuses); Assert.assertEquals(url.appendPath("replaced", false), statuses.get(unversionedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualCopyMissingToAdded() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualCopyMissingToAdded", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("missing"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File addedFile = new File(workingCopyDirectory, "added"); //noinspection ResultOfMethodCallIgnored addedFile.createNewFile(); add(svnOperationFactory, addedFile); final File missingFile = new File(workingCopyDirectory, "missing"); SVNFileUtil.deleteFile(missingFile); copyVirtual(svnOperationFactory, missingFile, addedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, addedFile, statuses); assertStatus(SVNStatusType.STATUS_MISSING, missingFile, statuses); Assert.assertEquals(url.appendPath("missing", false), statuses.get(addedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualCopyDeletedToAdded() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualCopyDeletedToAdded", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("deleted"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File addedFile = new File(workingCopyDirectory, "added"); //noinspection ResultOfMethodCallIgnored addedFile.createNewFile(); add(svnOperationFactory, addedFile); final File deletedFile = new File(workingCopyDirectory, "deleted"); workingCopy.delete(deletedFile); copyVirtual(svnOperationFactory, deletedFile, addedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, addedFile, statuses); assertStatus(SVNStatusType.STATUS_DELETED, deletedFile, statuses); Assert.assertEquals(url.appendPath("deleted", false), statuses.get(addedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualCopyReplacedToAdded() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualCopyReplacedToAdded", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("replaced"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File addedFile = new File(workingCopyDirectory, "added"); //noinspection ResultOfMethodCallIgnored addedFile.createNewFile(); add(svnOperationFactory, addedFile); final File replacedFile = new File(workingCopyDirectory, "replaced"); workingCopy.delete(replacedFile); //noinspection ResultOfMethodCallIgnored replacedFile.createNewFile(); workingCopy.add(replacedFile); copyVirtual(svnOperationFactory, replacedFile, addedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, addedFile, statuses); assertStatus(SVNStatusType.STATUS_REPLACED, replacedFile, statuses); Assert.assertEquals(url.appendPath("replaced", false), statuses.get(addedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualCopyMissingToCopied() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualCopyMissingToCopied", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("source"); commitBuilder.addFile("missing"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File sourceFile = new File(workingCopyDirectory, "source"); final File copiedFile = new File(workingCopyDirectory, "copied"); copy(svnOperationFactory, sourceFile, copiedFile); final File missingFile = new File(workingCopyDirectory, "missing"); SVNFileUtil.deleteFile(missingFile); copyVirtual(svnOperationFactory, missingFile, copiedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, copiedFile, statuses); assertStatus(SVNStatusType.STATUS_MISSING, missingFile, statuses); Assert.assertEquals(url.appendPath("missing", false), statuses.get(copiedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualCopyDeletedToCopied() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualCopyDeletedToCopied", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("source"); commitBuilder.addFile("deleted"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File sourceFile = new File(workingCopyDirectory, "source"); final File copiedFile = new File(workingCopyDirectory, "copied"); copy(svnOperationFactory, sourceFile, copiedFile); final File deletedFile = new File(workingCopyDirectory, "deleted"); workingCopy.delete(deletedFile); copyVirtual(svnOperationFactory, deletedFile, copiedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, copiedFile, statuses); assertStatus(SVNStatusType.STATUS_DELETED, deletedFile, statuses); Assert.assertEquals(url.appendPath("deleted", false), statuses.get(copiedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualCopyReplacedToCopied() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualCopyReplacedToCopied", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("source"); commitBuilder.addFile("replaced"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File sourceFile = new File(workingCopyDirectory, "source"); final File copiedFile = new File(workingCopyDirectory, "copied"); copy(svnOperationFactory, sourceFile, copiedFile); final File replacedFile = new File(workingCopyDirectory, "replaced"); workingCopy.delete(replacedFile); //noinspection ResultOfMethodCallIgnored replacedFile.createNewFile(); workingCopy.add(replacedFile); copyVirtual(svnOperationFactory, replacedFile, copiedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, copiedFile, statuses); assertStatus(SVNStatusType.STATUS_REPLACED, replacedFile, statuses); Assert.assertEquals(url.appendPath("replaced", false), statuses.get(copiedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualCopyMissingToReplaced() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualCopyMissingToReplaced", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("replaced"); commitBuilder.addFile("missing"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File replacedFile = new File(workingCopyDirectory, "replaced"); workingCopy.delete(replacedFile); //noinspection ResultOfMethodCallIgnored replacedFile.createNewFile(); workingCopy.add(replacedFile); final File missingFile = new File(workingCopyDirectory, "missing"); SVNFileUtil.deleteFile(missingFile); copyVirtual(svnOperationFactory, missingFile, replacedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_REPLACED, replacedFile, statuses); assertStatus(SVNStatusType.STATUS_MISSING, missingFile, statuses); Assert.assertEquals(url.appendPath("missing", false), statuses.get(replacedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualCopyDeletedToReplaced() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualCopyDeletedToReplaced", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("replaced"); commitBuilder.addFile("deleted"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File replacedFile = new File(workingCopyDirectory, "replaced"); workingCopy.delete(replacedFile); //noinspection ResultOfMethodCallIgnored replacedFile.createNewFile(); workingCopy.add(replacedFile); final File deletedFile = new File(workingCopyDirectory, "deleted"); workingCopy.delete(deletedFile); copyVirtual(svnOperationFactory, deletedFile, replacedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_REPLACED, replacedFile, statuses); assertStatus(SVNStatusType.STATUS_DELETED, deletedFile, statuses); Assert.assertEquals(url.appendPath("deleted", false), statuses.get(replacedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualCopyReplacedToReplaced() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualCopyReplacedToReplaced", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("replaced"); commitBuilder.addFile("anotherReplaced"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File replacedFile = new File(workingCopyDirectory, "replaced"); workingCopy.delete(replacedFile); //noinspection ResultOfMethodCallIgnored replacedFile.createNewFile(); workingCopy.add(replacedFile); final File anotherReplacedFile = new File(workingCopyDirectory, "anotherReplaced"); workingCopy.delete(anotherReplacedFile); //noinspection ResultOfMethodCallIgnored anotherReplacedFile.createNewFile(); workingCopy.add(anotherReplacedFile); copyVirtual(svnOperationFactory, anotherReplacedFile, replacedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_REPLACED, replacedFile, statuses); assertStatus(SVNStatusType.STATUS_REPLACED, anotherReplacedFile, statuses); Assert.assertEquals(url.appendPath("anotherReplaced", false), statuses.get(replacedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualMoveMissingToUnversioned() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualMoveMissingToUnversioned", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("missing"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File unversionedFile = new File(workingCopyDirectory, "unversioned"); //noinspection ResultOfMethodCallIgnored unversionedFile.createNewFile(); final File missingFile = new File(workingCopyDirectory, "missing"); SVNFileUtil.deleteFile(missingFile); moveVirtual(svnOperationFactory, missingFile, unversionedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, unversionedFile, statuses); assertStatus(SVNStatusType.STATUS_DELETED, missingFile, statuses); Assert.assertEquals(url.appendPath("missing", false), statuses.get(unversionedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualMoveDeletedToUnversioned() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualMoveDeletedToUnversioned", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("deleted"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File unversionedFile = new File(workingCopyDirectory, "unversioned"); //noinspection ResultOfMethodCallIgnored unversionedFile.createNewFile(); final File deletedFile = new File(workingCopyDirectory, "deleted"); workingCopy.delete(deletedFile); moveVirtual(svnOperationFactory, deletedFile, unversionedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, unversionedFile, statuses); assertStatus(SVNStatusType.STATUS_DELETED, deletedFile, statuses); Assert.assertEquals(url.appendPath("deleted", false), statuses.get(unversionedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualMoveReplacedToUnversioned() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualMoveReplacedToUnversioned", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("replaced"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File unversionedFile = new File(workingCopyDirectory, "unversioned"); //noinspection ResultOfMethodCallIgnored unversionedFile.createNewFile(); final File replacedFile = new File(workingCopyDirectory, "replaced"); workingCopy.delete(replacedFile); //noinspection ResultOfMethodCallIgnored replacedFile.createNewFile(); workingCopy.add(replacedFile); try { moveVirtual(svnOperationFactory, replacedFile, unversionedFile); Assert.fail("An exception should be thrown"); } catch (SVNException e) { e.printStackTrace(); Assert.assertEquals(SVNErrorCode.ENTRY_EXISTS, e.getErrorMessage().getErrorCode()); //expected } final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_UNVERSIONED, unversionedFile, statuses); assertStatus(SVNStatusType.STATUS_REPLACED, replacedFile, statuses); Assert.assertNull(statuses.get(unversionedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualMoveMissingToAdded() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualMoveMissingToAdded", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("missing"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File addedFile = new File(workingCopyDirectory, "added"); //noinspection ResultOfMethodCallIgnored addedFile.createNewFile(); add(svnOperationFactory, addedFile); final File missingFile = new File(workingCopyDirectory, "missing"); SVNFileUtil.deleteFile(missingFile); moveVirtual(svnOperationFactory, missingFile, addedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, addedFile, statuses); assertStatus(SVNStatusType.STATUS_DELETED, missingFile, statuses); Assert.assertEquals(url.appendPath("missing", false), statuses.get(addedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualMoveDeletedToAdded() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualMoveDeletedToAdded", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("deleted"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File addedFile = new File(workingCopyDirectory, "added"); //noinspection ResultOfMethodCallIgnored addedFile.createNewFile(); add(svnOperationFactory, addedFile); final File deletedFile = new File(workingCopyDirectory, "deleted"); workingCopy.delete(deletedFile); moveVirtual(svnOperationFactory, deletedFile, addedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, addedFile, statuses); assertStatus(SVNStatusType.STATUS_DELETED, deletedFile, statuses); Assert.assertEquals(url.appendPath("deleted", false), statuses.get(addedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualMoveReplacedToAdded() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualMoveReplacedToAdded", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("replaced"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File addedFile = new File(workingCopyDirectory, "added"); //noinspection ResultOfMethodCallIgnored addedFile.createNewFile(); add(svnOperationFactory, addedFile); final File replacedFile = new File(workingCopyDirectory, "replaced"); workingCopy.delete(replacedFile); //noinspection ResultOfMethodCallIgnored replacedFile.createNewFile(); workingCopy.add(replacedFile); try { moveVirtual(svnOperationFactory, replacedFile, addedFile); Assert.fail("An exception should be thrown"); } catch (SVNException e) { e.printStackTrace(); Assert.assertEquals(SVNErrorCode.ENTRY_EXISTS, e.getErrorMessage().getErrorCode()); //expected } final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, addedFile, statuses); assertStatus(SVNStatusType.STATUS_REPLACED, replacedFile, statuses); Assert.assertNull(statuses.get(addedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualMoveMissingToCopied() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualMoveMissingToCopied", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("source"); commitBuilder.addFile("missing"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File sourceFile = new File(workingCopyDirectory, "source"); final File copiedFile = new File(workingCopyDirectory, "copied"); copy(svnOperationFactory, sourceFile, copiedFile); final File missingFile = new File(workingCopyDirectory, "missing"); SVNFileUtil.deleteFile(missingFile); moveVirtual(svnOperationFactory, missingFile, copiedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, copiedFile, statuses); assertStatus(SVNStatusType.STATUS_DELETED, missingFile, statuses); Assert.assertEquals(url.appendPath("missing", false), statuses.get(copiedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualMoveDeletedToCopied() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualMoveDeletedToCopied", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("source"); commitBuilder.addFile("deleted"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File sourceFile = new File(workingCopyDirectory, "source"); final File copiedFile = new File(workingCopyDirectory, "copied"); copy(svnOperationFactory, sourceFile, copiedFile); final File deletedFile = new File(workingCopyDirectory, "deleted"); workingCopy.delete(deletedFile); moveVirtual(svnOperationFactory, deletedFile, copiedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, copiedFile, statuses); assertStatus(SVNStatusType.STATUS_DELETED, deletedFile, statuses); Assert.assertEquals(url.appendPath("deleted", false), statuses.get(copiedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualMoveReplacedToCopied() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualMoveReplacedToCopied", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("source"); commitBuilder.addFile("replaced"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File sourceFile = new File(workingCopyDirectory, "source"); final File copiedFile = new File(workingCopyDirectory, "copied"); copy(svnOperationFactory, sourceFile, copiedFile); final File replacedFile = new File(workingCopyDirectory, "replaced"); workingCopy.delete(replacedFile); //noinspection ResultOfMethodCallIgnored replacedFile.createNewFile(); workingCopy.add(replacedFile); try { moveVirtual(svnOperationFactory, replacedFile, copiedFile); Assert.fail("An exception should be thrown"); } catch (SVNException e) { e.printStackTrace(); Assert.assertEquals(SVNErrorCode.ENTRY_EXISTS, e.getErrorMessage().getErrorCode()); //expected } final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_ADDED, copiedFile, statuses); assertStatus(SVNStatusType.STATUS_REPLACED, replacedFile, statuses); Assert.assertEquals(url.appendPath("source", false), statuses.get(copiedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualMoveMissingToReplaced() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualMoveMissingToReplaced", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("replaced"); commitBuilder.addFile("missing"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File replacedFile = new File(workingCopyDirectory, "replaced"); workingCopy.delete(replacedFile); //noinspection ResultOfMethodCallIgnored replacedFile.createNewFile(); workingCopy.add(replacedFile); final File missingFile = new File(workingCopyDirectory, "missing"); SVNFileUtil.deleteFile(missingFile); moveVirtual(svnOperationFactory, missingFile, replacedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_REPLACED, replacedFile, statuses); assertStatus(SVNStatusType.STATUS_DELETED, missingFile, statuses); Assert.assertEquals(url.appendPath("missing", false), statuses.get(replacedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualMoveDeletedToReplaced() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualMoveDeletedToReplaced", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("replaced"); commitBuilder.addFile("deleted"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File replacedFile = new File(workingCopyDirectory, "replaced"); workingCopy.delete(replacedFile); //noinspection ResultOfMethodCallIgnored replacedFile.createNewFile(); workingCopy.add(replacedFile); final File deletedFile = new File(workingCopyDirectory, "deleted"); workingCopy.delete(deletedFile); moveVirtual(svnOperationFactory, deletedFile, replacedFile); final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_REPLACED, replacedFile, statuses); assertStatus(SVNStatusType.STATUS_DELETED, deletedFile, statuses); Assert.assertEquals(url.appendPath("deleted", false), statuses.get(replacedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } @Test public void testVirtualMoveReplacedToReplaced() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testVirtualMoveReplacedToReplaced", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("replaced"); commitBuilder.addFile("anotherReplaced"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File replacedFile = new File(workingCopyDirectory, "replaced"); workingCopy.delete(replacedFile); //noinspection ResultOfMethodCallIgnored replacedFile.createNewFile(); workingCopy.add(replacedFile); final File anotherReplacedFile = new File(workingCopyDirectory, "anotherReplaced"); workingCopy.delete(anotherReplacedFile); //noinspection ResultOfMethodCallIgnored anotherReplacedFile.createNewFile(); workingCopy.add(anotherReplacedFile); try { moveVirtual(svnOperationFactory, anotherReplacedFile, replacedFile); Assert.fail("An exception should be thrown"); } catch (SVNException e) { e.printStackTrace(); Assert.assertEquals(SVNErrorCode.ENTRY_EXISTS, e.getErrorMessage().getErrorCode()); //expected } final Map<File, SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory); assertStatus(SVNStatusType.STATUS_REPLACED, replacedFile, statuses); assertStatus(SVNStatusType.STATUS_REPLACED, anotherReplacedFile, statuses); Assert.assertNull(statuses.get(replacedFile).getCopyFromUrl()); } finally { svnOperationFactory.dispose(); sandbox.dispose(); } } private void assertStatus(SVNStatusType statusType, File file, Map<File, SvnStatus> statuses) { if (statusType == SVNStatusType.STATUS_NONE && statuses.get(file) == null) { return; } Assert.assertEquals(statusType, statuses.get(file).getNodeStatus()); } private void copyVirtual(SvnOperationFactory svnOperationFactory, File fromFile, File toFile) throws SVNException { copy(svnOperationFactory, fromFile, toFile, false, true); } private void moveVirtual(SvnOperationFactory svnOperationFactory, File fromFile, File toFile) throws SVNException { copy(svnOperationFactory, fromFile, toFile, true, true); } private void move(SvnOperationFactory svnOperationFactory, File fromFile, File toFile) throws SVNException { copy(svnOperationFactory, fromFile, toFile, true, false); } private void copy(SvnOperationFactory svnOperationFactory, File fromFile, File toFile) throws SVNException { copy(svnOperationFactory, fromFile, toFile, false, false); } private void copy(SvnOperationFactory svnOperationFactory, File fromFile, File toFile, boolean move, boolean virtual) throws SVNException { final SvnCopy copy = svnOperationFactory.createCopy(); copy.addCopySource(SvnCopySource.create(SvnTarget.fromFile(fromFile), SVNRevision.WORKING)); copy.setSingleTarget(SvnTarget.fromFile(toFile)); copy.setFailWhenDstExists(true);//fail when dst exists = !copy as child copy.setIgnoreExternals(true); copy.setMakeParents(false); copy.setVirtual(virtual); copy.setMove(move); copy.run(); } private void wronglyMove(SvnOperationFactory svnOperationFactory, File fromFile, File toFile) throws SVNException { SVNFileUtil.copyFile(fromFile, toFile, false); delete(svnOperationFactory, fromFile); add(svnOperationFactory, toFile); } private void wronglyCopy(SvnOperationFactory svnOperationFactory, File fromFile, File toFile) throws SVNException { SVNFileUtil.copyFile(fromFile, toFile, false); add(svnOperationFactory, toFile); } private void delete(SvnOperationFactory svnOperationFactory, File file) throws SVNException { final SvnScheduleForRemoval scheduleForRemoval = svnOperationFactory.createScheduleForRemoval(); scheduleForRemoval.setSingleTarget(SvnTarget.fromFile(file)); scheduleForRemoval.setDeleteFiles(true); scheduleForRemoval.setForce(false); scheduleForRemoval.setDryRun(false); scheduleForRemoval.run(); } private void add(SvnOperationFactory svnOperationFactory, File file) throws SVNException { final SvnScheduleForAddition scheduleForAddition = svnOperationFactory.createScheduleForAddition(); scheduleForAddition.setSingleTarget(SvnTarget.fromFile(file)); scheduleForAddition.setAddParents(true); scheduleForAddition.setMkDir(false); scheduleForAddition.setApplyAutoProperties(false); scheduleForAddition.setForce(false); scheduleForAddition.setIncludeIgnored(true); scheduleForAddition.run(); } private String getTestName() { return getClass().getSimpleName(); } }