diff options
Diffstat (limited to 'predict_files.go')
| -rw-r--r-- | predict_files.go | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/predict_files.go b/predict_files.go index c8baec1..25ae2d5 100644 --- a/predict_files.go +++ b/predict_files.go @@ -51,7 +51,7 @@ func predictFiles(a Args, pattern string, allowFiles bool) []string { return nil } - dir := a.Directory() + dir := directory(a.Last) files := listFiles(dir, pattern, allowFiles) // add dir if match @@ -60,6 +60,19 @@ func predictFiles(a Args, pattern string, allowFiles bool) []string { return PredictFilesSet(files).Predict(a) } +// directory gives the directory of the given partial path +// in case that it is not, we fall back to the current directory. +func directory(path string) string { + if info, err := os.Stat(path); err == nil && info.IsDir() { + return fixPathForm(path, path) + } + dir := filepath.Dir(path) + if info, err := os.Stat(dir); err == nil && info.IsDir() { + return fixPathForm(path, dir) + } + return "./" +} + // PredictFilesSet predict according to file rules to a given set of file names func PredictFilesSet(files []string) PredictFunc { return func(a Args) (prediction []string) { @@ -120,3 +133,42 @@ func matchFile(file, prefix string) bool { return strings.HasPrefix(file, prefix) } + +// fixPathForm changes a file name to a relative name +func fixPathForm(last string, file string) string { + // get wording directory for relative name + workDir, err := os.Getwd() + if err != nil { + return file + } + + abs, err := filepath.Abs(file) + if err != nil { + return file + } + + // if last is absolute, return path as absolute + if filepath.IsAbs(last) { + return fixDirPath(abs) + } + + rel, err := filepath.Rel(workDir, abs) + if err != nil { + return file + } + + // fix ./ prefix of path + if rel != "." && strings.HasPrefix(last, ".") { + rel = "./" + rel + } + + return fixDirPath(rel) +} + +func fixDirPath(path string) string { + info, err := os.Stat(path) + if err == nil && info.IsDir() && !strings.HasSuffix(path, "/") { + path += "/" + } + return path +} |
