mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Add StatDir and replace com.StatDir (#14099)
* Add StatDir and replace com.StatDir * a nit * Remove wrong file Co-authored-by: 6543 <6543@obermui.de>
This commit is contained in:
		@@ -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)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user