Files
codit/backend/internal/rpm/tree.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
}