gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit f9b351438b9c48dd0ddd527846babd1ef57140b6
parent c36fbab86fe574c28330462d43377cf02e7d5cd9
Author: Terin Stock <terinjokes@gmail.com>
Date:   Fri, 29 Apr 2022 02:00:25 -0700

[feature] allow absolute path to templates (#507)

Only attempt to join the `WebTemplateBaseDir` with the current working
directory if the user has not configured an absolute path to the
template directory.

This changeset also makes a similar change to the testrig, allowing
tests to configure an alternative location for the templates directory.

Fixes #411

Signed-off-by: Terin Stock <terinjokes@gmail.com>
Diffstat:
Minternal/email/util.go | 12+++++++-----
Minternal/router/template.go | 22++++++++++++----------
Mtestrig/router.go | 34+++++++++++++++++++++-------------
3 files changed, 40 insertions(+), 28 deletions(-)

diff --git a/internal/email/util.go b/internal/email/util.go @@ -28,14 +28,16 @@ import ( ) func loadTemplates(templateBaseDir string) (*template.Template, error) { - cwd, err := os.Getwd() - if err != nil { - return nil, fmt.Errorf("error getting current working directory: %s", err) + if !filepath.IsAbs(templateBaseDir) { + cwd, err := os.Getwd() + if err != nil { + return nil, fmt.Errorf("error getting current working directory: %s", err) + } + templateBaseDir = filepath.Join(cwd, templateBaseDir) } // look for all templates that start with 'email_' - tmPath := filepath.Join(cwd, fmt.Sprintf("%semail_*", templateBaseDir)) - return template.ParseGlob(tmPath) + return template.ParseGlob(filepath.Join(templateBaseDir, "email_*")) } // https://datatracker.ietf.org/doc/html/rfc2822 diff --git a/internal/router/template.go b/internal/router/template.go @@ -33,20 +33,22 @@ import ( // LoadTemplates loads html templates for use by the given engine func loadTemplates(engine *gin.Engine) error { - cwd, err := os.Getwd() - if err != nil { - return fmt.Errorf("error getting current working directory: %s", err) - } - templateBaseDir := viper.GetString(config.Keys.WebTemplateBaseDir) - _, err = os.Stat(filepath.Join(cwd, templateBaseDir, "index.tmpl")) - if err != nil { - return fmt.Errorf("%s doesn't seem to contain the templates; index.tmpl is missing: %s", filepath.Join(cwd, templateBaseDir), err) + if !filepath.IsAbs(templateBaseDir) { + cwd, err := os.Getwd() + if err != nil { + return fmt.Errorf("error getting current working directory: %w", err) + } + + templateBaseDir = filepath.Join(cwd, viper.GetString(config.Keys.WebTemplateBaseDir)) + } + + if _, err := os.Stat(filepath.Join(templateBaseDir, "index.tmpl")); err != nil { + return fmt.Errorf("%s doesn't seem to contain the templates; index.tmpl is missing: %w", templateBaseDir, err) } - tmPath := filepath.Join(cwd, fmt.Sprintf("%s*", templateBaseDir)) - engine.LoadHTMLGlob(tmPath) + engine.LoadHTMLGlob(fmt.Sprintf("%s*", templateBaseDir)) return nil } diff --git a/testrig/router.go b/testrig/router.go @@ -33,7 +33,14 @@ import ( ) // NewTestRouter returns a Router suitable for testing +// +// If the environment variable GTS_WEB_TEMPLATE_BASE_DIR set, it will take that +// value as the template base directory instead. func NewTestRouter(db db.DB) router.Router { + if alternativeTemplateBaseDir := os.Getenv("GTS_WEB_TEMPLATE_BASE_DIR"); alternativeTemplateBaseDir != "" { + viper.Set(config.Keys.WebTemplateBaseDir, alternativeTemplateBaseDir) + } + r, err := router.New(context.Background(), db) if err != nil { panic(err) @@ -43,23 +50,24 @@ func NewTestRouter(db db.DB) router.Router { // ConfigureTemplatesWithGin will panic on any errors related to template loading during tests func ConfigureTemplatesWithGin(engine *gin.Engine) { - router.LoadTemplateFunctions(engine) - // https://stackoverflow.com/questions/31873396/is-it-possible-to-get-the-current-root-of-package-structure-as-a-string-in-golan - _, runtimeCallerLocation, _, _ := runtime.Caller(0) - projectRoot, err := filepath.Abs(filepath.Join(filepath.Dir(runtimeCallerLocation), "../")) - if err != nil { - panic(err) - } - templateBaseDir := viper.GetString(config.Keys.WebTemplateBaseDir) - _, err = os.Stat(filepath.Join(projectRoot, templateBaseDir, "index.tmpl")) - if err != nil { - panic(fmt.Errorf("%s doesn't seem to contain the templates; index.tmpl is missing: %s", filepath.Join(projectRoot, templateBaseDir), err)) + if !filepath.IsAbs(templateBaseDir) { + // https://stackoverflow.com/questions/31873396/is-it-possible-to-get-the-current-root-of-package-structure-as-a-string-in-golan + _, runtimeCallerLocation, _, _ := runtime.Caller(0) + projectRoot, err := filepath.Abs(filepath.Join(filepath.Dir(runtimeCallerLocation), "../")) + if err != nil { + panic(err) + } + + templateBaseDir = filepath.Join(projectRoot, templateBaseDir) + } + + if _, err := os.Stat(filepath.Join(templateBaseDir, "index.tmpl")); err != nil { + panic(fmt.Errorf("%s doesn't seem to contain the templates; index.tmpl is missing: %w", templateBaseDir, err)) } - tmPath := filepath.Join(projectRoot, fmt.Sprintf("%s*", templateBaseDir)) - engine.LoadHTMLGlob(tmPath) + engine.LoadHTMLGlob(filepath.Join(templateBaseDir, "*")) }