return err
}
- c := newCommandeer(cfg)
+ c, err := newCommandeer(cfg)
+ if err != nil {
+ return err
+ }
var memProf *os.File
if memProfileFile != "" {
import (
"github.com/spf13/hugo/deps"
"github.com/spf13/hugo/helpers"
+ "github.com/spf13/hugo/hugofs"
)
type commandeer struct {
// 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
}
return err
}
- c := newCommandeer(cfg)
+ c, err := newCommandeer(cfg)
+ if err != nil {
+ return err
+ }
if buildWatch {
cfg.Cfg.Set("disableLiveReload", true)
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)
return err
}
- c := newCommandeer(cfg)
+ c, err := newCommandeer(cfg)
+ if err != nil {
+ return err
+ }
c.Set("buildDrafts", true)
return err
}
- c := newCommandeer(cfg)
+ c, err := newCommandeer(cfg)
+ if err != nil {
+ return err
+ }
c.Set("buildFuture", true)
return err
}
- c := newCommandeer(cfg)
+ c, err := newCommandeer(cfg)
+ if err != nil {
+ return err
+ }
c.Set("buildExpired", true)
return err
}
- c := newCommandeer(cfg)
+ c, err := newCommandeer(cfg)
+ if err != nil {
+ return err
+ }
if flagChanged(cmd.Flags(), "format") {
c.Set("metaDataFormat", configFormat)
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)
return err
}
- c := newCommandeer(cfg)
+ c, err := newCommandeer(cfg)
+ if err != nil {
+ return err
+ }
if flagChanged(cmd.Flags(), "disableLiveReload") {
c.Set("disableLiveReload", disableLiveReload)
return nil
}
-func New(cfg DepsCfg) *Deps {
+func New(cfg DepsCfg) (*Deps, error) {
var (
logger = cfg.Logger
fs = cfg.Fs
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
return result, err
}
- // TODO(bep) output consider saving original URL?
return BaseURL{url: base, urlStr: base.String()}, nil
}
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())
+
}
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 {
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
v.Set("disablePathToLower", true)
l := NewDefaultLanguage(v)
- p := NewPathSpec(hugofs.NewMem(v), l)
+ p, _ := NewPathSpec(hugofs.NewMem(v), l)
tests := []struct {
input 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,
ps.language = language
}
- return ps
+ return ps, nil
}
// PaginatePath returns the configured root path used for paginator pages.
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)
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 {
v := viper.New()
l := NewDefaultLanguage(v)
- p := NewPathSpec(hugofs.NewMem(v), l)
+ p, _ := NewPathSpec(hugofs.NewMem(v), l)
tests := []struct {
input string
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
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)
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 {
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 {
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 {
// 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) {
}
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)
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)
}
return nil
}
- de := deps.New(config)
+ de, err := deps.New(config)
+ require.NoError(b, err)
require.NoError(b, de.LoadResources())
buf := new(bytes.Buffer)
return nil
}
- de := deps.New(config)
+ de, err := deps.New(config)
+ require.NoError(b, err)
require.NoError(b, de.LoadResources())
buf := new(bytes.Buffer)
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)
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)
[]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)
}
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)
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)
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)