shithub: hugo

Download patch

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)
+	}
+}