ref: d71120852a8e14d0ea4d24de269fce041ef7b666
parent: a6b1eb1e9150aa5c1c86fe7424cc4167d6f59a5a
author: satotake <[email protected]>
date: Sun Aug 5 08:37:20 EDT 2018
Add fileStat to tpl/os/os
--- a/tpl/os/init.go
+++ b/tpl/os/init.go
@@ -55,6 +55,13 @@
},
)
+ ns.AddMethodMapping(ctx.FileStat,
+ []string{"fileStat"},
+ [][2]string{
+ {`{{ (fileExists "files/README.txt").Size }}`, `11`},
+ },
+ )
+
return ns
}
--- a/tpl/os/os.go
+++ b/tpl/os/os.go
@@ -130,3 +130,22 @@
return status, nil
}
+
+// FileStat Stat returns the os.FileInfo structure describing file.
+func (ns *Namespace) FileStat(i interface{}) (_os.FileInfo, error) {
+ path, err := cast.ToStringE(i)
+ if err != nil {
+ return nil, err
+ }
+
+ if path == "" {
+ return nil, errors.New("fileStat needs a path to a file")
+ }
+
+ r, err := ns.readFileFs.Stat(path)
+ if err != nil {
+ return nil, err
+ }
+
+ return r, nil
+}
--- a/tpl/os/os_test.go
+++ b/tpl/os/os_test.go
@@ -99,3 +99,37 @@
assert.Equal(t, test.expect, result, errMsg)
}
}
+
+func TestFileStat(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)
+
+ for i, test := range []struct {
+ filename string
+ expect interface{}
+ }{
+ {filepath.FromSlash("/f/f1.txt"), int64(10)},
+ {filepath.FromSlash("f/f1.txt"), int64(10)},
+ {"b", nil},
+ {"", nil},
+ } {
+ errMsg := fmt.Sprintf("[%d] %v", i, test)
+ result, err := ns.FileStat(test.filename)
+
+ if test.expect == nil {
+ require.Error(t, err, errMsg)
+ continue
+ }
+
+ require.NoError(t, err, errMsg)
+ assert.Equal(t, test.expect, result.Size(), errMsg)
+ }
+}