Skip to content

Commit 214b2dd

Browse files
committed
fix
1 parent 16955d0 commit 214b2dd

File tree

16 files changed

+89
-122
lines changed

16 files changed

+89
-122
lines changed

modules/fileicon/basic.go

Lines changed: 9 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,56 +6,26 @@ package fileicon
66
import (
77
"html/template"
88

9-
"code.gitea.io/gitea/modules/git"
109
"code.gitea.io/gitea/modules/svg"
10+
"code.gitea.io/gitea/modules/util"
1111
)
1212

13-
type FileEntry struct {
14-
Name string
15-
EntryMode git.EntryMode
16-
FollowEntryMode git.EntryMode
17-
}
18-
19-
func GetFileEntryByTreeEntry(entry *git.TreeEntry) *FileEntry {
20-
if entry.IsLink() {
21-
if te, err := entry.FollowLink(); err == nil && te.IsDir() {
22-
return &FileEntry{
23-
Name: entry.Name(),
24-
EntryMode: entry.Mode(),
25-
FollowEntryMode: te.Mode(),
26-
}
27-
}
28-
}
29-
return &FileEntry{
30-
Name: entry.Name(),
31-
EntryMode: entry.Mode(),
32-
}
33-
}
34-
35-
func BasicThemeFolderIconName(isOpen bool) string {
36-
if isOpen {
37-
return "octicon-file-directory-open-fill"
38-
}
39-
return "octicon-file-directory-fill"
40-
}
41-
42-
func BasicThemeFolderIconWithOpenStatus(isOpen bool) template.HTML {
43-
return svg.RenderHTML(BasicThemeFolderIconName(isOpen))
44-
}
45-
46-
func BasicThemeIconWithOpenStatus(entry *FileEntry, isOpen bool) template.HTML {
47-
// TODO: add "open icon" support
13+
func BasicEntryIconName(entry *EntryInfo) string {
4814
svgName := "octicon-file"
4915
switch {
5016
case entry.EntryMode.IsLink():
5117
svgName = "octicon-file-symlink-file"
52-
if entry.FollowEntryMode.IsDir() {
18+
if entry.SymlinkToMode.IsDir() {
5319
svgName = "octicon-file-directory-symlink"
5420
}
5521
case entry.EntryMode.IsDir():
56-
svgName = BasicThemeFolderIconName(isOpen)
22+
svgName = util.Iif(entry.IsOpen, "octicon-file-directory-open-fill", "octicon-file-directory-fill")
5723
case entry.EntryMode.IsSubModule():
5824
svgName = "octicon-file-submodule"
5925
}
60-
return svg.RenderHTML(svgName)
26+
return svgName
27+
}
28+
29+
func BasicEntryIconHTML(entry *EntryInfo) template.HTML {
30+
return svg.RenderHTML(BasicEntryIconName(entry))
6131
}

modules/fileicon/entry.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright 2025 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package fileicon
5+
6+
import "code.gitea.io/gitea/modules/git"
7+
8+
type EntryInfo struct {
9+
FullName string
10+
EntryMode git.EntryMode
11+
SymlinkToMode git.EntryMode
12+
IsOpen bool
13+
}
14+
15+
func EntryInfoFromGitTreeEntry(gitEntry *git.TreeEntry) *EntryInfo {
16+
ret := &EntryInfo{FullName: gitEntry.Name(), EntryMode: gitEntry.Mode()}
17+
if gitEntry.IsLink() {
18+
if te, err := gitEntry.FollowLink(); err == nil && te.IsDir() {
19+
ret.SymlinkToMode = te.Mode()
20+
}
21+
}
22+
return ret
23+
}
24+
25+
func EntryInfoFolder() *EntryInfo {
26+
return &EntryInfo{EntryMode: git.EntryModeTree}
27+
}

modules/fileicon/material.go

Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import (
1212
"code.gitea.io/gitea/modules/json"
1313
"code.gitea.io/gitea/modules/log"
1414
"code.gitea.io/gitea/modules/options"
15+
"code.gitea.io/gitea/modules/setting"
1516
"code.gitea.io/gitea/modules/svg"
17+
"code.gitea.io/gitea/modules/util"
1618
)
1719

1820
type materialIconRulesData struct {
@@ -78,41 +80,41 @@ func (m *MaterialIconProvider) renderFileIconSVG(p *RenderedIconPool, name, svg,
7880
return template.HTML(`<svg ` + svgCommonAttrs + `><use xlink:href="#` + svgID + `"></use></svg>`)
7981
}
8082

81-
func (m *MaterialIconProvider) FolderIconWithOpenStatus(p *RenderedIconPool, isOpen bool) template.HTML {
82-
name := m.FindIconName("folder", true, isOpen)
83-
return m.renderFileIconSVG(p, name, m.svgs[name], BasicThemeFolderIconName(isOpen))
84-
}
85-
86-
func (m *MaterialIconProvider) FileIconWithOpenStatus(p *RenderedIconPool, entry *FileEntry, isOpen bool) template.HTML {
83+
func (m *MaterialIconProvider) EntryIconHTML(p *RenderedIconPool, entry *EntryInfo) template.HTML {
8784
if m.rules == nil {
88-
return BasicThemeIconWithOpenStatus(entry, isOpen)
85+
return BasicEntryIconHTML(entry)
8986
}
9087

9188
if entry.EntryMode.IsLink() {
92-
if entry.FollowEntryMode.IsDir() {
89+
if entry.SymlinkToMode.IsDir() {
9390
// keep the old "octicon-xxx" class name to make some "theme plugin selector" could still work
9491
return svg.RenderHTML("material-folder-symlink", 16, "octicon-file-directory-symlink")
9592
}
9693
return svg.RenderHTML("octicon-file-symlink-file") // TODO: find some better icons for them
9794
}
9895

99-
// TODO: add "open icon" support
100-
name := m.findIconNameByGit(entry, isOpen)
101-
// the material icon pack's "folder" icon doesn't look good, so use our built-in one
102-
// keep the old "octicon-xxx" class name to make some "theme plugin selector" could still work
103-
if iconSVG, ok := m.svgs[name]; ok && iconSVG != "" {
104-
// keep the old "octicon-xxx" class name to make some "theme plugin selector" could still work
105-
extraClass := "octicon-file"
106-
switch {
107-
case entry.EntryMode.IsDir():
108-
extraClass = BasicThemeFolderIconName(isOpen)
109-
case entry.EntryMode.IsSubModule():
110-
extraClass = "octicon-file-submodule"
96+
name := m.FindIconName(entry)
97+
iconSVG := m.svgs[name]
98+
if iconSVG == "" {
99+
name = "file"
100+
if entry.EntryMode.IsDir() {
101+
name = util.Iif(entry.IsOpen, "folder-open", "folder")
102+
}
103+
iconSVG = m.svgs[name]
104+
if iconSVG == "" {
105+
setting.PanicInDevOrTesting("missing file icon for %s", name)
111106
}
112-
return m.renderFileIconSVG(p, name, iconSVG, extraClass)
113107
}
114-
// TODO: use an interface or wrapper for git.Entry to make the code testable.
115-
return BasicThemeIconWithOpenStatus(entry, isOpen)
108+
109+
// keep the old "octicon-xxx" class name to make some "theme plugin selector" could still work
110+
extraClass := "octicon-file"
111+
switch {
112+
case entry.EntryMode.IsDir():
113+
extraClass = BasicEntryIconName(entry)
114+
case entry.EntryMode.IsSubModule():
115+
extraClass = "octicon-file-submodule"
116+
}
117+
return m.renderFileIconSVG(p, name, iconSVG, extraClass)
116118
}
117119

118120
func (m *MaterialIconProvider) findIconNameWithLangID(s string) string {
@@ -127,16 +129,17 @@ func (m *MaterialIconProvider) findIconNameWithLangID(s string) string {
127129
return ""
128130
}
129131

130-
func (m *MaterialIconProvider) FindIconName(name string, isDir, isOpen bool) string {
131-
fileNameLower := strings.ToLower(path.Base(name))
132-
if isDir {
132+
func (m *MaterialIconProvider) FindIconName(entry *EntryInfo) string {
133+
if entry.EntryMode.IsSubModule() {
134+
return "folder-git"
135+
}
136+
137+
fileNameLower := strings.ToLower(path.Base(entry.FullName))
138+
if entry.EntryMode.IsDir() {
133139
if s, ok := m.rules.FolderNames[fileNameLower]; ok {
134140
return s
135141
}
136-
if isOpen {
137-
return "folder-open"
138-
}
139-
return "folder"
142+
return util.Iif(entry.IsOpen, "folder-open", "folder")
140143
}
141144

142145
if s, ok := m.rules.FileNames[fileNameLower]; ok {
@@ -158,10 +161,3 @@ func (m *MaterialIconProvider) FindIconName(name string, isDir, isOpen bool) str
158161

159162
return "file"
160163
}
161-
162-
func (m *MaterialIconProvider) findIconNameByGit(entry *FileEntry, isOpen bool) string {
163-
if entry.EntryMode.IsSubModule() {
164-
return "folder-git"
165-
}
166-
return m.FindIconName(entry.Name, entry.EntryMode.IsDir(), isOpen)
167-
}

modules/fileicon/render.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ func (p *RenderedIconPool) RenderToHTML() template.HTML {
3333
return template.HTML(sb.String())
3434
}
3535

36-
func RenderEntryIconWithOpenStatus(renderedIconPool *RenderedIconPool, entry *FileEntry, isOpen bool) template.HTML {
36+
func RenderEntryIconHTML(renderedIconPool *RenderedIconPool, entry *EntryInfo) template.HTML {
3737
if setting.UI.FileIconTheme == "material" {
38-
return DefaultMaterialIconProvider().FileIconWithOpenStatus(renderedIconPool, entry, isOpen)
38+
return DefaultMaterialIconProvider().EntryIconHTML(renderedIconPool, entry)
3939
}
40-
return BasicThemeIconWithOpenStatus(entry, isOpen)
40+
return BasicEntryIconHTML(entry)
4141
}

modules/templates/helper.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,11 @@ func NewFuncMap() template.FuncMap {
5959

6060
// -----------------------------------------------------------------
6161
// svg / avatar / icon / color
62-
"svg": svg.RenderHTML,
63-
"folderIconHTMLByOpenStatus": FolderIconHTMLByOpenStatus,
64-
"MigrationIcon": migrationIcon,
65-
"ActionIcon": actionIcon,
66-
"SortArrow": sortArrow,
67-
"ContrastColor": util.ContrastColor,
62+
"svg": svg.RenderHTML,
63+
"MigrationIcon": migrationIcon,
64+
"ActionIcon": actionIcon,
65+
"SortArrow": sortArrow,
66+
"ContrastColor": util.ContrastColor,
6867

6968
// -----------------------------------------------------------------
7069
// time / number / format

modules/templates/util_misc.go

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,11 @@ import (
1414

1515
activities_model "code.gitea.io/gitea/models/activities"
1616
repo_model "code.gitea.io/gitea/models/repo"
17-
"code.gitea.io/gitea/modules/fileicon"
1817
"code.gitea.io/gitea/modules/git"
1918
giturl "code.gitea.io/gitea/modules/git/url"
2019
"code.gitea.io/gitea/modules/json"
2120
"code.gitea.io/gitea/modules/log"
2221
"code.gitea.io/gitea/modules/repository"
23-
"code.gitea.io/gitea/modules/setting"
2422
"code.gitea.io/gitea/modules/svg"
2523

2624
"github.com/editorconfig/editorconfig-core-go/v2"
@@ -194,10 +192,3 @@ func tabSizeClass(ec *editorconfig.Editorconfig, filename string) string {
194192
}
195193
return "tab-size-4"
196194
}
197-
198-
func FolderIconHTMLByOpenStatus(isOpen bool) template.HTML {
199-
if setting.UI.FileIconTheme == "material" {
200-
return fileicon.DefaultMaterialIconProvider().FolderIconWithOpenStatus(nil, isOpen)
201-
}
202-
return fileicon.BasicThemeFolderIconWithOpenStatus(isOpen)
203-
}

routers/web/repo/commit.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -372,8 +372,6 @@ func Diff(ctx *context.Context) {
372372

373373
renderedIconPool := fileicon.NewRenderedIconPool()
374374
ctx.PageData["DiffFileTree"] = transformDiffTreeForWeb(renderedIconPool, diffTree, nil)
375-
ctx.PageData["FolderIcon"] = templates.FolderIconHTMLByOpenStatus(false)
376-
ctx.PageData["FolderOpenIcon"] = templates.FolderIconHTMLByOpenStatus(true)
377375
ctx.Data["FileIconPoolHTML"] = renderedIconPool.RenderToHTML()
378376
}
379377

routers/web/repo/compare.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -642,8 +642,6 @@ func PrepareCompareDiff(
642642

643643
renderedIconPool := fileicon.NewRenderedIconPool()
644644
ctx.PageData["DiffFileTree"] = transformDiffTreeForWeb(renderedIconPool, diffTree, nil)
645-
ctx.PageData["FolderIcon"] = templates.FolderIconHTMLByOpenStatus(false)
646-
ctx.PageData["FolderOpenIcon"] = templates.FolderIconHTMLByOpenStatus(true)
647645
ctx.Data["FileIconPoolHTML"] = renderedIconPool.RenderToHTML()
648646
}
649647

routers/web/repo/pull.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -827,8 +827,6 @@ func viewPullFiles(ctx *context.Context, specifiedStartCommit, specifiedEndCommi
827827

828828
renderedIconPool := fileicon.NewRenderedIconPool()
829829
ctx.PageData["DiffFileTree"] = transformDiffTreeForWeb(renderedIconPool, diffTree, filesViewedState)
830-
ctx.PageData["FolderIcon"] = templates.FolderIconHTMLByOpenStatus(false)
831-
ctx.PageData["FolderOpenIcon"] = templates.FolderIconHTMLByOpenStatus(true)
832830
ctx.Data["FileIconPoolHTML"] = renderedIconPool.RenderToHTML()
833831
}
834832

routers/web/repo/treelist.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,7 @@ func transformDiffTreeForWeb(renderedIconPool *fileicon.RenderedIconPool, diffTr
111111
item := &WebDiffFileItem{FullName: file.HeadPath, DiffStatus: file.Status}
112112
item.IsViewed = filesViewedState[item.FullName] == pull_model.Viewed
113113
item.NameHash = git.HashFilePathForWebUI(item.FullName)
114-
item.FileIcon = fileicon.RenderEntryIconWithOpenStatus(renderedIconPool, &fileicon.FileEntry{
115-
Name: file.HeadPath,
116-
EntryMode: file.HeadMode,
117-
}, false)
114+
item.FileIcon = fileicon.RenderEntryIconHTML(renderedIconPool, &fileicon.EntryInfo{FullName: file.HeadPath, EntryMode: file.HeadMode})
118115

119116
switch file.HeadMode {
120117
case git.EntryModeTree:

0 commit comments

Comments
 (0)