#!/usr/bin/env --split-string=${JDK_HOME}/bin/java @Makeshift/java_arguments @Makeshift/java_javac_arguments \c [SS]
// This command runs directly from the present source file, it needs no compiling.
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import static java.nio.file.FileVisitResult.CONTINUE;
import static java.lang.System.out;
/** A shell command to remove all impermanent state and output files.
*
* @see
* The `clean` command
*/
public final class CleanCommand extends SimpleFileVisitor { // [AFN]
private CleanCommand() {}
/** Takes a `clean` command from the shell and executes it.
*/
public static void main( final String[] arguments ) throws IOException {
if( arguments.length != 0 ) {
System.err.println( "Usage: clean" );
System.exit( 1 ); }
new CleanCommand().run(); }
// ━━━ F i l e V i s i t o r ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
public @Override FileVisitResult visitFile( final Path file, BasicFileAttributes _a )
throws IOException {
return delete( file ); }
public @Override FileVisitResult postVisitDirectory( final Path directory, final IOException x )
throws IOException {
if( x != null ) throw x;
return delete( directory ); }
//// P r i v a t e ////////////////////////////////////////////////////////////////////////////////////
private int count; // Of files deleted.
private FileVisitResult delete( final Path path ) throws IOException {
Files.delete( path );
++count;
return CONTINUE; }
private void run() throws IOException {
final Path projectOutputDirectory = Path.of( System.getProperty("java.io.tmpdir"),
"Makeshift" );
if( !Files.isDirectory( projectOutputDirectory )) return;
Files.walkFileTree( projectOutputDirectory, CleanCommand.this );
if( count > 0 ) {
out.print( count );
out.print( " intermediate output file" );
if( count > 1 ) out.print( 's' );
out.println( " deleted" ); }}}
// NOTES
// ─────
// AFN Atypical file naming is allowed here, as explained in `./build`.
//
// SS · Long-form option `--split-string` is for Emacs, as explained in `./build`.
// Copyright © 2020, 2022, 2024 Michael Allan. Licence MIT.