grim/convey

closing merged branch
hostnames
2017-10-13, Gary Kramlich
33eae19fcbbe
closing merged branch
/*
* Convey
* 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/>.
*/
package tasks
import (
"os"
"strings"
"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)
if err != nil {
return nil, err
}
realTask := taskType.New()
if err = yaml.Unmarshal(rawTask, realTask); err != nil {
return nil, err
}
return realTask, 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)
if len(parts) != 1 {
return parts[0], trimBase(base, parts[1])
}
return parts[0], trimBase(base, DestFromSrc(parts[0]))
}
func trimBase(base, path string) string {
if base == "" {
return path
}
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
// input otherwise.
func DestFromSrc(file string) string {
clean := strings.TrimRight(file, string(os.PathSeparator))
if !strings.ContainsRune(clean, os.PathSeparator) {
return "."
}
return file
}