Skip to content

Commit 0dba9e2

Browse files
committed
Work
1 parent 8ac809a commit 0dba9e2

File tree

7 files changed

+138
-38
lines changed

7 files changed

+138
-38
lines changed

hugolib/roles/roles.go

+39-9
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"fmt"
1919
"sort"
2020

21+
"github.com/gohugoio/hugo/common/hugo"
2122
"github.com/gohugoio/hugo/common/paths"
2223
"github.com/gohugoio/hugo/config"
2324
"github.com/gohugoio/hugo/hugofs/glob"
@@ -31,7 +32,36 @@ type RoleConfig struct {
3132
Weight int
3233
}
3334

34-
type Role struct {
35+
// Site is a sub set if page.Site to avoid circular dependencies.
36+
type Site interface {
37+
Hugo() hugo.HugoInfo
38+
}
39+
40+
type Role interface {
41+
Name() string
42+
Site() Site
43+
}
44+
45+
var _ Role = (*RoleSite)(nil)
46+
47+
func NewRoleSite(r RoleInternal, s Site) Role {
48+
return RoleSite{r: r, s: s}
49+
}
50+
51+
type RoleSite struct {
52+
r RoleInternal
53+
s Site
54+
}
55+
56+
func (r RoleSite) Name() string {
57+
return r.r.Name
58+
}
59+
60+
func (r RoleSite) Site() Site {
61+
return r.s
62+
}
63+
64+
type RoleInternal struct {
3565
// Name is the name of the role, extracted from the key in the config.
3666
Name string
3767

@@ -40,12 +70,12 @@ type Role struct {
4070
// There is only be one default role.
4171
Default bool
4272

43-
config RoleConfig
73+
RoleConfig
4474
}
4575

4676
type Roles struct {
4777
roleConfigs map[string]RoleConfig
48-
Sorted []Role
78+
Sorted []RoleInternal
4979
}
5080

5181
func (r Roles) IndexDefault() int {
@@ -95,29 +125,29 @@ func (r *Roles) init(defaultContentRole string) error {
95125
defaultSeen = true
96126
}
97127

98-
r.Sorted = append(r.Sorted, Role{Name: k, Default: isDefault, config: v})
128+
r.Sorted = append(r.Sorted, RoleInternal{Name: k, Default: isDefault, RoleConfig: v})
99129
}
100130

101131
// Sort by weight if set, then by name.
102132
sort.SliceStable(r.Sorted, func(i, j int) bool {
103133
ri, rj := r.Sorted[i], r.Sorted[j]
104-
if ri.config.Weight == rj.config.Weight {
134+
if ri.Weight == rj.Weight {
105135
return ri.Name < rj.Name
106136
}
107-
if rj.config.Weight == 0 {
137+
if rj.Weight == 0 {
108138
return true
109139
}
110-
if ri.config.Weight == 0 {
140+
if ri.Weight == 0 {
111141
return false
112142
}
113-
return ri.config.Weight < rj.config.Weight
143+
return ri.Weight < rj.Weight
114144
})
115145

116146
if !defaultSeen {
117147
// If no default role is set, we set the first one.
118148
first := r.Sorted[0]
119149
first.Default = true
120-
r.roleConfigs[first.Name] = first.config
150+
r.roleConfigs[first.Name] = first.RoleConfig
121151
r.Sorted[0] = first
122152
}
123153

hugolib/roles/roles_integration_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,15 @@ versions: ["v1.2.3"]
5555
---
5656
Users with no (blank) role will see this.
5757
-- layouts/_default/single.html --
58-
{{ .Title }}|{{ .Content }}|{{ .Version }}|{{ .Role }}|
58+
{{ .Title }}|{{ .Content }}|{{ .Site.Version.Name }}|{{ .Site.Role.Name }}|
5959
`
6060

6161
b := hugolib.Test(t, files)
6262

63-
//
63+
// TODO1 export Default?
6464
// /guest/v1.2.3/en/publicpost/index.html
6565

6666
// TODO1 make it hugo.Roles, hugo.Versions, etc. (also hugo.Languages)
6767

68-
b.AssertFileContent("public/member/v2.0.0/en/memberonlypost/index.html", "foo")
68+
b.AssertFileContent("public/member/v2.0.0/en/memberonlypost/index.html", "Member Only|<p>Member content.</p>\n|v2.0.0|member|")
6969
}

hugolib/site.go

+34-20
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,13 @@ func (s Site) cloneForVersionAndRole(version, role int) *Site {
125125

126126
// TODO1 adjust all methods that uses the embedded siteRole to use the siteRole directly.
127127
type siteRole struct {
128-
rolei int
129-
role roles.Role
128+
rolei int
129+
roleInternal roles.RoleInternal
130+
role roles.Role
130131

131-
versioni int
132-
version versions.Version
132+
versioni int
133+
versionInternal versions.VersionInternal
134+
version versions.Version
133135

134136
pageMap *pageMap
135137

@@ -174,8 +176,8 @@ func (s *Site) Debug() {
174176
// NewHugoSites creates HugoSites from the given config.
175177
func NewHugoSites(cfg deps.DepsCfg) (*HugoSites, error) {
176178
conf := cfg.Configs.GetFirstLanguageConfig()
177-
roles := cfg.Configs.Base.Roles.Config.Sorted
178-
versions := cfg.Configs.Base.Versions.Config.Sorted
179+
rolesSorted := cfg.Configs.Base.Roles.Config.Sorted
180+
versionsSorted := cfg.Configs.Base.Versions.Config.Sorted
179181

180182
var logger loggers.Logger
181183
if cfg.TestLogger != nil {
@@ -265,7 +267,7 @@ func NewHugoSites(cfg deps.DepsCfg) (*HugoSites, error) {
265267
Shifter: ns,
266268
}
267269

268-
dimensionLengths := []int{len(confm.Languages), len(versions), len(roles)}
270+
dimensionLengths := []int{len(confm.Languages), len(versionsSorted), len(rolesSorted)}
269271

270272
pageTrees := &pageTrees{
271273
treePages: doctree.New(
@@ -316,10 +318,12 @@ func NewHugoSites(cfg deps.DepsCfg) (*HugoSites, error) {
316318
// TODO1 clean up s vs siteRole injected.
317319
pm := newPageMap(i, 0, 0, s, memCache, pageTrees)
318320
s.siteRole = &siteRole{
319-
pageMap: pm,
320-
role: roles[0],
321-
version: versions[0],
322-
pageFinder: newPageFinder(pm),
321+
pageMap: pm,
322+
roleInternal: rolesSorted[0],
323+
role: roles.NewRoleSite(rolesSorted[0], s),
324+
versionInternal: versionsSorted[0],
325+
version: versions.NewVersionSite(versionsSorted[0], s),
326+
pageFinder: newPageFinder(pm),
323327
}
324328

325329
s.siteRefLinker, err = newSiteRefLinker(s)
@@ -367,22 +371,24 @@ func NewHugoSites(cfg deps.DepsCfg) (*HugoSites, error) {
367371
return li.Lang < lj.Lang
368372
})
369373

370-
versionsRolesSites := make([][][]*Site, len(versions))
371-
for i := 0; i < len(versions); i++ {
372-
versionsRolesSites[i] = make([][]*Site, len(roles))
374+
versionsRolesSites := make([][][]*Site, len(versionsSorted))
375+
for i := 0; i < len(versionsSorted); i++ {
376+
versionsRolesSites[i] = make([][]*Site, len(rolesSorted))
373377
}
374378
versionsRolesSites[0][0] = sites
375-
for i := 0; i < len(versions); i++ {
376-
for j := 0; j < len(roles); j++ {
379+
for i := 0; i < len(versionsSorted); i++ {
380+
for j := 0; j < len(rolesSorted); j++ {
377381
if i == 0 && j == 0 {
378382
// Already done.
379383
continue
380384
}
381385
roleSites := make([]*Site, len(sites))
382386
for k, s := range sites {
383387
roleSites[k] = s.cloneForVersionAndRole(i, j)
384-
roleSites[k].role = roles[j]
385-
roleSites[k].version = versions[i]
388+
roleSites[k].roleInternal = rolesSorted[j]
389+
roleSites[k].role = roles.NewRoleSite(rolesSorted[j], roleSites[k])
390+
roleSites[k].versionInternal = versionsSorted[i]
391+
roleSites[k].version = versions.NewVersionSite(versionsSorted[i], roleSites[k])
386392
pm := newPageMap(k, i, j, s, memCache, pageTrees)
387393
roleSites[k].pageMap = pm
388394
roleSites[k].pageFinder = newPageFinder(pm)
@@ -917,6 +923,14 @@ func (s *Site) Language() *langs.Language {
917923
return s.language
918924
}
919925

926+
func (s *Site) Role() roles.Role {
927+
return s.role
928+
}
929+
930+
func (s *Site) Version() versions.Version {
931+
return s.version
932+
}
933+
920934
func (s *Site) Languages() langs.Languages {
921935
return s.h.Configs.Languages
922936
}
@@ -1454,7 +1468,7 @@ func (s *Site) getLanguagePermalinkLang(alwaysInSubDir bool) string {
14541468
}
14551469

14561470
func (s *Site) getPrefixRole() string {
1457-
role := s.role
1471+
role := s.roleInternal
14581472
if role.Default {
14591473
if s.conf.DefaultContentRoleInSubdir {
14601474
return role.Name
@@ -1465,7 +1479,7 @@ func (s *Site) getPrefixRole() string {
14651479
}
14661480

14671481
func (s *Site) getPrefixVersion() string {
1468-
version := s.version
1482+
version := s.versionInternal
14691483
if version.Default {
14701484
if s.conf.DefaultContentVersionInSubdir {
14711485
return version.Name

hugolib/versions/versions.go

+31-3
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,35 @@ type VersionConfig struct {
3333
Weight int
3434
}
3535

36-
type Version struct {
36+
// Site is a sub set if page.Site to avoid circular dependencies.
37+
type Site interface {
38+
Hugo() hugo.HugoInfo
39+
}
40+
type Version interface {
41+
Name() string
42+
Site() Site
43+
}
44+
45+
type VersionSite struct {
46+
v VersionInternal
47+
s Site
48+
}
49+
50+
func (v VersionSite) Name() string {
51+
return v.v.Name
52+
}
53+
54+
func (v VersionSite) Site() Site {
55+
return v.s
56+
}
57+
58+
func NewVersionSite(v VersionInternal, s Site) Version {
59+
return VersionSite{v: v, s: s}
60+
}
61+
62+
var _ Version = (*VersionSite)(nil)
63+
64+
type VersionInternal struct {
3765
// Name of the version.
3866
// This is the key from the config.
3967
Name string
@@ -47,7 +75,7 @@ type Version struct {
4775

4876
type Versions struct {
4977
versionConfigs map[string]VersionConfig
50-
Sorted []Version
78+
Sorted []VersionInternal
5179
}
5280

5381
func (r Versions) IndexDefault() int {
@@ -94,7 +122,7 @@ func (r *Versions) init(defaultContentVersion string) error {
94122
defaultSeen = true
95123
}
96124

97-
r.Sorted = append(r.Sorted, Version{Name: k, Default: isDefault, VersionConfig: v})
125+
r.Sorted = append(r.Sorted, VersionInternal{Name: k, Default: isDefault, VersionConfig: v})
98126
}
99127

100128
// Sort by weight if set, then by name.

resources/page/page.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ type PageWithoutContent interface {
347347
PageMetaProvider
348348
PageMetaInternalProvider
349349

350-
PageDimensionProvider
350+
resource.LanguageProvider
351351

352352
// For pages backed by a file.
353353
FileProvider
@@ -402,8 +402,7 @@ type PageWithoutContent interface {
402402
HeadingsFiltered(context.Context) tableofcontents.Headings
403403
}
404404

405-
type PageDimensionProvider interface {
406-
resource.LanguageProvider
405+
type SiteDimensionProvider interface {
407406
Role() roles.Role
408407
}
409408

resources/page/page_nop.go

+5
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"html/template"
2222
"time"
2323

24+
"github.com/gohugoio/hugo/hugolib/roles"
2425
"github.com/gohugoio/hugo/markup/converter"
2526
"github.com/gohugoio/hugo/markup/tableofcontents"
2627

@@ -254,6 +255,10 @@ func (p *nopPage) Language() *langs.Language {
254255
return nil
255256
}
256257

258+
func (p *nopPage) Role() roles.Role {
259+
return nil
260+
}
261+
257262
func (p *nopPage) Lastmod() (t time.Time) {
258263
return
259264
}

resources/page/site.go

+24
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import (
1919
"github.com/gohugoio/hugo/common/maps"
2020
"github.com/gohugoio/hugo/config/privacy"
2121
"github.com/gohugoio/hugo/config/services"
22+
"github.com/gohugoio/hugo/hugolib/roles"
23+
"github.com/gohugoio/hugo/hugolib/versions"
2224
"github.com/gohugoio/hugo/identity"
2325

2426
"github.com/gohugoio/hugo/config"
@@ -33,6 +35,12 @@ type Site interface {
3335
// Returns the Language configured for this Site.
3436
Language() *langs.Language
3537

38+
// Returns the role configured for this Site.
39+
Role() roles.Role
40+
41+
// Returns the version configured for this Site.
42+
Version() versions.Version
43+
3644
// Returns all the languages configured for all sites.
3745
Languages() langs.Languages
3846

@@ -194,6 +202,14 @@ func (s *siteWrapper) Languages() langs.Languages {
194202
return s.s.Languages()
195203
}
196204

205+
func (s *siteWrapper) Role() roles.Role {
206+
return s.s.Role()
207+
}
208+
209+
func (s *siteWrapper) Version() versions.Version {
210+
return s.s.Version()
211+
}
212+
197213
func (s *siteWrapper) AllPages() Pages {
198214
return s.s.AllPages()
199215
}
@@ -391,6 +407,14 @@ func (t testSite) Language() *langs.Language {
391407
return t.l
392408
}
393409

410+
func (t testSite) Role() roles.Role {
411+
return nil
412+
}
413+
414+
func (t testSite) Version() versions.Version {
415+
return nil
416+
}
417+
394418
func (t testSite) Home() Page {
395419
return nil
396420
}

0 commit comments

Comments
 (0)