blob: 5b0f8df595a5972f9b4e28064832496bd8d2e478 [file] [log] [blame]
package com.intellij.updater;
import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
public class CreateAction extends PatchAction {
public CreateAction(String path) {
super(path, -1);
}
public CreateAction(DataInputStream in) throws IOException {
super(in);
}
protected void doBuildPatchFile(File olderFile, File newerFile, ZipOutputStream patchOutput) throws IOException {
Runner.logger.info("building PatchFile");
patchOutput.putNextEntry(new ZipEntry(myPath));
writeExecutableFlag(patchOutput, newerFile);
Utils.copyFileToStream(newerFile, patchOutput);
patchOutput.closeEntry();
}
@Override
protected ValidationResult doValidate(File toFile) {
ValidationResult result = doValidateAccess(toFile, ValidationResult.Action.CREATE);
if (result != null) return result;
if (toFile.exists()) {
return new ValidationResult(ValidationResult.Kind.CONFLICT,
myPath,
ValidationResult.Action.CREATE,
ValidationResult.ALREADY_EXISTS_MESSAGE,
ValidationResult.Option.REPLACE, ValidationResult.Option.KEEP);
}
return null;
}
@Override
protected void doApply(ZipFile patchFile, File toFile) throws IOException {
prepareToWriteFile(toFile);
InputStream in = Utils.getEntryInputStream(patchFile, myPath);
try {
boolean executable = readExecutableFlag(in);
Utils.copyStreamToFile(in, toFile);
Utils.setExecutable(toFile, executable);
}
finally {
in.close();
}
}
private static void prepareToWriteFile(File file) throws IOException {
if (file.exists()) {
try {
Utils.delete(file);
} catch (IOException e) {
if (Utils.isWindows() && file.exists()) {
throw new RetryException(e);
} else {
throw e;
}
}
return;
}
while (file != null && !file.exists()) {
file = file.getParentFile();
}
if (file != null && !file.isDirectory()) {
Utils.delete(file);
}
}
protected void doBackup(File toFile, File backupFile) {
// do nothing
}
protected void doRevert(File toFile, File backupFile) throws IOException {
Utils.delete(toFile);
}
}