package org.tmatesoft.svn.test; import java.io.File; import junit.framework.Assert; import org.junit.Assume; import org.junit.Before; import org.junit.Test; import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNProperty; import org.tmatesoft.svn.core.SVNPropertyValue; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.wc.SVNFileUtil; import org.tmatesoft.svn.core.internal.wc2.SvnWcGeneration; import org.tmatesoft.svn.core.wc.SVNWCUtil; import org.tmatesoft.svn.core.wc2.SvnCheckout; 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.SvnSetProperty; import org.tmatesoft.svn.core.wc2.SvnTarget; import org.tmatesoft.svn.core.wc2.SvnUpdate; public class SvnWcUtilTest { private static final String FILE2_PATH = "A/B/beta"; private static final String DIR_PATH = "C"; private static final String DIRB_PATH = "A/B"; private static final String DIRG_PATH = "A/G"; private static final String MISSING_DIR_PATH = "C/missing"; private static final String FILE1_PATH = "A/alpha"; private static final String EXT_PATH = "ext"; private static final String EXT_DEEP_PATH = "ext-deep/ext"; private static final String FILE_PATH_IN_EXT = "ext/alpha"; private static final String DIR_PATH_IN_EXT = "ext/B"; private static final String FILE_PATH_IN_DEEP_EXT = "ext-deep/ext/alpha"; private static final String DIR_PATH_IN_DEEP_EXT = "ext-deep/ext/B"; private static final String UNVERSIONED_DIR1_PATH = "unversioned"; private static final String UNVERSIONED_DIR2_PATH = "C/unversioned"; private static final String UNVERSIONED_FILE_PATH = "unversioned.txt"; @Before public void setup() { Assume.assumeTrue(!TestUtil.isNewWorkingCopyOnly()); } @Test public void testIsVersionedDirectory() throws SVNException { final Sandbox sandbox = Sandbox.createWithCleanup(getClass().getSimpleName(), TestOptions.getInstance()); final SVNURL url = prepareRepository(sandbox); final File wc17 = prepareWc(sandbox, url, SvnWcGeneration.V17); final File wc16 = prepareWc(sandbox, url, SvnWcGeneration.V16); final File unversioned = sandbox.createDirectory("unversioned"); Assert.assertFalse(SVNWCUtil.isVersionedDirectory(unversioned)); testIsVersioned(wc16); testIsVersioned(wc17); File wc16copy = sandbox.createDirectory("wc16-copy"); wc16copy.delete(); File wc17copy = sandbox.createDirectory("wc17-copy"); wc16copy.delete(); SVNFileUtil.copyDirectory(wc16, wc16copy, true, null); SVNFileUtil.copyDirectory(wc17, wc17copy, true, null); File innerWc16In17 = new File(wc17copy, "innerWc16"); File innerWc17In17 = new File(wc17copy, "innerWc17"); File innerWc16In16 = new File(wc16copy, "innerWc16"); File innerWc17In16 = new File(wc16copy, "innerWc17"); File innerWc16InUnversionedIn16 = new File(new File(wc16copy, UNVERSIONED_DIR1_PATH), "innerWc16"); File innerWc17InUnversionedIn16 = new File(new File(wc16copy, UNVERSIONED_DIR1_PATH), "innerWc17"); File innerWc16InUnversionedIn17 = new File(new File(wc17copy, UNVERSIONED_DIR1_PATH), "innerWc16"); File innerWc17InUnversionedIn17 = new File(new File(wc17copy, UNVERSIONED_DIR1_PATH), "innerWc17"); SVNFileUtil.copyDirectory(wc16, innerWc16In16, true, null); SVNFileUtil.copyDirectory(wc16, innerWc16In17, true, null); SVNFileUtil.copyDirectory(wc17, innerWc17In16, true, null); SVNFileUtil.copyDirectory(wc17, innerWc17In17, true, null); SVNFileUtil.copyDirectory(wc16, innerWc16InUnversionedIn16, true, null); SVNFileUtil.copyDirectory(wc16, innerWc16InUnversionedIn17, true, null); SVNFileUtil.copyDirectory(wc17, innerWc17InUnversionedIn16, true, null); SVNFileUtil.copyDirectory(wc17, innerWc17InUnversionedIn17, true, null); testIsVersioned(innerWc16In16); testIsVersioned(innerWc16In17); testIsVersioned(innerWc17In16); testIsVersioned(innerWc17In17); testIsVersioned(innerWc16InUnversionedIn16); testIsVersioned(innerWc16InUnversionedIn17); testIsVersioned(innerWc17InUnversionedIn16); testIsVersioned(innerWc17InUnversionedIn17); } @Test public void testIsWcRoot() throws SVNException { final Sandbox sandbox = Sandbox.createWithCleanup(getClass().getSimpleName(), TestOptions.getInstance()); final SVNURL url = prepareRepository(sandbox); final File wc17 = prepareWc(sandbox, url, SvnWcGeneration.V17); final File wc16 = prepareWc(sandbox, url, SvnWcGeneration.V16); final File unversioned = sandbox.createDirectory("unversioned"); Assert.assertFalse(SVNWCUtil.isWorkingCopyRoot(unversioned)); testIsWcRoot(wc16); testIsWcRoot(wc17); File wc16copy = sandbox.createDirectory("wc16-copy"); wc16copy.delete(); File wc17copy = sandbox.createDirectory("wc17-copy"); wc16copy.delete(); SVNFileUtil.copyDirectory(wc16, wc16copy, true, null); SVNFileUtil.copyDirectory(wc17, wc17copy, true, null); File innerWc16In17 = new File(wc17copy, "innerWc16"); File innerWc17In17 = new File(wc17copy, "innerWc17"); File innerWc16In16 = new File(wc16copy, "innerWc16"); File innerWc17In16 = new File(wc16copy, "innerWc17"); File innerWc16InUnversionedIn16 = new File(new File(wc16copy, UNVERSIONED_DIR1_PATH), "innerWc16"); File innerWc17InUnversionedIn16 = new File(new File(wc16copy, UNVERSIONED_DIR1_PATH), "innerWc17"); File innerWc16InUnversionedIn17 = new File(new File(wc17copy, UNVERSIONED_DIR1_PATH), "innerWc16"); File innerWc17InUnversionedIn17 = new File(new File(wc17copy, UNVERSIONED_DIR1_PATH), "innerWc17"); SVNFileUtil.copyDirectory(wc16, innerWc16In16, true, null); SVNFileUtil.copyDirectory(wc16, innerWc16In17, true, null); SVNFileUtil.copyDirectory(wc17, innerWc17In16, true, null); SVNFileUtil.copyDirectory(wc17, innerWc17In17, true, null); SVNFileUtil.copyDirectory(wc16, innerWc16InUnversionedIn16, true, null); SVNFileUtil.copyDirectory(wc16, innerWc16InUnversionedIn17, true, null); SVNFileUtil.copyDirectory(wc17, innerWc17InUnversionedIn16, true, null); SVNFileUtil.copyDirectory(wc17, innerWc17InUnversionedIn17, true, null); testIsWcRoot(innerWc16In16); testIsWcRoot(innerWc16In17); testIsWcRoot(innerWc17In16); testIsWcRoot(innerWc17In17); testIsWcRoot(innerWc16InUnversionedIn16); testIsWcRoot(innerWc16InUnversionedIn17); testIsWcRoot(innerWc17InUnversionedIn16); testIsWcRoot(innerWc17InUnversionedIn17); } @Test public void testGetWcRoot() throws SVNException { final Sandbox sandbox = Sandbox.createWithCleanup(getClass().getSimpleName(), TestOptions.getInstance()); final SVNURL url = prepareRepository(sandbox); final File wc17 = prepareWc(sandbox, url, SvnWcGeneration.V17); final File wc16 = prepareWc(sandbox, url, SvnWcGeneration.V16); final File unversioned = sandbox.createDirectory("unversioned"); Assert.assertEquals(null, SVNWCUtil.getWorkingCopyRoot(unversioned, false)); testGetWcRoot(wc17); testGetWcRoot(wc16); File wc16copy = sandbox.createDirectory("wc16-copy"); wc16copy.delete(); File wc17copy = sandbox.createDirectory("wc17-copy"); wc16copy.delete(); SVNFileUtil.copyDirectory(wc16, wc16copy, true, null); SVNFileUtil.copyDirectory(wc17, wc17copy, true, null); File innerWc16In17 = new File(wc17copy, "innerWc16"); File innerWc17In17 = new File(wc17copy, "innerWc17"); File innerWc16In16 = new File(wc16copy, "innerWc16"); File innerWc17In16 = new File(wc16copy, "innerWc17"); File innerWc16InUnversionedIn16 = new File(new File(wc16copy, UNVERSIONED_DIR1_PATH), "innerWc16"); File innerWc17InUnversionedIn16 = new File(new File(wc16copy, UNVERSIONED_DIR1_PATH), "innerWc17"); File innerWc16InUnversionedIn17 = new File(new File(wc17copy, UNVERSIONED_DIR1_PATH), "innerWc16"); File innerWc17InUnversionedIn17 = new File(new File(wc17copy, UNVERSIONED_DIR1_PATH), "innerWc17"); SVNFileUtil.copyDirectory(wc16, innerWc16In16, true, null); SVNFileUtil.copyDirectory(wc16, innerWc16In17, true, null); SVNFileUtil.copyDirectory(wc17, innerWc17In16, true, null); SVNFileUtil.copyDirectory(wc17, innerWc17In17, true, null); SVNFileUtil.copyDirectory(wc16, innerWc16InUnversionedIn16, true, null); SVNFileUtil.copyDirectory(wc16, innerWc16InUnversionedIn17, true, null); SVNFileUtil.copyDirectory(wc17, innerWc17InUnversionedIn16, true, null); SVNFileUtil.copyDirectory(wc17, innerWc17InUnversionedIn17, true, null); testGetWcRoot(innerWc16In16); testGetWcRoot(innerWc16In17); testGetWcRoot(innerWc17In16); testGetWcRoot(innerWc17In17); testGetWcRoot(innerWc16InUnversionedIn16); testGetWcRoot(innerWc16InUnversionedIn17); testGetWcRoot(innerWc17InUnversionedIn16); testGetWcRoot(innerWc17InUnversionedIn17); } private void testIsVersioned(final File wcRoot) { Assert.assertTrue(SVNWCUtil.isVersionedDirectory(wcRoot)); Assert.assertTrue(SVNWCUtil.isVersionedDirectory(new File(wcRoot, DIR_PATH))); Assert.assertFalse(SVNWCUtil.isVersionedDirectory(new File(wcRoot, MISSING_DIR_PATH))); Assert.assertFalse(SVNWCUtil.isVersionedDirectory(new File(wcRoot, FILE1_PATH))); Assert.assertFalse(SVNWCUtil.isVersionedDirectory(new File(wcRoot, FILE2_PATH))); Assert.assertFalse(SVNWCUtil.isVersionedDirectory(new File(wcRoot, UNVERSIONED_FILE_PATH))); Assert.assertFalse(SVNWCUtil.isVersionedDirectory(new File(wcRoot, UNVERSIONED_DIR1_PATH))); Assert.assertFalse(SVNWCUtil.isVersionedDirectory(new File(wcRoot, UNVERSIONED_DIR2_PATH))); Assert.assertTrue(SVNWCUtil.isVersionedDirectory(new File(wcRoot, DIRB_PATH))); Assert.assertTrue(SVNWCUtil.isVersionedDirectory(new File(wcRoot, DIRG_PATH))); Assert.assertTrue(SVNWCUtil.isVersionedDirectory(new File(wcRoot, EXT_PATH))); Assert.assertTrue(SVNWCUtil.isVersionedDirectory(new File(wcRoot, EXT_DEEP_PATH))); Assert.assertTrue(SVNWCUtil.isVersionedDirectory(new File(wcRoot, DIR_PATH_IN_EXT))); Assert.assertTrue(SVNWCUtil.isVersionedDirectory(new File(wcRoot, DIR_PATH_IN_DEEP_EXT))); Assert.assertFalse(SVNWCUtil.isVersionedDirectory(new File(wcRoot, FILE_PATH_IN_EXT))); Assert.assertFalse(SVNWCUtil.isVersionedDirectory(new File(wcRoot, FILE_PATH_IN_DEEP_EXT))); Assert.assertFalse(SVNWCUtil.isVersionedDirectory(new File(wcRoot, EXT_DEEP_PATH).getParentFile())); } private void testIsWcRoot(final File wcRoot) throws SVNException { Assert.assertTrue(SVNWCUtil.isWorkingCopyRoot(wcRoot)); Assert.assertFalse(SVNWCUtil.isWorkingCopyRoot(new File(wcRoot, DIR_PATH))); Assert.assertFalse(SVNWCUtil.isWorkingCopyRoot(new File(wcRoot, MISSING_DIR_PATH))); Assert.assertFalse(SVNWCUtil.isWorkingCopyRoot(new File(wcRoot, FILE1_PATH))); Assert.assertFalse(SVNWCUtil.isWorkingCopyRoot(new File(wcRoot, FILE2_PATH))); Assert.assertFalse(SVNWCUtil.isWorkingCopyRoot(new File(wcRoot, UNVERSIONED_FILE_PATH))); Assert.assertFalse(SVNWCUtil.isWorkingCopyRoot(new File(wcRoot, UNVERSIONED_DIR1_PATH))); Assert.assertFalse(SVNWCUtil.isWorkingCopyRoot(new File(wcRoot, UNVERSIONED_DIR2_PATH))); Assert.assertFalse(SVNWCUtil.isWorkingCopyRoot(new File(wcRoot, DIRB_PATH))); Assert.assertFalse(SVNWCUtil.isWorkingCopyRoot(new File(wcRoot, DIRG_PATH))); Assert.assertFalse(SVNWCUtil.isWorkingCopyRoot(new File(wcRoot, DIR_PATH_IN_DEEP_EXT))); Assert.assertFalse(SVNWCUtil.isWorkingCopyRoot(new File(wcRoot, DIR_PATH_IN_EXT))); Assert.assertFalse(SVNWCUtil.isWorkingCopyRoot(new File(wcRoot, FILE_PATH_IN_DEEP_EXT))); Assert.assertFalse(SVNWCUtil.isWorkingCopyRoot(new File(wcRoot, FILE_PATH_IN_EXT))); Assert.assertTrue(SVNWCUtil.isWorkingCopyRoot(new File(wcRoot, EXT_PATH))); Assert.assertTrue(SVNWCUtil.isWorkingCopyRoot(new File(wcRoot, EXT_DEEP_PATH))); Assert.assertFalse(SVNWCUtil.isWorkingCopyRoot(new File(wcRoot, EXT_DEEP_PATH).getParentFile())); } private void testGetWcRoot(final File wcRoot) throws SVNException { Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(wcRoot, false)); Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, DIR_PATH), false)); Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, MISSING_DIR_PATH), false)); Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, FILE1_PATH), false)); Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, FILE2_PATH), false)); Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, UNVERSIONED_FILE_PATH), false)); Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, UNVERSIONED_DIR1_PATH), false)); Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, UNVERSIONED_DIR2_PATH), false)); Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, DIRB_PATH), false)); Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, DIRG_PATH), false)); Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, DIR_PATH_IN_DEEP_EXT), false)); Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, DIR_PATH_IN_EXT), false)); Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, FILE_PATH_IN_DEEP_EXT), false)); Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, FILE_PATH_IN_EXT), false)); Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, EXT_PATH), false)); Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, EXT_DEEP_PATH), false)); Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, EXT_DEEP_PATH).getParentFile(), false)); File extRoot = new File(wcRoot, EXT_PATH); File deepExtRoot = new File(wcRoot, EXT_DEEP_PATH); Assert.assertEquals(deepExtRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, DIR_PATH_IN_DEEP_EXT), true)); Assert.assertEquals(extRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, DIR_PATH_IN_EXT), true)); Assert.assertEquals(deepExtRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, FILE_PATH_IN_DEEP_EXT), true)); Assert.assertEquals(extRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, FILE_PATH_IN_EXT), true)); Assert.assertEquals(extRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, EXT_PATH), true)); Assert.assertEquals(deepExtRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, EXT_DEEP_PATH), true)); Assert.assertEquals(wcRoot, SVNWCUtil.getWorkingCopyRoot(new File(wcRoot, EXT_DEEP_PATH).getParentFile(), true)); } private SVNURL prepareRepository(Sandbox sandbox) throws SVNException { final SVNURL url = sandbox.createSvnRepository(); final CommitBuilder commitBuilder = new CommitBuilder(url); commitBuilder.addFile(FILE1_PATH, "contents1".getBytes()); commitBuilder.addFile(FILE2_PATH, "contents2".getBytes()); commitBuilder.addDirectory(DIR_PATH); commitBuilder.commit(); return url; } private File prepareWc(Sandbox sandbox, SVNURL url, SvnWcGeneration generation) throws SVNException { File directory = sandbox.createDirectory("wc"); SvnOperationFactory of = new SvnOperationFactory(); of.setPrimaryWcGeneration(generation); SvnCheckout co = of.createCheckout(); co.setSingleTarget(SvnTarget.fromFile(directory)); co.setSource(SvnTarget.fromURL(url)); co.run(); SVNFileUtil.ensureDirectoryExists(new File(directory, "unversioned")); SVNFileUtil.ensureDirectoryExists(new File(directory, "C/unversioned")); SVNFileUtil.writeToFile(new File(directory, "unversioned.txt"), "text", null); SvnScheduleForRemoval rm = of.createScheduleForRemoval(); rm.addTarget(SvnTarget.fromFile(new File(directory, DIRB_PATH))); rm.setDepth(SVNDepth.INFINITY); rm.run(); SvnScheduleForAddition add = of.createScheduleForAddition(); add.addTarget(SvnTarget.fromFile(new File(directory, DIRG_PATH))); add.setMkDir(true); add.run(); SvnSetProperty ps = of.createSetProperty(); ps.setSingleTarget(SvnTarget.fromFile(directory)); ps.setPropertyName(SVNProperty.EXTERNALS); ps.setPropertyValue(SVNPropertyValue.create("^/A " + EXT_PATH + "\n^/A " + EXT_DEEP_PATH)); ps.run(); SvnUpdate up = of.createUpdate(); up.setSingleTarget(SvnTarget.fromFile(directory)); up.setIgnoreExternals(false); up.setDepth(SVNDepth.INFINITY); up.run(); Assert.assertTrue(new File(directory, DIR_PATH_IN_DEEP_EXT).isDirectory()); Assert.assertTrue(new File(directory, FILE_PATH_IN_DEEP_EXT).isFile()); Assert.assertTrue(new File(directory, DIR_PATH_IN_EXT).isDirectory()); Assert.assertTrue(new File(directory, FILE_PATH_IN_EXT).isFile()); return directory; } }