Skip to content

Commit 0e173c2

Browse files
authored
Merge branch 'main' into lunny/storage_bug_fix
2 parents f7b93f3 + 6a4be2c commit 0e173c2

File tree

5 files changed

+126
-7
lines changed

5 files changed

+126
-7
lines changed
+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package git
5+
6+
import (
7+
"fmt"
8+
"testing"
9+
10+
"github.com/stretchr/testify/assert"
11+
)
12+
13+
func TestBranchRuleMatchPriority(t *testing.T) {
14+
kases := []struct {
15+
Rules []string
16+
BranchName string
17+
ExpectedMatchIdx int
18+
}{
19+
{
20+
Rules: []string{"release/*", "release/v1.17"},
21+
BranchName: "release/v1.17",
22+
ExpectedMatchIdx: 1,
23+
},
24+
{
25+
Rules: []string{"release/v1.17", "release/*"},
26+
BranchName: "release/v1.17",
27+
ExpectedMatchIdx: 0,
28+
},
29+
{
30+
Rules: []string{"release/**/v1.17", "release/test/v1.17"},
31+
BranchName: "release/test/v1.17",
32+
ExpectedMatchIdx: 1,
33+
},
34+
{
35+
Rules: []string{"release/test/v1.17", "release/**/v1.17"},
36+
BranchName: "release/test/v1.17",
37+
ExpectedMatchIdx: 0,
38+
},
39+
{
40+
Rules: []string{"release/**", "release/v1.0.0"},
41+
BranchName: "release/v1.0.0",
42+
ExpectedMatchIdx: 1,
43+
},
44+
{
45+
Rules: []string{"release/v1.0.0", "release/**"},
46+
BranchName: "release/v1.0.0",
47+
ExpectedMatchIdx: 0,
48+
},
49+
{
50+
Rules: []string{"release/**", "release/v1.0.0"},
51+
BranchName: "release/v2.0.0",
52+
ExpectedMatchIdx: 0,
53+
},
54+
{
55+
Rules: []string{"release/*", "release/v1.0.0"},
56+
BranchName: "release/1/v2.0.0",
57+
ExpectedMatchIdx: -1,
58+
},
59+
}
60+
61+
for _, kase := range kases {
62+
var pbs ProtectedBranchRules
63+
for _, rule := range kase.Rules {
64+
pbs = append(pbs, &ProtectedBranch{RuleName: rule})
65+
}
66+
pbs.sort()
67+
matchedPB := pbs.GetFirstMatched(kase.BranchName)
68+
if matchedPB == nil {
69+
if kase.ExpectedMatchIdx >= 0 {
70+
assert.Error(t, fmt.Errorf("no matched rules but expected %s[%d]", kase.Rules[kase.ExpectedMatchIdx], kase.ExpectedMatchIdx))
71+
}
72+
} else {
73+
assert.EqualValues(t, kase.Rules[kase.ExpectedMatchIdx], matchedPB.RuleName)
74+
}
75+
}
76+
}

models/git/protected_branch_list.go

