Avoid filepath.Abs
filepath.Abs is surprisingly expensive, it calls os.Getwd every
time, which involves multiple syscalls, a lock, and and allocations.
Use IsAbs and prefix matching instead.
Test: paths_test.go
Change-Id: Ia6cf34d6bef24c694702af1e7a6ff08ffd2d822b
diff --git a/android/paths.go b/android/paths.go
index 13b31c7..4b84c97 100644
--- a/android/paths.go
+++ b/android/paths.go
@@ -503,16 +503,9 @@
return ret, err
}
- abs, err := filepath.Abs(ret.String())
- if err != nil {
- return ret, err
- }
- buildroot, err := filepath.Abs(ctx.Config().buildDir)
- if err != nil {
- return ret, err
- }
- if strings.HasPrefix(abs, buildroot) {
- return ret, fmt.Errorf("source path %s is in output", abs)
+ // absolute path already checked by validateSafePath
+ if strings.HasPrefix(ret.String(), ctx.Config().buildDir) {
+ return ret, fmt.Errorf("source path %s is in output", ret.String())
}
return ret, err
@@ -526,16 +519,9 @@
return ret, err
}
- abs, err := filepath.Abs(ret.String())
- if err != nil {
- return ret, err
- }
- buildroot, err := filepath.Abs(ctx.Config().buildDir)
- if err != nil {
- return ret, err
- }
- if strings.HasPrefix(abs, buildroot) {
- return ret, fmt.Errorf("source path %s is in output", abs)
+ // absolute path already checked by validatePath
+ if strings.HasPrefix(ret.String(), ctx.Config().buildDir) {
+ return ret, fmt.Errorf("source path %s is in output", ret.String())
}
return ret, nil