Skip to content

Commit bdd5c10

Browse files
committed
Merge remote-tracking branch 'giteaofficial/main'
* giteaofficial/main: [skip ci] Updated translations via Crowdin Improve Actions test (go-gitea#32883) Support org labels when adding labels by label names (go-gitea#32988) Add `show more` organizations icon in user's profile (go-gitea#32986) Improve "ellipsis string" (go-gitea#32989) Refactor "string truncate" (go-gitea#32984)
2 parents 0fb6f40 + 3c00e89 commit bdd5c10

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+1087
-173
lines changed

custom/conf/app.example.ini

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1339,6 +1339,9 @@ LEVEL = Info
13391339
;; Number of repos that are displayed on one page
13401340
;REPO_PAGING_NUM = 15
13411341

1342+
;; Number of orgs that are displayed on profile page
1343+
;ORG_PAGING_NUM = 15
1344+
13421345
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13431346
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13441347
;[ui.meta]

models/actions/run.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ func InsertRun(ctx context.Context, run *ActionRun, jobs []*jobparser.SingleWork
275275
return err
276276
}
277277
run.Index = index
278-
run.Title, _ = util.SplitStringAtByteN(run.Title, 255)
278+
run.Title = util.EllipsisDisplayString(run.Title, 255)
279279

280280
if err := db.Insert(ctx, run); err != nil {
281281
return err
@@ -308,7 +308,7 @@ func InsertRun(ctx context.Context, run *ActionRun, jobs []*jobparser.SingleWork
308308
} else {
309309
hasWaiting = true
310310
}
311-
job.Name, _ = util.SplitStringAtByteN(job.Name, 255)
311+
job.Name = util.EllipsisDisplayString(job.Name, 255)
312312
runJobs = append(runJobs, &ActionRunJob{
313313
RunID: run.ID,
314314
RepoID: run.RepoID,
@@ -402,7 +402,7 @@ func UpdateRun(ctx context.Context, run *ActionRun, cols ...string) error {
402402
if len(cols) > 0 {
403403
sess.Cols(cols...)
404404
}
405-
run.Title, _ = util.SplitStringAtByteN(run.Title, 255)
405+
run.Title = util.EllipsisDisplayString(run.Title, 255)
406406
affected, err := sess.Update(run)
407407
if err != nil {
408408
return err

models/actions/runner.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ func GetRunnerByID(ctx context.Context, id int64) (*ActionRunner, error) {
252252
// UpdateRunner updates runner's information.
253253
func UpdateRunner(ctx context.Context, r *ActionRunner, cols ...string) error {
254254
e := db.GetEngine(ctx)
255-
r.Name, _ = util.SplitStringAtByteN(r.Name, 255)
255+
r.Name = util.EllipsisDisplayString(r.Name, 255)
256256
var err error
257257
if len(cols) == 0 {
258258
_, err = e.ID(r.ID).AllCols().Update(r)
@@ -279,7 +279,7 @@ func CreateRunner(ctx context.Context, t *ActionRunner) error {
279279
// Remove OwnerID to avoid confusion; it's not worth returning an error here.
280280
t.OwnerID = 0
281281
}
282-
t.Name, _ = util.SplitStringAtByteN(t.Name, 255)
282+
t.Name = util.EllipsisDisplayString(t.Name, 255)
283283
return db.Insert(ctx, t)
284284
}
285285

models/actions/runner_token.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"code.gitea.io/gitea/models/db"
1111
repo_model "code.gitea.io/gitea/models/repo"
1212
user_model "code.gitea.io/gitea/models/user"
13-
"code.gitea.io/gitea/modules/base"
1413
"code.gitea.io/gitea/modules/timeutil"
1514
"code.gitea.io/gitea/modules/util"
1615
)
@@ -52,7 +51,7 @@ func GetRunnerToken(ctx context.Context, token string) (*ActionRunnerToken, erro
5251
if err != nil {
5352
return nil, err
5453
} else if !has {
55-
return nil, fmt.Errorf(`runner token "%s...": %w`, base.TruncateString(token, 3), util.ErrNotExist)
54+
return nil, fmt.Errorf(`runner token "%s...": %w`, util.TruncateRunes(token, 3), util.ErrNotExist)
5655
}
5756
return &runnerToken, nil
5857
}

models/actions/schedule.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func CreateScheduleTask(ctx context.Context, rows []*ActionSchedule) error {
6868

6969
// Loop through each schedule row
7070
for _, row := range rows {
71-
row.Title, _ = util.SplitStringAtByteN(row.Title, 255)
71+
row.Title = util.EllipsisDisplayString(row.Title, 255)
7272
// Create new schedule row
7373
if err = db.Insert(ctx, row); err != nil {
7474
return err

models/actions/task.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ func CreateTaskForRunner(ctx context.Context, runner *ActionRunner) (*ActionTask
298298
if len(workflowJob.Steps) > 0 {
299299
steps := make([]*ActionTaskStep, len(workflowJob.Steps))
300300
for i, v := range workflowJob.Steps {
301-
name, _ := util.SplitStringAtByteN(v.String(), 255)
301+
name := util.EllipsisDisplayString(v.String(), 255)
302302
steps[i] = &ActionTaskStep{
303303
Name: name,
304304
TaskID: task.ID,

models/activities/action.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ import (
2020
repo_model "code.gitea.io/gitea/models/repo"
2121
"code.gitea.io/gitea/models/unit"
2222
user_model "code.gitea.io/gitea/models/user"
23-
"code.gitea.io/gitea/modules/base"
2423
"code.gitea.io/gitea/modules/git"
2524
"code.gitea.io/gitea/modules/log"
2625
"code.gitea.io/gitea/modules/setting"
2726
"code.gitea.io/gitea/modules/structs"
2827
"code.gitea.io/gitea/modules/timeutil"
28+
"code.gitea.io/gitea/modules/util"
2929

3030
"xorm.io/builder"
3131
"xorm.io/xorm/schemas"
@@ -226,7 +226,7 @@ func (a *Action) GetActUserName(ctx context.Context) string {
226226
// ShortActUserName gets the action's user name trimmed to max 20
227227
// chars.
228228
func (a *Action) ShortActUserName(ctx context.Context) string {
229-
return base.EllipsisString(a.GetActUserName(ctx), 20)
229+
return util.EllipsisDisplayString(a.GetActUserName(ctx), 20)
230230
}
231231

232232
// GetActDisplayName gets the action's display name based on DEFAULT_SHOW_FULL_NAME, or falls back to the username if it is blank.
@@ -260,7 +260,7 @@ func (a *Action) GetRepoUserName(ctx context.Context) string {
260260
// ShortRepoUserName returns the name of the action repository owner
261261
// trimmed to max 20 chars.
262262
func (a *Action) ShortRepoUserName(ctx context.Context) string {
263-
return base.EllipsisString(a.GetRepoUserName(ctx), 20)
263+
return util.EllipsisDisplayString(a.GetRepoUserName(ctx), 20)
264264
}
265265

266266
// GetRepoName returns the name of the action repository.
@@ -275,7 +275,7 @@ func (a *Action) GetRepoName(ctx context.Context) string {
275275
// ShortRepoName returns the name of the action repository
276276
// trimmed to max 33 chars.
277277
func (a *Action) ShortRepoName(ctx context.Context) string {
278-
return base.EllipsisString(a.GetRepoName(ctx), 33)
278+
return util.EllipsisDisplayString(a.GetRepoName(ctx), 33)
279279
}
280280

281281
// GetRepoPath returns the virtual path to the action repository.

models/fixtures/label.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,14 @@
9696
num_issues: 0
9797
num_closed_issues: 0
9898
archived_unix: 0
99+
100+
-
101+
id: 10
102+
repo_id: 3
103+
org_id: 0
104+
name: repo3label1
105+
color: '#112233'
106+
exclusive: false
107+
num_issues: 0
108+
num_closed_issues: 0
109+
archived_unix: 0

models/issues/issue_update.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ func ChangeIssueTitle(ctx context.Context, issue *Issue, doer *user_model.User,
177177
}
178178
defer committer.Close()
179179

180-
issue.Title, _ = util.SplitStringAtByteN(issue.Title, 255)
180+
issue.Title = util.EllipsisDisplayString(issue.Title, 255)
181181
if err = UpdateIssueCols(ctx, issue, "name"); err != nil {
182182
return fmt.Errorf("updateIssueCols: %w", err)
183183
}
@@ -440,7 +440,7 @@ func NewIssue(ctx context.Context, repo *repo_model.Repository, issue *Issue, la
440440
}
441441

442442
issue.Index = idx
443-
issue.Title, _ = util.SplitStringAtByteN(issue.Title, 255)
443+
issue.Title = util.EllipsisDisplayString(issue.Title, 255)
444444

445445
if err = NewIssueWithIndex(ctx, issue.Poster, NewIssueOptions{
446446
Repo: repo,

models/issues/label.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,17 @@ func GetLabelIDsInRepoByNames(ctx context.Context, repoID int64, labelNames []st
349349
Find(&labelIDs)
350350
}
351351

352+
// GetLabelIDsInOrgByNames returns a list of labelIDs by names in a given org.
353+
func GetLabelIDsInOrgByNames(ctx context.Context, orgID int64, labelNames []string) ([]int64, error) {
354+
labelIDs := make([]int64, 0, len(labelNames))
355+
return labelIDs, db.GetEngine(ctx).Table("label").
356+
Where("org_id = ?", orgID).
357+
In("name", labelNames).
358+
Asc("name").
359+
Cols("id").
360+
Find(&labelIDs)
361+
}
362+
352363
// BuildLabelNamesIssueIDsCondition returns a builder where get issue ids match label names
353364
func BuildLabelNamesIssueIDsCondition(labelNames []string) *builder.Builder {
354365
return builder.Select("issue_label.issue_id").

models/issues/pull.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ func NewPullRequest(ctx context.Context, repo *repo_model.Repository, issue *Iss
572572
}
573573

574574
issue.Index = idx
575-
issue.Title, _ = util.SplitStringAtByteN(issue.Title, 255)
575+
issue.Title = util.EllipsisDisplayString(issue.Title, 255)
576576

577577
if err = NewIssueWithIndex(ctx, issue.Poster, NewIssueOptions{
578578
Repo: repo,

models/project/project.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ func NewProject(ctx context.Context, p *Project) error {
256256
return util.NewInvalidArgumentErrorf("project type is not valid")
257257
}
258258

259-
p.Title, _ = util.SplitStringAtByteN(p.Title, 255)
259+
p.Title = util.EllipsisDisplayString(p.Title, 255)
260260

261261
return db.WithTx(ctx, func(ctx context.Context) error {
262262
if err := db.Insert(ctx, p); err != nil {
@@ -311,7 +311,7 @@ func UpdateProject(ctx context.Context, p *Project) error {
311311
p.CardType = CardTypeTextOnly
312312
}
313313

314-
p.Title, _ = util.SplitStringAtByteN(p.Title, 255)
314+
p.Title = util.EllipsisDisplayString(p.Title, 255)
315315
_, err := db.GetEngine(ctx).ID(p.ID).Cols(
316316
"title",
317317
"description",

models/repo/release.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ func IsReleaseExist(ctx context.Context, repoID int64, tagName string) (bool, er
156156

157157
// UpdateRelease updates all columns of a release
158158
func UpdateRelease(ctx context.Context, rel *Release) error {
159-
rel.Title, _ = util.SplitStringAtByteN(rel.Title, 255)
159+
rel.Title = util.EllipsisDisplayString(rel.Title, 255)
160160
_, err := db.GetEngine(ctx).ID(rel.ID).AllCols().Update(rel)
161161
return err
162162
}

models/user/user.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,9 @@ func (u *User) BeforeUpdate() {
190190
}
191191

192192
u.LowerName = strings.ToLower(u.Name)
193-
u.Location = base.TruncateString(u.Location, 255)
194-
u.Website = base.TruncateString(u.Website, 255)
195-
u.Description = base.TruncateString(u.Description, 255)
193+
u.Location = util.TruncateRunes(u.Location, 255)
194+
u.Website = util.TruncateRunes(u.Website, 255)
195+
u.Description = util.TruncateRunes(u.Description, 255)
196196
}
197197

198198
// AfterLoad is invoked from XORM after filling all the fields of this object.
@@ -501,9 +501,9 @@ func (u *User) GitName() string {
501501
// ShortName ellipses username to length
502502
func (u *User) ShortName(length int) string {
503503
if setting.UI.DefaultShowFullName && len(u.FullName) > 0 {
504-
return base.EllipsisString(u.FullName, length)
504+
return util.EllipsisDisplayString(u.FullName, length)
505505
}
506-
return base.EllipsisString(u.Name, length)
506+
return util.EllipsisDisplayString(u.Name, length)
507507
}
508508

509509
// IsMailable checks if a user is eligible

modules/base/tool.go

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ import (
1616
"strconv"
1717
"strings"
1818
"time"
19-
"unicode/utf8"
2019

2120
"code.gitea.io/gitea/modules/git"
2221
"code.gitea.io/gitea/modules/log"
2322
"code.gitea.io/gitea/modules/setting"
23+
"code.gitea.io/gitea/modules/util"
2424

2525
"github.com/dustin/go-humanize"
2626
)
@@ -35,7 +35,7 @@ func EncodeSha256(str string) string {
3535
// ShortSha is basically just truncating.
3636
// It is DEPRECATED and will be removed in the future.
3737
func ShortSha(sha1 string) string {
38-
return TruncateString(sha1, 10)
38+
return util.TruncateRunes(sha1, 10)
3939
}
4040

4141
// BasicAuthDecode decode basic auth string
@@ -116,27 +116,6 @@ func FileSize(s int64) string {
116116
return humanize.IBytes(uint64(s))
117117
}
118118

119-
// EllipsisString returns a truncated short string,
120-
// it appends '...' in the end of the length of string is too large.
121-
func EllipsisString(str string, length int) string {
122-
if length <= 3 {
123-
return "..."
124-
}
125-
if utf8.RuneCountInString(str) <= length {
126-
return str
127-
}
128-
return string([]rune(str)[:length-3]) + "..."
129-
}
130-
131-
// TruncateString returns a truncated string with given limit,
132-
// it returns input string if length is not reached limit.
133-
func TruncateString(str string, limit int) string {
134-
if utf8.RuneCountInString(str) < limit {
135-
return str
136-
}
137-
return string([]rune(str)[:limit])
138-
}
139-
140119
// StringsToInt64s converts a slice of string to a slice of int64.
141120
func StringsToInt64s(strs []string) ([]int64, error) {
142121
if strs == nil {

modules/base/tool_test.go

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -113,36 +113,6 @@ func TestFileSize(t *testing.T) {
113113
assert.Equal(t, "2.0 EiB", FileSize(size))
114114
}
115115

116-
func TestEllipsisString(t *testing.T) {
117-
assert.Equal(t, "...", EllipsisString("foobar", 0))
118-
assert.Equal(t, "...", EllipsisString("foobar", 1))
119-
assert.Equal(t, "...", EllipsisString("foobar", 2))
120-
assert.Equal(t, "...", EllipsisString("foobar", 3))
121-
assert.Equal(t, "f...", EllipsisString("foobar", 4))
122-
assert.Equal(t, "fo...", EllipsisString("foobar", 5))
123-
assert.Equal(t, "foobar", EllipsisString("foobar", 6))
124-
assert.Equal(t, "foobar", EllipsisString("foobar", 10))
125-
assert.Equal(t, "测...", EllipsisString("测试文本一二三四", 4))
126-
assert.Equal(t, "测试...", EllipsisString("测试文本一二三四", 5))
127-
assert.Equal(t, "测试文...", EllipsisString("测试文本一二三四", 6))
128-
assert.Equal(t, "测试文本一二三四", EllipsisString("测试文本一二三四", 10))
129-
}
130-
131-
func TestTruncateString(t *testing.T) {
132-
assert.Equal(t, "", TruncateString("foobar", 0))
133-
assert.Equal(t, "f", TruncateString("foobar", 1))
134-
assert.Equal(t, "fo", TruncateString("foobar", 2))
135-
assert.Equal(t, "foo", TruncateString("foobar", 3))
136-
assert.Equal(t, "foob", TruncateString("foobar", 4))
137-
assert.Equal(t, "fooba", TruncateString("foobar", 5))
138-
assert.Equal(t, "foobar", TruncateString("foobar", 6))
139-
assert.Equal(t, "foobar", TruncateString("foobar", 7))
140-
assert.Equal(t, "测试文本", TruncateString("测试文本一二三四", 4))
141-
assert.Equal(t, "测试文本一", TruncateString("测试文本一二三四", 5))
142-
assert.Equal(t, "测试文本一二", TruncateString("测试文本一二三四", 6))
143-
assert.Equal(t, "测试文本一二三", TruncateString("测试文本一二三四", 7))
144-
}
145-
146116
func TestStringsToInt64s(t *testing.T) {
147117
testSuccess := func(input []string, expected []int64) {
148118
result, err := StringsToInt64s(input)

modules/issue/template/unmarshal.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ func unmarshal(filename string, content []byte) (*api.IssueTemplate, error) {
109109

110110
it.Content = string(content)
111111
it.Name = path.Base(it.FileName) // paths in Git are always '/' separated - do not use filepath!
112-
it.About, _ = util.SplitStringAtByteN(it.Content, 80)
112+
it.About = util.EllipsisDisplayString(it.Content, 80)
113113
} else {
114114
it.Content = templateBody
115115
if it.About == "" {

modules/markup/html_link.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ func linkProcessor(ctx *RenderContext, node *html.Node) {
173173

174174
uri := node.Data[m[0]:m[1]]
175175
remaining := node.Data[m[1]:]
176-
if util.IsLikelySplitLeftPart(remaining) {
176+
if util.IsLikelyEllipsisLeftPart(remaining) {
177177
return
178178
}
179179
replaceContent(node, m[0], m[1], createLink(ctx, uri, uri, "" /*link*/))

modules/markup/html_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -207,12 +207,12 @@ func TestRender_links(t *testing.T) {
207207
"ftps://gitea.com",
208208
`<p>ftps://gitea.com</p>`)
209209

210-
t.Run("LinkSplit", func(t *testing.T) {
211-
input, _ := util.SplitStringAtByteN("http://10.1.2.3", 12)
210+
t.Run("LinkEllipsis", func(t *testing.T) {
211+
input := util.EllipsisDisplayString("http://10.1.2.3", 12)
212212
assert.Equal(t, "http://10…", input)
213213
test(input, "<p>http://10…</p>")
214214

215-
input, _ = util.SplitStringAtByteN("http://10.1.2.3", 13)
215+
input = util.EllipsisDisplayString("http://10.1.2.3", 13)
216216
assert.Equal(t, "http://10.…", input)
217217
test(input, "<p>http://10.…</p>")
218218
})

modules/setting/ui.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ var UI = struct {
6363
} `ini:"ui.admin"`
6464
User struct {
6565
RepoPagingNum int
66+
OrgPagingNum int
6667
} `ini:"ui.user"`
6768
Meta struct {
6869
Author string
@@ -127,8 +128,10 @@ var UI = struct {
127128
},
128129
User: struct {
129130
RepoPagingNum int
131+
OrgPagingNum int
130132
}{
131133
RepoPagingNum: 15,
134+
OrgPagingNum: 15,
132135
},
133136
Meta: struct {
134137
Author string

0 commit comments

Comments
 (0)