package org.tmatesoft.svn.test;
import junit.framework.Assert;
import org.junit.Test;
import org.tmatesoft.svn.core.*;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.admin.SVNAdminClient;
import org.tmatesoft.svn.core.wc2.SvnLog;
import org.tmatesoft.svn.core.wc2.SvnOperationFactory;
import org.tmatesoft.svn.core.wc2.SvnRevisionRange;
import org.tmatesoft.svn.core.wc2.SvnTarget;
import org.tmatesoft.svn.core.wc2.admin.SvnRepositoryCreate;
import java.io.File;
import java.util.Map;
public class SyncTest {
@Test
public void testSourceUrlContainsSpace() throws Exception {
final TestOptions options = TestOptions.getInstance();
final SvnOperationFactory svnOperationFactory = new SvnOperationFactory();
final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testSourceUrlContainsSpace", options);
try {
//prepare a repository with a space in the URL
final File repositoryDirectory = sandbox.createDirectory("svn.repo with space");
final SvnRepositoryCreate repositoryCreate = svnOperationFactory.createRepositoryCreate();
repositoryCreate.setRepositoryRoot(repositoryDirectory);
final SVNURL sourceUrl = repositoryCreate.run();
final SVNURL targetUrl = sandbox.createSvnRepository();
final CommitBuilder commitBuilder = new CommitBuilder(sourceUrl);
commitBuilder.addFile("file", "contents".getBytes());
commitBuilder.commit();
final SVNClientManager clientManager = SVNClientManager.newInstance();
try {
final SVNAdminClient adminClient = clientManager.getAdminClient();
adminClient.doInitialize(sourceUrl, targetUrl);
Assert.assertEquals(sourceUrl.toString(), getPropertyString(targetUrl, SVNRevisionProperty.FROM_URL, 0));
Assert.assertEquals(getUuid(sourceUrl), getPropertyString(targetUrl, SVNRevisionProperty.FROM_UUID, 0));
Assert.assertEquals("0", getPropertyString(targetUrl, SVNRevisionProperty.LAST_MERGED_REVISION, 0));
adminClient.doSynchronize(targetUrl);
} finally {
clientManager.dispose();
}
Assert.assertEquals(sourceUrl.toString(), getPropertyString(targetUrl, SVNRevisionProperty.FROM_URL, 0));
Assert.assertEquals(getUuid(sourceUrl), getPropertyString(targetUrl, SVNRevisionProperty.FROM_UUID, 0));
Assert.assertEquals("1", getPropertyString(targetUrl, SVNRevisionProperty.LAST_MERGED_REVISION, 0));
Assert.assertEquals(1, getLatestRevision(targetUrl));
final SvnLog log = svnOperationFactory.createLog();
log.setSingleTarget(SvnTarget.fromURL(targetUrl));
log.setDiscoverChangedPaths(true);
log.addRange(SvnRevisionRange.create(SVNRevision.create(1), SVNRevision.HEAD));
final SVNLogEntry logEntry = log.run();
Assert.assertEquals(1, logEntry.getRevision());
final Map<String,SVNLogEntryPath> changedPaths = logEntry.getChangedPaths();
Assert.assertEquals(1, changedPaths.size());
final SVNLogEntryPath logEntryPath = changedPaths.values().iterator().next();
Assert.assertEquals("/file", logEntryPath.getPath());
Assert.assertEquals(SVNNodeKind.FILE, logEntryPath.getKind());
Assert.assertEquals('A', logEntryPath.getType());
} finally {
svnOperationFactory.dispose();
sandbox.dispose();
}
}
private long getLatestRevision(SVNURL url) throws SVNException {
final SVNRepository svnRepository = SVNRepositoryFactory.create(url);
try {
return svnRepository.getLatestRevision();
} finally {
svnRepository.closeSession();
}
}
private String getUuid(SVNURL url) throws SVNException {
final SVNRepository svnRepository = SVNRepositoryFactory.create(url);
try {
return svnRepository.getRepositoryUUID(true);
} finally {
svnRepository.closeSession();
}
}
private String getPropertyString(SVNURL url, String propertyName, long revision) throws SVNException {
final SVNRepository svnRepository = SVNRepositoryFactory.create(url);
try {
final SVNPropertyValue propertyValue = svnRepository.getRevisionPropertyValue(revision, propertyName);
return SVNPropertyValue.getPropertyAsString(propertyValue);
} finally {
svnRepository.closeSession();
}
}
private String getTestName() {
return "SyncTest";
}
}