Files
notify/util.go
T

112 lines
2.1 KiB
Go

package notify
import (
"errors"
"os"
"path/filepath"
"strings"
)
const sep = string(os.PathSeparator)
func nonil(err ...error) error {
for _, err := range err {
if err != nil {
return err
}
}
return nil
}
var errDepth = errors.New("exceeded allowed iteration count (circular symlink?)")
// canonical resolves any symlink in the given path and returns it in a clean form.
// It expects the path to be absolute. It fails to resolve circular symlinks by
// maintaining a simple iteration limit.
//
// TODO(rjeczalik): replace with realpath?
func canonical(p string) (string, error) {
p, err := filepath.Abs(p)
if err != nil {
return "", err
}
for i, depth := 1, 1; i < len(p); i, depth = i+1, depth+1 {
if depth > 128 {
return "", &os.PathError{Op: "canonical", Path: p, Err: errDepth}
}
if j := strings.IndexRune(p[i:], '/'); j == -1 {
i = len(p)
} else {
i = i + j
}
fi, err := os.Lstat(p[:i])
if err != nil {
return "", err
}
if fi.Mode()&os.ModeSymlink == os.ModeSymlink {
s, err := os.Readlink(p[:i])
if err != nil {
return "", err
}
p = "/" + s + p[i:]
i = 1 // no guarantee s is canonical, start all over
}
}
return filepath.Clean(p), nil
}
// Joinevents TODO
func joinevents(events []Event) (e Event) {
if len(events) == 0 {
e = All
} else {
for _, event := range events {
e |= event
}
}
return
}
func split(s string) (string, string) {
if i := lastIndexSep(s); i != -1 {
return s[:i], s[i+1:]
}
return "", s
}
func base(s string) string {
if i := lastIndexSep(s); i != -1 {
return s[i+1:]
}
return s
}
// TODO(rjeczalik): split unix + windows
func indexbase(root, name string) int {
if n, m := len(root), len(name); m >= n && name[:n] == root &&
(n == m || name[n] == os.PathSeparator) {
return min(n+1, m)
}
return -1
}
// IndexSep TODO
func indexSep(s string) int {
for i := 0; i < len(s); i++ {
if s[i] == os.PathSeparator {
return i
}
}
return -1
}
// LastIndexSep TODO
func lastIndexSep(s string) int {
for i := len(s) - 1; i >= 0; i-- {
if s[i] == os.PathSeparator {
return i
}
}
return -1
}