ref: 145b3fcce35fbac25c7033c91c1b7ae6d1179da8
parent: 01e249e97ce9a3bc145f4372a032b9da3e123a62
	author: Helder Pereira <helfper@gmail.com>
	date: Sun Jun 14 06:14:56 EDT 2020
	
Fix aliases with relativeURLs
--- a/hugolib/alias.go
+++ b/hugolib/alias.go
@@ -99,8 +99,11 @@
OutputFormat: outputFormat,
}
- return s.publisher.Publish(pd)
+	if s.Info.relativeURLs || s.Info.canonifyURLs {+ pd.AbsURLPath = s.absURLPath(targetPath)
+ }
+ return s.publisher.Publish(pd)
}
 func (a aliasHandler) targetPathAlias(src string) (string, error) {--- a/hugolib/alias_test.go
+++ b/hugolib/alias_test.go
@@ -45,18 +45,29 @@
t.Parallel()
c := qt.New(t)
- b := newTestSitesBuilder(t)
-	b.WithSimpleConfigFile().WithContent("blog/page.md", pageWithAlias)-	b.CreateSites().Build(BuildCfg{})+	tests := []struct {+ urlPrefix string
+		settings  map[string]interface{}+	}{+		{"http://example.com", map[string]interface{}{"baseURL": "http://example.com"}},+		{"http://example.com", map[string]interface{}{"baseURL": "http://example.com", "canonifyURLs": true}},+		{"../..", map[string]interface{}{"relativeURLs": true}},+ }
- c.Assert(len(b.H.Sites), qt.Equals, 1)
- c.Assert(len(b.H.Sites[0].RegularPages()), qt.Equals, 1)
+	for _, test := range tests {+ b := newTestSitesBuilder(t)
+		b.WithSimpleConfigFileAndSettings(test.settings).WithContent("blog/page.md", pageWithAlias)+		b.CreateSites().Build(BuildCfg{})- // the real page
-	b.AssertFileContent("public/blog/page/index.html", "For some moments the old man")- // the alias redirectors
-	b.AssertFileContent("public/foo/bar/index.html", "<meta http-equiv=\"refresh\" content=\"0; ")-	b.AssertFileContent("public/blog/rel/index.html", "<meta http-equiv=\"refresh\" content=\"0; ")+ c.Assert(len(b.H.Sites), qt.Equals, 1)
+ c.Assert(len(b.H.Sites[0].RegularPages()), qt.Equals, 1)
+
+ // the real page
+		b.AssertFileContent("public/blog/page/index.html", "For some moments the old man")+ // the alias redirectors
+		b.AssertFileContent("public/foo/bar/index.html", "<meta http-equiv=\"refresh\" content=\"0; url="+test.urlPrefix+"/blog/page/\" />")+		b.AssertFileContent("public/blog/rel/index.html", "<meta http-equiv=\"refresh\" content=\"0; url="+test.urlPrefix+"/blog/page/\" />")+ }
}
 func TestAliasMultipleOutputFormats(t *testing.T) {--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -1540,7 +1540,21 @@
 func (s *Site) permalink(link string) string {return s.PathSpec.PermalinkForBaseURL(link, s.PathSpec.BaseURL.String())
+}
+func (s *Site) absURLPath(targetPath string) string {+ var path string
+	if s.Info.relativeURLs {+ path = helpers.GetDottedRelativePath(targetPath)
+	} else {+ url := s.PathSpec.BaseURL.String()
+		if !strings.HasSuffix(url, "/") {+ url += "/"
+ }
+ path = url
+ }
+
+ return path
}
 func (s *Site) lookupLayouts(layouts ...string) tpl.Template {@@ -1562,17 +1576,6 @@
return err
}
- var path string
-	if s.Info.relativeURLs {- path = helpers.GetDottedRelativePath(targetPath)
-	} else {- s := s.PathSpec.BaseURL.String()
-		if !strings.HasSuffix(s, "/") {- s += "/"
- }
- path = s
- }
-
 	pd := publisher.Descriptor{Src: renderBuffer,
TargetPath: targetPath,
@@ -1580,14 +1583,14 @@
// For the minification part of XML,
// we currently only use the MIME type.
OutputFormat: output.RSSFormat,
- AbsURLPath: path,
+ AbsURLPath: s.absURLPath(targetPath),
}
return s.publisher.Publish(pd)
-
}
 func (s *Site) renderAndWritePage(statCounter *uint64, name string, targetPath string, p *pageState, templ tpl.Template) error {+	s.Log.DEBUG.Printf("Render %s to %q", name, targetPath)renderBuffer := bp.GetBuffer()
defer bp.PutBuffer(renderBuffer)
@@ -1604,18 +1607,6 @@
isHTML := of.IsHTML
isRSS := of.Name == "RSS"
- var path string
-
-	if s.Info.relativeURLs {- path = helpers.GetDottedRelativePath(targetPath)
-	} else if isRSS || s.Info.canonifyURLs {- url := s.PathSpec.BaseURL.String()
-		if !strings.HasSuffix(url, "/") {- url += "/"
- }
- path = url
- }
-
 	pd := publisher.Descriptor{Src: renderBuffer,
TargetPath: targetPath,
@@ -1625,10 +1616,10 @@
 	if isRSS {// Always canonify URLs in RSS
- pd.AbsURLPath = path
+ pd.AbsURLPath = s.absURLPath(targetPath)
 	} else if isHTML { 		if s.Info.relativeURLs || s.Info.canonifyURLs {- pd.AbsURLPath = path
+ pd.AbsURLPath = s.absURLPath(targetPath)
}
 		if s.running() && s.Cfg.GetBool("watch") && !s.Cfg.GetBool("disableLiveReload") {--- a/hugolib/site_render.go
+++ b/hugolib/site_render.go
@@ -383,7 +383,7 @@
 	if found {mainLang := s.h.multilingual.DefaultLang
 		if s.Info.defaultContentLanguageInSubdir {- mainLangURL := s.PathSpec.AbsURL(mainLang.Lang, false)
+ mainLangURL := s.PathSpec.AbsURL(mainLang.Lang+"/", false)
 			s.Log.DEBUG.Printf("Write redirect to main language %s: %s", mainLang, mainLangURL) 			if err := s.publishDestAlias(true, "/", mainLangURL, html, nil); err != nil {return err
--- a/hugolib/testhelpers_test.go
+++ b/hugolib/testhelpers_test.go
@@ -277,9 +277,14 @@
 func (s *sitesBuilder) WithSimpleConfigFileAndBaseURL(baseURL string) *sitesBuilder {s.T.Helper()
-	config := fmt.Sprintf("baseURL = %q", baseURL)+	return s.WithSimpleConfigFileAndSettings(map[string]interface{}{"baseURL": baseURL})+}
- config = config + commonConfigSections
+func (s *sitesBuilder) WithSimpleConfigFileAndSettings(settings interface{}) *sitesBuilder {+ s.T.Helper()
+ var buf bytes.Buffer
+ parser.InterfaceToConfig(settings, metadecoders.TOML, &buf)
+ config := buf.String() + commonConfigSections
 	return s.WithConfigFile("toml", config)}
--- a/transform/urlreplacers/absurlreplacer.go
+++ b/transform/urlreplacers/absurlreplacer.go
@@ -69,6 +69,7 @@
 	return []*prefix{ 		{b: []byte("src="), f: checkCandidateBase}, 		{b: []byte("href="), f: checkCandidateBase},+		{b: []byte("url="), f: checkCandidateBase}, 		{b: []byte("action="), f: checkCandidateBase}, 		{b: []byte("srcset="), f: checkCandidateSrcset},}
--- a/transform/urlreplacers/absurlreplacer_test.go
+++ b/transform/urlreplacers/absurlreplacer_test.go
@@ -88,8 +88,8 @@
schemaless2: <img srcset="//img.jpg" src="//basic.jpg2> POST
`
- relPathVariations = `PRE. a href="/img/small.jpg" input action="/foo.html" POST.`
- relPathVariationsCorrect = `PRE. a href="../../img/small.jpg" input action="../../foo.html" POST.`
+ relPathVariations = `PRE. a href="/img/small.jpg" input action="/foo.html" meta url=/redirect/to/page/ POST.`
+ relPathVariationsCorrect = `PRE. a href="../../img/small.jpg" input action="../../foo.html" meta url=../../redirect/to/page/ POST.`
testBaseURL = "http://base/"
)
--
⑨