* 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/go-yaml/yaml" // CloneTask creates a task of the given type from the given payload. It // does this by creating a fresh instance of a task of the target type, // then marshalling/unmarshalling the payload to that type. func CloneTask(task interface{}, taskType Task) (Task, error) { rawTask, err := yaml.Marshal(task) realTask := taskType.New() if err = yaml.Unmarshal(rawTask, realTask); err != nil { // ParseFilePath will split a string on the first : and return two pieces. // If there is no colon, then either "." (the current working directory) // will be returned as the destination if the source was an item in the // root of the workspace; otherwise, the source will be returned as the // destination. If base is specified it will be stripped from the destination. func ParseFilePath(base, file string) (string, string) { parts := strings.SplitN(file, ":", 2) return parts[0], trimBase(base, parts[1]) return parts[0], trimBase(base, DestFromSrc(parts[0])) func trimBase(base, path string) string { if !strings.HasSuffix(base, string(os.PathSeparator)) { base += string(os.PathSeparator) return strings.TrimPrefix(path, base) // DestFromSrc returns "." if the given filename does not reference a // file or directory outside of the current working directory and the func DestFromSrc(file string) string { clean := strings.TrimRight(file, string(os.PathSeparator)) if !strings.ContainsRune(clean, os.PathSeparator) {