/* * Copyright 2010 the original author or authors. * * Licensed 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.gradle.api.tasks; import org.gradle.api.Action; import org.gradle.api.Incubating; import org.gradle.api.file.DeleteSpec; import org.gradle.api.file.FileCollection; import org.gradle.api.internal.ConventionTask; import org.gradle.api.internal.file.FileResolver; import org.gradle.api.internal.file.delete.Deleter; import org.gradle.internal.nativeintegration.filesystem.FileSystem; import javax.inject.Inject; import java.util.LinkedHashSet; import java.util.Set; /** * <p>Deletes files or directories. Example:</p> * <pre autoTested=''> * task makePretty(type: Delete) { * delete 'uglyFolder', 'uglyFile' * followSymlinks = true * } * </pre> * * Be default symlinks will not be followed when deleting files. To change this behavior call * {@link Delete#setFollowSymlinks(boolean)} with true. On systems that do not support symlinks, * this will have no effect. */ public class Delete extends ConventionTask implements DeleteSpec { private Set<Object> delete = new LinkedHashSet<Object>(); private boolean followSymlinks; @Inject protected FileSystem getFileSystem() { // Decoration takes care of the implementation throw new UnsupportedOperationException(); } @Inject protected FileResolver getFileResolver() { // Decoration takes care of the implementation throw new UnsupportedOperationException(); } @TaskAction protected void clean() { Deleter deleter = new Deleter(getFileResolver(), getFileSystem()); final boolean innerFollowSymLinks = followSymlinks; final Object[] paths = delete.toArray(); setDidWork(deleter.delete(new Action<DeleteSpec>(){ @Override public void execute(DeleteSpec deleteSpec) { deleteSpec.delete(paths).setFollowSymlinks(innerFollowSymLinks); } }).getDidWork()); } /** * Returns the resolved set of files which will be deleted by this task. * * @return The files. Never returns null. */ @Destroys public FileCollection getTargetFiles() { return getProject().files(delete); } /** * Returns the set of files which will be deleted by this task. * * @return The files. Never returns null. */ @Internal public Set<Object> getDelete() { return delete; } /** * Sets the files to be deleted by this task. * * @param targets A set of any type of object accepted by {@link org.gradle.api.Project#files(Object...)} * @since 4.0 */ public void setDelete(Set<Object> targets) { this.delete = targets; } /** * Sets the files to be deleted by this task. * * @param target Any type of object accepted by {@link org.gradle.api.Project#files(Object...)} */ public void setDelete(Object target) { delete.clear(); this.delete.add(target); } /** * Returns if symlinks should be followed when doing a delete. * * @return true if symlinks will be followed. */ @Incubating @Input public boolean isFollowSymlinks() { return followSymlinks; } /** * Set if symlinks should be followed. If the platform doesn't support symlinks, then this will have no effect. * * @param followSymlinks if symlinks should be followed. */ @Incubating public void setFollowSymlinks(boolean followSymlinks) { this.followSymlinks = followSymlinks; } /** * Adds some files to be deleted by this task. The given targets are evaluated as per {@link org.gradle.api.Project#files(Object...)}. * * @param targets Any type of object accepted by {@link org.gradle.api.Project#files(Object...)} */ public Delete delete(Object... targets) { for (Object target : targets) { this.delete.add(target); } return this; } }