69 lines
1.5 KiB
Go
69 lines
1.5 KiB
Go
package rpm
|
|
|
|
import "errors"
|
|
import "io/fs"
|
|
import "os"
|
|
import "path/filepath"
|
|
import "sort"
|
|
import "strings"
|
|
|
|
type TreeEntry struct {
|
|
Name string `json:"name"`
|
|
Path string `json:"path"`
|
|
Type string `json:"type"`
|
|
Size int64 `json:"size"`
|
|
IsRepoDir bool `json:"is_repo_dir"`
|
|
RepoMode string `json:"repo_mode"`
|
|
}
|
|
|
|
var ErrPathNotFound = errors.New("path not found")
|
|
|
|
func ListTree(basePath string, relPath string) ([]TreeEntry, error) {
|
|
var dirPath string
|
|
var entries []fs.DirEntry
|
|
var err error
|
|
var result []TreeEntry
|
|
var entry fs.DirEntry
|
|
var info fs.FileInfo
|
|
var kind string
|
|
var entryPath string
|
|
var i int
|
|
dirPath = filepath.Join(basePath, filepath.FromSlash(relPath))
|
|
entries, err = os.ReadDir(dirPath)
|
|
if err != nil {
|
|
if os.IsNotExist(err) {
|
|
return nil, ErrPathNotFound
|
|
}
|
|
return nil, err
|
|
}
|
|
result = make([]TreeEntry, 0, len(entries))
|
|
for i = 0; i < len(entries); i++ {
|
|
entry = entries[i]
|
|
kind = "file"
|
|
if entry.IsDir() {
|
|
kind = "dir"
|
|
}
|
|
info, err = entry.Info()
|
|
if err != nil {
|
|
continue
|
|
}
|
|
entryPath = entry.Name()
|
|
if relPath != "" {
|
|
entryPath = filepath.ToSlash(filepath.Join(relPath, entry.Name()))
|
|
}
|
|
result = append(result, TreeEntry{
|
|
Name: entry.Name(),
|
|
Path: entryPath,
|
|
Type: kind,
|
|
Size: info.Size(),
|
|
})
|
|
}
|
|
sort.Slice(result, func(i int, j int) bool {
|
|
if result[i].Type != result[j].Type {
|
|
return result[i].Type == "dir"
|
|
}
|
|
return strings.ToLower(result[i].Name) < strings.ToLower(result[j].Name)
|
|
})
|
|
return result, nil
|
|
}
|