Skip to content

Commit 61be52b

Browse files
committed
finish submodule support
1 parent b1193e0 commit 61be52b

File tree

3 files changed

+50
-26
lines changed

3 files changed

+50
-26
lines changed

services/repository/files/tree.go

Lines changed: 47 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

141142
type 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-
}

web_src/js/components/ViewFileTreeItem.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ type Item = {
66
name: string;
77
path: string;
88
htmlUrl: string;
9+
sub_module_url?: string;
910
type: string;
1011
children?: Item[];
1112
};
@@ -41,7 +42,7 @@ const doLoadFileContent = () => {
4142
};
4243
4344
const doGotoSubModule = () => {
44-
// TOTO: redirect to submodule
45+
location.href = props.item.sub_module_url;
4546
};
4647
</script>
4748

web_src/js/features/repo-view-file-tree-sidebar.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ async function loadChildren(item, recursive?: boolean) {
3939
name: i.name,
4040
type: i.type,
4141
path: i.path,
42+
sub_module_url: i.sub_module_url,
4243
children: i.children,
4344
}));
4445
}

0 commit comments

Comments
 (0)