summaryrefslogtreecommitdiffstats
path: root/source/filesystem.go
diff options
context:
space:
mode:
authorNoah Campbell <noahcampbell@gmail.com>2013-09-04 22:28:59 -0700
committerNoah Campbell <noahcampbell@gmail.com>2013-09-04 22:42:52 -0700
commit610c06e6589770d950d8fd4e01efd90b132fcff5 (patch)
tree859f0cb1ce70875175d3910e4ccd05fdd8173393 /source/filesystem.go
parentd4d9da9f3a6358e8325d0c3f973a5842ef3be039 (diff)
downloadhugo-610c06e6589770d950d8fd4e01efd90b132fcff5.tar.gz
hugo-610c06e6589770d950d8fd4e01efd90b132fcff5.zip
Introduce source.Filesystem
This provides an abstraction over how files are processed by Hugo. This allows for alternatives like CMS systems or Dropbox, etc.
Diffstat (limited to 'source/filesystem.go')
-rw-r--r--source/filesystem.go72
1 files changed, 72 insertions, 0 deletions
diff --git a/source/filesystem.go b/source/filesystem.go
new file mode 100644
index 000000000..5434431aa
--- /dev/null
+++ b/source/filesystem.go
@@ -0,0 +1,72 @@
+package source
+
+import (
+ "io"
+ "os"
+ "path/filepath"
+)
+
+type Input interface {
+ Files() []*File
+}
+
+type File struct {
+ Name string
+ Contents io.Reader
+}
+
+type Filesystem struct {
+ files []*File
+ Base string
+ AvoidPaths []string
+}
+
+func (f *Filesystem) Files() []*File {
+ f.captureFiles()
+ return f.files
+}
+
+func (f *Filesystem) add(name string, reader io.Reader) {
+ f.files = append(f.files, &File{Name: name, Contents: reader})
+}
+
+func (f *Filesystem) captureFiles() {
+
+ walker := func(path string, fi os.FileInfo, err error) error {
+ if err != nil {
+ return nil
+ }
+
+ if fi.IsDir() {
+ if f.avoid(path) {
+ return filepath.SkipDir
+ }
+ return nil
+ } else {
+ if ignoreDotFile(path) {
+ return nil
+ }
+ file, err := os.Open(path)
+ if err != nil {
+ return err
+ }
+ f.add(path, file)
+ return nil
+ }
+ }
+
+ filepath.Walk(f.Base, walker)
+}
+
+func (f *Filesystem) avoid(path string) bool {
+ for _, avoid := range f.AvoidPaths {
+ if avoid == path {
+ return true
+ }
+ }
+ return false
+}
+
+func ignoreDotFile(path string) bool {
+ return filepath.Base(path)[0] == '.'
+}