+3-7
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,8 @@ func (rules ProtectedBranchRules) sort() {
2828
sort.Slice(rules, func(i, j int) bool {
2929
rules[i].loadGlob()
3030
rules[j].loadGlob()
31-
if rules[i].isPlainName {
32-
if !rules[j].isPlainName {
33-
return true
34-
}
35-
} else if rules[j].isPlainName {
36-
return true
31+
if rules[i].isPlainName != rules[j].isPlainName {
32+
return rules[i].isPlainName // plain name comes first, so plain name means "less"
3733
}
3834
return rules[i].CreatedUnix < rules[j].CreatedUnix
3935
})
@@ -46,7 +42,7 @@ func FindRepoProtectedBranchRules(ctx context.Context, repoID int64) (ProtectedB
4642
if err != nil {
4743
return nil, err
4844
}
49-
rules.sort()
45+
rules.sort() // to make non-glob rules have higher priority, and for same glob/non-glob rules, first created rules have higher priority
5046
return rules, nil
5147
}
5248

routers/web/org/projects.go

+22
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
issues_model "code.gitea.io/gitea/models/issues"
1515
project_model "code.gitea.io/gitea/models/project"
16+
attachment_model "code.gitea.io/gitea/models/repo"
1617
"code.gitea.io/gitea/models/unit"
1718
"code.gitea.io/gitea/modules/base"
1819
"code.gitea.io/gitea/modules/context"
@@ -128,6 +129,7 @@ func canWriteProjects(ctx *context.Context) bool {
128129
func NewProject(ctx *context.Context) {
129130
ctx.Data["Title"] = ctx.Tr("repo.projects.new")
130131
ctx.Data["BoardTypes"] = project_model.GetBoardConfig()
132+
ctx.Data["CardTypes"] = project_model.GetCardConfig()
131133
ctx.Data["CanWriteProjects"] = canWriteProjects(ctx)
132134
ctx.Data["PageIsViewProjects"] = true
133135
ctx.Data["HomeLink"] = ctx.ContextUser.HomeLink()
@@ -145,6 +147,7 @@ func NewProjectPost(ctx *context.Context) {
145147
ctx.Data["CanWriteProjects"] = canWriteProjects(ctx)
146148
ctx.Data["PageIsViewProjects"] = true
147149
ctx.Data["BoardTypes"] = project_model.GetBoardConfig()
150+
ctx.Data["CardTypes"] = project_model.GetCardConfig()
148151
ctx.HTML(http.StatusOK, tplProjectsNew)
149152
return
150153
}
@@ -155,6 +158,7 @@ func NewProjectPost(ctx *context.Context) {
155158
Description: form.Content,
156159
CreatorID: ctx.Doer.ID,
157160
BoardType: form.BoardType,
161+
CardType: form.CardType,
158162
}
159163

160164
if ctx.ContextUser.IsOrganization() {
@@ -229,6 +233,8 @@ func EditProject(ctx *context.Context) {
229233
ctx.Data["PageIsEditProjects"] = true
230234
ctx.Data["PageIsViewProjects"] = true
231235
ctx.Data["CanWriteProjects"] = canWriteProjects(ctx)
236+
ctx.Data["CardTypes"] = project_model.GetCardConfig()
237+
232238
shared_user.RenderUserHeader(ctx)
233239

234240
p, err := project_model.GetProjectByID(ctx, ctx.ParamsInt64(":id"))
@@ -250,6 +256,7 @@ func EditProject(ctx *context.Context) {
250256
ctx.Data["content"] = p.Description
251257
ctx.Data["redirect"] = ctx.FormString("redirect")
252258
ctx.Data["HomeLink"] = ctx.ContextUser.HomeLink()
259+
ctx.Data["card_type"] = p.CardType
253260

254261
ctx.HTML(http.StatusOK, tplProjectsNew)
255262
}
@@ -261,6 +268,8 @@ func EditProjectPost(ctx *context.Context) {
261268
ctx.Data["PageIsEditProjects"] = true
262269
ctx.Data["PageIsViewProjects"] = true
263270
ctx.Data["CanWriteProjects"] = canWriteProjects(ctx)
271+
ctx.Data["CardTypes"] = project_model.GetCardConfig()
272+
264273
shared_user.RenderUserHeader(ctx)
265274

266275
if ctx.HasError() {
@@ -284,6 +293,7 @@ func EditProjectPost(ctx *context.Context) {
284293

285294
p.Title = form.Title
286295
p.Description = form.Content
296+
p.CardType = form.CardType
287297
if err = project_model.UpdateProject(ctx, p); err != nil {
288298
ctx.ServerError("UpdateProjects", err)
289299
return
@@ -329,6 +339,18 @@ func ViewProject(ctx *context.Context) {
329339
return
330340
}
331341

342+
if project.CardType != project_model.CardTypeTextOnly {
343+
issuesAttachmentMap := make(map[int64][]*attachment_model.Attachment)
344+
for _, issuesList := range issuesMap {
345+
for _, issue := range issuesList {
346+
if issueAttachment, err := attachment_model.GetAttachmentsByIssueIDImagesLatest(ctx, issue.ID); err == nil {
347+
issuesAttachmentMap[issue.ID] = issueAttachment
348+
}
349+
}
350+
}
351+
ctx.Data["issuesAttachmentMap"] = issuesAttachmentMap
352+
}
353+
332354
linkedPrsMap := make(map[int64][]*issues_model.Issue)
333355
for _, issuesList := range issuesMap {
334356
for _, issue := range issuesList {

templates/projects/new.tmpl

+18
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,24 @@
4545
</div>
4646
</div>
4747
{{end}}
48+
49+
<div class="field">
50+
<label>{{.locale.Tr "repo.projects.card_type.desc"}}</label>
51+
<div class="ui selection dropdown">
52+
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
53+
{{range $element := .CardTypes}}
54+
{{if or (eq $.card_type $element.CardType) (and (not $.PageIsEditProjects) (eq $element.CardType 1))}}
55+
<input type="hidden" name="card_type" value="{{$element.CardType}}">
56+
<div class="default text">{{$.locale.Tr $element.Translation}}</div>
57+
{{end}}
58+
{{end}}
59+
<div class="menu">
60+
{{range $element := .CardTypes}}
61+
<div class="item" data-id="{{$element.CardType}}" data-value="{{$element.CardType}}">{{$.locale.Tr $element.Translation}}</div>
62+
{{end}}
63+
</div>
64+
</div>
65+
</div>
4866
</div>
4967
<div class="ui container">
5068
<div class="ui divider"></div>

templates/projects/view.tmpl

+7
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,13 @@
175175

176176
<!-- start issue card -->
177177
<div class="card board-card" data-issue="{{.ID}}">
178+
{{if eq $.Project.CardType 1}}{{/* Images and Text*/}}
179+
<div class="card-attachment-images">
180+
{{range (index $.issuesAttachmentMap .ID)}}
181+
<img src="{{.DownloadURL}}" alt="{{.Name}}" />
182+
{{end}}
183+
</div>
184+
{{end}}
178185
<div class="content gt-p-0">
179186
<div class="header">
180187
<span class="gt-dif gt-ac gt-vm {{if .IsClosed}}red{{else}}green{{end}}">

0 commit comments

Comments
 (0)