]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
Fix defaultContentLanguageInSubdir with only 1 language
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 7 Jul 2023 16:41:10 +0000 (18:41 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sat, 8 Jul 2023 14:08:46 +0000 (16:08 +0200)
Fixes #10064

12 files changed:
commands/hugobuilder.go
config/allconfig/configlanguage.go
config/configProvider.go
helpers/url_test.go
hugolib/config_test.go
hugolib/pagebundler_test.go
hugolib/paths/paths.go
hugolib/site.go
hugolib/site_new.go
hugolib/site_url_test.go
hugolib/sitemap_test.go
hugolib/testhelpers_test.go

index b5cd0c2bbedcb5d4b30f9020161c44640d17e9c0..d2b43cc770740f6fe72c203e77705782f179866d 100644 (file)
@@ -1042,8 +1042,8 @@ func (c *hugoBuilder) rebuildSites(events []fsnotify.Event) error {
        if c.fastRenderMode {
                c.withConf(func(conf *commonConfig) {
                        // Make sure we always render the home pages
-                       for _, l := range conf.configs.Languages {
-                               langPath := h.GetLangSubDir(l.Lang)
+                       for _, l := range conf.configs.ConfigLangs() {
+                               langPath := l.LanguagePrefix()
                                if langPath != "" {
                                        langPath = langPath + "/"
                                }
index be549126bd20dc8d9a11f645079c92c2ab64a70a..534276c25ba1a1e76fe3b6f12283d8c6ac7c6b5a 100644 (file)
@@ -41,6 +41,16 @@ func (c ConfigLanguage) LanguagesDefaultFirst() langs.Languages {
        return c.m.LanguagesDefaultFirst
 }
 
+func (c ConfigLanguage) LanguagePrefix() string {
+       if c.DefaultContentLanguageInSubdir() && c.DefaultContentLanguage() == c.Language().Lang {
+               return c.Language().Lang
+       }
+       if !c.IsMultiLingual() || c.DefaultContentLanguage() == c.Language().Lang {
+               return ""
+       }
+       return c.Language().Lang
+}
+
 func (c ConfigLanguage) BaseURL() urls.BaseURL {
        return c.config.C.BaseURL
 }
index 5d6acce9f3bca430cae8383fbfe72233c7eec12b..94683005667517a14f33b3088178835f8350f8fe 100644 (file)
@@ -27,6 +27,7 @@ type AllProvider interface {
        Language() *langs.Language
        Languages() langs.Languages
        LanguagesDefaultFirst() langs.Languages
+       LanguagePrefix() string
        BaseURL() urls.BaseURL
        BaseURLLiveReload() urls.BaseURL
        Environment() string
index b51625a30bfcbe5698394af749605c3597d3acc5..448756b5bdb92d7dc5930cd0d9ba6e6f62181ac7 100644 (file)
@@ -109,8 +109,16 @@ func doTestAbsURL(t *testing.T, defaultInSubDir, addLanguage, multilingual bool,
                                                "weight": 10,
                                        },
                                })
+                               v.Set("defaultContentLanguage", "en")
+                       } else {
+                               v.Set("defaultContentLanguage", lang)
+                               v.Set("languages", map[string]any{
+                                       lang: map[string]interface{}{
+                                               "weight": 10,
+                                       },
+                               })
                        }
-                       v.Set("defaultContentLanguage", "en")
+
                        v.Set("defaultContentLanguageInSubdir", defaultInSubDir)
                        v.Set("baseURL", test.baseURL)
 
@@ -118,16 +126,21 @@ func doTestAbsURL(t *testing.T, defaultInSubDir, addLanguage, multilingual bool,
                        if multilingual {
                                configLang = lang
                        }
+                       defaultContentLanguage := lang
+                       if multilingual {
+                               defaultContentLanguage = "en"
+                       }
+
                        p := newTestPathSpecFromCfgAndLang(v, configLang)
 
                        output := p.AbsURL(test.input, addLanguage)
                        expected := test.expected
-                       if multilingual && addLanguage {
-                               if !defaultInSubDir && lang == "en" {
-                                       expected = strings.Replace(expected, "MULTI", "", 1)
-                               } else {
-                                       expected = strings.Replace(expected, "MULTI", lang+"/", 1)
-                               }
+                       if addLanguage {
+                               addLanguage = defaultInSubDir && lang == defaultContentLanguage
+                               addLanguage = addLanguage || (lang != defaultContentLanguage && multilingual)
+                       }
+                       if addLanguage {
+                               expected = strings.Replace(expected, "MULTI", lang+"/", 1)
                        } else {
                                expected = strings.Replace(expected, "MULTI", "", 1)
                        }
@@ -162,8 +175,16 @@ func doTestRelURL(t testing.TB, defaultInSubDir, addLanguage, multilingual bool,
                                "weight": 10,
                        },
                })
+               v.Set("defaultContentLanguage", "en")
+       } else {
+               v.Set("defaultContentLanguage", lang)
+               v.Set("languages", map[string]any{
+                       lang: map[string]interface{}{
+                               "weight": 10,
+                       },
+               })
        }
-       v.Set("defaultContentLanguage", "en")
+
        v.Set("defaultContentLanguageInSubdir", defaultInSubDir)
 
        tests := []struct {
@@ -209,25 +230,25 @@ func doTestRelURL(t testing.TB, defaultInSubDir, addLanguage, multilingual bool,
        }
 
        for i, test := range tests {
-               c.Run(fmt.Sprintf("%v/%t%t%t/%s", test, defaultInSubDir, addLanguage, multilingual, lang), func(c *qt.C) {
+               c.Run(fmt.Sprintf("%v/defaultInSubDir=%t;addLanguage=%t;multilingual=%t/%s", test, defaultInSubDir, addLanguage, multilingual, lang), func(c *qt.C) {
 
                        v.Set("baseURL", test.baseURL)
                        v.Set("canonifyURLs", test.canonify)
-                       var configLang string
+                       defaultContentLanguage := lang
                        if multilingual {
-                               configLang = lang
+                               defaultContentLanguage = "en"
                        }
-                       p := newTestPathSpecFromCfgAndLang(v, configLang)
+                       p := newTestPathSpecFromCfgAndLang(v, lang)
 
                        output := p.RelURL(test.input, addLanguage)
 
                        expected := test.expected
-                       if multilingual && addLanguage {
-                               if !defaultInSubDir && lang == "en" {
-                                       expected = strings.Replace(expected, "MULTI", "", 1)
-                               } else {
-                                       expected = strings.Replace(expected, "MULTI", "/"+lang, 1)
-                               }
+                       if addLanguage {
+                               addLanguage = defaultInSubDir && lang == defaultContentLanguage
+                               addLanguage = addLanguage || (lang != defaultContentLanguage && multilingual)
+                       }
+                       if addLanguage {
+                               expected = strings.Replace(expected, "MULTI", "/"+lang, 1)
                        } else {
                                expected = strings.Replace(expected, "MULTI", "", 1)
                        }
index f87d8b936f3f2aae6e3c0c411c57406d2fbf5028..c4a373232f7e0df8d845b19e02de1b03acc3a693 100644 (file)
@@ -1295,3 +1295,94 @@ Home.
        b.Assert(b.H.Configs.LanguageConfigSlice[0].Module.Mounts, qt.HasLen, 7)
 
 }
+
+func TestDefaultContentLanguageInSubdirOnlyOneLanguage(t *testing.T) {
+
+       t.Run("One language, default in sub dir", func(t *testing.T) {
+               t.Skip()
+               t.Parallel()
+
+               files := `
+-- hugo.toml --
+baseURL = "https://example.com"
+defaultContentLanguage = "en"
+defaultContentLanguageInSubdir = true
+disableKinds = ["taxonomy", "term", "page", "section"]
+-- content/foo/bar.txt --
+Foo.
+-- layouts/index.html --
+Home.
+`
+               b := NewIntegrationTestBuilder(
+                       IntegrationTestConfig{
+                               T:           t,
+                               TxtarString: files,
+                       },
+               ).Build()
+
+               b.AssertFileContent("public/en/index.html", "Home.")
+               b.AssertFileContent("public/en/foo/bar.txt", "Foo.")
+       })
+
+       t.Run("Two languages, default in sub dir", func(t *testing.T) {
+               t.Skip()
+               t.Parallel()
+
+               files := `
+-- hugo.toml --
+baseURL = "https://example.com"
+defaultContentLanguage = "en"
+defaultContentLanguageInSubdir = true
+disableKinds = ["taxonomy", "term", "page", "section"]
+[languages]
+[languages.en]
+title = "English Title"
+[languages.sv]
+title = "Swedish Title"
+-- content/foo/bar.txt --
+Foo.
+-- layouts/index.html --
+Home.
+`
+               b := NewIntegrationTestBuilder(
+                       IntegrationTestConfig{
+                               T:           t,
+                               TxtarString: files,
+                       },
+               ).Build()
+
+               b.AssertFileContent("public/en/index.html", "Home.")
+               b.AssertFileContent("public/en/foo/bar.txt", "Foo.")
+       })
+
+       t.Run("Two languages, default in root", func(t *testing.T) {
+               t.Parallel()
+
+               files := `
+-- hugo.toml --
+baseURL = "https://example.com"
+defaultContentLanguage = "en"
+defaultContentLanguageInSubdir = false
+disableKinds = ["taxonomy", "term", "page", "section"]
+[languages]
+[languages.en]
+title = "English Title"
+[languages.sv]
+title = "Swedish Title"
+-- content/foo/bar.txt --
+Foo.
+-- layouts/index.html --
+Home.
+`
+               b := NewIntegrationTestBuilder(
+                       IntegrationTestConfig{
+                               T:           t,
+                               TxtarString: files,
+                       },
+               ).Build()
+
+               b.AssertFileContent("public/index.html", "Home.")
+               b.AssertFileContent("public/foo/bar.txt", "Foo.")
+       })
+
+}
index 51ce8252637db260b85876dbdfb02bd32155a4f7..ebf5d628bd1d6f89c8af1079843b0abda861881d 100644 (file)
@@ -67,6 +67,7 @@ func TestPageBundlerSiteRegular(t *testing.T) {
                                                fs, cfg := newTestBundleSources(c)
                                                cfg.Set("baseURL", baseURL)
                                                cfg.Set("canonifyURLs", canonify)
+                                               cfg.Set("defaultContentLanguageInSubdir", false)
 
                                                cfg.Set("permalinks", map[string]string{
                                                        "a": ":sections/:filename",
index 9e15d3ab4e396d42a5e6a398431d51835c72fe80..b0d9e3c1b1c573d7a8edd03ce52941225e579d5c 100644 (file)
@@ -102,6 +102,7 @@ func (p *Paths) Lang() string {
        return p.Cfg.Language().Lang
 }
 
+// TODO1 check this.
 func (p *Paths) GetTargetLanguageBasePath() string {
        if len(p.Cfg.Languages()) > 1 {
                // In a multihost configuration all assets will be published below the language code.
@@ -110,41 +111,8 @@ func (p *Paths) GetTargetLanguageBasePath() string {
        return p.GetLanguagePrefix()
 }
 
-func (p *Paths) GetURLLanguageBasePath() string {
-       if len(p.Cfg.Languages()) > 1 {
-               return ""
-       }
-       return p.GetLanguagePrefix()
-}
-
 func (p *Paths) GetLanguagePrefix() string {
-       if len(p.Cfg.Languages()) < 2 {
-               return ""
-       }
-       defaultLang := p.Cfg.DefaultContentLanguage()
-       defaultInSubDir := p.Cfg.DefaultContentLanguageInSubdir()
-       currentLang := p.Cfg.Language().Lang
-       if currentLang == "" || (currentLang == defaultLang && !defaultInSubDir) {
-               return ""
-       }
-       return currentLang
-}
-
-// GetLangSubDir returns the given language's subdir if needed.
-func (p *Paths) GetLangSubDir(lang string) string {
-       if len(p.Cfg.Languages()) < 2 {
-               return ""
-       }
-
-       if p.Cfg.IsMultihost() {
-               return ""
-       }
-
-       if lang == "" || (lang == p.Cfg.DefaultContentLanguage() && !p.Cfg.DefaultContentLanguageInSubdir()) {
-               return ""
-       }
-
-       return lang
+       return p.Cfg.LanguagePrefix()
 }
 
 // AbsPathify creates an absolute path if given a relative path. If already
index 7a352892990bd9840334a59b6bde6284db43ba80..eb6a4e344bb033285f1a8b926be394e5ec3c54c0 100644 (file)
@@ -887,21 +887,16 @@ func (s *Site) getLanguageTargetPathLang(alwaysInSubDir bool) string {
 
 // get any language code to prefix the relative permalink with.
 func (s *Site) getLanguagePermalinkLang(alwaysInSubDir bool) string {
-       if !s.h.isMultiLingual() || s.h.Conf.IsMultihost() {
+       if s.h.Conf.IsMultihost() {
                return ""
        }
 
-       if alwaysInSubDir {
+       if s.h.Conf.IsMultiLingual() && alwaysInSubDir {
                return s.Language().Lang
        }
 
-       isDefault := s.Language().Lang == s.conf.DefaultContentLanguage
-
-       if !isDefault || s.conf.DefaultContentLanguageInSubdir {
-               return s.Language().Lang
-       }
+       return s.GetLanguagePrefix()
 
-       return ""
 }
 
 func (s *Site) getTaxonomyKey(key string) string {
index c6c5cd2a35c1026900e789d4fe720435373d6c68..61273d3c87475bd7c48d20c75cc102d51f3994e1 100644 (file)
@@ -470,16 +470,11 @@ func (s *Site) IsMultiLingual() bool {
 }
 
 func (s *Site) LanguagePrefix() string {
-       conf := s.s.Conf
-       if !conf.IsMultiLingual() {
+       prefix := s.GetLanguagePrefix()
+       if prefix == "" {
                return ""
        }
-
-       if !conf.DefaultContentLanguageInSubdir() && s.language.Lang == conf.DefaultContentLanguage() {
-               return ""
-       }
-
-       return "/" + s.language.Lang
+       return "/" + prefix
 }
 
 // Returns the identity of this site.
index cb69be4ca053e8240869c04db33f9f11170c580b..821c84c95130e58613e3ecc9569ccdf5c3f69c58 100644 (file)
@@ -38,35 +38,6 @@ var urlFakeSource = [][2]string{
        {filepath.FromSlash("content/blue/doc2.md"), slugDoc2},
 }
 
-func TestPageCount(t *testing.T) {
-       t.Parallel()
-       c := qt.New(t)
-       cfg, fs := newTestCfg()
-       cfg.Set("uglyURLs", false)
-       cfg.Set("paginate", 10)
-       configs, err := loadTestConfigFromProvider(cfg)
-       c.Assert(err, qt.IsNil)
-
-       writeSourcesToSource(t, "", fs, urlFakeSource...)
-       s := buildSingleSite(t, deps.DepsCfg{Fs: fs, Configs: configs}, BuildCfg{})
-
-       _, err = s.Fs.WorkingDirReadOnly.Open("public/blue")
-       if err != nil {
-               t.Errorf("No indexed rendered.")
-       }
-
-       for _, pth := range []string{
-               "public/sd1/foo/index.html",
-               "public/sd2/index.html",
-               "public/sd3/index.html",
-               "public/sd4.html",
-       } {
-               if _, err := s.Fs.WorkingDirReadOnly.Open(filepath.FromSlash(pth)); err != nil {
-                       t.Errorf("No alias rendered: %s", pth)
-               }
-       }
-}
-
 func TestUglyURLsPerSection(t *testing.T) {
        t.Parallel()
 
index 984943c6f1f1811ce14c46c40e788714f3fb4105..aae874d502fd04631d05689ff06dfa76ce7a9028 100644 (file)
@@ -46,6 +46,7 @@ func doTestSitemapOutput(t *testing.T, internal bool) {
        c := qt.New(t)
        cfg, fs := newTestCfg()
        cfg.Set("baseURL", "http://auth/bub/")
+       cfg.Set("defaultContentLanguageInSubdir", false)
        configs, err := loadTestConfigFromProvider(cfg)
        c.Assert(err, qt.IsNil)
        writeSource(t, fs, "layouts/sitemap.xml", sitemapTemplate)
index 73920bd49f6656c1c3265ebc6db7e87b9ae05baf..700aa8c3d5e33d63ca5c7b1876eecf90cfe30e3b 100644 (file)
@@ -937,8 +937,7 @@ func newTestCfgBasic() (config.Provider, *hugofs.Fs) {
 func newTestCfg(withConfig ...func(cfg config.Provider) error) (config.Provider, *hugofs.Fs) {
        mm := afero.NewMemMapFs()
        cfg := config.New()
-       // Default is false, but true is easier to use as default in tests
-       cfg.Set("defaultContentLanguageInSubdir", true)
+       cfg.Set("defaultContentLanguageInSubdir", false)
        cfg.Set("publishDir", "public")
 
        fs := hugofs.NewFromOld(hugofs.NewBaseFileDecorator(mm), cfg)