diff options
author | Yohann Roussel <yroussel@google.com> | 2017-07-05 12:10:21 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2017-07-05 12:10:21 +0000 |
commit | 37059f3f14f3920359dc0c7a5133a338988c966e (patch) | |
tree | b8b67bc9ea12cc9d69735b59730a6386641cf1b5 /src/main/java/com/android/tools/r8 | |
parent | ac25c3d3e8f287fe118e5b98d9ca012881df67ef (diff) | |
parent | 78be58456a12d4a51ad5fb0c19c292c01746f97b (diff) | |
download | r8-37059f3f14f3920359dc0c7a5133a338988c966e.tar.gz |
Merge "Allow overwriting zip output file in D8 and R8"
Diffstat (limited to 'src/main/java/com/android/tools/r8')
6 files changed, 50 insertions, 19 deletions
diff --git a/src/main/java/com/android/tools/r8/BaseCommand.java b/src/main/java/com/android/tools/r8/BaseCommand.java index 85c430a44..aa0e39659 100644 --- a/src/main/java/com/android/tools/r8/BaseCommand.java +++ b/src/main/java/com/android/tools/r8/BaseCommand.java @@ -22,6 +22,7 @@ abstract class BaseCommand { private final OutputMode outputMode; private final CompilationMode mode; private final int minApiLevel; + private final boolean overwriteOutputs; BaseCommand(boolean printHelp, boolean printVersion) { this.printHelp = printHelp; @@ -32,10 +33,11 @@ abstract class BaseCommand { this.outputMode = OutputMode.Indexed; this.mode = null; this.minApiLevel = 0; + this.overwriteOutputs = true; } BaseCommand(AndroidApp app, Path outputPath, - OutputMode outputMode, CompilationMode mode, int minApiLevel) { + OutputMode outputMode, CompilationMode mode, int minApiLevel, boolean overwriteOutputs) { assert app != null; assert mode != null; assert minApiLevel > 0; @@ -44,6 +46,7 @@ abstract class BaseCommand { this.outputMode = outputMode; this.mode = mode; this.minApiLevel = minApiLevel; + this.overwriteOutputs = overwriteOutputs; // Print options are not set. printHelp = false; printVersion = false; @@ -81,6 +84,10 @@ abstract class BaseCommand { return outputMode; } + public boolean isOverwriteOutputs() { + return overwriteOutputs; + } + abstract static class Builder<C extends BaseCommand, B extends Builder<C, B>> { private boolean printHelp = false; @@ -90,6 +97,7 @@ abstract class BaseCommand { private OutputMode outputMode = OutputMode.Indexed; private CompilationMode mode; private int minApiLevel = Constants.DEFAULT_ANDROID_API; + private boolean overwriteOutputs = true; protected Builder(CompilationMode mode) { this(AndroidApp.builder(), mode); @@ -197,9 +205,9 @@ abstract class BaseCommand { return outputMode; } - /** Set an output path. Must be an existing directory or a non-existent zip file. */ - public B setOutputPath(Path outputPath) throws CompilationException { - this.outputPath = FileUtils.validateOutputFile(outputPath); + /** Set an output path. Must be an existing directory or a zip file. */ + public B setOutputPath(Path outputPath) { + this.outputPath = outputPath; return self(); } @@ -248,5 +256,17 @@ abstract class BaseCommand { this.printVersion = printVersion; return self(); } + + protected boolean isOverwriteOutputs() { + return overwriteOutputs; + } + + protected void setOverwriteOutputs(boolean overwriteOutputs) { + this.overwriteOutputs = overwriteOutputs; + } + + protected void validate() throws CompilationException { + FileUtils.validateOutputFile(outputPath, overwriteOutputs); + } } } diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java index 62cb5a57d..0ef972889 100644 --- a/src/main/java/com/android/tools/r8/D8Command.java +++ b/src/main/java/com/android/tools/r8/D8Command.java @@ -101,8 +101,10 @@ public class D8Command extends BaseCommand { if (isPrintHelp() || isPrintVersion()) { return new D8Command(isPrintHelp(), isPrintVersion()); } + + validate(); return new D8Command(getAppBuilder().build(), - getOutputPath(), getOutputMode(), getMode(), getMinApiLevel()); + getOutputPath(), getOutputMode(), getMode(), getMinApiLevel(), isOverwriteOutputs()); } } @@ -180,8 +182,8 @@ public class D8Command extends BaseCommand { } private D8Command(AndroidApp inputApp, Path outputPath, - OutputMode outputMode, CompilationMode mode, int minApiLevel) { - super(inputApp, outputPath, outputMode, mode, minApiLevel); + OutputMode outputMode, CompilationMode mode, int minApiLevel, boolean overwriteOutputs) { + super(inputApp, outputPath, outputMode, mode, minApiLevel, overwriteOutputs); } private D8Command(boolean printHelp, boolean printVersion) { @@ -194,7 +196,7 @@ public class D8Command extends BaseCommand { assert !internal.debug; internal.debug = getMode() == CompilationMode.DEBUG; internal.minApiLevel = getMinApiLevel(); - internal.overwriteOutputs = true; + internal.overwriteOutputs = isOverwriteOutputs(); // Assert and fixup defaults. assert !internal.skipMinification; internal.skipMinification = true; diff --git a/src/main/java/com/android/tools/r8/DexSegments.java b/src/main/java/com/android/tools/r8/DexSegments.java index 501fecc16..09eb21e50 100644 --- a/src/main/java/com/android/tools/r8/DexSegments.java +++ b/src/main/java/com/android/tools/r8/DexSegments.java @@ -41,12 +41,14 @@ public class DexSegments { if (isPrintHelp()) { return new Command(isPrintHelp()); } + validate(); return new Command( getAppBuilder().build(), getOutputPath(), getOutputMode(), getMode(), - getMinApiLevel()); + getMinApiLevel(), + isOverwriteOutputs()); } } @@ -89,8 +91,9 @@ public class DexSegments { Path outputPath, OutputMode outputMode, CompilationMode mode, - int minApiLevel) { - super(inputApp, outputPath, outputMode, mode, minApiLevel); + int minApiLevel, + boolean isOverwrite) { + super(inputApp, outputPath, outputMode, mode, minApiLevel, isOverwrite); } private Command(boolean printHelp) { diff --git a/src/main/java/com/android/tools/r8/Disassemble.java b/src/main/java/com/android/tools/r8/Disassemble.java index b183ecc17..7d7389533 100644 --- a/src/main/java/com/android/tools/r8/Disassemble.java +++ b/src/main/java/com/android/tools/r8/Disassemble.java @@ -46,13 +46,15 @@ public class Disassemble { return new DisassembleCommand(isPrintHelp(), isPrintVersion()); } + validate(); return new DisassembleCommand( getAppBuilder().build(), getOutputPath(), getOutputMode(), getMode(), getMinApiLevel(), - useSmali); + useSmali, + isOverwriteOutputs()); } } @@ -108,8 +110,9 @@ public class Disassemble { OutputMode outputMode, CompilationMode mode, int minApiLevel, - boolean useSmali) { - super(inputApp, outputPath, outputMode, mode, minApiLevel); + boolean useSmali, + boolean isOverwrite) { + super(inputApp, outputPath, outputMode, mode, minApiLevel, isOverwrite); //assert getOutputMode() == OutputMode.Indexed : "Only regular mode is supported in R8"; this.useSmali = useSmali; } diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java index 7d0146290..7fd1c6f72 100644 --- a/src/main/java/com/android/tools/r8/R8Command.java +++ b/src/main/java/com/android/tools/r8/R8Command.java @@ -136,6 +136,7 @@ public class R8Command extends BaseCommand { return new R8Command(isPrintHelp(), isPrintVersion()); } + validate(); DexItemFactory factory = new DexItemFactory(); ImmutableList<ProguardConfigurationRule> mainDexKeepRules; if (this.mainDexRules.isEmpty()) { @@ -178,7 +179,8 @@ public class R8Command extends BaseCommand { getMinApiLevel(), useTreeShaking, useMinification, - ignoreMissingClasses); + ignoreMissingClasses, + isOverwriteOutputs()); } } @@ -321,8 +323,9 @@ public class R8Command extends BaseCommand { int minApiLevel, boolean useTreeShaking, boolean useMinification, - boolean ignoreMissingClasses) { - super(inputApp, outputPath, outputMode, mode, minApiLevel); + boolean ignoreMissingClasses, + boolean overwriteOutputs) { + super(inputApp, outputPath, outputMode, mode, minApiLevel, overwriteOutputs); assert proguardConfiguration != null; assert mainDexKeepRules != null; assert getOutputMode() == OutputMode.Indexed : "Only regular mode is supported in R8"; diff --git a/src/main/java/com/android/tools/r8/utils/FileUtils.java b/src/main/java/com/android/tools/r8/utils/FileUtils.java index 3f69c2e88..6a708455d 100644 --- a/src/main/java/com/android/tools/r8/utils/FileUtils.java +++ b/src/main/java/com/android/tools/r8/utils/FileUtils.java @@ -73,10 +73,10 @@ public class FileUtils { Files.write(file, Arrays.asList(lines)); } - public static Path validateOutputFile(Path path) throws CompilationException { + public static Path validateOutputFile(Path path, boolean allowOverwrite) throws CompilationException { if (path != null) { if (isZipFile(path)) { - if (Files.exists(path)) { + if ((!allowOverwrite) && Files.exists(path)) { throw new CompilationException("Cannot write to existing output file: " + path); } } else if (!(Files.exists(path) && Files.isDirectory(path))) { |