Skip to content

Commit

Permalink
Make sure the last modified timestamp is set correctly
Browse files Browse the repository at this point in the history
Linux stores modification time with nano-seconds precision, but we
currently set the timestamp of the cached file only in milliseconds.
This can lead to the situation that the source is considered a few
nanoseconds older than the cache file and therefore the cache is
regenerated every time.
  • Loading branch information
laeubi committed Aug 20, 2023
1 parent df437f8 commit d0396e3
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ private static TargetBundle getWrappedArtifact(Artifact artifact, MavenTargetLoc
wrap.messages(true).map(ProcessingMessage::message).distinct().forEach(msg -> {
bundleStatus.add(Status.warning(msg));
});
return wrap.getFile();
return wrap.getFile().get();
}
if (directErrors.size() == 1) {
throw new CoreException(Status.error(directErrors.get(0).message()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,10 +136,7 @@ public boolean visitEnter(DependencyNode n) {
Map<DependencyNode, WrappedBundle> visited = new HashMap<>();
WrappedBundle wrappedNode = getWrappedNode(node, instructionsLookup, visited);
for (WrappedBundle wrap : visited.values()) {
Jar jar = wrap.getJar();
if (jar != null) {
jar.close();
}
wrap.getJar().ifPresent(jar -> jar.close());
}
return wrappedNode;
}
Expand Down Expand Up @@ -195,6 +192,7 @@ private static WrappedBundle getWrappedNode(DependencyNode node,
if (cached == null) {
List<ProcessingMessage> messages = new ArrayList<>();
wrapArtifactFile.getParentFile().mkdirs();
boolean hasErrors = false;
try (Analyzer analyzer = new Analyzer(analyzerJar);) {
analyzer.setProperty("mvnGroupId", artifact.getGroupId());
analyzer.setProperty("mvnArtifactId", artifact.getArtifactId());
Expand All @@ -208,7 +206,7 @@ private static WrappedBundle getWrappedNode(DependencyNode node,
analyzer.setProperty(property, trimValue);
}
for (WrappedBundle dep : depends) {
Jar depJar = dep.getJar();
Jar depJar = dep.getJar().orElse(null);
if (depJar == null) {
messages.add(new ProcessingMessage(artifact, Type.WARN,
"Dependency " + dep.getNode().getDependency() + " was ignored!"));
Expand All @@ -225,14 +223,21 @@ private static WrappedBundle getWrappedNode(DependencyNode node,
continue;
}
messages.add(new ProcessingMessage(artifact, Type.ERROR, err));
hasErrors = true;
}
for (String warn : analyzer.getWarnings()) {
messages.add(new ProcessingMessage(artifact, Type.WARN, warn));
}
}
wrapArtifactFile.setLastModified(originalFile.lastModified());
visited.put(node, wrappedNode = new WrappedBundle(node, depends, key, wrapArtifactFile.toPath(),
new Jar(wrapArtifactFile), messages));
if (hasErrors) {
Files.deleteIfExists(wrapArtifactFile.toPath());
visited.put(node, wrappedNode = new WrappedBundle(node, depends, key, null, null, messages));
} else {
Files.setLastModifiedTime(wrapArtifactFile.toPath(),
Files.getLastModifiedTime(originalFile.toPath()));
visited.put(node, wrappedNode = new WrappedBundle(node, depends, key, wrapArtifactFile.toPath(),
new Jar(wrapArtifactFile), messages));
}
} else {
visited.put(node, wrappedNode = new WrappedBundle(node, depends, key, wrapArtifactFile.toPath(),
new Jar(wrapArtifactFile), List.of()));
Expand Down Expand Up @@ -291,7 +296,7 @@ public static boolean isOutdated(Path cacheFile, Path sourceFile) throws IOExcep
if (Files.exists(cacheFile)) {
FileTime sourceTimeStamp = Files.getLastModifiedTime(sourceFile);
FileTime cacheTimeStamp = Files.getLastModifiedTime(cacheFile);
return sourceTimeStamp.compareTo(cacheTimeStamp) > 0;
return sourceTimeStamp.toMillis() > cacheTimeStamp.toMillis();
}
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import java.nio.file.Path;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Stream;

import org.eclipse.aether.graph.DependencyNode;
Expand All @@ -26,34 +27,38 @@ public final class WrappedBundle {
private final DependencyNode node;
private final List<WrappedBundle> depends;
private final String instructionsKey;
private final Path file;
private final Jar jar;
private final Optional<Path> file;
private final Optional<Jar> jar;
private final List<ProcessingMessage> messages;

WrappedBundle(DependencyNode node, List<WrappedBundle> depends, String key, Path file, Jar jar,
List<ProcessingMessage> messages) {
this.node = node;
this.depends = depends;
this.instructionsKey = key;
this.file = file;
this.jar = jar;
this.file = Optional.ofNullable(file);
this.jar = Optional.ofNullable(jar);
this.messages = messages;
}

String getInstructionsKey() {
return instructionsKey;
}

Jar getJar() {
Optional<Jar> getJar() {
return jar;
}

DependencyNode getNode() {
return node;
}

/** @return the location of the wrapped bundle's files */
public Path getFile() {
/**
*
* @return an optional describing the wrapped bundle, or an empty optional if
* the bundle was not wrapped because of errors in the generation phase.
*/
public Optional<Path> getFile() {
return file;
}

Expand Down

0 comments on commit d0396e3

Please sign in to comment.