summaryrefslogtreecommitdiffstats
path: root/hugofs/fs.go
diff options
context:
space:
mode:
Diffstat (limited to 'hugofs/fs.go')
-rw-r--r--hugofs/fs.go83
1 files changed, 78 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()
+}