Fix URLs for bundle resources in multihost mode
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 5 Jan 2018 11:01:13 +0000 (12:01 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sat, 6 Jan 2018 09:29:13 +0000 (10:29 +0100)
Fixes #4217

helpers/pathspec.go
helpers/pathspec_test.go
helpers/url.go
hugolib/hugo_sites_build_test.go
hugolib/hugo_sites_multihost_test.go
resource/resource.go

index 450391f16a24eb50b91c9613453374de6832e884..d35538b85766cad7f5f48db1d6d686183535bbc5 100644 (file)
@@ -35,8 +35,8 @@ type PathSpec struct {
        uglyURLs           bool
        canonifyURLs       bool
 
-       language  *Language
-       languages Languages
+       Language  *Language
+       Languages Languages
 
        // pagination path handling
        paginatePath string
@@ -70,7 +70,7 @@ type PathSpec struct {
 }
 
 func (p PathSpec) String() string {
-       return fmt.Sprintf("PathSpec, language %q, prefix %q, multilingual: %T", p.language.Lang, p.getLanguagePrefix(), p.multilingual)
+       return fmt.Sprintf("PathSpec, language %q, prefix %q, multilingual: %T", p.Language.Lang, p.getLanguagePrefix(), p.multilingual)
 }
 
 // NewPathSpec creats a new PathSpec from the given filesystems and Language.
@@ -113,8 +113,8 @@ func NewPathSpec(fs *hugofs.Fs, cfg config.Provider) (*PathSpec, error) {
                uglyURLs:                       cfg.GetBool("uglyURLs"),
                canonifyURLs:                   cfg.GetBool("canonifyURLs"),
                multilingual:                   cfg.GetBool("multilingual"),
-               language:                       language,
-               languages:                      languages,
+               Language:                       language,
+               Languages:                      languages,
                defaultContentLanguageInSubdir: cfg.GetBool("defaultContentLanguageInSubdir"),
                defaultContentLanguage:         cfg.GetString("defaultContentLanguage"),
                paginatePath:                   cfg.GetString("paginatePath"),
index eb1623a5edb807c5141f5091eb074f0913b7e9b2..e10ccc6395c88fd587581ae52acd72d359e83a0d 100644 (file)
@@ -50,7 +50,7 @@ func TestNewPathSpecFromConfig(t *testing.T) {
        require.True(t, p.removePathAccents)
        require.True(t, p.uglyURLs)
        require.Equal(t, "no", p.defaultContentLanguage)
-       require.Equal(t, "no", p.language.Lang)
+       require.Equal(t, "no", p.Language.Lang)
        require.Equal(t, "side", p.paginatePath)
 
        require.Equal(t, "http://base.com", p.BaseURL.String())
index e2501cd1a53d75e00de339d9761e04ed827c23d8..ef08a75300695b7c14326a041646322c687b1ac1 100644 (file)
@@ -208,7 +208,7 @@ func (p *PathSpec) getLanguagePrefix() string {
        defaultLang := p.defaultContentLanguage
        defaultInSubDir := p.defaultContentLanguageInSubdir
 
-       currentLang := p.language.Lang
+       currentLang := p.Language.Lang
        if currentLang == "" || (currentLang == defaultLang && !defaultInSubDir) {
                return ""
        }
@@ -221,7 +221,7 @@ func (p *PathSpec) GetLangSubDir(lang string) string {
                return ""
        }
 
-       if p.languages.IsMultihost() {
+       if p.Languages.IsMultihost() {
                return ""
        }
 
index 09cd7aff3de707ece286d24a67d9b00b8e630b7a..429ea9a7c26dc8ee7286708abf9a3b127565eb2d 100644 (file)
@@ -394,7 +394,7 @@ func doTestMultiSitesBuild(t *testing.T, configTemplate, configSuffix string) {
        }
 
        // Check bundles
-       bundleFr := enSite.getPage(KindPage, "bundles/b1/index.md")
+       bundleFr := frSite.getPage(KindPage, "bundles/b1/index.md")
        require.NotNil(t, bundleFr)
        require.Equal(t, "/blog/fr/bundles/b1/", bundleFr.RelPermalink())
        require.Equal(t, 1, len(bundleFr.Resources))
index 0729f7d9dc32b421fa4537cf478535017b116569..5f4455371170265b2e9b16b9331891148ad76fc5 100644 (file)
@@ -1,6 +1,7 @@
 package hugolib
 
 import (
+       "path/filepath"
        "testing"
 
        "github.com/spf13/afero"
@@ -26,7 +27,7 @@ tag = "tags"
 [Languages]
 [Languages.en]
 staticDir2 = ["ens1", "ens2"]
-baseURL = "https://example.com"
+baseURL = "https://example.com/docs"
 weight = 10
 title = "In English"
 languageName = "English"
@@ -65,7 +66,7 @@ languageName = "Nynorsk"
        s1h := s1.getPage(KindHome)
        assert.True(s1h.IsTranslated())
        assert.Len(s1h.Translations(), 2)
-       assert.Equal("https://example.com/", s1h.Permalink())
+       assert.Equal("https://example.com/docs/", s1h.Permalink())
 
        // For “regular multilingual” we kept the aliases pages with url in front matter
        // as a literal value that we use as is.
@@ -76,12 +77,12 @@ languageName = "Nynorsk"
        pageWithURLInFrontMatter := s1.getPage(KindPage, "sect/doc3.en.md")
        assert.NotNil(pageWithURLInFrontMatter)
        assert.Equal("/superbob", pageWithURLInFrontMatter.URL())
-       assert.Equal("/superbob/", pageWithURLInFrontMatter.RelPermalink())
+       assert.Equal("/docs/superbob/", pageWithURLInFrontMatter.RelPermalink())
        th.assertFileContent("public/en/superbob/index.html", "doc3|Hello|en")
 
        // check alias:
-       th.assertFileContent("public/en/al/alias1/index.html", `content="0; url=https://example.com/superbob/"`)
-       th.assertFileContent("public/en/al/alias2/index.html", `content="0; url=https://example.com/superbob/"`)
+       th.assertFileContent("public/en/al/alias1/index.html", `content="0; url=https://example.com/docs/superbob/"`)
+       th.assertFileContent("public/en/al/alias2/index.html", `content="0; url=https://example.com/docs/superbob/"`)
 
        s2 := sites.Sites[1]
        assert.Equal([]string{"s1", "s2", "frs1", "frs2"}, s2.StaticDirs())
@@ -93,9 +94,29 @@ languageName = "Nynorsk"
        th.assertFileContentStraight("public/en/index.html", "Default Home Page")
 
        // Check paginators
-       th.assertFileContent("public/en/page/1/index.html", `refresh" content="0; url=https://example.com/"`)
+       th.assertFileContent("public/en/page/1/index.html", `refresh" content="0; url=https://example.com/docs/"`)
        th.assertFileContent("public/nn/page/1/index.html", `refresh" content="0; url=https://example.no/"`)
-       th.assertFileContent("public/en/sect/page/2/index.html", "List Page 2", "Hello", "https://example.com/sect/", "\"/sect/page/3/")
+       th.assertFileContent("public/en/sect/page/2/index.html", "List Page 2", "Hello", "https://example.com/docs/sect/", "\"/docs/sect/page/3/")
        th.assertFileContent("public/fr/sect/page/2/index.html", "List Page 2", "Bonjour", "https://example.fr/sect/")
 
+       // Check bundles
+
+       bundleEn := s1.getPage(KindPage, "bundles/b1/index.en.md")
+       require.NotNil(t, bundleEn)
+       require.Equal(t, "/docs/bundles/b1/", bundleEn.RelPermalink())
+       require.Equal(t, 1, len(bundleEn.Resources))
+       logoEn := bundleEn.Resources.GetByPrefix("logo")
+       require.NotNil(t, logoEn)
+       require.Equal(t, "/docs/bundles/b1/logo.png", logoEn.RelPermalink())
+       require.Contains(t, readFileFromFs(t, fs.Destination, filepath.FromSlash("public/en/bundles/b1/logo.png")), "PNG Data")
+
+       bundleFr := s2.getPage(KindPage, "bundles/b1/index.md")
+       require.NotNil(t, bundleFr)
+       require.Equal(t, "/bundles/b1/", bundleFr.RelPermalink())
+       require.Equal(t, 1, len(bundleFr.Resources))
+       logoFr := bundleFr.Resources.GetByPrefix("logo")
+       require.NotNil(t, logoFr)
+       require.Equal(t, "/bundles/b1/logo.png", logoFr.RelPermalink())
+       require.Contains(t, readFileFromFs(t, fs.Destination, filepath.FromSlash("public/fr/bundles/b1/logo.png")), "PNG Data")
+
 }
index a9fa3df160927c95f3b7e558c845511340e33788..72ce2912541199bd057d158dae0c3e6393a284fc 100644 (file)
@@ -273,7 +273,11 @@ func (l *genericResource) Publish() error {
 }
 
 func (l *genericResource) target() string {
-       return l.relPermalinkForRel(l.rel, false)
+       target := l.relPermalinkForRel(l.rel, false)
+       if l.spec.PathSpec.Languages.IsMultihost() {
+               target = path.Join(l.spec.PathSpec.Language.Lang, target)
+       }
+       return target
 }
 
 func (r *Spec) newGenericResource(