package org.tmatesoft.svn.test; import java.io.File; import org.junit.Assert; import org.junit.Assume; import org.junit.Test; import org.tmatesoft.svn.core.SVNCommitInfo; import org.tmatesoft.svn.core.SVNDepth; 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.ISvnCommitParameters; import org.tmatesoft.svn.core.wc2.ISvnCommitParameters.Action; import org.tmatesoft.svn.core.wc2.SvnCommit; import org.tmatesoft.svn.core.wc2.SvnCommitPacket; 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; import org.tmatesoft.svn.core.wc2.SvnUpdate; public class SvnCommitParametersTest { private static final String DIR_PATH = "directory"; private static final String MISSING_DIR_PATH = "directory/subdir"; private static final String CHANGED_FILE_PATH = "directory/file2"; private static final String MISSING_FILE_PATH = "directory/file1"; private static final String COPY_DIR_PATH = "copy"; private static final String COPY_MISSING_DIR_PATH = "copy/subdir"; private static final String COPY_CHANGED_FILE_PATH = "copy/file2"; private static final String COPY_MISSING_FILE_PATH = "copy/file1"; public String getTestName() { return "SvnCommitParametersTest"; } @Test public void testMissingFileDelete() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testMissingFileDelete", options); try { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile("someFile"); commitBuilder.commit(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File someFile = new File(workingCopyDirectory, "someFile"); SVNFileUtil.deleteFile(someFile); final SvnCommit commit = svnOperationFactory.createCommit(); commit.setSingleTarget(SvnTarget.fromFile(workingCopyDirectory)); commit.setCommitParameters(createCommitParameters(ISvnCommitParameters.Action.DELETE, true, ISvnCommitParameters.Action.DELETE, true)); commit.setCommitMessage(""); final SVNCommitInfo commitInfo = commit.run(); Assert.assertNotNull(commitInfo); Assert.assertEquals(2, commitInfo.getNewRevision()); workingCopy.revert(); Assert.assertFalse(someFile.exists()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testDeleteMissing() throws SVNException { WorkingCopy wc = prepareMissingWc(getTestName()); File missingFile = wc.getFile(MISSING_FILE_PATH); File missingDir = wc.getFile(MISSING_DIR_PATH); File changedFile = wc.getFile(CHANGED_FILE_PATH); SvnCommitPacket packet = collectPacket(wc, new File[] {changedFile, missingFile, missingDir}, new SvnOperationFactory(), createCommitParameters(Action.DELETE, true, Action.DELETE, true), SVNDepth.EMPTY); try { Assert.assertNotNull(packet.getItem(changedFile)); Assert.assertNotNull(packet.getItem(missingFile)); Assert.assertNotNull(packet.getItem(missingDir)); } finally { packet.dispose(); } SvnStatus st = wc.getStatus(MISSING_FILE_PATH); Assert.assertEquals(SVNStatusType.STATUS_DELETED, st.getNodeStatus()); st = wc.getStatus(MISSING_DIR_PATH); Assert.assertEquals(SVNStatusType.STATUS_DELETED, st.getNodeStatus()); } @Test public void testSkipMissing() throws SVNException { WorkingCopy wc = prepareMissingWc(getTestName()); File missingFile = wc.getFile(MISSING_FILE_PATH); File missingDir = wc.getFile(MISSING_DIR_PATH); File changedFile = wc.getFile(CHANGED_FILE_PATH); SvnCommitPacket packet = collectPacket(wc, new File[] {changedFile, missingFile, missingDir}, new SvnOperationFactory(), createCommitParameters(Action.SKIP, true, Action.SKIP, true), SVNDepth.EMPTY); Assert.assertNotNull(packet.getItem(changedFile)); Assert.assertNull(packet.getItem(missingFile)); Assert.assertNull(packet.getItem(missingDir)); packet.dispose(); SvnStatus st = wc.getStatus(MISSING_FILE_PATH); Assert.assertEquals(SVNStatusType.STATUS_MISSING, st.getNodeStatus()); st = wc.getStatus(MISSING_DIR_PATH); Assert.assertEquals(SVNStatusType.STATUS_MISSING, st.getNodeStatus()); } @Test public void testFailOnMissing() throws SVNException { WorkingCopy wc = prepareMissingWc(getTestName()); File missingFile = wc.getFile(MISSING_FILE_PATH); File missingDir = wc.getFile(MISSING_DIR_PATH); File changedFile = wc.getFile(CHANGED_FILE_PATH); try { collectPacket(wc, new File[] {changedFile, missingFile, missingDir}, new SvnOperationFactory(), createCommitParameters(Action.ERROR, true, Action.SKIP, true), SVNDepth.EMPTY); Assert.fail(); } catch (SVNException e) { // } SvnStatus st = wc.getStatus(MISSING_FILE_PATH); Assert.assertEquals(SVNStatusType.STATUS_MISSING, st.getNodeStatus()); st = wc.getStatus(MISSING_DIR_PATH); Assert.assertEquals(SVNStatusType.STATUS_MISSING, st.getNodeStatus()); } @Test public void testDeleteMissingInACopy() throws SVNException { Assume.assumeTrue(TestUtil.isNewWorkingCopyTest()); WorkingCopy wc = prepareMissingWc(getTestName()); File missingFile = wc.getFile(COPY_MISSING_FILE_PATH); File missingDir = wc.getFile(COPY_MISSING_DIR_PATH); File changedFile = wc.getFile(COPY_CHANGED_FILE_PATH); File copyRoot = wc.getFile(COPY_DIR_PATH); wc.copy(DIR_PATH, COPY_DIR_PATH); SvnStatus st = wc.getStatus(COPY_MISSING_FILE_PATH); Assert.assertEquals(SVNStatusType.STATUS_MISSING, st.getNodeStatus()); st = wc.getStatus(COPY_MISSING_DIR_PATH); Assert.assertEquals(SVNStatusType.STATUS_MISSING, st.getNodeStatus()); SvnCommitPacket packet = collectPacket(wc, new File[] {copyRoot, changedFile, missingFile, missingDir}, new SvnOperationFactory(), createCommitParameters(Action.DELETE, true, Action.DELETE, true), SVNDepth.EMPTY); Assert.assertNotNull(packet.getItem(changedFile)); Assert.assertNotNull(packet.getItem(missingFile)); Assert.assertNotNull(packet.getItem(missingDir)); packet.dispose(); st = wc.getStatus(COPY_MISSING_FILE_PATH); Assert.assertEquals(SVNStatusType.STATUS_DELETED, st.getNodeStatus()); st = wc.getStatus(COPY_MISSING_DIR_PATH); Assert.assertEquals(SVNStatusType.STATUS_DELETED, st.getNodeStatus()); } @Test public void testPostCommitDeletions() throws SVNException { Assume.assumeTrue(TestUtil.isNewWorkingCopyTest()); WorkingCopy wc = prepareMissingWc(getTestName()); File missingFile = wc.getFile(MISSING_FILE_PATH); File missingDir = wc.getFile(MISSING_DIR_PATH); File dir = wc.getFile(DIR_PATH); SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); SvnScheduleForRemoval rm = svnOperationFactory.createScheduleForRemoval(); rm.addTarget(SvnTarget.fromFile(missingDir)); rm.addTarget(SvnTarget.fromFile(missingFile)); rm.setDepth(SVNDepth.EMPTY); rm.setDeleteFiles(false); rm.run(); restoreDirectory(missingDir, svnOperationFactory); wc.changeFileContents(MISSING_FILE_PATH, "changed contents"); Assert.assertTrue(missingDir.isDirectory()); Assert.assertTrue(missingFile.isFile()); SvnCommit ci = svnOperationFactory.createCommit(); ci.setCommitMessage("message"); ci.addTarget(SvnTarget.fromFile(dir)); ci.setCommitParameters(createCommitParameters(Action.DELETE, true, Action.SKIP, false)); ci.setDepth(SVNDepth.INFINITY); ci.run(); Assert.assertTrue(missingDir.isDirectory()); Assert.assertTrue(!missingFile.exists()); } private void restoreDirectory(File missingDir, SvnOperationFactory svnOperationFactory) throws SVNException { if (TestUtil.isNewWorkingCopyTest()) { missingDir.mkdir(); } else { SvnUpdate up = svnOperationFactory.createUpdate(); up.setSingleTarget(SvnTarget.fromFile(missingDir)); up.run(); } } @Test public void testPostCommitForReplacement() throws SVNException { WorkingCopy wc = prepareMissingWc(getTestName()); File missingFile = wc.getFile(MISSING_FILE_PATH); File missingDir = wc.getFile(MISSING_DIR_PATH); File dir = wc.getFile(DIR_PATH); SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); SvnScheduleForRemoval rm = svnOperationFactory.createScheduleForRemoval(); rm.addTarget(SvnTarget.fromFile(missingFile)); rm.addTarget(SvnTarget.fromFile(missingDir)); rm.setDepth(SVNDepth.EMPTY); rm.run(); restoreDirectory(missingDir, svnOperationFactory); wc.changeFileContents(MISSING_FILE_PATH, "changed contents"); SvnScheduleForAddition add = svnOperationFactory.createScheduleForAddition(); add.addTarget(SvnTarget.fromFile(missingFile)); add.addTarget(SvnTarget.fromFile(missingDir)); add.run(); Assert.assertTrue(missingDir.isDirectory()); Assert.assertTrue(missingFile.isFile()); SvnCommit ci = svnOperationFactory.createCommit(); ci.setCommitMessage("message"); ci.addTarget(SvnTarget.fromFile(dir)); ci.setCommitParameters(createCommitParameters(Action.SKIP, true, Action.SKIP, true)); ci.setDepth(SVNDepth.INFINITY); ci.run(); Assert.assertTrue(missingDir.isDirectory()); Assert.assertTrue(missingFile.exists()); } private WorkingCopy prepareMissingWc(String sandboxName) throws SVNException { final TestOptions options = TestOptions.getInstance(); final Sandbox sandbox = Sandbox.createWithCleanup(sandboxName, options); final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile(MISSING_FILE_PATH, "contents1".getBytes()); commitBuilder.addFile(CHANGED_FILE_PATH, "contents2".getBytes()); commitBuilder.addDirectory(MISSING_DIR_PATH); commitBuilder.commit(); WorkingCopy wc = sandbox.checkoutNewWorkingCopy(url, -1); wc.deleteFile(MISSING_FILE_PATH); wc.changeFileContents(CHANGED_FILE_PATH, "changed"); wc.deleteFile(MISSING_DIR_PATH); return wc; } private SvnCommitPacket collectPacket(WorkingCopy wc, File[] targets, SvnOperationFactory of, ISvnCommitParameters params, SVNDepth depth) throws SVNException { SvnCommit ci = of.createCommit(); ci.setCommitParameters(params); for (int i = 0; i < targets.length; i++) { ci.addTarget(SvnTarget.fromFile(targets[i])); } ci.setDepth(depth); return ci.collectCommitItems(); } private ISvnCommitParameters createCommitParameters(final ISvnCommitParameters.Action onMissingFile, final boolean deleteFile, final ISvnCommitParameters.Action onMissingDir, final boolean deleteDir) { return new ISvnCommitParameters() { public ISvnCommitParameters.Action onMissingFile(File file) { return onMissingFile; } public ISvnCommitParameters.Action onMissingDirectory(File file) { return onMissingDir; } public boolean onDirectoryDeletion(File directory) { return deleteDir; } public boolean onFileDeletion(File file) { return deleteFile; } }; } }