mirror of
https://github.com/Luzifer/go_helpers.git
synced 2024-12-24 13:01:21 +00:00
Added helper to find binaries in path or directory
This commit is contained in:
parent
b9f1867384
commit
25969daa7c
3 changed files with 130 additions and 0 deletions
54
which/which.go
Normal file
54
which/which.go
Normal file
|
@ -0,0 +1,54 @@
|
|||
package which
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
"path"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Common named errors to match in programs using this library
|
||||
var (
|
||||
ErrBinaryNotFound = errors.New("Requested binary was not found")
|
||||
ErrNoSearchSpecified = errors.New("You need to specify a binary to search")
|
||||
)
|
||||
|
||||
// FindInPath searches the specified binary in directories listed in $PATH and returns first match
|
||||
func FindInPath(binary string) (string, error) {
|
||||
pathEnv := os.Getenv("PATH")
|
||||
if len(pathEnv) == 0 {
|
||||
return "", errors.New("Found empty $PATH, not able to search $PATH")
|
||||
}
|
||||
|
||||
for _, part := range strings.Split(pathEnv, ":") {
|
||||
if len(part) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
if found, err := FindInDirectory(binary, part); err != nil {
|
||||
return "", err
|
||||
} else if found {
|
||||
return path.Join(part, binary), nil
|
||||
}
|
||||
}
|
||||
|
||||
return "", ErrBinaryNotFound
|
||||
}
|
||||
|
||||
// FindInDirectory checks whether the specified file is present in the directory
|
||||
func FindInDirectory(binary, directory string) (bool, error) {
|
||||
if len(binary) == 0 {
|
||||
return false, ErrNoSearchSpecified
|
||||
}
|
||||
|
||||
_, err := os.Stat(path.Join(directory, binary))
|
||||
|
||||
switch {
|
||||
case err == nil:
|
||||
return true, nil
|
||||
case os.IsNotExist(err):
|
||||
return false, nil
|
||||
default:
|
||||
return false, err
|
||||
}
|
||||
}
|
13
which/which_suite_test.go
Normal file
13
which/which_suite_test.go
Normal file
|
@ -0,0 +1,13 @@
|
|||
package which_test
|
||||
|
||||
import (
|
||||
. "github.com/onsi/ginkgo"
|
||||
. "github.com/onsi/gomega"
|
||||
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestWhich(t *testing.T) {
|
||||
RegisterFailHandler(Fail)
|
||||
RunSpecs(t, "Which Suite")
|
||||
}
|
63
which/which_test.go
Normal file
63
which/which_test.go
Normal file
|
@ -0,0 +1,63 @@
|
|||
package which_test
|
||||
|
||||
import (
|
||||
. "github.com/Luzifer/go_helpers/which"
|
||||
|
||||
. "github.com/onsi/ginkgo"
|
||||
. "github.com/onsi/gomega"
|
||||
)
|
||||
|
||||
var _ = Describe("Which", func() {
|
||||
var (
|
||||
result string
|
||||
err error
|
||||
found bool
|
||||
)
|
||||
|
||||
Context("With a file available on linux systems", func() {
|
||||
BeforeEach(func() {
|
||||
found, err = FindInDirectory("bash", "/bin")
|
||||
})
|
||||
|
||||
It("should not have errored", func() {
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
})
|
||||
It("should have found the binary at /bin/bash", func() {
|
||||
Expect(found).To(BeTrue())
|
||||
})
|
||||
})
|
||||
|
||||
Context("Searching bash on the system", func() {
|
||||
BeforeEach(func() {
|
||||
result, err = FindInPath("bash")
|
||||
})
|
||||
|
||||
It("should not have errored", func() {
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
})
|
||||
It("should have a result", func() {
|
||||
Expect(len(result)).NotTo(Equal(0))
|
||||
})
|
||||
})
|
||||
|
||||
Context("Searching a non existent file", func() {
|
||||
BeforeEach(func() {
|
||||
result, err = FindInPath("dfqoiwurgtqi3uegrds")
|
||||
})
|
||||
|
||||
It("should have errored", func() {
|
||||
Expect(err).To(Equal(ErrBinaryNotFound))
|
||||
})
|
||||
})
|
||||
|
||||
Context("Searching an empty file", func() {
|
||||
BeforeEach(func() {
|
||||
result, err = FindInPath("")
|
||||
})
|
||||
|
||||
It("should have errored", func() {
|
||||
Expect(err).To(Equal(ErrNoSearchSpecified))
|
||||
})
|
||||
})
|
||||
|
||||
})
|
Loading…
Reference in a new issue