github.com/wolfd/bazel-gazelle@v0.14.0/internal/wspace/finder.go (about) 1 /* Copyright 2016 The Bazel Authors. All rights reserved. 2 Licensed under the Apache License, Version 2.0 (the "License"); 3 you may not use this file except in compliance with the License. 4 You may obtain a copy of the License at 5 http://www.apache.org/licenses/LICENSE-2.0 6 Unless required by applicable law or agreed to in writing, software 7 distributed under the License is distributed on an "AS IS" BASIS, 8 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 9 See the License for the specific language governing permissions and 10 limitations under the License. 11 */ 12 13 // Package wspace provides functions to locate and modify a bazel WORKSPACE file. 14 package wspace 15 16 import ( 17 "os" 18 "path/filepath" 19 "strings" 20 ) 21 22 const workspaceFile = "WORKSPACE" 23 24 // Find searches from the given dir and up for the WORKSPACE file 25 // returning the directory containing it, or an error if none found in the tree. 26 func Find(dir string) (string, error) { 27 dir, err := filepath.Abs(dir) 28 if err != nil { 29 return "", err 30 } 31 32 for { 33 _, err = os.Stat(filepath.Join(dir, workspaceFile)) 34 if err == nil { 35 return dir, nil 36 } 37 if !os.IsNotExist(err) { 38 return "", err 39 } 40 if strings.HasSuffix(dir, string(os.PathSeparator)) { // stop at root dir 41 return "", os.ErrNotExist 42 } 43 dir = filepath.Dir(dir) 44 } 45 }