* Copyright 2016-2017 Gary Kramlich <grim@reaperworld.com> * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. "github.com/aphistic/gomol" "github.com/mattn/go-zglob" "bitbucket.org/rw_grim/convey/environment" "bitbucket.org/rw_grim/convey/state" "bitbucket.org/rw_grim/convey/tasks" Files []string `yaml:"files"` func sanitizeFile(base, file string, env []string) (string, error) { filename, err := environment.Mapper(file, env) pathname, err := filepath.Abs(filename) if !strings.HasPrefix(pathname, base) { return "", fmt.Errorf("the path %s is outside the convey working directory", filename) func sanitizeFiles(base string, files, env []string) ([]string, error) { for _, file := range files { sanitized, err := sanitizeFile(base, file, env) list = append(list, sanitized) func (c *Clean) Execute(name string, logger *gomol.LogAdapter, env []string, st *state.State) error { fullEnv := environment.Merge(env, st.Environment) for _, pattern := range c.Files { matches, err := zglob.Glob(pattern) if err == os.ErrNotExist { // Glob was an explicit name, but the file doesn't exist. Silently // ignore this case, just as RemoveAll ignores no change to the FS. for _, path := range matches { sanitized, err := sanitizeFile(wd, path, fullEnv) logger.Debugf("removing \"%v\", expanded from \"%v\"", sanitized, pattern) if err := os.RemoveAll(sanitized); err != nil { func (c *Clean) New() tasks.Task { func (c *Clean) Valid() error { return fmt.Errorf("No files specified")