Commit 94e60061 authored by Gustavo Niemeyer's avatar Gustavo Niemeyer Committed by Rob Pike

filepath: new Abs function

R=golang-dev, rsc1, peterGo, bsiegert, r, mattn
CC=golang-dev
https://golang.org/cl/4271057
parent 7c9c4fc3
...@@ -231,6 +231,21 @@ func EvalSymlinks(path string) (string, os.Error) { ...@@ -231,6 +231,21 @@ func EvalSymlinks(path string) (string, os.Error) {
return Clean(b.String()), nil return Clean(b.String()), nil
} }
// Abs returns an absolute representation of path.
// If the path is not absolute it will be joined with the current
// working directory to turn it into an absolute path. The absolute
// path name for a given file is not guaranteed to be unique.
func Abs(path string) (string, os.Error) {
if IsAbs(path) {
return path, nil
}
wd, err := os.Getwd()
if err != nil {
return "", err
}
return Join(wd, path), nil
}
// Visitor methods are invoked for corresponding file tree entries // Visitor methods are invoked for corresponding file tree entries
// visited by Walk. The parameter path is the full path of f relative // visited by Walk. The parameter path is the full path of f relative
// to root. // to root.
......
...@@ -9,6 +9,7 @@ import ( ...@@ -9,6 +9,7 @@ import (
"path/filepath" "path/filepath"
"reflect" "reflect"
"runtime" "runtime"
"strings"
"testing" "testing"
) )
...@@ -459,9 +460,9 @@ func TestEvalSymlinks(t *testing.T) { ...@@ -459,9 +460,9 @@ func TestEvalSymlinks(t *testing.T) {
// relative // relative
for _, d := range EvalSymlinksTests { for _, d := range EvalSymlinksTests {
if p, err := filepath.EvalSymlinks(d.path); err != nil { if p, err := filepath.EvalSymlinks(d.path); err != nil {
t.Errorf("EvalSymlinks(%v) error: %v", d.path, err) t.Errorf("EvalSymlinks(%q) error: %v", d.path, err)
} else if p != d.dest { } else if p != d.dest {
t.Errorf("EvalSymlinks(%v)=%v, want %v", d.path, p, d.dest) t.Errorf("EvalSymlinks(%q)=%q, want %q", d.path, p, d.dest)
} }
} }
// absolute // absolute
...@@ -476,9 +477,49 @@ func TestEvalSymlinks(t *testing.T) { ...@@ -476,9 +477,49 @@ func TestEvalSymlinks(t *testing.T) {
filepath.Join(testroot, d.dest), filepath.Join(testroot, d.dest),
} }
if p, err := filepath.EvalSymlinks(a.path); err != nil { if p, err := filepath.EvalSymlinks(a.path); err != nil {
t.Errorf("EvalSymlinks(%v) error: %v", a.path, err) t.Errorf("EvalSymlinks(%q) error: %v", a.path, err)
} else if p != a.dest { } else if p != a.dest {
t.Errorf("EvalSymlinks(%v)=%v, want %v", a.path, p, a.dest) t.Errorf("EvalSymlinks(%q)=%q, want %q", a.path, p, a.dest)
}
}
}
// Test paths relative to $GOROOT/src
var abstests = []string{
"../AUTHORS",
"pkg/../../AUTHORS",
"Make.pkg",
"pkg/Makefile",
// Already absolute
"$GOROOT/src/Make.pkg",
}
func TestAbs(t *testing.T) {
oldwd, err := os.Getwd()
if err != nil {
t.Fatal("Getwd failed: " + err.String())
}
defer os.Chdir(oldwd)
goroot := os.Getenv("GOROOT")
cwd := filepath.Join(goroot, "src")
os.Chdir(cwd)
for _, path := range abstests {
path = strings.Replace(path, "$GOROOT", goroot, -1)
abspath, err := filepath.Abs(path)
if err != nil {
t.Errorf("Abs(%q) error: %v", path, err)
}
info, err := os.Stat(path)
if err != nil {
t.Errorf("%s: %s", path, err)
}
absinfo, err := os.Stat(abspath)
if err != nil || absinfo.Ino != info.Ino {
t.Errorf("Abs(%q)=%q, not the same file", path, abspath)
}
if !filepath.IsAbs(abspath) {
t.Errorf("Abs(%q)=%q, not an absolute path", path, abspath)
} }
} }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment