in vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/VltFile.java [431:536]
public FileAction update(VaultFile remoteFile, boolean force)
throws VltException {
State state = getStatus();
switch (state) {
case IGNORED:
case OBSTRUCTED:
case REPLACED:
if (!force || remoteFile == null) {
throw error("update not possible. file is " + state.name().toLowerCase(Locale.ROOT) + ". " +
"Specify --force to overwrite existing files.");
}
return doUpdate(remoteFile, false);
case ADDED:
if (remoteFile != null) {
if (mergeableWithRemote(remoteFile) != FileAction.VOID) {
throw error("Failed to add file: object of the same name already exists.");
}
return doUpdate(remoteFile, false);
} else {
return FileAction.VOID;
}
case CLEAN:
if (remoteFile == null) {
return doDelete(false);
} else {
if (file.isDirectory()) {
// do nothing
return FileAction.VOID;
} else {
return doUpdate(remoteFile, false);
}
}
case CONFLICTED:
if (remoteFile == null) {
try {
if (!entry.revertConflict(file)) {
return FileAction.CONFLICTED;
}
} catch (IOException e) {
throw exception("Error during update.", e);
}
// refetch status, and delete file if clean
return doDelete(getStatus() != State.CLEAN);
} else {
try {
if (!entry.revertConflict(file)) {
return doMerge(remoteFile, FileAction.CONFLICTED);
} else {
return doMerge(remoteFile, FileAction.UPDATED);
}
} catch (IOException e) {
throw exception("Error during update.", e);
}
}
case DELETED:
if (remoteFile == null) {
// we can delete the entry since someone else deleted it as well
return doDelete(false);
} else {
// just update base and entry, in case someone wants to revert
return doUpdate(remoteFile, true);
}
case MISSING:
if (remoteFile == null) {
// if file is missing, just delete it
return doDelete(false);
} else {
// do update
entry = null;
return doUpdate(remoteFile, false);
}
case MODIFIED:
if (remoteFile == null) {
// keep the file
return doDelete(true);
} else {
return doMerge(remoteFile, FileAction.VOID);
}
case UNKNOWN:
if (remoteFile == null) {
// do nothing
return FileAction.VOID;
} else {
// do update
if (file.exists() && !force) {
throw error("Failed to update: object of the same name already exists." +
" Specify --force to overwrite existing files.");
}
return doUpdate(remoteFile, false);
}
case VOID:
// do update
return doUpdate(remoteFile, false);
default:
throw exception("illegal state: " + state, null);
}
}