]> source.dussan.org Git - gitea.git/commitdiff
Add StatDir and replace com.StatDir (#14099)
authorLunny Xiao <xiaolunwen@gmail.com>
Mon, 21 Dec 2020 23:40:57 +0000 (07:40 +0800)
committerGitHub <noreply@github.com>
Mon, 21 Dec 2020 23:40:57 +0000 (07:40 +0800)
* Add StatDir and replace com.StatDir

* a nit

* Remove wrong file

Co-authored-by: 6543 <6543@obermui.de>
models/repo.go
modules/options/dynamic.go
modules/options/static.go
modules/templates/dynamic.go
modules/templates/static.go
modules/util/path.go

index 3df850a3ba38e5b17e7b5eab7db5cff198df9073..d791b6cbd22584c45d51ff9696db1f1d4b8f7824 100644 (file)
@@ -79,7 +79,7 @@ func loadRepoConfig() {
                        log.Fatal("Failed to get custom %s files: %v", t, err)
                }
                if isDir {
-                       customFiles, err := com.StatDir(customPath)
+                       customFiles, err := util.StatDir(customPath)
                        if err != nil {
                                log.Fatal("Failed to get custom %s files: %v", t, err)
                        }
index 060ca12bb00da74712e38bc64f12d27f4cb96b4e..ffb89df88274bf9cb32a8069d8d7ddfe8df684fe 100644 (file)
@@ -14,8 +14,6 @@ import (
        "code.gitea.io/gitea/modules/log"
        "code.gitea.io/gitea/modules/setting"
        "code.gitea.io/gitea/modules/util"
-
-       "github.com/unknwon/com"
 )
 
 var (
@@ -39,7 +37,7 @@ func Dir(name string) ([]string, error) {
                return []string{}, fmt.Errorf("Unabe to check if custom directory %s is a directory. %v", customDir, err)
        }
        if isDir {
-               files, err := com.StatDir(customDir, true)
+               files, err := util.StatDir(customDir, true)
 
                if err != nil {
                        return []string{}, fmt.Errorf("Failed to read custom directory. %v", err)
@@ -55,7 +53,7 @@ func Dir(name string) ([]string, error) {
                return []string{}, fmt.Errorf("Unabe to check if static directory %s is a directory. %v", staticDir, err)
        }
        if isDir {
-               files, err := com.StatDir(staticDir, true)
+               files, err := util.StatDir(staticDir, true)
 
                if err != nil {
                        return []string{}, fmt.Errorf("Failed to read static directory. %v", err)
index ff1e6b2332343fe9f80da090722672d037d62b2e..5f4ffdda78e49e967ea62068f3b08399ee2bbcac 100644 (file)
@@ -14,8 +14,6 @@ import (
        "code.gitea.io/gitea/modules/log"
        "code.gitea.io/gitea/modules/setting"
        "code.gitea.io/gitea/modules/util"
-
-       "github.com/unknwon/com"
 )
 
 var (
@@ -38,7 +36,7 @@ func Dir(name string) ([]string, error) {
                return []string{}, fmt.Errorf("Failed to check if custom directory %s is a directory. %v", err)
        }
        if isDir {
-               files, err := com.StatDir(customDir, true)
+               files, err := util.StatDir(customDir, true)
 
                if err != nil {
                        return []string{}, fmt.Errorf("Failed to read custom directory. %v", err)
index 5eda9480348e7469f936cf0704b5008ed57f502b..7f1a36e0b7e50c31d016ec666d449114956ebedd 100644 (file)
@@ -18,7 +18,6 @@ import (
        "code.gitea.io/gitea/modules/util"
 
        "gitea.com/macaron/macaron"
-       "github.com/unknwon/com"
 )
 
 var (
@@ -65,7 +64,7 @@ func Mailer() (*texttmpl.Template, *template.Template) {
                log.Warn("Unable to check if templates dir %s is a directory. Error: %v", staticDir, err)
        }
        if isDir {
-               files, err := com.StatDir(staticDir)
+               files, err := util.StatDir(staticDir)
 
                if err != nil {
                        log.Warn("Failed to read %s templates dir. %v", staticDir, err)
@@ -94,7 +93,7 @@ func Mailer() (*texttmpl.Template, *template.Template) {
                log.Warn("Unable to check if templates dir %s is a directory. Error: %v", customDir, err)
        }
        if isDir {
-               files, err := com.StatDir(customDir)
+               files, err := util.StatDir(customDir)
 
                if err != nil {
                        log.Warn("Failed to read %s templates dir. %v", customDir, err)
index fd8e79a783befa41c0be35f9519b5a880ee6c529..0c3d65ccf25da6f5a70f0043f1a4e71f9518b67e 100644 (file)
@@ -21,7 +21,6 @@ import (
        "code.gitea.io/gitea/modules/util"
 
        "gitea.com/macaron/macaron"
-       "github.com/unknwon/com"
 )
 
 var (
@@ -83,7 +82,7 @@ func NewTemplateFileSystem() templateFileSystem {
                log.Warn("Unable to check if templates dir %s is a directory. Error: %v", customDir, err)
        }
        if isDir {
-               files, err := com.StatDir(customDir)
+               files, err := util.StatDir(customDir)
 
                if err != nil {
                        log.Warn("Failed to read %s templates dir. %v", customDir, err)
@@ -179,7 +178,7 @@ func Mailer() (*texttmpl.Template, *template.Template) {
                log.Warn("Failed to check if custom directory %s is a directory. %v", err)
        }
        if isDir {
-               files, err := com.StatDir(customDir)
+               files, err := util.StatDir(customDir)
 
                if err != nil {
                        log.Warn("Failed to read %s templates dir. %v", customDir, err)
index fbcefb83b6f7256d017b7871b957b22ae1d20a5d..aa3d009899273883bf410ce2549a8393fd356c51 100644 (file)
@@ -5,8 +5,11 @@
 package util
 
 import (
+       "errors"
        "os"
+       "path"
        "path/filepath"
+       "strings"
 )
 
 // EnsureAbsolutePath ensure that a path is absolute, making it
@@ -70,3 +73,80 @@ func IsExist(path string) (bool, error) {
        }
        return false, err
 }
+
+func statDir(dirPath, recPath string, includeDir, isDirOnly, followSymlinks bool) ([]string, error) {
+       dir, err := os.Open(dirPath)
+       if err != nil {
+               return nil, err
+       }
+       defer dir.Close()
+
+       fis, err := dir.Readdir(0)
+       if err != nil {
+               return nil, err
+       }
+
+       statList := make([]string, 0)
+       for _, fi := range fis {
+               if strings.Contains(fi.Name(), ".DS_Store") {
+                       continue
+               }
+
+               relPath := path.Join(recPath, fi.Name())
+               curPath := path.Join(dirPath, fi.Name())
+               if fi.IsDir() {
+                       if includeDir {
+                               statList = append(statList, relPath+"/")
+                       }
+                       s, err := statDir(curPath, relPath, includeDir, isDirOnly, followSymlinks)
+                       if err != nil {
+                               return nil, err
+                       }
+                       statList = append(statList, s...)
+               } else if !isDirOnly {
+                       statList = append(statList, relPath)
+               } else if followSymlinks && fi.Mode()&os.ModeSymlink != 0 {
+                       link, err := os.Readlink(curPath)
+                       if err != nil {
+                               return nil, err
+                       }
+
+                       isDir, err := IsDir(link)
+                       if err != nil {
+                               return nil, err
+                       }
+                       if isDir {
+                               if includeDir {
+                                       statList = append(statList, relPath+"/")
+                               }
+                               s, err := statDir(curPath, relPath, includeDir, isDirOnly, followSymlinks)
+                               if err != nil {
+                                       return nil, err
+                               }
+                               statList = append(statList, s...)
+                       }
+               }
+       }
+       return statList, nil
+}
+
+// StatDir gathers information of given directory by depth-first.
+// It returns slice of file list and includes subdirectories if enabled;
+// it returns error and nil slice when error occurs in underlying functions,
+// or given path is not a directory or does not exist.
+//
+// Slice does not include given path itself.
+// If subdirectories is enabled, they will have suffix '/'.
+func StatDir(rootPath string, includeDir ...bool) ([]string, error) {
+       if isDir, err := IsDir(rootPath); err != nil {
+               return nil, err
+       } else if !isDir {
+               return nil, errors.New("not a directory or does not exist: " + rootPath)
+       }
+
+       isIncludeDir := false
+       if len(includeDir) != 0 {
+               isIncludeDir = includeDir[0]
+       }
+       return statDir(rootPath, "", isIncludeDir, false, false)
+}