package hugofs

import "github.com/gohugoio/hugo/hugofs"

Package hugofs provides the file systems used by Hugo.

Index

Variables

var LanguageDirsMerger = func(lofi, bofi []os.FileInfo) ([]os.FileInfo, error) {
	m := make(map[string]*LanguageFileInfo)

	for _, fi := range lofi {
		fil, ok := fi.(*LanguageFileInfo)
		if !ok {
			return nil, fmt.Errorf("received %T, expected *LanguageFileInfo", fi)
		}
		m[fil.virtualName] = fil
	}

	for _, fi := range bofi {
		fil, ok := fi.(*LanguageFileInfo)
		if !ok {
			return nil, fmt.Errorf("received %T, expected *LanguageFileInfo", fi)
		}
		existing, found := m[fil.virtualName]

		if !found || existing.weight < fil.weight {
			m[fil.virtualName] = fil
		}
	}

	merged := make([]os.FileInfo, len(m))
	i := 0
	for _, v := range m {
		merged[i] = v
		i++
	}

	return merged, nil
}
var (
	NoOpFs = &noOpFs{}
)
var Os = &afero.OsFs{}

Os points to an Os Afero file system.

Functions

func NewHashingFs

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 NewLanguageCompositeFs

func NewLanguageCompositeFs(base afero.Fs, overlay *LanguageFs) afero.Fs

NewLanguageCompositeFs creates a composite and language aware filesystem. This is a hybrid filesystem. To get a specific file in Open, Stat etc., use the full filename to the target filesystem. This information is available in Readdir, Stat etc. via the special LanguageFileInfo FileInfo implementation.

Types

type BasePathRealFilenameFs

type BasePathRealFilenameFs struct {
	*afero.BasePathFs
}

This is a thin wrapper around afero.BasePathFs that provides the real filename in Stat and LstatIfPossible.

func NewBasePathRealFilenameFs

func NewBasePathRealFilenameFs(base *afero.BasePathFs) *BasePathRealFilenameFs

func (*BasePathRealFilenameFs) LstatIfPossible

func (b *BasePathRealFilenameFs) LstatIfPossible(name string) (os.FileInfo, bool, error)

func (*BasePathRealFilenameFs) Stat

func (b *BasePathRealFilenameFs) Stat(name string) (os.FileInfo, error)

type FileHashReceiver

type FileHashReceiver interface {
	OnFileClose(name, md5sum string)
}

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

type FilePather

type FilePather interface {
	// Filename gets the full path and filename to the file.
	Filename() string

	// Path gets the content relative path including file name and extension.
	// The directory is relative to the content root where "content" is a broad term.
	Path() string

	// RealName is FileInfo.Name in its original form.
	RealName() string

	BaseDir() string
}

FilePather is aware of its file's location.

type Fs

type Fs struct {
	// Source is Hugo's source file system.
	Source afero.Fs

	// Destination is Hugo's destination file system.
	Destination afero.Fs

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

	// WorkingDir is a read-only file system
	// restricted to the project working dir.
	WorkingDir *afero.BasePathFs
}

Fs abstracts the file system to separate source and destination file systems and allows both to be mocked for testing.

func NewDefault

func NewDefault(cfg config.Provider) *Fs

NewDefault creates a new Fs with the OS file system as source and destination file systems.

func NewFrom

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

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

func NewMem

func NewMem(cfg config.Provider) *Fs

NewMem creates a new Fs with the MemMapFs as source and destination file systems. Useful for testing.

type LanguageAnnouncer

type LanguageAnnouncer interface {
	Lang() string
	TranslationBaseName() string
}

LanguageAnnouncer is aware of its language.

type LanguageFileInfo

type LanguageFileInfo struct {
	os.FileInfo
	// contains filtered or unexported fields
}

func (*LanguageFileInfo) BaseDir

func (fi *LanguageFileInfo) BaseDir() string

func (*LanguageFileInfo) Filename

func (fi *LanguageFileInfo) Filename() string

func (*LanguageFileInfo) Lang

func (fi *LanguageFileInfo) Lang() string

func (*LanguageFileInfo) Name

func (fi *LanguageFileInfo) Name() string

Name is the name of the file within this filesystem without any path info. It will be marked with language information so we can identify it as ours.

func (*LanguageFileInfo) Path

func (fi *LanguageFileInfo) Path() string

func (*LanguageFileInfo) RealName

func (fi *LanguageFileInfo) RealName() string

func (*LanguageFileInfo) TranslationBaseName

func (fi *LanguageFileInfo) TranslationBaseName() string

TranslationBaseName returns the base filename without any extension or language identificator.

type LanguageFs

type LanguageFs struct {
	afero.Fs
	// contains filtered or unexported fields
}

func NewLanguageFs

func NewLanguageFs(lang string, languages map[string]bool, fs afero.Fs) *LanguageFs

func (*LanguageFs) Lang

func (fs *LanguageFs) Lang() string

func (*LanguageFs) LstatIfPossible

func (fs *LanguageFs) LstatIfPossible(name string) (os.FileInfo, bool, error)

func (*LanguageFs) Open

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

func (*LanguageFs) Stat

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

type RealFilenameInfo

type RealFilenameInfo interface {
	os.FileInfo

	// This is the real filename to the file in the underlying filesystem.
	RealFilename() string
}

RealFilenameInfo is a thin wrapper around os.FileInfo adding the real filename.

type RootMappingFs

type RootMappingFs struct {
	afero.Fs
	// 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

func NewRootMappingFs(fs afero.Fs, fromTo ...string) (*RootMappingFs, error)

NewRootMappingFs creates a new RootMappingFs on top of the provided with a list of from, to string pairs of root mappings. Note that 'from' represents a virtual root that maps to the actual filename in 'to'.

func (*RootMappingFs) LstatIfPossible

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

func (*RootMappingFs) Open

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

func (*RootMappingFs) Stat

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

Source Files

basepath_real_filename_fs.go fs.go hashing_fs.go language_composite_fs.go language_fs.go noop_fs.go rootmapping_fs.go

Version
v0.47.1
Published
Aug 20, 2018
Platform
darwin/amd64
Imports
12 packages
Last checked
3 minutes ago

Tools for package owners.