}
private void changeNodeProperties(String path, SVNProperties propNamesToValues) throws SVNException {
FSParentPath parentPath = null;
SVNNodeKind kind = null;
SVNProperties properties = null;
boolean done = false;
boolean haveRealChanges = false;
for (Iterator propNames = propNamesToValues.nameSet().iterator(); propNames.hasNext();) {
String propName = (String)propNames.next();
SVNPropertyValue propValue = propNamesToValues.getSVNPropertyValue(propName);
FSRepositoryUtil.validateProperty(propName, propValue);
if (!done) {
parentPath = myTxnRoot.openPath(path, true, true);
kind = parentPath.getRevNode().getType();
if ((myTxnRoot.getTxnFlags() & FSTransactionRoot.SVN_FS_TXN_CHECK_LOCKS) != 0) {
FSCommitter.allowLockedOperation(myFSFS, path, getAuthor(), myLockTokens, false, false);
}
myCommitter.makePathMutable(parentPath, path);
properties = parentPath.getRevNode().getProperties(myFSFS);
done = true;
}
if (properties.isEmpty() && propValue == null) {
continue;
}
if (myFSFS.supportsMergeInfo() && propName.equals(SVNProperty.MERGE_INFO)) {
long increment = 0;
boolean hadMergeInfo = parentPath.getRevNode().hasMergeInfo();
if (propValue != null && !hadMergeInfo) {
increment = 1;
} else if (propValue == null && hadMergeInfo) {
increment = -1;
}
if (increment != 0) {
parentPath.getRevNode().setHasMergeInfo(propValue != null);
myCommitter.incrementMergeInfoUpTree(parentPath, increment);
}
}
if (propValue == null) {
properties.remove(propName);
} else {
properties.put(propName, propValue);
}
if (!haveRealChanges) {
haveRealChanges = true;
}