github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/go/base/path.go (about)

     1  // Copyright 2017 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package base
     6  
     7  import (
     8  	"os"
     9  	"path/filepath"
    10  	"runtime"
    11  	"strings"
    12  	"sync"
    13  )
    14  
    15  var cwd string
    16  var cwdOnce sync.Once
    17  
    18  // UncachedCwd returns the current working directory.
    19  // Most callers should use Cwd, which caches the result for future use.
    20  // UncachedCwd is appropriate to call early in program startup before flag parsing,
    21  // because the -C flag may change the current directory.
    22  func UncachedCwd() string {
    23  	wd, err := os.Getwd()
    24  	if err != nil {
    25  		Fatalf("cannot determine current directory: %v", err)
    26  	}
    27  	return wd
    28  }
    29  
    30  // Cwd returns the current working directory at the time of the first call.
    31  func Cwd() string {
    32  	cwdOnce.Do(func() {
    33  		cwd = UncachedCwd()
    34  	})
    35  	return cwd
    36  }
    37  
    38  // ShortPath returns an absolute or relative name for path, whatever is shorter.
    39  func ShortPath(path string) string {
    40  	if rel, err := filepath.Rel(Cwd(), path); err == nil && len(rel) < len(path) {
    41  		return rel
    42  	}
    43  	return path
    44  }
    45  
    46  // RelPaths returns a copy of paths with absolute paths
    47  // made relative to the current directory if they would be shorter.
    48  func RelPaths(paths []string) []string {
    49  	var out []string
    50  	for _, p := range paths {
    51  		rel, err := filepath.Rel(Cwd(), p)
    52  		if err == nil && len(rel) < len(p) {
    53  			p = rel
    54  		}
    55  		out = append(out, p)
    56  	}
    57  	return out
    58  }
    59  
    60  // IsTestFile reports whether the source file is a set of tests and should therefore
    61  // be excluded from coverage analysis.
    62  func IsTestFile(file string) bool {
    63  	// We don't cover tests, only the code they test.
    64  	return strings.HasSuffix(file, "_test.go")
    65  }
    66  
    67  // IsNull reports whether the path is a common name for the null device.
    68  // It returns true for /dev/null on Unix, or NUL (case-insensitive) on Windows.
    69  func IsNull(path string) bool {
    70  	if path == os.DevNull {
    71  		return true
    72  	}
    73  	if runtime.GOOS == "windows" {
    74  		if strings.EqualFold(path, "NUL") {
    75  			return true
    76  		}
    77  	}
    78  	return false
    79  }