| // Copyright 2023 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package pathutil |
| |
| import ( |
| "path/filepath" |
| "strings" |
| ) |
| |
| // InDir checks whether path is in the file tree rooted at dir. |
| // It checks only the lexical form of the file names. |
| // It does not consider symbolic links. |
| // |
| // Copied from go/src/cmd/go/internal/search/search.go. |
| func InDir(dir, path string) bool { |
| pv := strings.ToUpper(filepath.VolumeName(path)) |
| dv := strings.ToUpper(filepath.VolumeName(dir)) |
| path = path[len(pv):] |
| dir = dir[len(dv):] |
| switch { |
| default: |
| return false |
| case pv != dv: |
| return false |
| case len(path) == len(dir): |
| if path == dir { |
| return true |
| } |
| return false |
| case dir == "": |
| return path != "" |
| case len(path) > len(dir): |
| if dir[len(dir)-1] == filepath.Separator { |
| if path[:len(dir)] == dir { |
| return path[len(dir):] != "" |
| } |
| return false |
| } |
| if path[len(dir)] == filepath.Separator && path[:len(dir)] == dir { |
| if len(path) == len(dir)+1 { |
| return true |
| } |
| return path[len(dir)+1:] != "" |
| } |
| return false |
| } |
| } |