* Add StatDir and replace com.StatDir * a nit * Remove wrong file Co-authored-by: 6543 <6543@obermui.de>tags/v1.15.0-dev
@@ -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) | |||
} |
@@ -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) |
@@ -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) |
@@ -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) |
@@ -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) |
@@ -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) | |||
} |