package hudson.plugins.trackingsvn;
import hudson.FilePath;
import hudson.model.FreeStyleBuild;
import hudson.model.FreeStyleProject;
import hudson.plugins.trackingsvn.TrackingSVNProperty.ToTrack;
import hudson.scm.SubversionSCM;
import hudson.scm.SubversionTagAction;
import hudson.util.StreamTaskListener;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import org.jvnet.hudson.test.HudsonTestCase;
import org.jvnet.hudson.test.UnstableBuilder;
import org.jvnet.hudson.test.HudsonHomeLoader.CopyExisting;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNCommitClient;
public class TrackingSVNTest extends HudsonTestCase {
public void test1() throws Exception {
File repo = new CopyExisting(getClass().getResource("svn-repo.zip")).allocate();
SubversionSCM scm = new SubversionSCM("file:///" + repo.getAbsolutePath().replace('\\', '/'));
FreeStyleProject p1 = createFreeStyleProject();
p1.setScm(scm);
FreeStyleProject p2 = createFreeStyleProject();
p2.setScm(scm);
p2.addProperty(new TrackingSVNProperty(p1.getName(), ToTrack.LAST_STABLE, null));
long revision1 = getRevision(p1);
long revision2 = getRevision(p2);
assertEquals(revision1, revision2);
doCommit(scm);
revision2 = getRevision(p2);
assertEquals(revision1, revision2);
revision1 = getRevision(p1);
revision2 = getRevision(p2);
assertEquals(revision1, revision2);
doCommit(scm);
p1.getBuildersList().add(new UnstableBuilder());
long newRevision1 = getRevision(p1);
revision2 = getRevision(p2);
assertFalse(newRevision1 == revision2);
assertEquals(revision1, revision2);
}
public void test2() throws Exception {
File repo = new CopyExisting(getClass().getResource("svn-repo.zip")).allocate();
SubversionSCM scm = new SubversionSCM("file:///" + repo.getAbsolutePath().replace('\\', '/'));
FreeStyleProject p1 = createFreeStyleProject();
p1.setScm(scm);
FreeStyleProject p2 = createFreeStyleProject();
p2.setScm(scm);
p2.addProperty(new TrackingSVNProperty(p1.getName(), ToTrack.LAST_STABLE, "file://" + repo.getPath()));
long revision1 = getRevision(p1);
doCommit(scm);
long revision2 = getRevision(p2);
assertEquals(revision1, revision2);
}
private void doCommit(SubversionSCM scm) throws IOException, Exception,
InterruptedException, ExecutionException, SVNException {
FreeStyleProject forCommit = createFreeStyleProject();
forCommit.setScm(scm);
forCommit.setAssignedLabel(hudson.getSelfLabel());
FreeStyleBuild b = assertBuildStatusSuccess(forCommit.scheduleBuild2(0).get());
FilePath newFile = b.getWorkspace().child("foo");
boolean exists = newFile.exists();
newFile.touch(System.currentTimeMillis());
newFile.write("" + System.currentTimeMillis(), null);
SVNClientManager svnm = SubversionSCM.createSvnClientManager();
if (!exists) svnm.getWCClient().doAdd(new File(newFile.getRemote()),false,false,false, SVNDepth.INFINITY, false,false);
SVNCommitClient cc = svnm.getCommitClient();
cc.doCommit(new File[]{new File(newFile.getRemote())},false,"added",null,null,false,false,SVNDepth.EMPTY);
}
private long getRevision(FreeStyleProject p) throws Exception {
FreeStyleBuild b = p.scheduleBuild2(0).get();
System.out.println(b.getLog());
SubversionTagAction action = b.getAction(SubversionTagAction.class);
return action.getTags().keySet().iterator().next().revision;
}
}