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  }