blob: 9ad2370727164561dd5deb67218e55d9c92a910c [file] [log] [blame]
/*
* Copyright 2012-present Facebook, Inc.
*
* 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 com.facebook.buck.step.fs;
import com.facebook.buck.step.CompositeStep;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Objects;
import com.google.common.collect.ImmutableList;
/**
* Deletes the directory, if it exists, before creating it.
* {@link MakeCleanDirectoryStep} is preferable to {@link MkdirStep} if the directory may
* contain many generated files and we want to avoid the case where it could accidentally include
* generated files from a previous run in Buck.
* <p>
* For example, for a directory of {@code .class} files, if the user deletes a {@code .java} file
* that generated one of the {@code .class} files, the {@code .class} file corresponding to the
* deleted {@code .java} file should no longer be there when {@code javac} is run again.
*/
public final class MakeCleanDirectoryStep extends CompositeStep {
private final String pathRelativeToProjectRoot;
public MakeCleanDirectoryStep(String pathRelativeToProjectRoot) {
super(ImmutableList.of(
new RmStep(pathRelativeToProjectRoot, true /* shouldForceDeletion */, true /* shouldRecurse */),
new MkdirStep(pathRelativeToProjectRoot)));
this.pathRelativeToProjectRoot = pathRelativeToProjectRoot;
}
@VisibleForTesting
public String getPath() {
return pathRelativeToProjectRoot;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof MakeCleanDirectoryStep)) {
return false;
}
MakeCleanDirectoryStep that = (MakeCleanDirectoryStep)obj;
return Objects.equal(this.pathRelativeToProjectRoot, that.pathRelativeToProjectRoot);
}
@Override
public int hashCode() {
return Objects.hashCode(pathRelativeToProjectRoot);
}
}