@@ -13,6 +13,7 @@ import (
1313
1414 repo_model "code.gitea.io/gitea/models/repo"
1515 "code.gitea.io/gitea/modules/git"
16+ "code.gitea.io/gitea/modules/log"
1617 "code.gitea.io/gitea/modules/setting"
1718 api "code.gitea.io/gitea/modules/structs"
1819 "code.gitea.io/gitea/modules/util"
@@ -139,10 +140,50 @@ func entryModeString(entryMode git.EntryMode) string {
139140}
140141
141142type TreeViewNode struct {
142- Name string `json:"name"`
143- Type string `json:"type"`
144- Path string `json:"path"`
145- Children []* TreeViewNode `json:"children,omitempty"`
143+ Name string `json:"name"`
144+ Type string `json:"type"`
145+ Path string `json:"path"`
146+ SubModuleURL string `json:"sub_module_url,omitempty"`
147+ Children []* TreeViewNode `json:"children,omitempty"`
148+ }
149+
150+ func (node * TreeViewNode ) sortLevel () int {
151+ switch node .Type {
152+ case "tree" , "commit" :
153+ return 0
154+ default :
155+ return 1
156+ }
157+ }
158+
159+ func newTreeViewNodeFromEntry (ctx context.Context , commit * git.Commit , parentDir string , entry * git.TreeEntry ) * TreeViewNode {
160+ node := & TreeViewNode {
161+ Name : entry .Name (),
162+ Type : entryModeString (entry .Mode ()),
163+ Path : path .Join (parentDir , entry .Name ()),
164+ }
165+
166+ if node .Type == "commit" {
167+ if subModule , err := commit .GetSubModule (node .Path ); err != nil {
168+ log .Error ("GetSubModule: %v" , err )
169+ } else if subModule != nil {
170+ submoduleFile := git .NewCommitSubmoduleFile (subModule .URL , entry .ID .String ())
171+ webLink := submoduleFile .SubmoduleWebLink (ctx )
172+ node .SubModuleURL = webLink .CommitWebLink
173+ }
174+ }
175+
176+ return node
177+ }
178+
179+ // sortTreeViewNodes list directory first and with alpha sequence
180+ func sortTreeViewNodes (nodes []* TreeViewNode ) {
181+ sort .Slice (nodes , func (i , j int ) bool {
182+ if nodes [i ].sortLevel () != nodes [j ].sortLevel () {
183+ return nodes [i ].sortLevel () < nodes [j ].sortLevel ()
184+ }
185+ return nodes [i ].Name < nodes [j ].Name
186+ })
146187}
147188
148189/*
@@ -429,11 +470,7 @@ func GetTreeInformation(ctx context.Context, repo *repo_model.Repository, gitRep
429470 fields := strings .Split (dir , "/" )
430471 var parentNode * TreeViewNode
431472 for _ , entry := range rootEntries {
432- node := & TreeViewNode {
433- Name : entry .Name (),
434- Type : entryModeString (entry .Mode ()),
435- Path : entry .Name (),
436- }
473+ node := newTreeViewNodeFromEntry (ctx , commit , "" , entry )
437474 treeViewNodes = append (treeViewNodes , node )
438475 if dir != "" && fields [0 ] == entry .Name () {
439476 parentNode = node
@@ -466,23 +503,8 @@ func GetTreeInformation(ctx context.Context, repo *repo_model.Repository, gitRep
466503 }
467504
468505 for _ , entry := range entries {
469- parentNode .Children = append (parentNode .Children , & TreeViewNode {
470- Name : entry .Name (),
471- Type : entryModeString (entry .Mode ()),
472- Path : path .Join (dir , entry .Name ()),
473- })
506+ parentNode .Children = append (parentNode .Children , newTreeViewNodeFromEntry (ctx , commit , dir , entry ))
474507 }
475508 sortTreeViewNodes (parentNode .Children )
476509 return treeViewNodes , nil
477510}
478-
479- // sortTreeViewNodes list directory first and with alpha sequence
480- func sortTreeViewNodes (nodes []* TreeViewNode ) {
481- sort .Slice (nodes , func (i , j int ) bool {
482- if nodes [i ].Type != nodes [j ].Type {
483- // folder and submodule first
484- return nodes [i ].Type == "tree" || nodes [i ].Type == "commit"
485- }
486- return nodes [i ].Name < nodes [j ].Name
487- })
488- }
0 commit comments