tpl: Add os.fileExists template function
authordigitalcraftsman <digitalcraftsman@users.noreply.github.com>
Thu, 28 Sep 2017 17:52:34 +0000 (19:52 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 28 Sep 2017 17:52:34 +0000 (19:52 +0200)
Fixes #3839

docs/content/functions/fileExists.md [new file with mode: 0644]
tpl/os/init.go
tpl/os/os.go
tpl/os/os_test.go

diff --git a/docs/content/functions/fileExists.md b/docs/content/functions/fileExists.md
new file mode 100644 (file)
index 0000000..3d535aa
--- /dev/null
@@ -0,0 +1,29 @@
+---
+title: "fileExists"
+linktitle: "fileExists"
+date: 2017-08-31T22:38:22+02:00
+description: Checks whether a file exists under the given path.
+godocref:
+publishdate: 2017-08-31T22:38:22+02:00
+lastmod: 2017-08-31T22:38:22+02:00
+categories: [functions]
+menu:
+  docs:
+    parent: "functions"
+signature: ["fileExists PATH"]
+workson: []
+hugoversion:
+relatedfuncs: []
+deprecated: false
+aliases: []
+---
+
+`fileExists` allows you to check if a file exists under a given path, e.g. before inserting code into a template:
+
+```
+{{ if (fileExists "static/img/banner.jpg") -}}
+<img src="{{ "img/banner.jpg" | absURL }}" />
+{{- end }}
+```
+
+In the example above, a banner from the `static` folder should be shown if the given path points to an existing file.
\ No newline at end of file
index 3fc3308f2f2bfe0544eb7afbd788fc9dbd45d102..012f43b1f625f31e53fed4e82a9e288095ce5838 100644 (file)
@@ -48,6 +48,13 @@ func init() {
                        },
                )
 
+               ns.AddMethodMapping(ctx.FileExists,
+                       []string{"fileExists"},
+                       [][2]string{
+                               {`{{ fileExists "foo.txt" }}`, `false`},
+                       },
+               )
+
                return ns
 
        }
index c9ffb81cf60a883f6b47c2cbb07a7a12bc76b8c8..02faa2809447918c30b14c61b05868fef010369b 100644 (file)
@@ -96,3 +96,22 @@ func (ns *Namespace) ReadDir(i interface{}) ([]_os.FileInfo, error) {
 
        return list, nil
 }
+
+// FileExists checks whether a file exists under the given path.
+func (ns *Namespace) FileExists(i interface{}) (bool, error) {
+       path, err := cast.ToStringE(i)
+       if err != nil {
+               return false, err
+       }
+
+       if path == "" {
+               return false, errors.New("fileExists needs a path to a file")
+       }
+
+       status, err := afero.Exists(ns.deps.Fs.WorkingDir, path)
+       if err != nil {
+               return false, err
+       }
+
+       return status, nil
+}
index 383eb88c40a46f583d19a35b68316e3a179edacb..0919f885ab1604f517df73354eef2e0a527e7ca6 100644 (file)
@@ -63,3 +63,39 @@ func TestReadFile(t *testing.T) {
                assert.Equal(t, test.expect, result, errMsg)
        }
 }
+
+func TestFileExists(t *testing.T) {
+       t.Parallel()
+
+       workingDir := "/home/hugo"
+
+       v := viper.New()
+       v.Set("workingDir", workingDir)
+
+       ns := New(&deps.Deps{Fs: hugofs.NewMem(v)})
+
+       afero.WriteFile(ns.deps.Fs.Source, filepath.Join(workingDir, "/f/f1.txt"), []byte("f1-content"), 0755)
+       afero.WriteFile(ns.deps.Fs.Source, filepath.Join("/home", "f2.txt"), []byte("f2-content"), 0755)
+
+       for i, test := range []struct {
+               filename string
+               expect   interface{}
+       }{
+               {filepath.FromSlash("/f/f1.txt"), true},
+               {filepath.FromSlash("f/f1.txt"), true},
+               {filepath.FromSlash("../f2.txt"), false},
+               {"b", false},
+               {"", nil},
+       } {
+               errMsg := fmt.Sprintf("[%d] %v", i, test)
+               result, err := ns.FileExists(test.filename)
+
+               if test.expect == nil {
+                       require.Error(t, err, errMsg)
+                       continue
+               }
+
+               require.NoError(t, err, errMsg)
+               assert.Equal(t, test.expect, result, errMsg)
+       }
+}