diff options
Diffstat (limited to 'hugofs')
-rw-r--r-- | hugofs/fs.go | 83 | ||||
-rw-r--r-- | hugofs/fs_test.go | 72 |
2 files changed, 150 insertions, 5 deletions
diff --git a/hugofs/fs.go b/hugofs/fs.go index 7807bf935..a3cb55ea1 100644 --- a/hugofs/fs.go +++ b/hugofs/fs.go @@ -1,4 +1,4 @@ -// Copyright 2015 The Hugo Authors. All rights reserved. +// Copyright 2016 The Hugo Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -13,8 +13,81 @@ package hugofs -import "github.com/spf13/afero" +import ( + "github.com/spf13/afero" + "github.com/spf13/viper" +) -var SourceFs afero.Fs = new(afero.OsFs) -var DestinationFS afero.Fs = new(afero.OsFs) -var OsFs afero.Fs = new(afero.OsFs) +var ( + sourceFs afero.Fs + destinationFs afero.Fs + osFs afero.Fs = &afero.OsFs{} + workingDirFs *afero.BasePathFs +) + +// Source returns Hugo's source file system. +func Source() afero.Fs { + return sourceFs +} + +// SetSource sets Hugo's source file system +// and re-initializes dependent file systems. +func SetSource(fs afero.Fs) { + sourceFs = fs + initSourceDependencies() +} + +// Destination returns Hugo's destionation file system. +func Destination() afero.Fs { + return destinationFs +} + +// SetDestination sets Hugo's destionation file system +func SetDestination(fs afero.Fs) { + destinationFs = fs +} + +// Os returns an OS file system. +func Os() afero.Fs { + return osFs +} + +// WorkingDir returns a read-only file system +// restricted to the project working dir. +func WorkingDir() *afero.BasePathFs { + return workingDirFs +} + +// InitFs initializes with the OS file system +// as source and destination file systems. +func InitDefaultFs() { + InitFs(&afero.OsFs{}) +} + +// InitMemFs initializes with a MemMapFs as source and destination file systems. +// Useful for testing. +func InitMemFs() { + InitFs(&afero.MemMapFs{}) +} + +// InitFs initializes with the given file system +// as source and destination file systems. +func InitFs(fs afero.Fs) { + sourceFs = fs + destinationFs = fs + + initSourceDependencies() +} + +func initSourceDependencies() { + workingDir := viper.GetString("WorkingDir") + + if workingDir != "" { + workingDirFs = afero.NewBasePathFs(afero.NewReadOnlyFs(sourceFs), workingDir).(*afero.BasePathFs) + } + +} + +func init() { + InitDefaultFs() +} diff --git a/hugofs/fs_test.go b/hugofs/fs_test.go new file mode 100644 index 000000000..06d63a78f --- /dev/null +++ b/hugofs/fs_test.go @@ -0,0 +1,72 @@ +// Copyright 2016 The Hugo Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package hugofs + +import ( + "github.com/spf13/afero" + "github.com/spf13/viper" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestInitDefault(t *testing.T) { + viper.Reset() + defer viper.Reset() + + InitDefaultFs() + + assert.IsType(t, new(afero.OsFs), Source()) + assert.IsType(t, new(afero.OsFs), Destination()) + assert.IsType(t, new(afero.OsFs), Os()) + assert.Nil(t, WorkingDir()) +} + +func TestInitMemFs(t *testing.T) { + viper.Reset() + defer viper.Reset() + + InitMemFs() + + assert.IsType(t, new(afero.MemMapFs), Source()) + assert.IsType(t, new(afero.MemMapFs), Destination()) + assert.IsType(t, new(afero.OsFs), Os()) + assert.Nil(t, WorkingDir()) +} + +func TestSetSource(t *testing.T) { + + InitMemFs() + + SetSource(new(afero.OsFs)) + assert.IsType(t, new(afero.OsFs), Source()) +} + +func TestSetDestination(t *testing.T) { + + InitMemFs() + + SetDestination(new(afero.OsFs)) + assert.IsType(t, new(afero.OsFs), Destination()) +} + +func TestWorkingDir(t *testing.T) { + viper.Reset() + defer viper.Reset() + + viper.Set("WorkingDir", "/a/b/") + + InitMemFs() + + assert.IsType(t, new(afero.BasePathFs), WorkingDir()) +} |