Skip to content

Commit e3339ae

Browse files
authored
Merge branch 'main' into fix/release-btn-style
2 parents f278b7d + f1cd90d commit e3339ae

24 files changed

+342
-321
lines changed

options/locale/locale_fr-FR.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ files=Fichiers
117117

118118
error=Erreur
119119
error404=La page que vous essayez d'atteindre <strong>n'existe pas</strong> ou <strong>vous n'êtes pas autorisé</strong> à la voir.
120+
error503=Le serveur n’a pas pu répondre à votre requête. Veuillez réessayer plus tard.
120121
go_back=Retour
121122
invalid_data=Données invalides : %v
122123

options/locale/locale_pt-PT.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ files=Ficheiros
117117

118118
error=Erro
119119
error404=A página que pretende aceder <strong>não existe</strong> ou <strong>não tem autorização</strong> para a ver.
120+
error503=O servidor não conseguiu concluir o seu pedido. Tente novamente mais tarde.
120121
go_back=Voltar
121122
invalid_data=Dados inválidos: %v
122123

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

routers/web/org/org.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,14 @@ const (
2727
// Create render the page for create organization
2828
func Create(ctx *context.Context) {
2929
ctx.Data["Title"] = ctx.Tr("new_org")
30-
ctx.Data["DefaultOrgVisibilityMode"] = setting.Service.DefaultOrgVisibilityMode
3130
if !ctx.Doer.CanCreateOrganization() {
3231
ctx.ServerError("Not allowed", errors.New(ctx.Locale.TrString("org.form.create_org_not_allowed")))
3332
return
3433
}
34+
35+
ctx.Data["visibility"] = setting.Service.DefaultOrgVisibilityMode
36+
ctx.Data["repo_admin_change_team_access"] = true
37+
3538
ctx.HTML(http.StatusOK, tplCreateOrg)
3639
}
3740

routers/web/repo/commit.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ func Diff(ctx *context.Context) {
369369
return
370370
}
371371

372-
ctx.PageData["DiffFiles"] = transformDiffTreeForUI(diffTree, nil)
372+
ctx.PageData["DiffFileTree"] = transformDiffTreeForWeb(diffTree, nil)
373373
}
374374

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

routers/web/repo/compare.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,7 @@ func PrepareCompareDiff(
639639
return false
640640
}
641641

642-
ctx.PageData["DiffFiles"] = transformDiffTreeForUI(diffTree, nil)
642+
ctx.PageData["DiffFileTree"] = transformDiffTreeForWeb(diffTree, nil)
643643
}
644644

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

