v0.126.1 Latest Latest

This package is not in the latest version of its module.

Go to latest
Published: May 15, 2024 License: Apache-2.0 Imports: 34 Imported by: 235



Package hugofs provides the file systems used by Hugo.

Package hugofs provides the file systems used by Hugo.



This section is empty.


View Source
var AppendDirsMerger overlayfs.DirsMerger = func(lofi, bofi []fs.DirEntry) []fs.DirEntry {
	for _, fi1 := range bofi {
		var found bool

		if fi1.IsDir() {
			for _, fi2 := range lofi {
				if fi2.IsDir() && fi2.Name() == fi1.Name() {
					found = true
		if !found {
			lofi = append(lofi, fi1)

	return lofi

AppendDirsMerger merges two directories keeping all regular files with the first slice as the base. Duplicate directories in the second slice will be ignored. This strategy is used for the i18n and data fs where we need all entries.

View Source
var LanguageDirsMerger overlayfs.DirsMerger = func(lofi, bofi []fs.DirEntry) []fs.DirEntry {
	for _, fi1 := range bofi {
		fim1 := fi1.(FileMetaInfo)
		var found bool
		for _, fi2 := range lofi {
			fim2 := fi2.(FileMetaInfo)
			if fi1.Name() == fi2.Name() && fim1.Meta().Lang == fim2.Meta().Lang {
				found = true
		if !found {
			lofi = append(lofi, fi1)

	return lofi

LanguageDirsMerger implements the overlayfs.DirsMerger func, which is used to merge two directories.

View Source
var (

	// NoOpFs provides a no-op filesystem that implements the afero.Fs
	// interface.
	NoOpFs = &noOpFs{}
View Source
var Os = &afero.OsFs{}

Os points to the (real) Os filesystem.


func AddFileInfoToError added in v0.123.0

func AddFileInfoToError(err error, fi FileMetaInfo, fs afero.Fs) error

AddFileInfoToError adds file info to the given error.

func Glob added in v0.57.0

func Glob(fs afero.Fs, pattern string, handle func(fi FileMetaInfo) (bool, error)) error

Glob walks the fs and passes all matches to the handle func. The handle func can return true to signal a stop.

func IsOsFs added in v0.97.0

func IsOsFs(fs afero.Fs) bool

IsOsFs returns whether fs is an OsFs or if it fs wraps an OsFs. TODO(bep) make this more robust.

func MakeReadableAndRemoveAllModulePkgDir added in v0.65.0

func MakeReadableAndRemoveAllModulePkgDir(fs afero.Fs, dir string) (int, error)

MakeReadableAndRemoveAllModulePkgDir makes any subdir in dir readable and then removes the root. TODO(bep) move this to a more suitable place.

func NewBaseFileDecorator added in v0.56.0

func NewBaseFileDecorator(fs afero.Fs, callbacks ...func(fi FileMetaInfo)) afero.Fs

NewBaseFileDecorator decorates the given Fs to provide the real filename and an Opener func.

func NewBasePathFs added in v0.123.0

func NewBasePathFs(source afero.Fs, path string) afero.Fs

NewBasePathFs creates a new BasePathFs.

func NewComponentFs added in v0.123.0

func NewComponentFs(opts ComponentFsOptions) *componentFs

NewComponentFs creates a new component filesystem.

func NewCreateCountingFs added in v0.55.0

func NewCreateCountingFs(fs afero.Fs) afero.Fs

func NewHasBytesReceiver added in v0.103.0

func NewHasBytesReceiver(delegate afero.Fs, shouldCheck func(name string) bool, hasBytesCallback func(name string, match bool), pattern []byte) afero.Fs

func NewHashingFs added in v0.45.1

func NewHashingFs(delegate afero.Fs, hashReceiver FileHashReceiver) afero.Fs

NewHashingFs creates a new filesystem that will receive MD5 checksums of any written file content on Close. Note that this is probably not a good idea for "full build" situations, but when doing fast render mode, the amount of files published is low, and it would be really nice to know exactly which of these files where actually changed. Note that this will only work for file operations that use the io.Writer to write content to file, but that is fine for the "publish content" use case.

func NewReadOnlyFs added in v0.123.0

func NewReadOnlyFs(source afero.Fs) afero.Fs

NewReadOnlyFs creates a new ReadOnlyFs.

func NewStacktracerFs added in v0.55.0

func NewStacktracerFs(fs afero.Fs, pattern string) afero.Fs

NewStacktracerFs wraps the given fs printing stack traces for file creates matching the given regexp pattern.

func WalkFilesystems added in v0.97.0

func WalkFilesystems(fs afero.Fs, fn WalkFn) bool

WalkFilesystems walks fs recursively and calls fn. If fn returns true, walking is stopped.

func WrapFilesystem added in v0.123.0

func WrapFilesystem(container, content afero.Fs) afero.Fs

WrapFilesystem is typically used to wrap a afero.BasePathFs to allow access to the underlying filesystem if needed.


type ComponentFsOptions added in v0.123.0

type ComponentFsOptions struct {
	// The filesystem where one or more components are mounted.
	Fs afero.Fs

	// The component name, e.g. "content", "layouts" etc.
	Component string

	DefaultContentLanguage string

	// The parser used to parse paths provided by this filesystem.
	PathParser *paths.PathParser

type ComponentPath added in v0.123.0

type ComponentPath struct {
	Component string
	Path      string
	Lang      string

func (ComponentPath) ComponentPathJoined added in v0.123.0

func (c ComponentPath) ComponentPathJoined() string

type DirOnlyOps added in v0.123.0

type DirOnlyOps interface {
	Name() string
	Readdir(count int) ([]os.FileInfo, error)
	Readdirnames(n int) ([]string, error)
	Stat() (os.FileInfo, error)

DirOnlyOps is a subset of the afero.File interface covering the methods needed for directory operations.

type DuplicatesReporter added in v0.55.0

type DuplicatesReporter interface {
	ReportDuplicates() string

DuplicatesReporter reports about duplicate filenames.

type FileHashReceiver added in v0.45.1

type FileHashReceiver interface {
	OnFileClose(name, md5sum string)

FileHashReceiver will receive the filename an the content's MD5 sum on file close.

type FileInfoOptionals added in v0.123.0

type FileInfoOptionals interface {
	Size() int64
	Mode() fs.FileMode
	ModTime() time.Time
	Sys() any

type FileInfoProvider added in v0.123.0

type FileInfoProvider interface {
	FileInfo() FileMetaInfo

type FileMeta added in v0.56.0

type FileMeta struct {
	PathInfo *paths.Path
	Name     string
	Filename string

	BaseDir       string
	SourceRoot    string
	Module        string
	ModuleOrdinal int
	Component     string

	Weight    int
	IsProject bool
	Watch     bool

	// The lang associated with this file. This may be
	// either the language set in the filename or
	// the language defined in the source mount configuration.
	Lang string
	// The language index for the above lang. This is the index
	// in the sorted list of languages/sites.
	LangIndex int

	OpenFunc     func() (afero.File, error)
	JoinStatFunc func(name string) (FileMetaInfo, error)

	// Include only files or directories that match.
	InclusionFilter *glob.FilenameFilter

	// Rename the name part of the file (not the directory).
	// Returns the new name and a boolean indicating if the file
	// should be included.
	Rename func(name string, toFrom bool) (string, bool)

func NewFileMeta added in v0.86.0

func NewFileMeta() *FileMeta

func (*FileMeta) Copy added in v0.86.0

func (m *FileMeta) Copy() *FileMeta

func (*FileMeta) JoinStat added in v0.64.1

func (f *FileMeta) JoinStat(name string) (FileMetaInfo, error)

func (*FileMeta) Merge added in v0.86.0

func (m *FileMeta) Merge(from *FileMeta)

func (*FileMeta) Open added in v0.56.0

func (f *FileMeta) Open() (afero.File, error)

func (*FileMeta) ReadAll added in v0.123.0

func (f *FileMeta) ReadAll() ([]byte, error)

type FileMetaInfo added in v0.56.0

type FileMetaInfo interface {

	// This is a real hybrid as it also implements the fs.FileInfo interface.

func DirEntriesToFileMetaInfos added in v0.123.0

func DirEntriesToFileMetaInfos(fis []fs.DirEntry) []FileMetaInfo

func NewFileMetaInfo added in v0.56.0

func NewFileMetaInfo(fi FileNameIsDir, m *FileMeta) FileMetaInfo

type FileNameIsDir added in v0.123.0

type FileNameIsDir interface {
	Name() string
	IsDir() bool

type FilesystemUnwrapper added in v0.97.0

type FilesystemUnwrapper interface {
	UnwrapFilesystem() afero.Fs

FilesystemUnwrapper returns the underlying filesystem.

type FilesystemsUnwrapper added in v0.97.0

type FilesystemsUnwrapper interface {
	UnwrapFilesystems() []afero.Fs

FilesystemsUnwrapper returns the underlying filesystems.

type Fs added in v0.20.1

type Fs struct {
	// Source is Hugo's source file system.
	// Note that this will always be a "plain" Afero filesystem:
	// * afero.OsFs when running in production
	// * afero.MemMapFs for many of the tests.
	Source afero.Fs

	// PublishDir is where Hugo publishes its rendered content.
	// It's mounted inside publishDir (default /public).
	PublishDir afero.Fs

	// PublishDirStatic is the file system used for static files.
	PublishDirStatic afero.Fs

	// PublishDirServer is the file system used for serving the public directory with Hugo's development server.
	// This will typically be the same as PublishDir, but not if --renderStaticToDisk is set.
	PublishDirServer afero.Fs

	// Os is an OS file system.
	// NOTE: Field is currently unused.
	Os afero.Fs

	// WorkingDirReadOnly is a read-only file system
	// restricted to the project working dir.
	WorkingDirReadOnly afero.Fs

	// WorkingDirWritable is a writable file system
	// restricted to the project working dir.
	WorkingDirWritable afero.Fs

Fs holds the core filesystems used by Hugo.

func NewDefault added in v0.20.1

func NewDefault(cfg config.Provider) *Fs

func NewFrom added in v0.20.1

func NewFrom(fs afero.Fs, conf config.BaseConfig) *Fs

NewFrom creates a new Fs based on the provided Afero Fs as source and destination file systems. Useful for testing.

func NewFromOld added in v0.112.0

func NewFromOld(fs afero.Fs, cfg config.Provider) *Fs

func NewFromSourceAndDestination added in v0.97.1

func NewFromSourceAndDestination(source, destination afero.Fs, cfg config.Provider) *Fs

NewFromSourceAndDestination creates a new Fs based on the provided Afero Fss as the source and destination file systems.

type MetaProvider added in v0.123.0

type MetaProvider interface {
	Meta() *FileMeta

type OpenFilesFs added in v0.123.0

type OpenFilesFs struct {
	// contains filtered or unexported fields

OpenFilesFs is a wrapper around afero.Fs that keeps track of open files.

func (*OpenFilesFs) Create added in v0.123.0

func (fs *OpenFilesFs) Create(name string) (afero.File, error)

func (*OpenFilesFs) Open added in v0.123.0

func (fs *OpenFilesFs) Open(name string) (afero.File, error)

func (*OpenFilesFs) OpenFile added in v0.123.0

func (fs *OpenFilesFs) OpenFile(name string, flag int, perm os.FileMode) (afero.File, error)

func (*OpenFilesFs) OpenFiles added in v0.123.0

func (fs *OpenFilesFs) OpenFiles() map[string]int

func (*OpenFilesFs) UnwrapFilesystem added in v0.123.0

func (fs *OpenFilesFs) UnwrapFilesystem() afero.Fs

type Reseter added in v0.55.0

type Reseter interface {

Reseter is implemented by some of the stateful filesystems.

type ReverseLookupProvder added in v0.123.0

type ReverseLookupProvder interface {
	ReverseLookup(filename string) ([]ComponentPath, error)
	ReverseLookupComponent(component, filename string) ([]ComponentPath, error)

type RootMapping added in v0.56.0

type RootMapping struct {
	From          string    // The virtual mount.
	FromBase      string    // The base directory of the virtual mount.
	To            string    // The source directory or file.
	ToBase        string    // The base of To. May be empty if an absolute path was provided.
	Module        string    // The module path/ID.
	ModuleOrdinal int       // The module ordinal starting with 0 which is the project.
	IsProject     bool      // Whether this is a mount in the main project.
	Meta          *FileMeta // File metadata (lang etc.)
	// contains filtered or unexported fields

RootMapping describes a virtual file or directory mount.

type RootMappingFs added in v0.42.1

type RootMappingFs struct {
	// contains filtered or unexported fields

A RootMappingFs maps several roots into one. Note that the root of this filesystem is directories only, and they will be returned in Readdir and Readdirnames in the order given.

func NewRootMappingFs added in v0.42.1

func NewRootMappingFs(fs afero.Fs, rms ...RootMapping) (*RootMappingFs, error)

NewRootMappingFs creates a new RootMappingFs on top of the provided with root mappings with some optional metadata about the root. Note that From represents a virtual root that maps to the actual filename in To.

func (RootMappingFs) Filter added in v0.56.0

func (fs RootMappingFs) Filter(f func(m RootMapping) bool) *RootMappingFs

Filter creates a copy of this filesystem with only mappings matching a filter.

func (*RootMappingFs) Key added in v0.123.7

func (fs *RootMappingFs) Key() string

func (*RootMappingFs) Mounts added in v0.123.0

func (fs *RootMappingFs) Mounts(base string) ([]FileMetaInfo, error)

func (*RootMappingFs) Open added in v0.42.1

func (fs *RootMappingFs) Open(name string) (afero.File, error)

Open opens the named file for reading.

func (*RootMappingFs) ReverseLookup added in v0.123.0

func (fs *RootMappingFs) ReverseLookup(filename string) ([]ComponentPath, error)

func (fs *RootMappingFs) ReverseStat(filename string) ([]FileMetaInfo, error)

func (*RootMappingFs) ReverseLookupComponent added in v0.123.4

func (fs *RootMappingFs) ReverseLookupComponent(component, filename string) ([]ComponentPath, error)

func (*RootMappingFs) Stat added in v0.42.1

func (fs *RootMappingFs) Stat(name string) (os.FileInfo, error)

Stat returns the os.FileInfo structure describing a given file. If there is an error, it will be of type *os.PathError.

func (*RootMappingFs) UnwrapFilesystem added in v0.97.0

func (fs *RootMappingFs) UnwrapFilesystem() afero.Fs

type WalkFn added in v0.97.0

type WalkFn func(fs afero.Fs) bool

WalkFn is the walk func for WalkFilesystems.

type WalkFunc added in v0.56.0

type WalkFunc func(path string, info FileMetaInfo) error

type WalkHook added in v0.56.0

type WalkHook func(dir FileMetaInfo, path string, readdir []FileMetaInfo) ([]FileMetaInfo, error)

type Walkway added in v0.56.0

type Walkway struct {
	// contains filtered or unexported fields

func NewWalkway added in v0.56.0

func NewWalkway(cfg WalkwayConfig) *Walkway

func (*Walkway) Walk added in v0.56.0

func (w *Walkway) Walk() error

type WalkwayConfig added in v0.56.0

type WalkwayConfig struct {
	// The filesystem to walk.
	Fs afero.Fs

	// The root to start from in Fs.
	Root string

	// The logger to use.
	Logger     loggers.Logger
	PathParser *paths.PathParser

	// One or both of these may be pre-set.
	Info       FileMetaInfo               // The start info.
	DirEntries []FileMetaInfo             // The start info's dir entries.
	IgnoreFile func(filename string) bool // Optional

	// Will be called in order.
	HookPre  WalkHook // Optional.
	WalkFn   WalkFunc
	HookPost WalkHook // Optional.

	// Some optional flags.
	FailOnNotExist bool // If set, return an error if a directory is not found.
	SortDirEntries bool // If set, sort the dir entries by Name before calling the WalkFn, default is ReaDir order.


Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL