package org.tmatesoft.svn.core.internal.wc2.old; import java.io.File; import org.tmatesoft.svn.core.SVNCommitInfo; import org.tmatesoft.svn.core.SVNErrorCode; import org.tmatesoft.svn.core.SVNErrorMessage; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.internal.wc.SVNErrorManager; import org.tmatesoft.svn.core.internal.wc16.SVNCommitClient16; import org.tmatesoft.svn.core.internal.wc2.ISvnCommitRunner; import org.tmatesoft.svn.core.internal.wc2.compat.SvnCodec; import org.tmatesoft.svn.core.wc.SVNCommitPacket; import org.tmatesoft.svn.core.wc2.SvnCommit; import org.tmatesoft.svn.core.wc2.SvnCommitPacket; import org.tmatesoft.svn.core.wc2.SvnTarget; import org.tmatesoft.svn.util.SVNLogType; public class SvnOldCommit extends SvnOldRunner<SVNCommitInfo, SvnCommit> implements ISvnCommitRunner { public SvnCommitPacket collectCommitItems(SvnCommit operation) throws SVNException { setOperation(operation); SVNCommitClient16 client = new SVNCommitClient16(getOperation().getRepositoryPool(), getOperation().getOptions()); client.setEventHandler(getOperation().getEventHandler()); client.setCommitHandler(SvnCodec.commitHandler(getOperation().getCommitHandler())); client.setCommitParameters(SvnCodec.commitParameters(getOperation().getCommitParameters())); File[] paths = new File[getOperation().getTargets().size()]; int i = 0; for (SvnTarget tgt : getOperation().getTargets()) { paths[i++] = tgt.getFile(); } String[] changelists = null; if (getOperation().getApplicableChangelists() != null && !getOperation().getApplicableChangelists().isEmpty()) { changelists = getOperation().getApplicableChangelists().toArray(new String[getOperation().getApplicableChangelists().size()]); } SVNCommitPacket[] packets = client.doCollectCommitItems( paths, getOperation().isKeepLocks(), getOperation().isForce(), getOperation().getDepth(), true, changelists); if (packets != null && packets.length == 1) { return SvnCodec.commitPacket(this, packets[0]); } else if (packets != null && packets.length > 1) { SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNSUPPORTED_FEATURE, "Commit from different working copies belonging to different repositories is not supported"); SVNErrorManager.error(err, SVNLogType.WC); } return null; } @Override protected SVNCommitInfo run() throws SVNException { SvnCommitPacket packet = getOperation().collectCommitItems(); if (packet == null || packet.isEmpty()) { //if there's no changes, the packet will be null return null; } SVNCommitPacket oldPacket = (SVNCommitPacket) packet.getLockingContext(); SVNCommitClient16 client = new SVNCommitClient16(getOperation().getRepositoryPool(), getOperation().getOptions()); client.setEventHandler(getOperation().getEventHandler()); client.setCommitHandler(SvnCodec.commitHandler(getOperation().getCommitHandler())); client.setCommitParameters(SvnCodec.commitParameters(getOperation().getCommitParameters())); SVNCommitInfo info = client.doCommit(oldPacket, getOperation().isKeepLocks(), getOperation().isKeepChangelists(), getOperation().getCommitMessage(), getOperation().getRevisionProperties()); if (info != null) { getOperation().receive(getOperation().getFirstTarget(), info); } return info; } public void disposeCommitPacket(Object lockingContext, boolean disposeParentContext) throws SVNException { if (lockingContext instanceof SVNCommitPacket[]) { SVNCommitPacket[] packets = (SVNCommitPacket[]) lockingContext; for (int i = 0; i < packets.length; i++) { try { packets[i].dispose(); } catch (SVNException e) { // } } } else if (lockingContext instanceof SVNCommitPacket) { ((SVNCommitPacket) lockingContext).dispose(); } } public Object splitLockingContext(Object lockingContext, SvnCommitPacket newPacket) { if (lockingContext instanceof SVNCommitPacket[]) { final SVNCommitPacket[] oldPackets = (SVNCommitPacket[]) lockingContext; // TODO return lockingContext; } else { return lockingContext; } } }