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)
}
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
-
- "github.com/unknwon/com"
)
var (
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)
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)
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
-
- "github.com/unknwon/com"
)
var (
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)
"code.gitea.io/gitea/modules/util"
"gitea.com/macaron/macaron"
- "github.com/unknwon/com"
)
var (
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)
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)
"code.gitea.io/gitea/modules/util"
"gitea.com/macaron/macaron"
- "github.com/unknwon/com"
)
var (
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)
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)
package util
import (
+ "errors"
"os"
+ "path"
"path/filepath"
+ "strings"
)
// EnsureAbsolutePath ensure that a path is absolute, making it
}
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)
+}