routers/web/repo/pull.go

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -759,12 +759,9 @@ func viewPullFiles(ctx *context.Context, specifiedStartCommit, specifiedEndCommi
759759
// have to load only the diff and not get the viewed information
760760
// as the viewed information is designed to be loaded only on latest PR
761761
// diff and if you're signed in.
762-
shouldGetUserSpecificDiff := false
763-
if !ctx.IsSigned || willShowSpecifiedCommit || willShowSpecifiedCommitRange {
764-
// do nothing
765-
} else {
766-
shouldGetUserSpecificDiff = true
767-
err = gitdiff.SyncUserSpecificDiff(ctx, ctx.Doer.ID, pull, gitRepo, diff, diffOptions, files...)
762+
var reviewState *pull_model.ReviewState
763+
if ctx.IsSigned && !willShowSpecifiedCommit && !willShowSpecifiedCommitRange {
764+
reviewState, err = gitdiff.SyncUserSpecificDiff(ctx, ctx.Doer.ID, pull, gitRepo, diff, diffOptions)
768765
if err != nil {
769766
ctx.ServerError("SyncUserSpecificDiff", err)
770767
return
@@ -823,18 +820,11 @@ func viewPullFiles(ctx *context.Context, specifiedStartCommit, specifiedEndCommi
823820
ctx.ServerError("GetDiffTree", err)
824821
return
825822
}
826-
827-
filesViewedState := make(map[string]pull_model.ViewedState)
828-
if shouldGetUserSpecificDiff {
829-
// This sort of sucks because we already fetch this when getting the diff
830-
review, err := pull_model.GetNewestReviewState(ctx, ctx.Doer.ID, issue.ID)
831-
if err == nil && review != nil && review.UpdatedFiles != nil {
832-
// If there wasn't an error and we have a review with updated files, use that
833-
filesViewedState = review.UpdatedFiles
834-
}
823+
var filesViewedState map[string]pull_model.ViewedState
824+
if reviewState != nil {
825+
filesViewedState = reviewState.UpdatedFiles
835826
}
836-
837-
ctx.PageData["DiffFiles"] = transformDiffTreeForUI(diffTree, filesViewedState)
827+
ctx.PageData["DiffFileTree"] = transformDiffTreeForWeb(diffTree, filesViewedState)
838828
}
839829

840830
ctx.Data["Diff"] = diff

routers/web/repo/treelist.go

Lines changed: 71 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package repo
55

66
import (
77
"net/http"
8+
"strings"
89

910
pull_model "code.gitea.io/gitea/models/pull"
1011
"code.gitea.io/gitea/modules/base"
@@ -57,34 +58,85 @@ func isExcludedEntry(entry *git.TreeEntry) bool {
5758
return false
5859
}
5960

60-
type FileDiffFile struct {
61-
Name string
61+
// WebDiffFileItem is used by frontend, check the field names in frontend before changing
62+
type WebDiffFileItem struct {
63+
FullName string
64+
DisplayName string
6265
NameHash string
63-
IsSubmodule bool
66+
DiffStatus string
67+
EntryMode string
6468
IsViewed bool
65-
Status string
69+
Children []*WebDiffFileItem
70+
// TODO: add icon support in the future
6671
}
6772

68-
// transformDiffTreeForUI transforms a DiffTree into a slice of FileDiffFile for UI rendering
73+
// WebDiffFileTree is used by frontend, check the field names in frontend before changing
74+
type WebDiffFileTree struct {
75+
TreeRoot WebDiffFileItem
76+
}
77+
78+
// transformDiffTreeForWeb transforms a gitdiff.DiffTree into a WebDiffFileTree for Web UI rendering
6979
// it also takes a map of file names to their viewed state, which is used to mark files as viewed
70-
func transformDiffTreeForUI(diffTree *gitdiff.DiffTree, filesViewedState map[string]pull_model.ViewedState) []FileDiffFile {
71-
files := make([]FileDiffFile, 0, len(diffTree.Files))
80+
func transformDiffTreeForWeb(diffTree *gitdiff.DiffTree, filesViewedState map[string]pull_model.ViewedState) (dft WebDiffFileTree) {
81+
dirNodes := map[string]*WebDiffFileItem{"": &dft.TreeRoot}
82+
addItem := func(item *WebDiffFileItem) {
83+
var parentPath string
84+
pos := strings.LastIndexByte(item.FullName, '/')
85+
if pos == -1 {
86+
item.DisplayName = item.FullName
87+
} else {
88+
parentPath = item.FullName[:pos]
89+
item.DisplayName = item.FullName[pos+1:]
90+
}
91+
parentNode, parentExists := dirNodes[parentPath]
92+
if !parentExists {
93+
parentNode = &dft.TreeRoot
94+
fields := strings.Split(parentPath, "/")
95+
for idx, field := range fields {
96+
nodePath := strings.Join(fields[:idx+1], "/")
97+
node, ok := dirNodes[nodePath]
98+
if !ok {
99+
node = &WebDiffFileItem{EntryMode: "tree", DisplayName: field, FullName: nodePath}
100+
dirNodes[nodePath] = node
101+
parentNode.Children = append(parentNode.Children, node)
102+
}
103+
parentNode = node
104+
}
105+
}
106+
parentNode.Children = append(parentNode.Children, item)
107+
}
72108

73109
for _, file := range diffTree.Files {
74-
nameHash := git.HashFilePathForWebUI(file.HeadPath)
75-
isSubmodule := file.HeadMode == git.EntryModeCommit
76-
isViewed := filesViewedState[file.HeadPath] == pull_model.Viewed
77-
78-
files = append(files, FileDiffFile{
79-
Name: file.HeadPath,
80-
NameHash: nameHash,
81-
IsSubmodule: isSubmodule,
82-
IsViewed: isViewed,
83-
Status: file.Status,
84-
})
110+
item := &WebDiffFileItem{FullName: file.HeadPath, DiffStatus: file.Status}
111+
item.IsViewed = filesViewedState[item.FullName] == pull_model.Viewed
112+
item.NameHash = git.HashFilePathForWebUI(item.FullName)
113+
114+
switch file.HeadMode {
115+
case git.EntryModeTree:
116+
item.EntryMode = "tree"
117+
case git.EntryModeCommit:
118+
item.EntryMode = "commit" // submodule
119+
default:
120+
// default to empty, and will be treated as "blob" file because there is no "symlink" support yet
121+
}
122+
addItem(item)
85123
}
86124

87-
return files
125+
var mergeSingleDir func(node *WebDiffFileItem)
126+
mergeSingleDir = func(node *WebDiffFileItem) {
127+
if len(node.Children) == 1 {
128+
if child := node.Children[0]; child.EntryMode == "tree" {
129+
node.FullName = child.FullName
130+
node.DisplayName = node.DisplayName + "/" + child.DisplayName
131+
node.Children = child.Children
132+
mergeSingleDir(node)
133+
}
134+
}
135+
}
136+
for _, node := range dft.TreeRoot.Children {
137+
mergeSingleDir(node)
138+
}
139+
return dft
88140
}
89141

90142
func TreeViewNodes(ctx *context.Context) {

routers/web/repo/treelist_test.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Copyright 2025 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package repo
5+
6+
import (
7+
"testing"
8+
9+
pull_model "code.gitea.io/gitea/models/pull"
10+
"code.gitea.io/gitea/modules/git"
11+
"code.gitea.io/gitea/services/gitdiff"
12+
13+
"github.com/stretchr/testify/assert"
14+
)
15+
16+
func TestTransformDiffTreeForWeb(t *testing.T) {
17+
ret := transformDiffTreeForWeb(&gitdiff.DiffTree{Files: []*gitdiff.DiffTreeRecord{
18+
{
19+
Status: "changed",
20+
HeadPath: "dir-a/dir-a-x/file-deep",
21+
HeadMode: git.EntryModeBlob,
22+
},
23+
{
24+
Status: "added",
25+
HeadPath: "file1",
26+
HeadMode: git.EntryModeBlob,
27+
},
28+
}}, map[string]pull_model.ViewedState{
29+
"dir-a/dir-a-x/file-deep": pull_model.Viewed,
30+
})
31+
32+
assert.Equal(t, WebDiffFileTree{
33+
TreeRoot: WebDiffFileItem{
34+
Children: []*WebDiffFileItem{
35+
{
36+
EntryMode: "tree",
37+
DisplayName: "dir-a/dir-a-x",
38+
FullName: "dir-a/dir-a-x",
39+
Children: []*WebDiffFileItem{
40+
{
41+
EntryMode: "",
42+
DisplayName: "file-deep",
43+
FullName: "dir-a/dir-a-x/file-deep",
44+
NameHash: "4acf7eef1c943a09e9f754e93ff190db8583236b",
45+
DiffStatus: "changed",
46+
IsViewed: true,
47+
},
48+
},
49+
},
50+
{
51+
EntryMode: "",
52+
DisplayName: "file1",
53+
FullName: "file1",
54+
NameHash: "60b27f004e454aca81b0480209cce5081ec52390",
55+
DiffStatus: "added",
56+
},
57+
},
58+
},
59+
}, ret)
60+
}

services/gitdiff/gitdiff.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1337,10 +1337,13 @@ func GetDiffShortStat(gitRepo *git.Repository, beforeCommitID, afterCommitID str
13371337

13381338
// SyncUserSpecificDiff inserts user-specific data such as which files the user has already viewed on the given diff
13391339
// Additionally, the database is updated asynchronously if files have changed since the last review
1340-
func SyncUserSpecificDiff(ctx context.Context, userID int64, pull *issues_model.PullRequest, gitRepo *git.Repository, diff *Diff, opts *DiffOptions, files ...string) error {
1340+
func SyncUserSpecificDiff(ctx context.Context, userID int64, pull *issues_model.PullRequest, gitRepo *git.Repository, diff *Diff, opts *DiffOptions) (*pull_model.ReviewState, error) {
13411341
review, err := pull_model.GetNewestReviewState(ctx, userID, pull.ID)
1342-
if err != nil || review == nil || review.UpdatedFiles == nil {
1343-
return err
1342+
if err != nil {
1343+
return nil, err
1344+
}
1345+
if review == nil || len(review.UpdatedFiles) == 0 {
1346+
return review, nil
13441347
}
13451348

13461349
latestCommit := opts.AfterCommitID
@@ -1393,11 +1396,11 @@ outer:
13931396
err := pull_model.UpdateReviewState(ctx, review.UserID, review.PullID, review.CommitSHA, filesChangedSinceLastDiff)
13941397
if err != nil {
13951398
log.Warn("Could not update review for user %d, pull %d, commit %s and the changed files %v: %v", review.UserID, review.PullID, review.CommitSHA, filesChangedSinceLastDiff, err)
1396-
return err
1399+
return nil, err
13971400
}
13981401
}
13991402

1400-
return nil
1403+
return review, err
14011404
}
14021405

14031406
// CommentAsDiff returns c.Patch as *Diff

templates/admin/user/view.tmpl

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,30 +15,21 @@
1515
</div>
1616
<div class="tw-flex-1">
1717
<h4 class="ui top attached header">
18-
{{ctx.Locale.Tr "admin.emails"}}
19-
<div class="ui right">
20-
{{.EmailsTotal}}
21-
</div>
18+
{{ctx.Locale.Tr "admin.emails"}} ({{ctx.Locale.Tr "admin.total" .EmailsTotal}})
2219
</h4>
2320
<div class="ui attached segment">
2421
{{template "admin/user/view_emails" .}}
2522
</div>
2623
</div>
2724
</div>
2825
<h4 class="ui top attached header">
29-
{{ctx.Locale.Tr "admin.repositories"}}
30-
<div class="ui right">
31-
{{.ReposTotal}}
32-
</div>
26+
{{ctx.Locale.Tr "admin.repositories"}} ({{ctx.Locale.Tr "admin.total" .ReposTotal}})
3327
</h4>
3428
<div class="ui attached segment">
3529
{{template "explore/repo_list" .}}
3630
</div>
3731
<h4 class="ui top attached header">
38-
{{ctx.Locale.Tr "settings.organization"}}
39-
<div class="ui right">
40-
{{.OrgsTotal}}
41-
</div>
32+
{{ctx.Locale.Tr "settings.organization"}} ({{ctx.Locale.Tr "admin.total" .OrgsTotal}})
4233
</h4>
4334
<div class="ui attached segment">
4435
{{template "explore/user_list" .}}

templates/org/create.tmpl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@
1818
<label for="visibility">{{ctx.Locale.Tr "org.settings.visibility"}}</label>
1919
<div class="inline-right">
2020
<div class="ui radio checkbox">
21-
<input class="enable-system-radio" name="visibility" type="radio" value="0" {{if .DefaultOrgVisibilityMode.IsPublic}}checked{{end}}>
21+
<input class="enable-system-radio" name="visibility" type="radio" value="0" {{if .visibility.IsPublic}}checked{{end}}>
2222
<label>{{ctx.Locale.Tr "org.settings.visibility.public"}}</label>
2323
</div>
2424
<div class="ui radio checkbox">
25-
<input class="enable-system-radio" name="visibility" type="radio" value="1" {{if .DefaultOrgVisibilityMode.IsLimited}}checked{{end}}>
25+
<input class="enable-system-radio" name="visibility" type="radio" value="1" {{if .visibility.IsLimited}}checked{{end}}>
2626
<label>{{ctx.Locale.Tr "org.settings.visibility.limited"}}</label>
2727
</div>
2828
<div class="ui radio checkbox">
29-
<input class="enable-system-radio" name="visibility" type="radio" value="2" {{if .DefaultOrgVisibilityMode.IsPrivate}}checked{{end}}>
29+
<input class="enable-system-radio" name="visibility" type="radio" value="2" {{if .visibility.IsPrivate}}checked{{end}}>
3030
<label>{{ctx.Locale.Tr "org.settings.visibility.private"}}</label>
3131
</div>
3232
</div>
@@ -35,7 +35,7 @@
3535
<div class="inline field" id="permission_box">
3636
<label>{{ctx.Locale.Tr "org.settings.permission"}}</label>
3737
<div class="ui checkbox">
38-
<input type="checkbox" name="repo_admin_change_team_access" checked>
38+
<input type="checkbox" name="repo_admin_change_team_access" {{if .repo_admin_change_team_access}}checked{{end}}>
3939
<label>{{ctx.Locale.Tr "org.settings.repoadminchangeteam"}}</label>
4040
</div>
4141
</div>

0 commit comments

Comments
 (0)