mirror of
https://github.com/apache/maven-mvnd.git
synced 2025-10-13 21:50:48 +00:00
Remove build resumption which was ported from master to support resumption with 3.x (#1275)
This commit is contained in:
@@ -1,57 +0,0 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you 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 org.mvndaemon.mvnd.execution;
|
||||
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you 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.
|
||||
*/
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import org.apache.maven.execution.MavenExecutionResult;
|
||||
|
||||
/**
|
||||
* Instances of this class are responsible for determining whether it makes sense to "resume" a build (i.e., using
|
||||
* the {@code --resume} flag.
|
||||
*/
|
||||
public interface BuildResumptionAnalyzer {
|
||||
/**
|
||||
* Construct an instance of {@link BuildResumptionData} based on the outcome of the current Maven build.
|
||||
*
|
||||
* @param result Outcome of the current Maven build.
|
||||
* @return A {@link BuildResumptionData} instance or {@link Optional#empty()} if resuming the build is not
|
||||
* possible.
|
||||
*/
|
||||
Optional<BuildResumptionData> determineBuildResumptionData(final MavenExecutionResult result);
|
||||
}
|
@@ -1,62 +0,0 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you 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 org.mvndaemon.mvnd.execution;
|
||||
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you 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.
|
||||
*/
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* This class holds the information required to enable resuming a Maven build with {@code --resume}.
|
||||
*/
|
||||
public class BuildResumptionData {
|
||||
/**
|
||||
* The list of projects that remain to be built.
|
||||
*/
|
||||
private final List<String> remainingProjects;
|
||||
|
||||
public BuildResumptionData(final List<String> remainingProjects) {
|
||||
this.remainingProjects = remainingProjects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the projects that still need to be built when resuming.
|
||||
*
|
||||
* @return A list containing the group and artifact id of the projects.
|
||||
*/
|
||||
public List<String> getRemainingProjects() {
|
||||
return this.remainingProjects;
|
||||
}
|
||||
}
|
@@ -1,74 +0,0 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you 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 org.mvndaemon.mvnd.execution;
|
||||
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you 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.
|
||||
*/
|
||||
import org.apache.maven.execution.MavenExecutionRequest;
|
||||
import org.apache.maven.project.MavenProject;
|
||||
|
||||
/**
|
||||
* Instances of this interface retrieve and store data for the --resume / -r feature. This data is used to ensure newer
|
||||
* builds of the same project, that have the -r command-line flag, skip successfully built projects during earlier
|
||||
* invocations of Maven.
|
||||
*/
|
||||
public interface BuildResumptionDataRepository {
|
||||
/**
|
||||
* Persists any data needed to resume the build at a later point in time, using a new Maven invocation. This method
|
||||
* may also decide it is not needed or meaningful to persist such data, and return <code>false</code> to indicate
|
||||
* so.
|
||||
*
|
||||
* @param rootProject The root project that is being built.
|
||||
* @param buildResumptionData Information needed to resume the build.
|
||||
* @throws BuildResumptionPersistenceException When an error occurs while persisting data.
|
||||
*/
|
||||
void persistResumptionData(final MavenProject rootProject, final BuildResumptionData buildResumptionData)
|
||||
throws BuildResumptionPersistenceException;
|
||||
|
||||
/**
|
||||
* Uses previously stored resumption data to enrich an existing execution request.
|
||||
*
|
||||
* @param request The execution request that will be enriched.
|
||||
* @param rootProject The root project that is being built.
|
||||
*/
|
||||
void applyResumptionData(final MavenExecutionRequest request, final MavenProject rootProject);
|
||||
|
||||
/**
|
||||
* Removes previously stored resumption data.
|
||||
*
|
||||
* @param rootProject The root project that is being built.
|
||||
*/
|
||||
void removeResumptionData(final MavenProject rootProject);
|
||||
}
|
@@ -1,49 +0,0 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you 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 org.mvndaemon.mvnd.execution;
|
||||
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* This exception will be thrown when something fails while persisting build resumption data.
|
||||
*
|
||||
* @see BuildResumptionDataRepository#persistResumptionData
|
||||
*/
|
||||
public class BuildResumptionPersistenceException extends Exception {
|
||||
public BuildResumptionPersistenceException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
}
|
@@ -1,89 +0,0 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you 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 org.mvndaemon.mvnd.execution;
|
||||
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you 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.
|
||||
*/
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.apache.maven.api.di.Named;
|
||||
import org.apache.maven.api.di.Singleton;
|
||||
import org.apache.maven.execution.BuildFailure;
|
||||
import org.apache.maven.execution.BuildSuccess;
|
||||
import org.apache.maven.execution.MavenExecutionResult;
|
||||
import org.apache.maven.project.MavenProject;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* Default implementation of {@link BuildResumptionAnalyzer}.
|
||||
*/
|
||||
@Named
|
||||
@Singleton
|
||||
public class DefaultBuildResumptionAnalyzer implements BuildResumptionAnalyzer {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultBuildResumptionAnalyzer.class);
|
||||
|
||||
@Override
|
||||
public Optional<BuildResumptionData> determineBuildResumptionData(final MavenExecutionResult result) {
|
||||
if (!result.hasExceptions()) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
List<MavenProject> sortedProjects = result.getTopologicallySortedProjects();
|
||||
|
||||
boolean hasNoSuccess =
|
||||
sortedProjects.stream().noneMatch(project -> result.getBuildSummary(project) instanceof BuildSuccess);
|
||||
|
||||
if (hasNoSuccess) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
List<String> remainingProjects = sortedProjects.stream()
|
||||
.filter(project -> result.getBuildSummary(project) == null
|
||||
|| result.getBuildSummary(project) instanceof BuildFailure)
|
||||
.map(project -> project.getGroupId() + ":" + project.getArtifactId())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (remainingProjects.isEmpty()) {
|
||||
LOGGER.info("No remaining projects found, resuming the build would not make sense.");
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
return Optional.of(new BuildResumptionData(remainingProjects));
|
||||
}
|
||||
}
|
@@ -1,154 +0,0 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you 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 org.mvndaemon.mvnd.execution;
|
||||
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you 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.
|
||||
*/
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
import java.io.Writer;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Properties;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.apache.maven.api.di.Named;
|
||||
import org.apache.maven.api.di.Singleton;
|
||||
import org.apache.maven.execution.MavenExecutionRequest;
|
||||
import org.apache.maven.project.MavenProject;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* This implementation of {@link BuildResumptionDataRepository} persists information in a properties file. The file is
|
||||
* stored in the build output directory under the Maven execution root.
|
||||
*/
|
||||
@Named
|
||||
@Singleton
|
||||
public class DefaultBuildResumptionDataRepository implements BuildResumptionDataRepository {
|
||||
private static final String RESUME_PROPERTIES_FILENAME = "resume.properties";
|
||||
private static final String REMAINING_PROJECTS = "remainingProjects";
|
||||
private static final String PROPERTY_DELIMITER = ", ";
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultBuildResumptionDataRepository.class);
|
||||
|
||||
@Override
|
||||
public void persistResumptionData(MavenProject rootProject, BuildResumptionData buildResumptionData)
|
||||
throws BuildResumptionPersistenceException {
|
||||
Path directory = Paths.get(rootProject.getBuild().getDirectory());
|
||||
persistResumptionData(directory, buildResumptionData);
|
||||
}
|
||||
|
||||
public void persistResumptionData(Path directory, BuildResumptionData buildResumptionData)
|
||||
throws BuildResumptionPersistenceException {
|
||||
Properties properties = convertToProperties(buildResumptionData);
|
||||
|
||||
Path resumeProperties = directory.resolve(RESUME_PROPERTIES_FILENAME);
|
||||
try {
|
||||
Files.createDirectories(resumeProperties.getParent());
|
||||
try (Writer writer = Files.newBufferedWriter(resumeProperties)) {
|
||||
properties.store(writer, null);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
String message = "Could not create " + RESUME_PROPERTIES_FILENAME + " file.";
|
||||
throw new BuildResumptionPersistenceException(message, e);
|
||||
}
|
||||
}
|
||||
|
||||
private Properties convertToProperties(final BuildResumptionData buildResumptionData) {
|
||||
Properties properties = new Properties();
|
||||
|
||||
String value = String.join(PROPERTY_DELIMITER, buildResumptionData.getRemainingProjects());
|
||||
properties.setProperty(REMAINING_PROJECTS, value);
|
||||
|
||||
return properties;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyResumptionData(MavenExecutionRequest request, MavenProject rootProject) {
|
||||
Path directory = Paths.get(rootProject.getBuild().getDirectory());
|
||||
applyResumptionData(request, directory);
|
||||
}
|
||||
|
||||
public void applyResumptionData(MavenExecutionRequest request, Path directory) {
|
||||
Properties properties = loadResumptionFile(directory);
|
||||
applyResumptionProperties(request, properties);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeResumptionData(MavenProject rootProject) {
|
||||
Path directory = Paths.get(rootProject.getBuild().getDirectory());
|
||||
removeResumptionData(directory);
|
||||
}
|
||||
|
||||
public void removeResumptionData(Path directory) {
|
||||
Path resumeProperties = directory.resolve(RESUME_PROPERTIES_FILENAME);
|
||||
try {
|
||||
Files.deleteIfExists(resumeProperties);
|
||||
} catch (IOException e) {
|
||||
LOGGER.warn("Could not delete {} file. ", RESUME_PROPERTIES_FILENAME, e);
|
||||
}
|
||||
}
|
||||
|
||||
private Properties loadResumptionFile(Path rootBuildDirectory) {
|
||||
Properties properties = new Properties();
|
||||
Path path = rootBuildDirectory.resolve(RESUME_PROPERTIES_FILENAME);
|
||||
if (!Files.exists(path)) {
|
||||
LOGGER.warn("The {} file does not exist. The --resume / -r feature will not work.", path);
|
||||
return properties;
|
||||
}
|
||||
|
||||
try (Reader reader = Files.newBufferedReader(path)) {
|
||||
properties.load(reader);
|
||||
} catch (IOException e) {
|
||||
LOGGER.warn("Unable to read {}. The --resume / -r feature will not work.", path);
|
||||
}
|
||||
|
||||
return properties;
|
||||
}
|
||||
|
||||
// This method is made package-private for testing purposes
|
||||
void applyResumptionProperties(MavenExecutionRequest request, Properties properties) {
|
||||
if (properties.containsKey(REMAINING_PROJECTS)
|
||||
&& (request.getResumeFrom() == null || request.getResumeFrom().isEmpty())) {
|
||||
String propertyValue = properties.getProperty(REMAINING_PROJECTS);
|
||||
Stream.of(propertyValue.split(PROPERTY_DELIMITER))
|
||||
.filter(s -> s != null && !s.isEmpty())
|
||||
.forEach(request.getSelectedProjects()::add);
|
||||
LOGGER.info("Resuming from {} due to the --resume / -r feature.", propertyValue);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user