package org.tmatesoft.svn.core.internal.wc2.remote;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNProperty;
import org.tmatesoft.svn.core.SVNPropertyValue;
import org.tmatesoft.svn.core.SVNRevisionProperty;
import org.tmatesoft.svn.core.internal.wc.SVNErrorManager;
import org.tmatesoft.svn.core.internal.wc.SVNPropertiesManager;
import org.tmatesoft.svn.core.internal.wc17.db.Structure;
import org.tmatesoft.svn.core.internal.wc2.SvnRemoteOperationRunner;
import org.tmatesoft.svn.core.internal.wc2.SvnRepositoryAccess;
import org.tmatesoft.svn.core.internal.wc2.SvnRepositoryAccess.RepositoryInfo;
import org.tmatesoft.svn.core.internal.wc2.SvnRepositoryAccess.RevisionsPair;
import org.tmatesoft.svn.core.internal.wc2.SvnWcGeneration;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.wc.SVNPropertyData;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc2.SvnSetProperty;
import org.tmatesoft.svn.util.SVNLogType;
public class SvnRemoteSetRevisionProperty extends SvnRemoteOperationRunner<SVNPropertyData, SvnSetProperty> {
@Override
public boolean isApplicable(SvnSetProperty operation, SvnWcGeneration wcGeneration) throws SVNException {
return operation.isRevisionProperty();
}
@Override
protected SVNPropertyData run() throws SVNException {
String propertyName = getOperation().getPropertyName();
SVNPropertyValue propertyValue = getOperation().getPropertyValue();
boolean force = getOperation().isForce();
SvnRepositoryAccess access = getRepositoryAccess();
Structure<RepositoryInfo> repositoryInfo = access.createRepositoryFor(getOperation().getFirstTarget(), SVNRevision.HEAD, SVNRevision.HEAD, null);
SVNRepository repository = repositoryInfo.get(RepositoryInfo.repository);
repositoryInfo.release();
if (propertyValue != null && !SVNPropertiesManager.isValidPropertyName(propertyName)) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.CLIENT_PROPERTY_NAME, "Bad property name ''{0}''", propertyName);
SVNErrorManager.error(err, SVNLogType.WC);
}
if (!force && SVNRevisionProperty.AUTHOR.equals(propertyName) && propertyValue != null && propertyValue.isString() && propertyValue.getString().indexOf('\n') >= 0) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.CLIENT_REVISION_AUTHOR_CONTAINS_NEWLINE, "Value will not be set unless forced");
SVNErrorManager.error(err, SVNLogType.WC);
}
if (SVNProperty.isWorkingCopyProperty(propertyName)) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.CLIENT_PROPERTY_NAME, "''{0}'' is a wcprop, thus not accessible to clients", propertyName);
SVNErrorManager.error(err, SVNLogType.WC);
}
if (SVNProperty.isEntryProperty(propertyName)) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.CLIENT_PROPERTY_NAME, "Property ''{0}'' is an entry property", propertyName);
SVNErrorManager.error(err, SVNLogType.WC);
}
Structure<RevisionsPair> revPair = access.getRevisionNumber(repository, null, getOperation().getRevision(), null);
long revNumber = revPair.lng(RevisionsPair.revNumber);
repository.setRevisionPropertyValue(revNumber, propertyName, propertyValue);
return new SVNPropertyData(propertyName, propertyValue, getOperation().getOptions());
}
}