Skip to content

Commit e5a9688

Browse files
committed
Merge remote-tracking branch 'giteaofficial/main'
* giteaofficial/main: Extract and display readme and comments for Composer packages (go-gitea#30927) Have new announcement about docs contributions (go-gitea#31364) Fix bug filtering issues which have no project (go-gitea#31337) Refactor to use UnsafeStringToBytes (go-gitea#31358) [skip ci] Updated translations via Crowdin Fix PullRequestList.GetIssueIDs's logic (go-gitea#31352) [Refactor] Unify repo search order by logic (go-gitea#30876)
2 parents 5b45fc8 + 4e7b067 commit e5a9688

File tree

20 files changed

+235
-142
lines changed

20 files changed

+235
-142
lines changed

.github/pull_request_template.md

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
<!-- start tips -->
1+
<!-- start tips -->
22
Please check the following:
33
1. Make sure you are targeting the `main` branch, pull requests on release branches are only allowed for backports.
44
2. Make sure you have read contributing guidelines: https://github.com/go-gitea/gitea/blob/main/CONTRIBUTING.md .
5-
3. Describe what your pull request does and which issue you're targeting (if any).
6-
4. It is recommended to enable "Allow edits by maintainers", so maintainers can help more easily.
7-
5. Your input here will be included in the commit message when this PR has been merged. If you don't want some content to be included, please separate them with a line like `---`.
8-
6. Delete all these tips before posting.
5+
3. For documentations contribution, please go to https://gitea.com/gitea/docs
6+
4. Describe what your pull request does and which issue you're targeting (if any).
7+
5. It is recommended to enable "Allow edits by maintainers", so maintainers can help more easily.
8+
6. Your input here will be included in the commit message when this PR has been merged. If you don't want some content to be included, please separate them with a line like `---`.
9+
7. Delete all these tips before posting.
910
<!-- end tips -->

CONTRIBUTING.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,8 @@ $REWRITTEN_PR_SUMMARY
358358

359359
## Documentation
360360

361-
If you add a new feature or change an existing aspect of Gitea, the documentation for that feature must be created or updated in the same PR.
361+
If you add a new feature or change an existing aspect of Gitea, the documentation for that feature must be created or updated in another PR at [https://gitea.com/gitea/docs](https://gitea.com/gitea/docs).
362+
**The docs directory on main repository will be removed at some time. We will have a yaml file to store configuration file's meta data. After that completed, configuration documentation should be in the main repository.**
362363

363364
## API v1
364365

models/db/search.go

-6
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,6 @@ const (
1818
SearchOrderByRecentUpdated SearchOrderBy = "updated_unix DESC"
1919
SearchOrderByOldest SearchOrderBy = "created_unix ASC"
2020
SearchOrderByNewest SearchOrderBy = "created_unix DESC"
21-
SearchOrderBySize SearchOrderBy = "size ASC"
22-
SearchOrderBySizeReverse SearchOrderBy = "size DESC"
23-
SearchOrderByGitSize SearchOrderBy = "git_size ASC"
24-
SearchOrderByGitSizeReverse SearchOrderBy = "git_size DESC"
25-
SearchOrderByLFSSize SearchOrderBy = "lfs_size ASC"
26-
SearchOrderByLFSSizeReverse SearchOrderBy = "lfs_size DESC"
2721
SearchOrderByID SearchOrderBy = "id ASC"
2822
SearchOrderByIDReverse SearchOrderBy = "id DESC"
2923
SearchOrderByStars SearchOrderBy = "num_stars ASC"

models/issues/pull_list.go

+5-6
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,10 @@ func (prs PullRequestList) LoadIssues(ctx context.Context) (IssueList, error) {
192192
return nil, nil
193193
}
194194

195-
// Load issues.
196-
issueIDs := prs.GetIssueIDs()
195+
// Load issues which are not loaded
196+
issueIDs := container.FilterSlice(prs, func(pr *PullRequest) (int64, bool) {
197+
return pr.IssueID, pr.Issue == nil && pr.IssueID > 0
198+
})
197199
issues := make(map[int64]*Issue, len(issueIDs))
198200
if err := db.GetEngine(ctx).
199201
In("id", issueIDs).
@@ -229,10 +231,7 @@ func (prs PullRequestList) LoadIssues(ctx context.Context) (IssueList, error) {
229231
// GetIssueIDs returns all issue ids
230232
func (prs PullRequestList) GetIssueIDs() []int64 {
231233
return container.FilterSlice(prs, func(pr *PullRequest) (int64, bool) {
232-
if pr.Issue == nil {
233-
return pr.IssueID, pr.IssueID > 0
234-
}
235-
return 0, false
234+
return pr.IssueID, pr.IssueID > 0
236235
})
237236
}
238237

models/repo/repo_list.go

-25
Original file line numberDiff line numberDiff line change
@@ -207,31 +207,6 @@ type SearchRepoOptions struct {
207207
OnlyShowRelevant bool
208208
}
209209

210-
// SearchOrderBy is used to sort the result
211-
type SearchOrderBy string
212-
213-
func (s SearchOrderBy) String() string {
214-
return string(s)
215-
}
216-
217-
// Strings for sorting result
218-
const (
219-
SearchOrderByAlphabetically SearchOrderBy = "name ASC"
220-
SearchOrderByAlphabeticallyReverse SearchOrderBy = "name DESC"
221-
SearchOrderByLeastUpdated SearchOrderBy = "updated_unix ASC"
222-
SearchOrderByRecentUpdated SearchOrderBy = "updated_unix DESC"
223-
SearchOrderByOldest SearchOrderBy = "created_unix ASC"
224-
SearchOrderByNewest SearchOrderBy = "created_unix DESC"
225-
SearchOrderBySize SearchOrderBy = "size ASC"
226-
SearchOrderBySizeReverse SearchOrderBy = "size DESC"
227-
SearchOrderByID SearchOrderBy = "id ASC"
228-
SearchOrderByIDReverse SearchOrderBy = "id DESC"
229-
SearchOrderByStars SearchOrderBy = "num_stars ASC"
230-
SearchOrderByStarsReverse SearchOrderBy = "num_stars DESC"
231-
SearchOrderByForks SearchOrderBy = "num_forks ASC"
232-
SearchOrderByForksReverse SearchOrderBy = "num_forks DESC"
233-
)
234-
235210
// UserOwnedRepoCond returns user ownered repositories
236211
func UserOwnedRepoCond(userID int64) builder.Cond {
237212
return builder.Eq{

models/repo/search.go

+62-10
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,72 @@ package repo
55

66
import "code.gitea.io/gitea/models/db"
77

8+
// Strings for sorting result
9+
const (
10+
// only used for repos
11+
SearchOrderByAlphabetically db.SearchOrderBy = "owner_name ASC, name ASC"
12+
SearchOrderByAlphabeticallyReverse db.SearchOrderBy = "owner_name DESC, name DESC"
13+
SearchOrderBySize db.SearchOrderBy = "size ASC"
14+
SearchOrderBySizeReverse db.SearchOrderBy = "size DESC"
15+
SearchOrderByGitSize db.SearchOrderBy = "git_size ASC"
16+
SearchOrderByGitSizeReverse db.SearchOrderBy = "git_size DESC"
17+
SearchOrderByLFSSize db.SearchOrderBy = "lfs_size ASC"
18+
SearchOrderByLFSSizeReverse db.SearchOrderBy = "lfs_size DESC"
19+
// alias as also used elsewhere
20+
SearchOrderByLeastUpdated db.SearchOrderBy = db.SearchOrderByLeastUpdated
21+
SearchOrderByRecentUpdated db.SearchOrderBy = db.SearchOrderByRecentUpdated
22+
SearchOrderByOldest db.SearchOrderBy = db.SearchOrderByOldest
23+
SearchOrderByNewest db.SearchOrderBy = db.SearchOrderByNewest
24+
SearchOrderByID db.SearchOrderBy = db.SearchOrderByID
25+
SearchOrderByIDReverse db.SearchOrderBy = db.SearchOrderByIDReverse
26+
SearchOrderByStars db.SearchOrderBy = db.SearchOrderByStars
27+
SearchOrderByStarsReverse db.SearchOrderBy = db.SearchOrderByStarsReverse
28+
SearchOrderByForks db.SearchOrderBy = db.SearchOrderByForks
29+
SearchOrderByForksReverse db.SearchOrderBy = db.SearchOrderByForksReverse
30+
)
31+
832
// SearchOrderByMap represents all possible search order
933
var SearchOrderByMap = map[string]map[string]db.SearchOrderBy{
1034
"asc": {
11-
"alpha": "owner_name ASC, name ASC",
12-
"created": db.SearchOrderByOldest,
13-
"updated": db.SearchOrderByLeastUpdated,
14-
"size": db.SearchOrderBySize,
15-
"id": db.SearchOrderByID,
35+
"alpha": SearchOrderByAlphabetically,
36+
"created": SearchOrderByOldest,
37+
"updated": SearchOrderByLeastUpdated,
38+
"size": SearchOrderBySize,
39+
"git_size": SearchOrderByGitSize,
40+
"lfs_size": SearchOrderByLFSSize,
41+
"id": SearchOrderByID,
42+
"stars": SearchOrderByStars,
43+
"forks": SearchOrderByForks,
1644
},
1745
"desc": {
18-
"alpha": "owner_name DESC, name DESC",
19-
"created": db.SearchOrderByNewest,
20-
"updated": db.SearchOrderByRecentUpdated,
21-
"size": db.SearchOrderBySizeReverse,
22-
"id": db.SearchOrderByIDReverse,
46+
"alpha": SearchOrderByAlphabeticallyReverse,
47+
"created": SearchOrderByNewest,
48+
"updated": SearchOrderByRecentUpdated,
49+
"size": SearchOrderBySizeReverse,
50+
"git_size": SearchOrderByGitSizeReverse,
51+
"lfs_size": SearchOrderByLFSSizeReverse,
52+
"id": SearchOrderByIDReverse,
53+
"stars": SearchOrderByStarsReverse,
54+
"forks": SearchOrderByForksReverse,
2355
},
2456
}
57+
58+
// SearchOrderByFlatMap is similar to SearchOrderByMap but use human language keywords
59+
// to decide between asc and desc
60+
var SearchOrderByFlatMap = map[string]db.SearchOrderBy{
61+
"newest": SearchOrderByMap["desc"]["created"],
62+
"oldest": SearchOrderByMap["asc"]["created"],
63+
"leastupdate": SearchOrderByMap["asc"]["updated"],
64+
"reversealphabetically": SearchOrderByMap["desc"]["alpha"],
65+
"alphabetically": SearchOrderByMap["asc"]["alpha"],
66+
"reversesize": SearchOrderByMap["desc"]["size"],
67+
"size": SearchOrderByMap["asc"]["size"],
68+
"reversegitsize": SearchOrderByMap["desc"]["git_size"],
69+
"gitsize": SearchOrderByMap["asc"]["git_size"],
70+
"reverselfssize": SearchOrderByMap["desc"]["lfs_size"],
71+
"lfssize": SearchOrderByMap["asc"]["lfs_size"],
72+
"moststars": SearchOrderByMap["desc"]["stars"],
73+
"feweststars": SearchOrderByMap["asc"]["stars"],
74+
"mostforks": SearchOrderByMap["desc"]["forks"],
75+
"fewestforks": SearchOrderByMap["asc"]["forks"],
76+
}

modules/indexer/issues/dboptions.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ func ToSearchOptions(keyword string, opts *issues_model.IssuesOptions) *SearchOp
3838
searchOpt.MilestoneIDs = opts.MilestoneIDs
3939
}
4040

41+
if opts.ProjectID > 0 {
42+
searchOpt.ProjectID = optional.Some(opts.ProjectID)
43+
} else if opts.ProjectID == -1 { // FIXME: this is inconsistent from other places
44+
searchOpt.ProjectID = optional.Some[int64](0) // Those issues with no project(projectid==0)
45+
}
46+
4147
// See the comment of issues_model.SearchOptions for the reason why we need to convert
4248
convertID := func(id int64) optional.Option[int64] {
4349
if id > 0 {
@@ -49,7 +55,6 @@ func ToSearchOptions(keyword string, opts *issues_model.IssuesOptions) *SearchOp
4955
return nil
5056
}
5157

52-
searchOpt.ProjectID = convertID(opts.ProjectID)
5358
searchOpt.ProjectColumnID = convertID(opts.ProjectColumnID)
5459
searchOpt.PosterID = convertID(opts.PosterID)
5560
searchOpt.AssigneeID = convertID(opts.AssigneeID)

modules/markup/markdown/prefixed_id.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import (
99

1010
"code.gitea.io/gitea/modules/container"
1111
"code.gitea.io/gitea/modules/markup/common"
12+
"code.gitea.io/gitea/modules/util"
1213

1314
"github.com/yuin/goldmark/ast"
14-
"github.com/yuin/goldmark/util"
1515
)
1616

1717
type prefixedIDs struct {
@@ -36,7 +36,7 @@ func (p *prefixedIDs) GenerateWithDefault(value, dft []byte) []byte {
3636
if !bytes.HasPrefix(result, []byte("user-content-")) {
3737
result = append([]byte("user-content-"), result...)
3838
}
39-
if p.values.Add(util.BytesToReadOnlyString(result)) {
39+
if p.values.Add(util.UnsafeBytesToString(result)) {
4040
return result
4141
}
4242
for i := 1; ; i++ {
@@ -49,7 +49,7 @@ func (p *prefixedIDs) GenerateWithDefault(value, dft []byte) []byte {
4949

5050
// Put puts a given element id to the used ids table.
5151
func (p *prefixedIDs) Put(value []byte) {
52-
p.values.Add(util.BytesToReadOnlyString(value))
52+
p.values.Add(util.UnsafeBytesToString(value))
5353
}
5454

5555
func newPrefixedIDs() *prefixedIDs {

modules/markup/markdown/transform_heading.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ import (
77
"fmt"
88

99
"code.gitea.io/gitea/modules/markup"
10+
"code.gitea.io/gitea/modules/util"
1011

1112
"github.com/yuin/goldmark/ast"
1213
"github.com/yuin/goldmark/text"
13-
"github.com/yuin/goldmark/util"
1414
)
1515

1616
func (g *ASTTransformer) transformHeading(_ *markup.RenderContext, v *ast.Heading, reader text.Reader, tocList *[]markup.Header) {
@@ -21,11 +21,11 @@ func (g *ASTTransformer) transformHeading(_ *markup.RenderContext, v *ast.Headin
2121
}
2222
txt := v.Text(reader.Source())
2323
header := markup.Header{
24-
Text: util.BytesToReadOnlyString(txt),
24+
Text: util.UnsafeBytesToString(txt),
2525
Level: v.Level,
2626
}
2727
if id, found := v.AttributeString("id"); found {
28-
header.ID = util.BytesToReadOnlyString(id.([]byte))
28+
header.ID = util.UnsafeBytesToString(id.([]byte))
2929
}
3030
*tocList = append(*tocList, header)
3131
g.applyElementDir(v)

modules/packages/composer/metadata.go

+42-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package composer
66
import (
77
"archive/zip"
88
"io"
9+
"path"
910
"regexp"
1011
"strings"
1112

@@ -36,10 +37,14 @@ type Package struct {
3637
Metadata *Metadata
3738
}
3839

40+
// https://getcomposer.org/doc/04-schema.md
41+
3942
// Metadata represents the metadata of a Composer package
4043
type Metadata struct {
4144
Description string `json:"description,omitempty"`
45+
Readme string `json:"readme,omitempty"`
4246
Keywords []string `json:"keywords,omitempty"`
47+
Comments Comments `json:"_comments,omitempty"`
4348
Homepage string `json:"homepage,omitempty"`
4449
License Licenses `json:"license,omitempty"`
4550
Authors []Author `json:"authors,omitempty"`
@@ -74,6 +79,28 @@ func (l *Licenses) UnmarshalJSON(data []byte) error {
7479
return nil
7580
}
7681

82+
// Comments represents the comments of a Composer package
83+
type Comments []string
84+
85+
// UnmarshalJSON reads from a string or array
86+
func (c *Comments) UnmarshalJSON(data []byte) error {
87+
switch data[0] {
88+
case '"':
89+
var value string
90+
if err := json.Unmarshal(data, &value); err != nil {
91+
return err
92+
}
93+
*c = Comments{value}
94+
case '[':
95+
values := make([]string, 0, 5)
96+
if err := json.Unmarshal(data, &values); err != nil {
97+
return err
98+
}
99+
*c = Comments(values)
100+
}
101+
return nil
102+
}
103+
77104
// Author represents an author
78105
type Author struct {
79106
Name string `json:"name,omitempty"`
@@ -101,14 +128,14 @@ func ParsePackage(r io.ReaderAt, size int64) (*Package, error) {
101128
}
102129
defer f.Close()
103130

104-
return ParseComposerFile(f)
131+
return ParseComposerFile(archive, path.Dir(file.Name), f)
105132
}
106133
}
107134
return nil, ErrMissingComposerFile
108135
}
109136

110137
// ParseComposerFile parses a composer.json file to retrieve the metadata of a Composer package
111-
func ParseComposerFile(r io.Reader) (*Package, error) {
138+
func ParseComposerFile(archive *zip.Reader, pathPrefix string, r io.Reader) (*Package, error) {
112139
var cj struct {
113140
Name string `json:"name"`
114141
Version string `json:"version"`
@@ -137,6 +164,19 @@ func ParseComposerFile(r io.Reader) (*Package, error) {
137164
cj.Type = "library"
138165
}
139166

167+
if cj.Readme == "" {
168+
cj.Readme = "README.md"
169+
}
170+
f, err := archive.Open(path.Join(pathPrefix, cj.Readme))
171+
if err == nil {
172+
// 10kb limit for readme content
173+
buf, _ := io.ReadAll(io.LimitReader(f, 10*1024))
174+
cj.Readme = string(buf)
175+
_ = f.Close()
176+
} else {
177+
cj.Readme = ""
178+
}
179+
140180
return &Package{
141181
Name: cj.Name,
142182
Version: cj.Version,

0 commit comments

Comments
 (0)