package org.tmatesoft.svn.test;
import java.io.File;
import junit.framework.Assert;
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.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNCommitClient;
import org.tmatesoft.svn.core.wc.SVNCommitPacket;
public class BatchCommitTest {
@Test
public void testCollectCommitItems() throws SVNException {
final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testCommitFromExternals", TestOptions.getInstance());
final SVNURL firstRepository = sandbox.createSvnRepository();
createFixture(sandbox, firstRepository);
final SVNURL secondRepository = sandbox.createSvnRepository();
createFixture(sandbox, secondRepository);
// wc with a nested wcs
final WorkingCopy topWc = sandbox.checkoutNewWorkingCopy(firstRepository.appendPath("project1/trunk", false));
final WorkingCopy nestedWcSame = sandbox.checkoutNewWorkingCopy(
firstRepository.appendPath("project2/trunk", false),
-1,
true,
TestUtil.getDefaultWcGeneration(),
new File(topWc.getWorkingCopyDirectory(), "same"));
final WorkingCopy nestedWcAnother = sandbox.checkoutNewWorkingCopy(
secondRepository.appendPath("project1/trunk", false),
-1,
true,
TestUtil.getDefaultWcGeneration(),
new File(topWc.getWorkingCopyDirectory(), "another"));
// modify all the files.
TestUtil.writeFileContentsString(new File(topWc.getWorkingCopyDirectory(), "file.txt"), "modified");
TestUtil.writeFileContentsString(new File(nestedWcSame.getWorkingCopyDirectory(), "file.txt"), "modified");
TestUtil.writeFileContentsString(new File(nestedWcAnother.getWorkingCopyDirectory(), "file.txt"), "modified");
// collect: at least two packets (combine = true), default three (combine = false)
final File[] paths = new File[] {
topWc.getWorkingCopyDirectory(),
nestedWcAnother.getWorkingCopyDirectory(),
nestedWcSame.getWorkingCopyDirectory()
};
SVNCommitPacket[] packets = null;
SVNCommitClient cc = SVNClientManager.newInstance().getCommitClient();
try {
packets = cc.doCollectCommitItems(paths, false, false, SVNDepth.INFINITY, false, null);
Assert.assertNotNull(packets);
Assert.assertEquals(3, packets.length);
} finally {
for (int i = 0; packets != null && i < packets.length; i++) {
try {
packets[i].dispose();
} catch (SVNException e) {}
}
}
try {
packets = cc.doCollectCommitItems(paths, false, false, SVNDepth.INFINITY, true, null);
Assert.assertNotNull(packets);
Assert.assertEquals(2, packets.length);
} finally {
for (int i = 0; packets != null && i < packets.length; i++) {
try {
packets[i].dispose();
} catch (SVNException e) {}
}
}
}
@Test
public void testCommitCollectedItems() throws SVNException {
final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testCommitFromExternals", TestOptions.getInstance());
final SVNURL firstRepository = sandbox.createSvnRepository();
createFixture(sandbox, firstRepository);
final SVNURL secondRepository = sandbox.createSvnRepository();
createFixture(sandbox, secondRepository);
// wc with a nested wcs
final WorkingCopy topWc = sandbox.checkoutNewWorkingCopy(firstRepository.appendPath("project1/trunk", false));
final WorkingCopy nestedWcSame = sandbox.checkoutNewWorkingCopy(
firstRepository.appendPath("project2/trunk", false),
-1,
true,
TestUtil.getDefaultWcGeneration(),
new File(topWc.getWorkingCopyDirectory(), "same"));
final WorkingCopy nestedWcAnother = sandbox.checkoutNewWorkingCopy(
secondRepository.appendPath("project1/trunk", false),
-1,
true,
TestUtil.getDefaultWcGeneration(),
new File(topWc.getWorkingCopyDirectory(), "another"));
// modify all the files.
TestUtil.writeFileContentsString(new File(topWc.getWorkingCopyDirectory(), "file.txt"), "modified");
TestUtil.writeFileContentsString(new File(nestedWcSame.getWorkingCopyDirectory(), "file.txt"), "modified");
TestUtil.writeFileContentsString(new File(nestedWcAnother.getWorkingCopyDirectory(), "file.txt"), "modified");
// collect: at least two packets (combine = true), default three (combine = false)
final File[] paths = new File[] {
topWc.getWorkingCopyDirectory(),
nestedWcAnother.getWorkingCopyDirectory(),
nestedWcSame.getWorkingCopyDirectory()
};
topWc.updateToRevision(-1);
long currentRevision = topWc.getCurrentRevision();
SVNCommitPacket[] packets = null;
SVNCommitClient cc = SVNClientManager.newInstance().getCommitClient();
try {
packets = cc.doCollectCommitItems(paths, false, false, SVNDepth.INFINITY, false, null);
Assert.assertNotNull(packets);
Assert.assertEquals(3, packets.length);
// do commit, should have three revs
SVNCommitInfo[] infos = cc.doCommit(packets, false, "three separate commits");
Assert.assertEquals(3, infos.length);
topWc.updateToRevision(-1);
Assert.assertEquals(currentRevision + 2, topWc.getCurrentRevision());
} catch (SVNException e) {
e.printStackTrace();
for (int i = 0; packets != null && i < packets.length; i++) {
try {
packets[i].dispose();
} catch (SVNException inner) {}
}
throw e;
}
// modify all the files.
TestUtil.writeFileContentsString(new File(topWc.getWorkingCopyDirectory(), "file.txt"), "modified again");
TestUtil.writeFileContentsString(new File(nestedWcSame.getWorkingCopyDirectory(), "file.txt"), "modified again");
TestUtil.writeFileContentsString(new File(nestedWcAnother.getWorkingCopyDirectory(), "file.txt"), "modified again");
topWc.updateToRevision(-1);
currentRevision = topWc.getCurrentRevision();
try {
packets = cc.doCollectCommitItems(paths, false, false, SVNDepth.INFINITY, true, null);
Assert.assertNotNull(packets);
Assert.assertEquals(2, packets.length);
// do commit, should have three revs
SVNCommitInfo[] infos = cc.doCommit(packets, false, "three separate commits");
Assert.assertEquals(2, infos.length);
topWc.updateToRevision(-1);
Assert.assertEquals(currentRevision + 1, topWc.getCurrentRevision());
} catch (SVNException e) {
for (int i = 0; packets != null && i < packets.length; i++) {
try {
packets[i].dispose();
} catch (SVNException inner) {}
}
throw e;
}
}
private void createFixture(final Sandbox sandbox, final SVNURL repositoryRootURL) throws SVNException {
final WorkingCopy wc = sandbox.checkoutNewWorkingCopy(repositoryRootURL);
final File p1Directory = new File(wc.getWorkingCopyDirectory(), "project1/trunk");
final File p1File = new File(wc.getWorkingCopyDirectory(), "project1/trunk/file.txt");
p1Directory.mkdirs();
TestUtil.writeFileContentsString(p1File, "project1 file");
final File p2Directory = new File(wc.getWorkingCopyDirectory(), "project2/trunk");
final File p2File = new File(wc.getWorkingCopyDirectory(), "project2/trunk/file.txt");
TestUtil.writeFileContentsString(p2File, "project1 file");
p2Directory.mkdirs();
wc.add(p1Directory);
wc.add(p2Directory);
wc.commit("initial import");
wc.dispose();
}
private String getTestName() {
return getClass().getSimpleName();
}
}