gnodet commented on code in PR #356: URL: https://github.com/apache/maven-clean-plugin/pull/356#discussion_r4112683994
########## src/main/java/org/apache/maven/plugins/clean/CleanOrphansMojo.java: ########## @@ -0,0 +1,230 @@ +/* + * 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.apache.maven.plugins.clean; + +import java.io.IOException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +import org.apache.maven.api.Project; +import org.apache.maven.api.Session; +import org.apache.maven.api.di.Inject; +import org.apache.maven.api.plugin.Log; +import org.apache.maven.api.plugin.MojoException; +import org.apache.maven.api.plugin.annotations.Mojo; +import org.apache.maven.api.plugin.annotations.Parameter; +import org.apache.maven.api.services.PathMatcherFactory; + +/** + * Removes orphaned build output directories left behind by sub-projects that have been + * deleted or renamed since the last build. + * + * <p>When a sub-project is removed from the reactor (e.g. after a {@code git pull} or a branch + * switch), its {@code target/} directory may remain on disk even though its {@code pom.xml} is + * gone. Because the sub-project is no longer part of the reactor, {@code mvn clean} cannot know + * about it and will skip it. This goal detects such orphaned directories and removes them.</p> + * + * <p>Detection heuristic: a direct child directory of the current project's {@code basedir} is + * considered orphaned when its <em>only non-hidden child</em> is the build output directory + * (typically {@code target/}). A freshly checked-out or live sub-project always has at least a + * {@code pom.xml} alongside its build directory, so a directory whose sole visible content is a + * {@code target/} folder can safely be assumed to be a leftover.</p> + * + * @since 3.5.1 + */ +@Mojo(name = "purge-check", defaultPhase = "initialize") +public class CleanOrphansMojo implements org.apache.maven.api.plugin.Mojo { + + /** + * The logger where to send information about what the plugin is doing. + */ + @Inject + private Log logger; + + /** + * The current project instance, used to resolve {@code basedir}. + */ + @Inject + private Project project; + + /** + * The build output directory of the current project. Used only to determine the directory + * name (e.g. {@code target}) so that the same name is recognised in sibling directories. + */ + @Parameter(defaultValue = "${project.build.directory}", readonly = true, required = true) + private Path directory; + + /** + * The current session. + */ + @Inject + private Session session; Review Comment: Fixed in 70233df — removed both the `@Inject Session session` field and its import. ########## src/main/java/org/apache/maven/plugins/clean/CleanOrphansMojo.java: ########## @@ -0,0 +1,238 @@ +/* + * 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.apache.maven.plugins.clean; + +import java.io.IOException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +import org.apache.maven.api.Project; +import org.apache.maven.api.Session; +import org.apache.maven.api.di.Inject; +import org.apache.maven.api.plugin.Log; +import org.apache.maven.api.plugin.MojoException; +import org.apache.maven.api.plugin.annotations.Mojo; +import org.apache.maven.api.plugin.annotations.Parameter; +import org.apache.maven.api.services.PathMatcherFactory; + +/** + * Removes orphaned build output directories left behind by sub-projects that have been + * deleted or renamed since the last build. + * + * <p>When a sub-project is removed from the reactor (e.g. after a {@code git pull} or a branch + * switch), its {@code target/} directory may remain on disk even though its {@code pom.xml} is + * gone. Because the sub-project is no longer part of the reactor, {@code mvn clean} cannot know + * about it and will skip it. This goal detects such orphaned directories and removes them.</p> + * + * <p>Detection heuristic: a direct child directory of the current project's {@code basedir} is + * considered orphaned when its <em>only non-hidden child</em> is the build output directory + * (typically {@code target/}). A freshly checked-out or live sub-project always has at least a + * {@code pom.xml} alongside its build directory, so a directory whose sole visible content is a + * {@code target/} folder can safely be assumed to be a leftover.</p> + * + * @since 3.5.1 + */ +@Mojo(name = "purge-check", defaultPhase = "initialize") +public class CleanOrphansMojo implements org.apache.maven.api.plugin.Mojo { + + /** + * The logger where to send information about what the plugin is doing. + */ + @Inject + private Log logger; + + /** + * The current project instance, used to resolve {@code basedir}. + */ + @Inject + private Project project; + + /** + * The build output directory of the current project. Used only to determine the directory + * name (e.g. {@code target}) so that the same name is recognised in sibling directories. + */ + @Parameter(defaultValue = "${project.build.directory}", readonly = true, required = true) + private Path directory; + + /** + * The current session. + */ + @Inject + private Session session; Review Comment: Fixed in 70233df. ########## src/main/java/org/apache/maven/plugins/clean/CleanOrphansMojo.java: ########## @@ -0,0 +1,234 @@ +/* + * 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.apache.maven.plugins.clean; + +import java.io.IOException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +import org.apache.maven.api.Project; +import org.apache.maven.api.Session; +import org.apache.maven.api.di.Inject; +import org.apache.maven.api.plugin.Log; +import org.apache.maven.api.plugin.MojoException; +import org.apache.maven.api.plugin.annotations.Mojo; +import org.apache.maven.api.plugin.annotations.Parameter; +import org.apache.maven.api.services.PathMatcherFactory; + +/** + * Removes orphaned build output directories left behind by sub-projects that have been + * deleted or renamed since the last build. + * + * <p>When a sub-project is removed from the reactor (e.g. after a {@code git pull} or a branch + * switch), its {@code target/} directory may remain on disk even though its {@code pom.xml} is + * gone. Because the sub-project is no longer part of the reactor, {@code mvn clean} cannot know + * about it and will skip it. This goal detects such orphaned directories and removes them.</p> + * + * <p>Detection heuristic: a direct child directory of the current project's {@code basedir} is + * considered orphaned when its <em>only non-hidden child</em> is the build output directory + * (typically {@code target/}). A freshly checked-out or live sub-project always has at least a + * {@code pom.xml} alongside its build directory, so a directory whose sole visible content is a + * {@code target/} folder can safely be assumed to be a leftover. The entire child directory + * (not just its build output subdirectory) is removed, since an orphaned directory with no + * source files has no reason to remain on disk.</p> + * + * @since 3.5.1 + */ +@Mojo(name = "purge-check", defaultPhase = "initialize") +public class CleanOrphansMojo implements org.apache.maven.api.plugin.Mojo { + + /** + * The logger where to send information about what the plugin is doing. + */ + @Inject + private Log logger; + + /** + * The current project instance, used to resolve {@code basedir}. + */ + @Inject + private Project project; + + /** + * The build output directory of the current project. Used only to determine the directory + * name (e.g. {@code target}) so that the same name is recognised in sibling directories. + */ + @Parameter(defaultValue = "${project.build.directory}", readonly = true, required = true) + private Path directory; + + /** + * The current session. + */ + @Inject + private Session session; Review Comment: Fixed in 70233df. -- 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]
