summaryrefslogtreecommitdiffstats
path: root/utils/config.go
diff options
context:
space:
mode:
authorJesse Hallam <jesse.hallam@gmail.com>2018-06-06 10:18:24 -0400
committerChristopher Speller <crspeller@gmail.com>2018-06-06 07:18:24 -0700
commit0ba0af889e3a71d6d5aeb4dd10279d5027d3d8cd (patch)
tree3ff854b92c68b60cdcaf7cec73c86962cde5ea29 /utils/config.go
parent7df34989479f22de6f54ebab1e98f3b43ffd0bcf (diff)
downloadchat-0ba0af889e3a71d6d5aeb4dd10279d5027d3d8cd.tar.gz
chat-0ba0af889e3a71d6d5aeb4dd10279d5027d3d8cd.tar.bz2
chat-0ba0af889e3a71d6d5aeb4dd10279d5027d3d8cd.zip
MM-6839: searching for paths relative to executable (#8915)
* MM-6839: search relative to executable (#8853) * MM-6839: searching for paths relative to executable In addition to searching relative to the current working directory, also search relative to the location of the binary. This helps locate config and i18n files when invoking an absolute path to the mattermost binary. * MM-6839: find mattermost/ binary using utils.FindFile * add unit tests for utils.FindFile to exclude directories * fix filtering out directories in FindFile * fix platform invoking ./bin/mattermost
Diffstat (limited to 'utils/config.go')
-rw-r--r--utils/config.go102
1 files changed, 81 insertions, 21 deletions
diff --git a/utils/config.go b/utils/config.go
index 64085fcff..2fb6e689f 100644
--- a/utils/config.go
+++ b/utils/config.go
@@ -32,36 +32,96 @@ const (
LOG_FILENAME = "mattermost.log"
)
-// FindConfigFile attempts to find an existing configuration file. fileName can be an absolute or
-// relative path or name such as "/opt/mattermost/config.json" or simply "config.json". An empty
-// string is returned if no configuration is found.
-func FindConfigFile(fileName string) (path string) {
- if filepath.IsAbs(fileName) {
- if _, err := os.Stat(fileName); err == nil {
- return fileName
+var (
+ commonBaseSearchPaths = []string{
+ ".",
+ "..",
+ "../..",
+ "../../..",
+ }
+)
+
+func FindPath(path string, baseSearchPaths []string, filter func(os.FileInfo) bool) string {
+ if filepath.IsAbs(path) {
+ if _, err := os.Stat(path); err == nil {
+ return path
}
- } else {
- for _, dir := range []string{"./config", "../config", "../../config", "../../../config", "."} {
- path, _ := filepath.Abs(filepath.Join(dir, fileName))
- if _, err := os.Stat(path); err == nil {
- return path
+
+ return ""
+ }
+
+ searchPaths := []string{}
+ for _, baseSearchPath := range baseSearchPaths {
+ searchPaths = append(searchPaths, baseSearchPath)
+ }
+
+ // Additionally attempt to search relative to the location of the running binary.
+ var binaryDir string
+ if exe, err := os.Executable(); err == nil {
+ if exe, err = filepath.EvalSymlinks(exe); err == nil {
+ if exe, err = filepath.Abs(exe); err == nil {
+ binaryDir = filepath.Dir(exe)
}
}
}
- return ""
-}
+ if binaryDir != "" {
+ for _, baseSearchPath := range baseSearchPaths {
+ searchPaths = append(
+ searchPaths,
+ filepath.Join(binaryDir, baseSearchPath),
+ )
+ }
+ }
-// FindDir looks for the given directory in nearby ancestors, falling back to `./` if not found.
-func FindDir(dir string) (string, bool) {
- for _, parent := range []string{".", "..", "../..", "../../.."} {
- foundDir, err := filepath.Abs(filepath.Join(parent, dir))
+ for _, parent := range searchPaths {
+ found, err := filepath.Abs(filepath.Join(parent, path))
if err != nil {
continue
- } else if _, err := os.Stat(foundDir); err == nil {
- return foundDir, true
+ } else if fileInfo, err := os.Stat(found); err == nil {
+ if filter != nil {
+ if filter(fileInfo) {
+ return found
+ }
+ } else {
+ return found
+ }
}
}
- return "./", false
+
+ return ""
+}
+
+// FindConfigFile attempts to find an existing configuration file. fileName can be an absolute or
+// relative path or name such as "/opt/mattermost/config.json" or simply "config.json". An empty
+// string is returned if no configuration is found.
+func FindConfigFile(fileName string) (path string) {
+ found := FindFile(filepath.Join("config", fileName))
+ if found == "" {
+ found = FindPath(fileName, []string{"."}, nil)
+ }
+
+ return found
+}
+
+// FindFile looks for the given file in nearby ancestors relative to the current working
+// directory as well as the directory of the executable.
+func FindFile(path string) string {
+ return FindPath(path, commonBaseSearchPaths, func(fileInfo os.FileInfo) bool {
+ return !fileInfo.IsDir()
+ })
+}
+
+// FindDir looks for the given directory in nearby ancestors relative to the current working
+// directory as well as the directory of the executable, falling back to `./` if not found.
+func FindDir(dir string) (string, bool) {
+ found := FindPath(dir, commonBaseSearchPaths, func(fileInfo os.FileInfo) bool {
+ return fileInfo.IsDir()
+ })
+ if found == "" {
+ return "./", false
+ }
+
+ return found, true
}
func MloggerConfigFromLoggerConfig(s *model.LogSettings) *mlog.LoggerConfiguration {