diff --git a/routers/web/repo/tree.go b/routers/web/repo/tree.go index f07003245f..245eeace3f 100644 --- a/routers/web/repo/tree.go +++ b/routers/web/repo/tree.go @@ -68,19 +68,14 @@ func Tree(ctx *context.Context) { defer closer.Close() refName := gitRepo.UnstableGuessRefByShortName(ref) + var results []*files_service.TreeEntry if !recursive { - results, err := files_service.GetTreeList(ctx, ctx.Repo.Repository, dir, refName, false) - if err != nil { - ctx.ServerError("GetTreeList", err) - return - } - ctx.JSON(http.StatusOK, results) - return + results, err = files_service.GetTreeList(ctx, ctx.Repo.Repository, dir, refName, false) + } else { + results, err = files_service.GetTreeInformation(ctx, ctx.Repo.Repository, dir, refName) } - - results, err := files_service.GetTreeInformation(ctx, ctx.Repo.Repository, dir, refName) if err != nil { - ctx.ServerError("GetTreeList", err) + ctx.ServerError("GetTreeInformation", err) return } ctx.JSON(http.StatusOK, results) diff --git a/services/repository/files/tree.go b/services/repository/files/tree.go index 94eec833d1..a402cb3360 100644 --- a/services/repository/files/tree.go +++ b/services/repository/files/tree.go @@ -8,6 +8,7 @@ import ( "fmt" "net/url" "path" + "sort" "strings" repo_model "code.gitea.io/gitea/models/repo" @@ -126,7 +127,7 @@ type TreeEntry struct { Name string `json:"name"` IsFile bool `json:"isFile"` Path string `json:"path"` - Children []*TreeEntry `json:"children"` + Children []*TreeEntry `json:"children, omitempty"` } /* @@ -253,9 +254,12 @@ func GetTreeList(ctx context.Context, repo *repo_model.Repository, treePath stri for _, tree := range treeList { if !tree.IsFile { tree.Children = mapTree[tree.Path] + sortTreeEntries(tree.Children) } } + sortTreeEntries(treeList) + return treeList, nil } @@ -471,5 +475,17 @@ func GetTreeInformation(ctx context.Context, repo *repo_model.Repository, treePa Path: path.Join(dir, entry.Name()), }) } + sortTreeEntries(treeList) + sortTreeEntries(parentEntry.Children) return treeList, nil } + +// sortTreeEntries list directory first and with alpha sequence +func sortTreeEntries(entries []*TreeEntry) { + sort.Slice(entries, func(i, j int) bool { + if entries[i].IsFile != entries[j].IsFile { + return !entries[i].IsFile + } + return entries[i].Name < entries[j].Name + }) +} diff --git a/web_src/js/features/repo-view-file-tree-sidebar.ts b/web_src/js/features/repo-view-file-tree-sidebar.ts index b57249d041..d5489865e1 100644 --- a/web_src/js/features/repo-view-file-tree-sidebar.ts +++ b/web_src/js/features/repo-view-file-tree-sidebar.ts @@ -36,7 +36,7 @@ async function loadChildren(item, recursive?: boolean) { if (json instanceof Array) { return json.map((i) => ({ name: i.name, - isFile: i.type === 'file', + isFile: i.isFile, htmlUrl: i.html_url, path: i.path, }));