}
return reverted;
}
private boolean revert(SVNAdminArea dir, String name, SVNEntry entry, boolean useCommitTime) throws SVNException {
SVNLog log = dir.getLog();
boolean reverted = false;
SVNVersionedProperties baseProperties = null;
SVNProperties command = new SVNProperties();
boolean revertBase = false;
if (entry.isScheduledForReplacement()) {
revertBase = true;
baseProperties = dir.getRevertProperties(name);
String propRevertPath = SVNAdminUtil.getPropRevertPath(name, entry.getKind(), false);
command.put(SVNLog.NAME_ATTR, propRevertPath);
log.addCommand(SVNLog.DELETE, command, false);
command.clear();
reverted = true;
}
boolean reinstallWorkingFile = false;
if (baseProperties == null) {
if (dir.hasPropModifications(name)) {
baseProperties = dir.getBaseProperties(name);
SVNVersionedProperties propDiff = dir.getProperties(name).compareTo(baseProperties);
Collection propNames = propDiff.getPropertyNames(null);
reinstallWorkingFile = propNames.contains(SVNProperty.EXECUTABLE) ||
propNames.contains(SVNProperty.KEYWORDS) ||
propNames.contains(SVNProperty.EOL_STYLE) ||
propNames.contains(SVNProperty.CHARSET) ||
propNames.contains(SVNProperty.SPECIAL) ||
propNames.contains(SVNProperty.NEEDS_LOCK);
}
}
if (baseProperties != null) {
// save base props both to base and working.
SVNProperties newProperties = baseProperties.asMap();
SVNVersionedProperties originalBaseProperties = dir.getBaseProperties(name);
SVNVersionedProperties workProperties = dir.getProperties(name);
if (revertBase) {
originalBaseProperties.removeAll();
}
workProperties.removeAll();
for (Iterator names = newProperties.nameSet().iterator(); names.hasNext();) {
String propName = (String) names.next();
if (revertBase) {
originalBaseProperties.setPropertyValue(propName, newProperties.getSVNPropertyValue(propName));
}
workProperties.setPropertyValue(propName, newProperties.getSVNPropertyValue(propName));
}
dir.saveVersionedProperties(log, false);
reverted = true;
}
SVNProperties newEntryProperties = new SVNProperties();
if (entry.getKind() == SVNNodeKind.FILE) {
String basePath = SVNAdminUtil.getTextBasePath(name, false);
String revertBasePath = SVNAdminUtil.getTextRevertPath(name, false);
if (!reinstallWorkingFile) {
SVNFileType fileType = SVNFileType.getType(dir.getFile(name));
if (fileType == SVNFileType.NONE) {
reinstallWorkingFile = true;
}
}
if (dir.getFile(revertBasePath).isFile()) {
reinstallWorkingFile = true;
} else {
if (!dir.getFile(basePath).isFile()) {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.IO_ERROR, "Error restoring text for ''{0}''", dir.getFile(name));
SVNErrorManager.error(err, SVNLogType.WC);
}
revertBasePath = null;
}
if (revertBasePath != null) {
command.put(SVNLog.NAME_ATTR, revertBasePath);
command.put(SVNLog.DEST_ATTR, name);
log.addCommand(SVNLog.COPY_AND_TRANSLATE, command, false);
command.clear();
command.put(SVNLog.NAME_ATTR, revertBasePath);
command.put(SVNLog.DEST_ATTR, basePath);
log.addCommand(SVNLog.MOVE, command, false);
reverted = true;
} else {
if (!reinstallWorkingFile) {
reinstallWorkingFile = dir.hasTextModifications(name, false, false, false);
}
if (reinstallWorkingFile) {
command.put(SVNLog.NAME_ATTR, SVNAdminUtil.getTextBasePath(name, false));
command.put(SVNLog.DEST_ATTR, name);
log.addCommand(SVNLog.COPY_AND_TRANSLATE, command, false);
command.clear();
if (useCommitTime && entry.getCommittedDate() != null) {
command.put(SVNLog.NAME_ATTR, name);
command.put(SVNLog.TIMESTAMP_ATTR, entry.getCommittedDate());
log.addCommand(SVNLog.SET_TIMESTAMP, command, false);
command.clear();
} else {
command.put(SVNLog.NAME_ATTR, name);
command.put(SVNLog.TIMESTAMP_ATTR, SVNDate.formatDate(new Date(System.currentTimeMillis())));
log.addCommand(SVNLog.SET_TIMESTAMP, command, false);
command.clear();
}
command.put(SVNLog.NAME_ATTR, name);
command.put(SVNProperty.shortPropertyName(SVNProperty.TEXT_TIME), SVNLog.WC_TIMESTAMP);
log.addCommand(SVNLog.MODIFY_ENTRY, command, false);
command.clear();
command.put(SVNLog.NAME_ATTR, name);
command.put(SVNProperty.shortPropertyName(SVNProperty.WORKING_SIZE), SVNLog.WC_WORKING_SIZE);
log.addCommand(SVNLog.MODIFY_ENTRY, command, false);
command.clear();
}
reverted |= reinstallWorkingFile;
}
}
if (entry.getConflictNew() != null) {
command.put(SVNLog.NAME_ATTR, entry.getConflictNew());
log.addCommand(SVNLog.DELETE, command, false);
command.clear();
newEntryProperties.put(SVNProperty.shortPropertyName(SVNProperty.CONFLICT_NEW), (String) null);
if (!reverted) {
reverted |= dir.getFile(entry.getConflictNew()).exists();
}
}
if (entry.getConflictOld() != null) {
command.put(SVNLog.NAME_ATTR, entry.getConflictOld());
log.addCommand(SVNLog.DELETE, command, false);
command.clear();
newEntryProperties.put(SVNProperty.shortPropertyName(SVNProperty.CONFLICT_OLD), (String) null);
if (!reverted) {
reverted |= dir.getFile(entry.getConflictOld()).exists();
}
}
if (entry.getConflictWorking() != null) {
command.put(SVNLog.NAME_ATTR, entry.getConflictWorking());
log.addCommand(SVNLog.DELETE, command, false);
command.clear();
newEntryProperties.put(SVNProperty.shortPropertyName(SVNProperty.CONFLICT_WRK), (String) null);
if (!reverted) {
reverted |= dir.getFile(entry.getConflictWorking()).exists();
}
}
if (entry.getPropRejectFile() != null) {
command.put(SVNLog.NAME_ATTR, entry.getPropRejectFile());
log.addCommand(SVNLog.DELETE, command, false);
command.clear();
newEntryProperties.put(SVNProperty.shortPropertyName(SVNProperty.PROP_REJECT_FILE), (String) null);
if (!reverted) {
reverted |= dir.getFile(entry.getPropRejectFile()).exists();
}
}
if (entry.isScheduledForReplacement()) {
newEntryProperties.put(SVNProperty.shortPropertyName(SVNProperty.COPIED), SVNProperty.toString(false));
newEntryProperties.put(SVNProperty.shortPropertyName(SVNProperty.COPYFROM_URL), (String) null);
newEntryProperties.put(SVNProperty.shortPropertyName(SVNProperty.COPYFROM_REVISION),
SVNProperty.toString(SVNRepository.INVALID_REVISION));
if (entry.isFile() && entry.getCopyFromURL() != null) {
String basePath = SVNAdminUtil.getTextRevertPath(name, false);
File baseFile = dir.getFile(basePath);
String digest = SVNFileUtil.computeChecksum(baseFile);
newEntryProperties.put(SVNProperty.shortPropertyName(SVNProperty.CHECKSUM), digest);
}
}
if (entry.getSchedule() != null) {
newEntryProperties.put(SVNProperty.shortPropertyName(SVNProperty.SCHEDULE), (String) null);
reverted = true;
}
if (!newEntryProperties.isEmpty()) {
newEntryProperties.put(SVNLog.NAME_ATTR, name);
log.addCommand(SVNLog.MODIFY_ENTRY, newEntryProperties, false);
}
log.save();
dir.runLogs();
return reverted;
}