package org.tmatesoft.svn.test;
import java.io.File;
import java.util.Map;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Before;
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.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.wc16.SVNUpdateClient16;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNStatusType;
import org.tmatesoft.svn.core.wc2.SvnCheckout;
import org.tmatesoft.svn.core.wc2.SvnGetInfo;
import org.tmatesoft.svn.core.wc2.SvnInfo;
import org.tmatesoft.svn.core.wc2.SvnOperationFactory;
import org.tmatesoft.svn.core.wc2.SvnScheduleForAddition;
import org.tmatesoft.svn.core.wc2.SvnStatus;
import org.tmatesoft.svn.core.wc2.SvnTarget;
import org.tmatesoft.svn.core.wc2.SvnUpdate;
public class SpecialTest {
@Before
public void setup() {
Assume.assumeTrue(SVNFileUtil.symlinksSupported());
}
@Test
public void testExternalsAsSymlinksTargets() throws Exception {
final TestOptions options = TestOptions.getInstance();
final SvnOperationFactory svnOperationFactory = new SvnOperationFactory();
final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testExternalsAsSymlinksTargets", options);
try {
final SVNURL url = sandbox.createSvnRepository();
final CommitBuilder commitBuilder1 = new CommitBuilder(url);
commitBuilder1.addFile("directory/file");
final SVNCommitInfo commitInfo1 = commitBuilder1.commit();
final CommitBuilder commitBuilder2 = new CommitBuilder(url);
commitBuilder2.setDirectoryProperty("", SVNProperty.EXTERNALS, SVNPropertyValue.create("^/directory externalsTarget"));
final SVNCommitInfo commitInfo2 = commitBuilder2.commit();
final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, commitInfo1.getNewRevision());
final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory();
final File externalsSymlink = new File(workingCopyDirectory, "externalsTarget");
final File symlink = new File(workingCopyDirectory, "symlink");
SVNFileUtil.createSymlink(symlink, externalsSymlink.getPath());
final SvnUpdate update = svnOperationFactory.createUpdate();
update.setSingleTarget(SvnTarget.fromFile(workingCopyDirectory));
update.setRevision(SVNRevision.create(commitInfo2.getNewRevision()));
update.setDepth(SVNDepth.INFINITY);
update.setIgnoreExternals(false);
update.run();
final SvnScheduleForAddition scheduleForAddition = svnOperationFactory.createScheduleForAddition();
scheduleForAddition.setSingleTarget(SvnTarget.fromFile(symlink));
scheduleForAddition.run();
final Map<File,SvnStatus> statuses = TestUtil.getStatuses(svnOperationFactory, workingCopyDirectory);
Assert.assertEquals(SVNStatusType.STATUS_ADDED, statuses.get(symlink).getNodeStatus());
} finally {
svnOperationFactory.dispose();
sandbox.dispose();
}
}
@Test
public void testSymlinkPointsToWorkingCopy() throws Exception {
final TestOptions options = TestOptions.getInstance();
final SvnOperationFactory svnOperationFactory = new SvnOperationFactory();
final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testSymlinkPointsToWorkingCopy", options);
try {
final SVNURL url = sandbox.createSvnRepository();
final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber());
final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory();
final File symlink = new File(sandbox.createDirectory("directoryFroSymlink"), "symlink");
SVNFileUtil.createSymlink(symlink, workingCopyDirectory.getAbsolutePath());
final SvnGetInfo getInfo = svnOperationFactory.createGetInfo();
getInfo.setSingleTarget(SvnTarget.fromFile(symlink));
getInfo.run();
} finally {
svnOperationFactory.dispose();
sandbox.dispose();
}
}
@Test
public void testUnversionedSymlinkWithinOldWorkingCopyPointsToNewWorkingCopy() throws Exception {
Assume.assumeTrue(!TestUtil.isNewWorkingCopyOnly());
Assume.assumeTrue(TestUtil.isNewWorkingCopyTest());
final TestOptions options = TestOptions.getInstance();
final SvnOperationFactory svnOperationFactory = new SvnOperationFactory();
final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testUnversionedSymlinkWithinOldWorkingCopyPointsToNewWorkingCopy", options);
try {
final SVNURL url = sandbox.createSvnRepository();
final File oldWorkingCopy = checkoutOldWorkingCopy(sandbox.createDirectory("wc.old"), url);
final File newWorkingCopy = checkoutNewWorkingCopy(new File(oldWorkingCopy, "wc.new"), url, svnOperationFactory);
final File symlink = new File(oldWorkingCopy, "symlink");
SVNFileUtil.createSymlink(symlink, newWorkingCopy.getAbsolutePath());
final SvnGetInfo getInfo = svnOperationFactory.createGetInfo();
getInfo.setSingleTarget(SvnTarget.fromFile(symlink));
final SvnInfo info = getInfo.run();
Assert.assertEquals(symlink, info.getWcInfo().getWcRoot());
} finally {
svnOperationFactory.dispose();
sandbox.dispose();
}
}
@Test
public void testUnversionedSymlinkWithinOldWorkingCopyPointsToNewWorkingCopy17Only() throws Exception {
Assume.assumeTrue(TestUtil.isNewWorkingCopyOnly());
Assume.assumeTrue(TestUtil.isNewWorkingCopyTest());
final TestOptions options = TestOptions.getInstance();
final SvnOperationFactory svnOperationFactory = new SvnOperationFactory();
final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testUnversionedSymlinkWithinOldWorkingCopyPointsToNewWorkingCopy17Only", options);
try {
final SVNURL url = sandbox.createSvnRepository();
final File oldWorkingCopy = checkoutOldWorkingCopy(sandbox.createDirectory("wc.old"), url);
final File newWorkingCopy = checkoutNewWorkingCopy(new File(oldWorkingCopy, "wc.new"), url, svnOperationFactory);
final File symlink = new File(oldWorkingCopy, "symlink");
SVNFileUtil.createSymlink(symlink, newWorkingCopy.getAbsolutePath());
final SvnGetInfo getInfo = svnOperationFactory.createGetInfo();
getInfo.setSingleTarget(SvnTarget.fromFile(symlink));
final SvnInfo info = getInfo.run();
Assert.assertEquals(symlink, info.getWcInfo().getWcRoot());
} finally {
svnOperationFactory.dispose();
sandbox.dispose();
}
}
private File checkoutNewWorkingCopy(File directory, SVNURL url, SvnOperationFactory svnOperationFactory) throws SVNException {
final SvnCheckout checkout = svnOperationFactory.createCheckout();
checkout.setSource(SvnTarget.fromURL(url));
checkout.setSingleTarget(SvnTarget.fromFile(directory));
checkout.run();
return directory;
}
private File checkoutOldWorkingCopy(File directory, SVNURL url) throws SVNException {
final SVNClientManager clientManager = SVNClientManager.newInstance();
try {
final SVNUpdateClient16 updateClient16 = new SVNUpdateClient16(clientManager, clientManager.getOptions());
updateClient16.doCheckout(url, directory, SVNRevision.HEAD, SVNRevision.HEAD, SVNDepth.INFINITY, true);
return directory;
} finally {
clientManager.dispose();
}
}
private String getTestName() {
return "SpecialTest";
}
}