gnodet commented on code in PR #954:
URL: https://github.com/apache/maven/pull/954#discussion_r1073679949
##########
maven-core/src/main/java/org/apache/maven/ReactorReader.java:
##########
@@ -324,4 +273,185 @@ private static boolean isTestArtifact(Artifact artifact) {
return ("test-jar".equals(artifact.getProperty("type", "")))
|| ("jar".equals(artifact.getExtension()) &&
"tests".equals(artifact.getClassifier()));
}
+
+ private File findInProjectLocalRepository(Artifact artifact) {
+ Path target = getArtifactPath(artifact);
+ return Files.isRegularFile(target) ? target.toFile() : null;
+ }
+
+ /**
+ * Copy packaged and attached artifacts from this project to the
+ * project local repository.
+ * This allows a subsequent build to resume while still being able
+ * to locate attached artifacts.
+ *
+ * @param project the project to copy artifacts from
+ */
+ private void installIntoProjectLocalRepository(MavenProject project) {
+ if (!hasBeenPackagedDuringThisSession(project)) {
+ return;
+ }
+
getProjectArtifacts(project).filter(this::isRegularFile).forEach(this::installIntoProjectLocalRepository);
+ }
+
+ private void cleanProjectLocalRepository(MavenProject project) {
+ try {
+ Path artifactPath = getProjectLocalRepo()
+ .resolve(project.getGroupId())
+ .resolve(project.getArtifactId())
+ .resolve(project.getVersion());
+ if (Files.isDirectory(artifactPath)) {
+ try (Stream<Path> paths = Files.list(artifactPath)) {
+ for (Path path : (Iterable<Path>) paths::iterator) {
+ Files.delete(path);
+ }
+ }
+ try {
+ Files.delete(artifactPath);
+ Files.delete(artifactPath.getParent());
+ Files.delete(artifactPath.getParent().getParent());
+ } catch (DirectoryNotEmptyException e) {
+ // ignore
+ }
+ }
+ } catch (IOException e) {
+ LOGGER.error("Error while cleaning project local repository", e);
+ }
+ }
+
+ /**
+ * Retrieve a stream of the project's artifacts
+ */
+ private Stream<Artifact> getProjectArtifacts(MavenProject project) {
+ Stream<org.apache.maven.artifact.Artifact> artifacts = Stream.concat(
+ Stream.concat(
+ // pom artifact
+ Stream.of(new ProjectArtifact(project)),
+ // main project artifact if not a pom
+ "pom".equals(project.getPackaging()) ? Stream.empty()
: Stream.of(project.getArtifact())),
+ // attached artifacts
+ project.getAttachedArtifacts().stream());
+ return artifacts.map(RepositoryUtils::toArtifact);
+ }
+
+ private boolean isRegularFile(Artifact artifact) {
+ return artifact.getFile() != null && artifact.getFile().isFile();
+ }
+
+ private void installIntoProjectLocalRepository(Artifact artifact) {
+ Path target = getArtifactPath(artifact);
+ try {
+ LOGGER.info("Copying {} to project local repository", artifact);
+ Files.createDirectories(target.getParent());
+ Files.copy(
+ artifact.getFile().toPath(),
+ target,
+ StandardCopyOption.REPLACE_EXISTING,
+ StandardCopyOption.COPY_ATTRIBUTES);
+ } catch (IOException e) {
+ LOGGER.error("Error while copying artifact to project local
repository", e);
+ }
+ }
+
+ private Path getArtifactPath(Artifact artifact) {
+ String groupId = artifact.getGroupId();
+ String artifactId = artifact.getArtifactId();
+ String version = artifact.getBaseVersion();
+ String classifier = artifact.getClassifier();
+ String extension = artifact.getExtension();
+ Path repo = getProjectLocalRepo();
+ return repo.resolve(groupId)
+ .resolve(artifactId)
+ .resolve(version)
+ .resolve(artifactId
+ + "-" + version
+ + (classifier != null && !classifier.isEmpty() ? "-" +
classifier : "")
+ + "." + extension);
+ }
+
+ private Path getProjectLocalRepo() {
+ Path root =
session.getRequest().getMultiModuleProjectDirectory().toPath();
Review Comment:
First, [this property is always
available](https://github.com/apache/maven/blob/c2c6dd09219744cfe45df34cabed6684fe5c9213/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java#L308-L320),
and second, if no `.mvn` parent directory exists, the current directory will
be used. So this is maybe not perfect, and I'd really like to have this
root/top directory property problem solved in the near future, but in the mean
time, that's the best we have afaik.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]