summaryrefslogtreecommitdiffhomepage
path: root/hugofs
diff options
context:
space:
mode:
Diffstat (limited to 'hugofs')
-rw-r--r--hugofs/fs.go83
-rw-r--r--hugofs/fs_test.go72
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())
+}