diff options
author | mikaelpeltier <mikaelpeltier@google.com> | 2015-01-27 13:28:08 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-01-27 13:28:08 +0000 |
commit | 4d7a9d313dfa7251c9ca5cd3cf6d47cc0723fb53 (patch) | |
tree | b01555c8bcd6b9f1e5fc6cd5ca3b81f8beeaa1dc | |
parent | 3a234ceb43fe28206490354441170e64d8e8b7bd (diff) | |
parent | 85db4597460de8fa0f7766f52ccfde7333eb3075 (diff) | |
download | toolchain_jack-4d7a9d313dfa7251c9ca5cd3cf6d47cc0723fb53.zip toolchain_jack-4d7a9d313dfa7251c9ca5cd3cf6d47cc0723fb53.tar.gz toolchain_jack-4d7a9d313dfa7251c9ca5cd3cf6d47cc0723fb53.tar.bz2 |
Merge "Add incremental logs into library representing incremental state" into ub-jack
4 files changed, 156 insertions, 2 deletions
diff --git a/jack/src/com/android/jack/analysis/dependency/library/LibraryDependencies.java b/jack/src/com/android/jack/analysis/dependency/library/LibraryDependencies.java index 6e799d9..a5ebbe2 100644 --- a/jack/src/com/android/jack/analysis/dependency/library/LibraryDependencies.java +++ b/jack/src/com/android/jack/analysis/dependency/library/LibraryDependencies.java @@ -83,6 +83,16 @@ public class LibraryDependencies extends Dependency { return compare(importedLibrariesDexDigest, libraryDependencies.importedLibrariesDexDigest); } + @Nonnull + public List<String> getDigestOfImportedLibraries() { + return importedLibrariesDexDigest; + } + + @Nonnull + public List<String> getDigestOfLibrariesOnClasspath() { + return librariesOnClasspathDexDigest; + } + private static boolean compare(@Nonnull List<String> digests1, @Nonnull List<String> digests2) { if (digests1.size() != digests2.size()) { return false; diff --git a/jack/src/com/android/jack/incremental/IncrementalInputFilter.java b/jack/src/com/android/jack/incremental/IncrementalInputFilter.java index 82fa279..c21e9f9 100644 --- a/jack/src/com/android/jack/incremental/IncrementalInputFilter.java +++ b/jack/src/com/android/jack/incremental/IncrementalInputFilter.java @@ -33,14 +33,18 @@ import com.android.jack.library.InputJackLibrary; import com.android.jack.library.InputLibrary; import com.android.jack.library.JackLibraryFactory; import com.android.jack.library.LibraryFormatException; +import com.android.jack.library.LibraryIOException; import com.android.jack.library.LibraryReadingException; import com.android.jack.library.LibraryVersionException; +import com.android.jack.library.LibraryWritingException; import com.android.jack.library.NotJackLibraryException; import com.android.jack.library.OutputJackLibrary; import com.android.jack.reporting.Reporter.Severity; import com.android.sched.util.RunnableHooks; import com.android.sched.util.codec.ImplementationName; +import com.android.sched.util.config.HasKeyId; import com.android.sched.util.config.ThreadConfig; +import com.android.sched.util.config.id.BooleanPropertyId; import com.android.sched.util.file.CannotDeleteFileException; import com.android.sched.util.file.CannotReadException; import com.android.sched.util.log.Tracer; @@ -69,9 +73,15 @@ import javax.annotation.Nonnull; * {@link InputFilter} that returns filtered inputs required by incremental support. */ @ImplementationName(iface = InputFilter.class, name = "incremental") +@HasKeyId public class IncrementalInputFilter extends CommonFilter implements InputFilter { @Nonnull + public static final BooleanPropertyId INCREMENTAL_LOG = BooleanPropertyId + .create("jack.incremental.log", "Enable incremental log") + .addDefaultValue(Boolean.FALSE); + + @Nonnull public static final StatisticId<Counter> COMPILED_FILES = new StatisticId<Counter>( "jack.incremental.source.compiled", "Source files that will be compile", CounterImpl.class, Counter.class); @@ -177,6 +187,35 @@ public class IncrementalInputFilter extends CommonFilter implements InputFilter session.getLibraryDependencies().addImportedLibraries(importedLibrariesFromCommandLine); session.getLibraryDependencies().addLibrariesOnClasspath(librariesOnClasspathFromCommandLine); filesToRecompile = getInternalFileNamesToCompile(); + + if (ThreadConfig.get(INCREMENTAL_LOG).booleanValue()) { + IncrementalLogWriter incLog; + try { + File incrementalFolder = options.getIncrementalFolder(); + assert incrementalFolder != null; + incLog = new IncrementalLogWriter(getOutputJackLibrary(), incrementalFolder); + incLog.writeString("type: " + (incrementalInputLibrary == null ? "full" : "incremental")); + incLog.writeFiles("classpath", options.getClasspath()); + incLog.writeStrings("classpath digests (" + (libraryDependencies.hasSameLibraryOnClasspath( + session.getLibraryDependencies()) ? "identical" + : "modified") + ")", + session.getLibraryDependencies().getDigestOfLibrariesOnClasspath()); + incLog.writeFiles("import", options.getImportedLibraries()); + incLog.writeStrings("import digests (" + (libraryDependencies.hasSameImportedLibrary( + session.getLibraryDependencies()) ? "identical" + : "modified") + ")", + session.getLibraryDependencies().getDigestOfImportedLibraries()); + incLog.writeStrings("added (" + addedFileNames.size() + ")", addedFileNames); + incLog.writeStrings("deleted (" + deletedFileNames.size() + ")", deletedFileNames); + incLog.writeStrings("modified (" + modifiedFileNames.size() + ")", modifiedFileNames); + incLog.writeStrings("compiled (" + filesToRecompile.size() + ")", filesToRecompile); + incLog.close(); + } catch (LibraryIOException e) { + LibraryWritingException reportable = new LibraryWritingException(e); + Jack.getSession().getReporter().report(Severity.FATAL, reportable); + throw new JackAbortException(reportable); + } + } } @Override diff --git a/jack/src/com/android/jack/incremental/IncrementalLogWriter.java b/jack/src/com/android/jack/incremental/IncrementalLogWriter.java new file mode 100644 index 0000000..696b348 --- /dev/null +++ b/jack/src/com/android/jack/incremental/IncrementalLogWriter.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.jack.incremental; + +import com.google.common.base.Function; +import com.google.common.base.Joiner; +import com.google.common.collect.Collections2; + +import com.android.jack.library.FileType; +import com.android.jack.library.FileTypeDoesNotExistException; +import com.android.jack.library.LibraryIOException; +import com.android.jack.library.OutputJackLibrary; +import com.android.sched.util.file.CannotCreateFileException; +import com.android.sched.util.file.NotFileOrDirectoryException; +import com.android.sched.vfs.VPath; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.PrintStream; +import java.util.Collection; + +import javax.annotation.Nonnull; + +/** + * Write logs of incremental runs into a section logs of the library representing the incremental + * state. + */ +class IncrementalLogWriter { + + @Nonnull + static final VPath vpath = new VPath("logs", '/'); + + @Nonnull + private final PrintStream ps; + + @Nonnull + private final OutputJackLibrary library; + + IncrementalLogWriter(@Nonnull OutputJackLibrary library, @Nonnull File incrementalFolder) + throws LibraryIOException { + this.library = library; + try { + library.getFile(FileType.LOG, vpath); + } catch (FileTypeDoesNotExistException e) { + try { + library.createFile(FileType.LOG, vpath); + } catch (CannotCreateFileException e1) { + throw new LibraryIOException(library.getLocation(), e1); + } catch (NotFileOrDirectoryException e1) { + throw new LibraryIOException(library.getLocation(), e1); + } + } + + File logFile = new File(incrementalFolder, + FileType.LOG.buildFileVPath(vpath).getPathAsString(File.separatorChar)); + try { + ps = new PrintStream(new FileOutputStream(logFile, true)); + writeString("***"); + } catch (FileNotFoundException e) { + // File already creates by using VFS + throw new AssertionError(); + } + } + + void writeFiles(@Nonnull String prefixStr, @Nonnull Collection<File> files) { + writeStrings(prefixStr, Collections2.transform(files, new Function<File, String>() { + @Override + public String apply(File file) { + return file.getPath(); + } + })); + } + + void writeStrings(@Nonnull String prefixStr, @Nonnull Collection<String> strings) { + ps.print(prefixStr); + ps.print(": "); + ps.print(Joiner.on(",").join(strings)); + ps.println(); + } + + void close() { + ps.close(); + } + + void writeString(@Nonnull String str) { + ps.print(str); + ps.println(); + } +} diff --git a/jack/src/com/android/jack/library/FileType.java b/jack/src/com/android/jack/library/FileType.java index 0bd0578..5c75a3f 100644 --- a/jack/src/com/android/jack/library/FileType.java +++ b/jack/src/com/android/jack/library/FileType.java @@ -49,9 +49,10 @@ public enum FileType { }, DEPENDENCIES("dependencies", "dependencies", ".dep", "dependencies") { @Override - public String toString() { - return "dependencies"; + public void check() { } + }, + LOG("logs", "logs", ".log", "logs") { @Override public void check() { } |