all: Propagate baseURL error to the callers
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sat, 25 Mar 2017 13:37:04 +0000 (14:37 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 27 Mar 2017 13:43:56 +0000 (15:43 +0200)
18 files changed:
commands/benchmark.go
commands/commandeer.go
commands/hugo.go
commands/list.go
commands/new.go
commands/server.go
deps/deps.go
helpers/baseURL.go
helpers/baseURL_test.go
helpers/path_test.go
helpers/pathspec.go
helpers/pathspec_test.go
helpers/testhelpers_test.go
helpers/url_test.go
hugolib/hugo_sites.go
hugolib/testhelpers_test.go
tpl/tplimpl/template_funcs_test.go
tpl/tplimpl/template_test.go

index 4f9ab828b859f59a144c0fc3a46b60f67557b33e..6c42992a0234028b28b35f70be546c676206d854 100644 (file)
@@ -54,7 +54,10 @@ func benchmark(cmd *cobra.Command, args []string) error {
                return err
        }
 
-       c := newCommandeer(cfg)
+       c, err := newCommandeer(cfg)
+       if err != nil {
+               return err
+       }
 
        var memProf *os.File
        if memProfileFile != "" {
index e7fd70651cd211a3eef28e44f129bca5b770f4c3..19eadda10fc0fceeb508f7ae91232ab4222eaa37 100644 (file)
@@ -16,6 +16,7 @@ package commands
 import (
        "github.com/spf13/hugo/deps"
        "github.com/spf13/hugo/helpers"
+       "github.com/spf13/hugo/hugofs"
 )
 
 type commandeer struct {
@@ -35,12 +36,14 @@ func (c *commandeer) Set(key string, value interface{}) {
 // be configured before it is created.
 func (c *commandeer) PathSpec() *helpers.PathSpec {
        c.configured = true
-       if c.pathSpec == nil {
-               c.pathSpec = helpers.NewPathSpec(c.Fs, c.Cfg)
-       }
        return c.pathSpec
 }
 
-func newCommandeer(cfg *deps.DepsCfg) *commandeer {
-       return &commandeer{DepsCfg: cfg}
+func newCommandeer(cfg *deps.DepsCfg) (*commandeer, error) {
+       fs := hugofs.NewDefault(cfg.Language)
+       ps, err := helpers.NewPathSpec(fs, cfg.Cfg)
+       if err != nil {
+               return nil, err
+       }
+       return &commandeer{DepsCfg: cfg, pathSpec: ps}, nil
 }
index 48d4e0dc11c3c129321fa50852f99f4ad672b3d3..de5798df9d2f6ff94bc96cb9c218cb8499afb254 100644 (file)
@@ -118,7 +118,10 @@ Complete documentation is available at http://gohugo.io/.`,
                        return err
                }
 
-               c := newCommandeer(cfg)
+               c, err := newCommandeer(cfg)
+               if err != nil {
+                       return err
+               }
 
                if buildWatch {
                        cfg.Cfg.Set("disableLiveReload", true)
@@ -287,7 +290,10 @@ func InitializeConfig(subCmdVs ...*cobra.Command) (*deps.DepsCfg, error) {
 
        cfg.Cfg = config
 
-       c := newCommandeer(cfg)
+       c, err := newCommandeer(cfg)
+       if err != nil {
+               return nil, err
+       }
 
        for _, cmdV := range append([]*cobra.Command{hugoCmdV}, subCmdVs...) {
                c.initializeFlags(cmdV)
index 3f3286f382398fcf61a301c5808490634160a680..97753cc881aaae5f854f00fe79e1b9d6d273cfd5 100644 (file)
@@ -49,7 +49,10 @@ var listDraftsCmd = &cobra.Command{
                        return err
                }
 
-               c := newCommandeer(cfg)
+               c, err := newCommandeer(cfg)
+               if err != nil {
+                       return err
+               }
 
                c.Set("buildDrafts", true)
 
@@ -87,7 +90,10 @@ posted in the future.`,
                        return err
                }
 
-               c := newCommandeer(cfg)
+               c, err := newCommandeer(cfg)
+               if err != nil {
+                       return err
+               }
 
                c.Set("buildFuture", true)
 
@@ -125,7 +131,10 @@ expired.`,
                        return err
                }
 
-               c := newCommandeer(cfg)
+               c, err := newCommandeer(cfg)
+               if err != nil {
+                       return err
+               }
 
                c.Set("buildExpired", true)
 
index e2472af0c90110a06c62048729bdd2fffe2c62f0..abb234b8754cce1fe744e4fb5b66a676d12a380e 100644 (file)
@@ -93,7 +93,10 @@ func NewContent(cmd *cobra.Command, args []string) error {
                return err
        }
 
-       c := newCommandeer(cfg)
+       c, err := newCommandeer(cfg)
+       if err != nil {
+               return err
+       }
 
        if flagChanged(cmd.Flags(), "format") {
                c.Set("metaDataFormat", configFormat)
@@ -220,7 +223,10 @@ func NewTheme(cmd *cobra.Command, args []string) error {
                return newUserError("theme name needs to be provided")
        }
 
-       c := newCommandeer(cfg)
+       c, err := newCommandeer(cfg)
+       if err != nil {
+               return err
+       }
 
        createpath := c.PathSpec().AbsPathify(filepath.Join(c.Cfg.GetString("themesDir"), args[0]))
        jww.INFO.Println("creating theme at", createpath)
index 3e76737735e8f0882c344144a04362c980775b6a..ae51d075d2428cab474725c98976ef556f40b079 100644 (file)
@@ -106,7 +106,10 @@ func server(cmd *cobra.Command, args []string) error {
                return err
        }
 
-       c := newCommandeer(cfg)
+       c, err := newCommandeer(cfg)
+       if err != nil {
+               return err
+       }
 
        if flagChanged(cmd.Flags(), "disableLiveReload") {
                c.Set("disableLiveReload", disableLiveReload)
index 3e97ffd93e4e0f0e6f53e5da1121c7b9a994e21d..659f259dd93384401bd9437f956e964ab91177c9 100644 (file)
@@ -65,7 +65,7 @@ func (d *Deps) LoadResources() error {
        return nil
 }
 
-func New(cfg DepsCfg) *Deps {
+func New(cfg DepsCfg) (*Deps, error) {
        var (
                logger = cfg.Logger
                fs     = cfg.Fs
@@ -92,26 +92,37 @@ func New(cfg DepsCfg) *Deps {
                fs = hugofs.NewDefault(cfg.Language)
        }
 
+       ps, err := helpers.NewPathSpec(fs, cfg.Language)
+
+       if err != nil {
+               return nil, err
+       }
+
        d := &Deps{
                Fs:                  fs,
                Log:                 logger,
                templateProvider:    cfg.TemplateProvider,
                translationProvider: cfg.TranslationProvider,
                WithTemplate:        cfg.WithTemplate,
-               PathSpec:            helpers.NewPathSpec(fs, cfg.Language),
+               PathSpec:            ps,
                ContentSpec:         helpers.NewContentSpec(cfg.Language),
                Cfg:                 cfg.Language,
                Language:            cfg.Language,
        }
 
-       return d
+       return d, nil
 }
 
 // ForLanguage creates a copy of the Deps with the language dependent
 // parts switched out.
 func (d Deps) ForLanguage(l *helpers.Language) (*Deps, error) {
+       var err error
+
+       d.PathSpec, err = helpers.NewPathSpec(d.Fs, l)
+       if err != nil {
+               return nil, err
+       }
 
-       d.PathSpec = helpers.NewPathSpec(d.Fs, l)
        d.ContentSpec = helpers.NewContentSpec(l)
        d.Cfg = l
        d.Language = l
index 9a4b77edd65410bbcdb3f5fa861cd4952b6a802b..50265fe36331dd5c99f8947e6ac72eaff0c08a52 100644 (file)
@@ -69,6 +69,5 @@ func newBaseURLFromString(b string) (BaseURL, error) {
                return result, err
        }
 
-       // TODO(bep) output consider saving original URL?
        return BaseURL{url: base, urlStr: base.String()}, nil
 }
index eaa27ddb923ba58627169c26109dcd86e4475d6c..437152f3434a7e91b65ccef977c3a7c94d06f2c5 100644 (file)
@@ -48,4 +48,14 @@ func TestBaseURL(t *testing.T) {
        require.NoError(t, err)
        require.Equal(t, "webcal://hugo@rules.com", p)
 
+       // Test with "non-URLs". Some people will try to use these as a way to get
+       // relative URLs working etc.
+       b, err = newBaseURLFromString("/")
+       require.NoError(t, err)
+       require.Equal(t, "/", b.String())
+
+       b, err = newBaseURLFromString("")
+       require.NoError(t, err)
+       require.Equal(t, "", b.String())
+
 }
index 90dd95288b648ece121f7fbac9a464bbf2d7273a..25dbdc54365927adf6a63b9a7bc9c9a7756f7857 100644 (file)
@@ -59,7 +59,7 @@ func TestMakePath(t *testing.T) {
                v := viper.New()
                l := NewDefaultLanguage(v)
                v.Set("removePathAccents", test.removeAccents)
-               p := NewPathSpec(hugofs.NewMem(v), l)
+               p, _ := NewPathSpec(hugofs.NewMem(v), l)
 
                output := p.MakePath(test.input)
                if output != test.expected {
@@ -71,7 +71,7 @@ func TestMakePath(t *testing.T) {
 func TestMakePathSanitized(t *testing.T) {
        v := viper.New()
        l := NewDefaultLanguage(v)
-       p := NewPathSpec(hugofs.NewMem(v), l)
+       p, _ := NewPathSpec(hugofs.NewMem(v), l)
 
        tests := []struct {
                input    string
@@ -99,7 +99,7 @@ func TestMakePathSanitizedDisablePathToLower(t *testing.T) {
        v.Set("disablePathToLower", true)
 
        l := NewDefaultLanguage(v)
-       p := NewPathSpec(hugofs.NewMem(v), l)
+       p, _ := NewPathSpec(hugofs.NewMem(v), l)
 
        tests := []struct {
                input    string
index de7665c87296a47d4578031b8216dd94a6a9ec99..ff44880207f88ce86d341236567f39ca3e0291fa 100644 (file)
@@ -60,10 +60,14 @@ func (p PathSpec) String() string {
 }
 
 // NewPathSpec creats a new PathSpec from the given filesystems and Language.
-func NewPathSpec(fs *hugofs.Fs, cfg config.Provider) *PathSpec {
+func NewPathSpec(fs *hugofs.Fs, cfg config.Provider) (*PathSpec, error) {
 
-       // TODO(bep) output error handling
-       baseURL, _ := newBaseURLFromString(cfg.GetString("baseURL"))
+       baseURLstr := cfg.GetString("baseURL")
+       baseURL, err := newBaseURLFromString(baseURLstr)
+
+       if err != nil {
+               return nil, fmt.Errorf("Failed to create baseURL from %q: %s", baseURLstr, err)
+       }
 
        ps := &PathSpec{
                fs:                             fs,
@@ -87,7 +91,7 @@ func NewPathSpec(fs *hugofs.Fs, cfg config.Provider) *PathSpec {
                ps.language = language
        }
 
-       return ps
+       return ps, nil
 }
 
 // PaginatePath returns the configured root path used for paginator pages.
index c67c6fbdcdb1ba3ffcd3df36916f962a31fde711..2536b8f245ade46de4bfcd674049add9abf09b90 100644 (file)
@@ -40,8 +40,9 @@ func TestNewPathSpecFromConfig(t *testing.T) {
        v.Set("staticDir", "thestatic")
        v.Set("theme", "thetheme")
 
-       p := NewPathSpec(hugofs.NewMem(v), l)
+       p, err := NewPathSpec(hugofs.NewMem(v), l)
 
+       require.NoError(t, err)
        require.True(t, p.canonifyURLs)
        require.True(t, p.defaultContentLanguageInSubdir)
        require.True(t, p.disablePathToLower)
index 303f9feb680cb7970e92a10576f88b464527c7a6..d5a1b60eddf56925b56b915d64372b9e68a5a558 100644 (file)
@@ -8,7 +8,8 @@ import (
 
 func newTestPathSpec(fs *hugofs.Fs, v *viper.Viper) *PathSpec {
        l := NewDefaultLanguage(v)
-       return NewPathSpec(fs, l)
+       ps, _ := NewPathSpec(fs, l)
+       return ps
 }
 
 func newTestDefaultPathSpec(configKeyValues ...interface{}) *PathSpec {
index b53e2e6ccecc1c0bbb0cafb09dd24c6b7324f28d..49938825978a2362a5fe9cb0a7ad18016257249f 100644 (file)
@@ -28,7 +28,7 @@ func TestURLize(t *testing.T) {
 
        v := viper.New()
        l := NewDefaultLanguage(v)
-       p := NewPathSpec(hugofs.NewMem(v), l)
+       p, _ := NewPathSpec(hugofs.NewMem(v), l)
 
        tests := []struct {
                input    string
@@ -89,7 +89,7 @@ func doTestAbsURL(t *testing.T, defaultInSubDir, addLanguage, multilingual bool,
        for _, test := range tests {
                v.Set("baseURL", test.baseURL)
                l := NewLanguage(lang, v)
-               p := NewPathSpec(hugofs.NewMem(v), l)
+               p, _ := NewPathSpec(hugofs.NewMem(v), l)
 
                output := p.AbsURL(test.input, addLanguage)
                expected := test.expected
@@ -167,7 +167,7 @@ func doTestRelURL(t *testing.T, defaultInSubDir, addLanguage, multilingual bool,
                v.Set("baseURL", test.baseURL)
                v.Set("canonifyURLs", test.canonify)
                l := NewLanguage(lang, v)
-               p := NewPathSpec(hugofs.NewMem(v), l)
+               p, _ := NewPathSpec(hugofs.NewMem(v), l)
 
                output := p.RelURL(test.input, addLanguage)
 
@@ -255,7 +255,7 @@ func TestURLPrep(t *testing.T) {
                v := viper.New()
                v.Set("uglyURLs", d.ugly)
                l := NewDefaultLanguage(v)
-               p := NewPathSpec(hugofs.NewMem(v), l)
+               p, _ := NewPathSpec(hugofs.NewMem(v), l)
 
                output := p.URLPrep(d.input)
                if d.output != output {
index d0ad57525663bccb1b4d452593d81a8367387b05..6c737f65af2919a58058ce6c754f834d4b32a7b4 100644 (file)
@@ -92,7 +92,13 @@ func applyDepsIfNeeded(cfg deps.DepsCfg, sites ...*Site) error {
                if d == nil {
                        cfg.Language = s.Language
                        cfg.WithTemplate = s.withSiteTemplates(cfg.WithTemplate)
-                       d = deps.New(cfg)
+
+                       var err error
+                       d, err = deps.New(cfg)
+                       if err != nil {
+                               return err
+                       }
+
                        s.Deps = d
 
                        if err = d.LoadResources(); err != nil {
index 1caa97e4e4c5306fb2c0d5fcbbac72458b5a2480..d50514529c0ead054d1e1f372c493d20e7632f56 100644 (file)
@@ -74,7 +74,8 @@ func (th testHelper) replaceDefaultContentLanguageValue(value string) string {
 
 func newTestPathSpec(fs *hugofs.Fs, v *viper.Viper) *helpers.PathSpec {
        l := helpers.NewDefaultLanguage(v)
-       return helpers.NewPathSpec(fs, l)
+       ps, _ := helpers.NewPathSpec(fs, l)
+       return ps
 }
 
 func newTestDefaultPathSpec() *helpers.PathSpec {
@@ -82,7 +83,8 @@ func newTestDefaultPathSpec() *helpers.PathSpec {
        // Easier to reason about in tests.
        v.Set("disablePathToLower", true)
        fs := hugofs.NewDefault(v)
-       return helpers.NewPathSpec(fs, v)
+       ps, _ := helpers.NewPathSpec(fs, v)
+       return ps
 }
 
 func newTestCfg() (*viper.Viper, *hugofs.Fs) {
index aa322ddedb06b8c62c445af2e7508e73ac369440..a9cf5e58bf8fa467f5b7c9c0fa9a5dd10f901a8c 100644 (file)
@@ -289,12 +289,16 @@ urlize: bat-man
        }
        config.Fs = fs
 
-       d := deps.New(config)
+       d, err := deps.New(config)
+       if err != nil {
+               t.Fatal(err)
+       }
+
        if err := d.LoadResources(); err != nil {
                t.Fatal(err)
        }
 
-       err := d.Tmpl.Lookup("test").Execute(&b, &data)
+       err = d.Tmpl.Lookup("test").Execute(&b, &data)
 
        if err != nil {
                t.Fatal("Got error on execute", err)
@@ -2902,12 +2906,13 @@ func TestPartialCached(t *testing.T) {
                        return nil
                }
 
-               de := deps.New(config)
+               de, err := deps.New(config)
+               require.NoError(t, err)
                require.NoError(t, de.LoadResources())
 
                buf := new(bytes.Buffer)
                templ := de.Tmpl.Lookup("testroot")
-               err := templ.Execute(buf, &data)
+               err = templ.Execute(buf, &data)
                if err != nil {
                        t.Fatalf("[%d] error executing template: %s", i, err)
                }
@@ -2941,7 +2946,8 @@ func BenchmarkPartial(b *testing.B) {
                return nil
        }
 
-       de := deps.New(config)
+       de, err := deps.New(config)
+       require.NoError(b, err)
        require.NoError(b, de.LoadResources())
 
        buf := new(bytes.Buffer)
@@ -2972,7 +2978,8 @@ func BenchmarkPartialCached(b *testing.B) {
                return nil
        }
 
-       de := deps.New(config)
+       de, err := deps.New(config)
+       require.NoError(b, err)
        require.NoError(b, de.LoadResources())
 
        buf := new(bytes.Buffer)
@@ -2994,7 +3001,10 @@ func newTestFuncster() *templateFuncster {
 
 func newTestFuncsterWithViper(v *viper.Viper) *templateFuncster {
        config := newDepsConfig(v)
-       d := deps.New(config)
+       d, err := deps.New(config)
+       if err != nil {
+               panic(err)
+       }
 
        if err := d.LoadResources(); err != nil {
                panic(err)
@@ -3013,7 +3023,8 @@ func newTestTemplate(t *testing.T, name, template string) *template.Template {
                return nil
        }
 
-       de := deps.New(config)
+       de, err := deps.New(config)
+       require.NoError(t, err)
        require.NoError(t, de.LoadResources())
 
        return de.Tmpl.Lookup(name)
index 08bcab1a745e3a54b9a67d941dd08aefaa1a035b..43b834df24952491bf2a626c9ed80ced13210e58 100644 (file)
@@ -79,7 +79,8 @@ html lang=en
                                        []byte(this.baseContent), []byte(this.innerContent))
                        }
 
-                       a := deps.New(config)
+                       a, err := deps.New(config)
+                       require.NoError(t, err)
 
                        if err := a.LoadResources(); err != nil {
                                t.Fatal(err)
@@ -94,7 +95,7 @@ html lang=en
                        }
 
                        var buff bytes.Buffer
-                       err := a.Tmpl.ExecuteTemplate(&buff, "mytemplate.html", d)
+                       err = a.Tmpl.ExecuteTemplate(&buff, "mytemplate.html", d)
 
                        if err != nil && this.expectErr == 0 {
                                t.Errorf("Test %d with root '%s' errored: %s", i, root, err)
@@ -288,7 +289,8 @@ func TestTplGoFuzzReports(t *testing.T) {
                        return templ.AddTemplate("fuzz", this.data)
                }
 
-               de := deps.New(config)
+               de, err := deps.New(config)
+               require.NoError(t, err)
                require.NoError(t, de.LoadResources())
 
                templ := de.Tmpl.(*GoHTMLTemplate)
@@ -299,7 +301,7 @@ func TestTplGoFuzzReports(t *testing.T) {
                        t.Errorf("#1 Test %d should have errored", i)
                }
 
-               err := de.Tmpl.ExecuteTemplate(ioutil.Discard, "fuzz", d)
+               err = de.Tmpl.ExecuteTemplate(ioutil.Discard, "fuzz", d)
 
                if err != nil && this.expectErr == 0 {
                        t.Fatalf("Test %d errored: %s", i, err)