Skip to content

Commit ec3dcaf

Browse files
committed
Extract the parameter of RenderEntryIconWithOpenStatus from git.TreeEntry to FileEntry to decouple it from git.TreeEntry.
This change will allow integrating the file icons of the file tree on the diff page into the unified rendering logic without relying on `git.TreeEntry`.
1 parent 34c63a3 commit ec3dcaf

File tree

17 files changed

+105
-45
lines changed

17 files changed

+105
-45
lines changed

modules/fileicon/basic.go

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,28 @@ import (
1010
"code.gitea.io/gitea/modules/svg"
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+
1335
func BasicThemeFolderIconName(isOpen bool) string {
1436
if isOpen {
1537
return "octicon-file-directory-open-fill"
@@ -21,18 +43,18 @@ func BasicThemeFolderIconWithOpenStatus(isOpen bool) template.HTML {
2143
return svg.RenderHTML(BasicThemeFolderIconName(isOpen))
2244
}
2345

24-
func BasicThemeIconWithOpenStatus(entry *git.TreeEntry, isOpen bool) template.HTML {
46+
func BasicThemeIconWithOpenStatus(entry *FileEntry, isOpen bool) template.HTML {
2547
// TODO: add "open icon" support
2648
svgName := "octicon-file"
2749
switch {
28-
case entry.IsLink():
50+
case entry.EntryMode.IsLink():
2951
svgName = "octicon-file-symlink-file"
30-
if te, err := entry.FollowLink(); err == nil && te.IsDir() {
52+
if entry.FollowEntryMode.IsDir() {
3153
svgName = "octicon-file-directory-symlink"
3254
}
33-
case entry.IsDir():
55+
case entry.EntryMode.IsDir():
3456
svgName = BasicThemeFolderIconName(isOpen)
35-
case entry.IsSubModule():
57+
case entry.EntryMode.IsSubModule():
3658
svgName = "octicon-file-submodule"
3759
}
3860
return svg.RenderHTML(svgName)

modules/fileicon/material.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"strings"
1010
"sync"
1111

12-
"code.gitea.io/gitea/modules/git"
1312
"code.gitea.io/gitea/modules/json"
1413
"code.gitea.io/gitea/modules/log"
1514
"code.gitea.io/gitea/modules/options"
@@ -84,13 +83,13 @@ func (m *MaterialIconProvider) FolderIconWithOpenStatus(p *RenderedIconPool, isO
8483
return m.renderFileIconSVG(p, name, m.svgs[name], BasicThemeFolderIconName(isOpen))
8584
}
8685

87-
func (m *MaterialIconProvider) FileIconWithOpenStatus(p *RenderedIconPool, entry *git.TreeEntry, isOpen bool) template.HTML {
86+
func (m *MaterialIconProvider) FileIconWithOpenStatus(p *RenderedIconPool, entry *FileEntry, isOpen bool) template.HTML {
8887
if m.rules == nil {
8988
return BasicThemeIconWithOpenStatus(entry, isOpen)
9089
}
9190

92-
if entry.IsLink() {
93-
if te, err := entry.FollowLink(); err == nil && te.IsDir() {
91+
if entry.EntryMode.IsLink() {
92+
if entry.FollowEntryMode.IsDir() {
9493
// keep the old "octicon-xxx" class name to make some "theme plugin selector" could still work
9594
return svg.RenderHTML("material-folder-symlink", 16, "octicon-file-directory-symlink")
9695
}
@@ -105,9 +104,9 @@ func (m *MaterialIconProvider) FileIconWithOpenStatus(p *RenderedIconPool, entry
105104
// keep the old "octicon-xxx" class name to make some "theme plugin selector" could still work
106105
extraClass := "octicon-file"
107106
switch {
108-
case entry.IsDir():
107+
case entry.EntryMode.IsDir():
109108
extraClass = BasicThemeFolderIconName(isOpen)
110-
case entry.IsSubModule():
109+
case entry.EntryMode.IsSubModule():
111110
extraClass = "octicon-file-submodule"
112111
}
113112
return m.renderFileIconSVG(p, name, iconSVG, extraClass)
@@ -160,9 +159,9 @@ func (m *MaterialIconProvider) FindIconName(name string, isDir, isOpen bool) str
160159
return "file"
161160
}
162161

163-
func (m *MaterialIconProvider) findIconNameByGit(entry *git.TreeEntry, isOpen bool) string {
164-
if entry.IsSubModule() {
162+
func (m *MaterialIconProvider) findIconNameByGit(entry *FileEntry, isOpen bool) string {
163+
if entry.EntryMode.IsSubModule() {
165164
return "folder-git"
166165
}
167-
return m.FindIconName(entry.Name(), entry.IsDir(), isOpen)
166+
return m.FindIconName(entry.Name, entry.EntryMode.IsDir(), isOpen)
168167
}

modules/fileicon/render.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"html/template"
88
"strings"
99

10-
"code.gitea.io/gitea/modules/git"
1110
"code.gitea.io/gitea/modules/setting"
1211
)
1312

@@ -34,9 +33,7 @@ func (p *RenderedIconPool) RenderToHTML() template.HTML {
3433
return template.HTML(sb.String())
3534
}
3635

37-
// TODO: use an interface or struct to replace "*git.TreeEntry", to decouple the fileicon module from git module
38-
39-
func RenderEntryIconWithOpenStatus(renderedIconPool *RenderedIconPool, entry *git.TreeEntry, isOpen bool) template.HTML {
36+
func RenderEntryIconWithOpenStatus(renderedIconPool *RenderedIconPool, entry *FileEntry, isOpen bool) template.HTML {
4037
if setting.UI.FileIconTheme == "material" {
4138
return DefaultMaterialIconProvider().FileIconWithOpenStatus(renderedIconPool, entry, isOpen)
4239
}

modules/git/tree_entry_mode.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,31 @@ func (e EntryMode) String() string {
3030
return strconv.FormatInt(int64(e), 8)
3131
}
3232

33+
// IsSubModule if the entry is a sub module
34+
func (e EntryMode) IsSubModule() bool {
35+
return e == EntryModeCommit
36+
}
37+
38+
// IsDir if the entry is a sub dir
39+
func (e EntryMode) IsDir() bool {
40+
return e == EntryModeTree
41+
}
42+
43+
// IsLink if the entry is a symlink
44+
func (e EntryMode) IsLink() bool {
45+
return e == EntryModeSymlink
46+
}
47+
48+
// IsRegular if the entry is a regular file
49+
func (e EntryMode) IsRegular() bool {
50+
return e == EntryModeBlob
51+
}
52+
53+
// IsExecutable if the entry is an executable file (not necessarily binary)
54+
func (e EntryMode) IsExecutable() bool {
55+
return e == EntryModeExec
56+
}
57+
3358
func ParseEntryMode(mode string) (EntryMode, error) {
3459
switch mode {
3560
case "000000":

modules/git/tree_entry_nogogit.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,27 +59,27 @@ func (te *TreeEntry) Size() int64 {
5959

6060
// IsSubModule if the entry is a sub module
6161
func (te *TreeEntry) IsSubModule() bool {
62-
return te.entryMode == EntryModeCommit
62+
return te.entryMode.IsSubModule()
6363
}
6464

6565
// IsDir if the entry is a sub dir
6666
func (te *TreeEntry) IsDir() bool {
67-
return te.entryMode == EntryModeTree
67+
return te.entryMode.IsDir()
6868
}
6969

7070
// IsLink if the entry is a symlink
7171
func (te *TreeEntry) IsLink() bool {
72-
return te.entryMode == EntryModeSymlink
72+
return te.entryMode.IsLink()
7373
}
7474

7575
// IsRegular if the entry is a regular file
7676
func (te *TreeEntry) IsRegular() bool {
77-
return te.entryMode == EntryModeBlob
77+
return te.entryMode.IsRegular()
7878
}
7979

8080
// IsExecutable if the entry is an executable file (not necessarily binary)
8181
func (te *TreeEntry) IsExecutable() bool {
82-
return te.entryMode == EntryModeExec
82+
return te.entryMode.IsExecutable()
8383
}
8484

8585
// Blob returns the blob object the entry

modules/templates/helper.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func NewFuncMap() template.FuncMap {
6060
// -----------------------------------------------------------------
6161
// svg / avatar / icon / color
6262
"svg": svg.RenderHTML,
63-
"folderIconHTMLByOpenStatus": folderIconHTMLByOpenStatus,
63+
"folderIconHTMLByOpenStatus": FolderIconHTMLByOpenStatus,
6464
"MigrationIcon": migrationIcon,
6565
"ActionIcon": actionIcon,
6666
"SortArrow": sortArrow,

modules/templates/util_misc.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ func tabSizeClass(ec *editorconfig.Editorconfig, filename string) string {
195195
return "tab-size-4"
196196
}
197197

198-
func folderIconHTMLByOpenStatus(isOpen bool) template.HTML {
198+
func FolderIconHTMLByOpenStatus(isOpen bool) template.HTML {
199199
if setting.UI.FileIconTheme == "material" {
200200
return fileicon.DefaultMaterialIconProvider().FolderIconWithOpenStatus(nil, isOpen)
201201
}

routers/web/repo/commit.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
user_model "code.gitea.io/gitea/models/user"
2222
"code.gitea.io/gitea/modules/base"
2323
"code.gitea.io/gitea/modules/charset"
24+
"code.gitea.io/gitea/modules/fileicon"
2425
"code.gitea.io/gitea/modules/git"
2526
"code.gitea.io/gitea/modules/gitrepo"
2627
"code.gitea.io/gitea/modules/log"
@@ -370,7 +371,11 @@ func Diff(ctx *context.Context) {
370371
return
371372
}
372373

373-
ctx.PageData["DiffFiles"] = transformDiffTreeForUI(diffTree, nil)
374+
renderedIconPool := fileicon.NewRenderedIconPool()
375+
ctx.PageData["DiffFiles"] = transformDiffTreeForUI(renderedIconPool, diffTree, nil)
376+
ctx.PageData["FolderIcon"] = templates.FolderIconHTMLByOpenStatus(false)
377+
ctx.PageData["FolderOpenIcon"] = templates.FolderIconHTMLByOpenStatus(true)
378+
ctx.Data["FileIconPoolHTML"] = renderedIconPool.RenderToHTML()
374379
}
375380

376381
statuses, _, err := git_model.GetLatestCommitStatus(ctx, ctx.Repo.Repository.ID, commitID, db.ListOptionsAll)

routers/web/repo/compare.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"code.gitea.io/gitea/modules/base"
2727
"code.gitea.io/gitea/modules/charset"
2828
csv_module "code.gitea.io/gitea/modules/csv"
29+
"code.gitea.io/gitea/modules/fileicon"
2930
"code.gitea.io/gitea/modules/git"
3031
"code.gitea.io/gitea/modules/gitrepo"
3132
"code.gitea.io/gitea/modules/log"
@@ -639,7 +640,11 @@ func PrepareCompareDiff(
639640
return false
640641
}
641642

642-
ctx.PageData["DiffFiles"] = transformDiffTreeForUI(diffTree, nil)
643+
renderedIconPool := fileicon.NewRenderedIconPool()
644+
ctx.PageData["DiffFiles"] = transformDiffTreeForUI(renderedIconPool, diffTree, nil)
645+
ctx.PageData["FolderIcon"] = templates.FolderIconHTMLByOpenStatus(false)
646+
ctx.PageData["FolderOpenIcon"] = templates.FolderIconHTMLByOpenStatus(true)
647+
ctx.Data["FileIconPoolHTML"] = renderedIconPool.RenderToHTML()
643648
}
644649

645650
headCommit, err := ci.HeadGitRepo.GetCommit(headCommitID)

routers/web/repo/pull.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"code.gitea.io/gitea/models/unit"
2525
user_model "code.gitea.io/gitea/models/user"
2626
"code.gitea.io/gitea/modules/emoji"
27+
"code.gitea.io/gitea/modules/fileicon"
2728
"code.gitea.io/gitea/modules/git"
2829
"code.gitea.io/gitea/modules/gitrepo"
2930
issue_template "code.gitea.io/gitea/modules/issue/template"
@@ -834,7 +835,11 @@ func viewPullFiles(ctx *context.Context, specifiedStartCommit, specifiedEndCommi
834835
}
835836
}
836837

837-
ctx.PageData["DiffFiles"] = transformDiffTreeForUI(diffTree, filesViewedState)
838+
renderedIconPool := fileicon.NewRenderedIconPool()
839+
ctx.PageData["DiffFiles"] = transformDiffTreeForUI(renderedIconPool, diffTree, filesViewedState)
840+
ctx.PageData["FolderIcon"] = templates.FolderIconHTMLByOpenStatus(false)
841+
ctx.PageData["FolderOpenIcon"] = templates.FolderIconHTMLByOpenStatus(true)
842+
ctx.Data["FileIconPoolHTML"] = renderedIconPool.RenderToHTML()
838843
}
839844

840845
ctx.Data["Diff"] = diff

0 commit comments

Comments
 (0)