summaryrefslogtreecommitdiffstats
path: root/utils
diff options
context:
space:
mode:
authorJesse Hallam <jesse.hallam@gmail.com>2018-03-21 14:27:14 -0400
committerGeorge Goldberg <george@gberg.me>2018-03-21 18:27:14 +0000
commit9d701c704416a1d8648dd2818a8a15c4da99b424 (patch)
tree8ad361400a4435c96b9a82eff96fad8508ad9df8 /utils
parentb1b23079c6a49df29b6f27b85e98d6a9b1d3607c (diff)
downloadchat-9d701c704416a1d8648dd2818a8a15c4da99b424.tar.gz
chat-9d701c704416a1d8648dd2818a8a15c4da99b424.tar.bz2
chat-9d701c704416a1d8648dd2818a8a15c4da99b424.zip
Fix various segfaults when running `go test` manually (#8448)
* failing to find i18n shouldn't segfault The server was trying to handle the fact that it couldn't find the i18n directory, by emitting a translated log message... * fix utils.FindDir The attempts to find the directory in the parent or grandparent directory don't work if the current working directory was inside `enterprise`, with `enterprise` itself being a symlink as per the usual developer setup. Recurse to the root of the filesystem, cleaning the path along the way to work around this limitation (and allow tests to be run from an arbitrarily deep nesting level.) Fix corresponding usages to employ filepath.Join. * failing to find html templates shouldn't segfault * fail fast if the test user cannot be created * rework utils.FindDir to retain backwards compatibility
Diffstat (limited to 'utils')
-rw-r--r--utils/config.go30
-rw-r--r--utils/html.go10
-rw-r--r--utils/i18n.go12
-rw-r--r--utils/license.go3
4 files changed, 29 insertions, 26 deletions
diff --git a/utils/config.go b/utils/config.go
index 93a870743..5e9849930 100644
--- a/utils/config.go
+++ b/utils/config.go
@@ -9,7 +9,6 @@ import (
"io"
"io/ioutil"
"os"
- "path"
"path/filepath"
"strconv"
"strings"
@@ -51,21 +50,17 @@ func FindConfigFile(fileName string) (path string) {
return ""
}
+// FindDir looks for the given directory in nearby ancestors, falling back to `./` if not found.
func FindDir(dir string) (string, bool) {
- fileName := "."
- found := false
- if _, err := os.Stat("./" + dir + "/"); err == nil {
- fileName, _ = filepath.Abs("./" + dir + "/")
- found = true
- } else if _, err := os.Stat("../" + dir + "/"); err == nil {
- fileName, _ = filepath.Abs("../" + dir + "/")
- found = true
- } else if _, err := os.Stat("../../" + dir + "/"); err == nil {
- fileName, _ = filepath.Abs("../../" + dir + "/")
- found = true
+ for _, parent := range []string{".", "..", "../.."} {
+ foundDir, err := filepath.Abs(filepath.Join(parent, dir))
+ if err != nil {
+ continue
+ } else if _, err := os.Stat(foundDir); err == nil {
+ return foundDir, true
+ }
}
-
- return fileName + "/", found
+ return "./", false
}
func DisableDebugLogForTest() {
@@ -136,11 +131,10 @@ func ConfigureLog(s *model.LogSettings) {
func GetLogFileLocation(fileLocation string) string {
if fileLocation == "" {
- logDir, _ := FindDir("logs")
- return logDir + LOG_FILENAME
- } else {
- return path.Join(fileLocation, LOG_FILENAME)
+ fileLocation, _ = FindDir("logs")
}
+
+ return filepath.Join(fileLocation, LOG_FILENAME)
}
func SaveConfig(fileName string, config *model.Config) *model.AppError {
diff --git a/utils/html.go b/utils/html.go
index 6bbe55c6d..f9a7abe5b 100644
--- a/utils/html.go
+++ b/utils/html.go
@@ -5,8 +5,10 @@ package utils
import (
"bytes"
+ "errors"
"html/template"
"io"
+ "path/filepath"
"reflect"
"sync/atomic"
@@ -39,7 +41,7 @@ func NewHTMLTemplateWatcher(directory string) (*HTMLTemplateWatcher, error) {
return nil, err
}
- if htmlTemplates, err := template.ParseGlob(templatesDir + "*.html"); err != nil {
+ if htmlTemplates, err := template.ParseGlob(filepath.Join(templatesDir, "*.html")); err != nil {
return nil, err
} else {
ret.templates.Store(htmlTemplates)
@@ -56,7 +58,7 @@ func NewHTMLTemplateWatcher(directory string) (*HTMLTemplateWatcher, error) {
case event := <-watcher.Events:
if event.Op&fsnotify.Write == fsnotify.Write {
l4g.Info("Re-parsing templates because of modified file %v", event.Name)
- if htmlTemplates, err := template.ParseGlob(templatesDir + "*.html"); err != nil {
+ if htmlTemplates, err := template.ParseGlob(filepath.Join(templatesDir, "*.html")); err != nil {
l4g.Error("Failed to parse templates %v", err)
} else {
ret.templates.Store(htmlTemplates)
@@ -103,6 +105,10 @@ func (t *HTMLTemplate) Render() string {
}
func (t *HTMLTemplate) RenderToWriter(w io.Writer) error {
+ if t.Templates == nil {
+ return errors.New("no html templates")
+ }
+
if err := t.Templates.ExecuteTemplate(w, t.TemplateName, t); err != nil {
l4g.Error(T("api.api.render.error"), t.TemplateName, err)
return err
diff --git a/utils/i18n.go b/utils/i18n.go
index 8ed82d19f..7b8d1fef0 100644
--- a/utils/i18n.go
+++ b/utils/i18n.go
@@ -23,13 +23,15 @@ var settings model.LocalizationSettings
// this functions loads translations from filesystem
// and assign english while loading server config
func TranslationsPreInit() error {
+ // Set T even if we fail to load the translations. Lots of shutdown handling code will
+ // segfault trying to handle the error, and the untranslated IDs are strictly better.
+ T = TfuncWithFallback("en")
+ TDefault = TfuncWithFallback("en")
+
if err := InitTranslationsWithDir("i18n"); err != nil {
return err
}
- T = TfuncWithFallback("en")
- TDefault = TfuncWithFallback("en")
-
return nil
}
@@ -51,9 +53,9 @@ func InitTranslationsWithDir(dir string) error {
for _, f := range files {
if filepath.Ext(f.Name()) == ".json" {
filename := f.Name()
- locales[strings.Split(filename, ".")[0]] = i18nDirectory + filename
+ locales[strings.Split(filename, ".")[0]] = filepath.Join(i18nDirectory, filename)
- if err := i18n.LoadTranslationFile(i18nDirectory + filename); err != nil {
+ if err := i18n.LoadTranslationFile(filepath.Join(i18nDirectory, filename)); err != nil {
return err
}
}
diff --git a/utils/license.go b/utils/license.go
index 2853a58d0..cf874b62b 100644
--- a/utils/license.go
+++ b/utils/license.go
@@ -12,6 +12,7 @@ import (
"encoding/pem"
"io/ioutil"
"os"
+ "path/filepath"
"strconv"
"strings"
@@ -114,7 +115,7 @@ func GetLicenseFileFromDisk(fileName string) []byte {
func GetLicenseFileLocation(fileLocation string) string {
if fileLocation == "" {
configDir, _ := FindDir("config")
- return configDir + "mattermost.mattermost-license"
+ return filepath.Join(configDir, "mattermost.mattermost-license")
} else {
return fileLocation
}