Skip to content

Commit f95470f

Browse files
authored
Merge branch 'main' into org-oauth2
2 parents dc778a4 + 97f3f19 commit f95470f

Some content is hidden

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

45 files changed

+660
-190
lines changed

.drone.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,7 @@ steps:
571571

572572
# TODO: We should probably build all dependencies into a test image
573573
- name: test-e2e
574-
image: mcr.microsoft.com/playwright:v1.24.0-focal
574+
image: mcr.microsoft.com/playwright:v1.26.1-focal
575575
commands:
576576
- curl -sLO https://go.dev/dl/go1.19.linux-amd64.tar.gz && tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz
577577
- groupadd --gid 1001 gitea && useradd -m --gid 1001 --uid 1001 gitea

docs/content/doc/developers/guidelines-backend.md

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -67,22 +67,18 @@ Some actions should allow for rollback when database record insertion/update/del
6767
So services must be allowed to create a database transaction. Here is some example,
6868

6969
```go
70-
// servcies/repository/repo.go
71-
func CreateXXXX() error {\
72-
ctx, committer, err := db.TxContext()
73-
if err != nil {
74-
return err
75-
}
76-
defer committer.Close()
77-
78-
// do something, if return err, it will rollback automatically when `committer.Close()` is invoked.
79-
if err := issues.UpdateIssue(ctx, repoID); err != nil {
80-
// ...
81-
}
82-
83-
// ......
84-
85-
return committer.Commit()
70+
// services/repository/repository.go
71+
func CreateXXXX() error {
72+
return db.WithTx(func(ctx context.Context) error {
73+
e := db.GetEngine(ctx)
74+
// do something, if err is returned, it will rollback automatically
75+
if err := issues.UpdateIssue(ctx, repoID); err != nil {
76+
// ...
77+
return err
78+
}
79+
// ...
80+
return nil
81+
})
8682
}
8783
```
8884

@@ -94,14 +90,14 @@ If the function will be used in the transaction, just let `context.Context` as t
9490
func UpdateIssue(ctx context.Context, repoID int64) error {
9591
e := db.GetEngine(ctx)
9692

97-
// ......
93+
// ...
9894
}
9995
```
10096

10197
### Package Name
10298

10399
For the top level package, use a plural as package name, i.e. `services`, `models`, for sub packages, use singular,
104-
i.e. `servcies/user`, `models/repository`.
100+
i.e. `services/user`, `models/repository`.
105101

106102
### Import Alias
107103

jest.config.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// to run tests with ES6 module, node must run with "--experimental-vm-modules", or see Makefile's "test-frontend" for reference
12
export default {
23
rootDir: 'web_src',
34
setupFilesAfterEnv: ['jest-extended/all'],
@@ -7,6 +8,8 @@ export default {
78
transform: {
89
'\\.svg$': '<rootDir>/js/testUtils/jestRawLoader.js',
910
},
11+
setupFiles: [
12+
'./js/testUtils/jestSetup.js', // prepare global variables used by our code (eg: window.config)
13+
],
1014
verbose: false,
1115
};
12-

models/migrations/migrations.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,8 @@ var migrations = []Migration{
413413
NewMigration("Add badges to users", createUserBadgesTable),
414414
// v225 -> v226
415415
NewMigration("Alter gpg_key/public_key content TEXT fields to MEDIUMTEXT", alterPublicGPGKeyContentFieldsToMediumText),
416+
// v226 -> v227
417+
NewMigration("Conan and generic packages do not need to be semantically versioned", fixPackageSemverField),
416418
}
417419

418420
// GetCurrentDBVersion returns the current db version

models/migrations/v226.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Copyright 2022 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package migrations
6+
7+
import (
8+
"xorm.io/builder"
9+
"xorm.io/xorm"
10+
)
11+
12+
func fixPackageSemverField(x *xorm.Engine) error {
13+
_, err := x.Exec(builder.Update(builder.Eq{"semver_compatible": false}).From("`package`").Where(builder.In("`type`", "conan", "generic")))
14+
return err
15+
}

modules/convert/repository.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,10 @@ func innerToRepo(repo *repo_model.Repository, mode perm.AccessMode, isParent boo
5656
config := unit.ExternalTrackerConfig()
5757
hasIssues = true
5858
externalTracker = &api.ExternalTracker{
59-
ExternalTrackerURL: config.ExternalTrackerURL,
60-
ExternalTrackerFormat: config.ExternalTrackerFormat,
61-
ExternalTrackerStyle: config.ExternalTrackerStyle,
59+
ExternalTrackerURL: config.ExternalTrackerURL,
60+
ExternalTrackerFormat: config.ExternalTrackerFormat,
61+
ExternalTrackerStyle: config.ExternalTrackerStyle,
62+
ExternalTrackerRegexpPattern: config.ExternalTrackerRegexpPattern,
6263
}
6364
}
6465
hasWiki := false

modules/git/parse_nogogit.go

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -22,70 +22,72 @@ func ParseTreeEntries(data []byte) ([]*TreeEntry, error) {
2222
return parseTreeEntries(data, nil)
2323
}
2424

25+
var sepSpace = []byte{' '}
26+
2527
func parseTreeEntries(data []byte, ptree *Tree) ([]*TreeEntry, error) {
26-
entries := make([]*TreeEntry, 0, 10)
28+
var err error
29+
entries := make([]*TreeEntry, 0, bytes.Count(data, []byte{'\n'})+1)
2730
for pos := 0; pos < len(data); {
28-
// expect line to be of the form "<mode> <type> <sha> <space-padded-size>\t<filename>"
31+
// expect line to be of the form:
32+
// <mode> <type> <sha> <space-padded-size>\t<filename>
33+
// <mode> <type> <sha>\t<filename>
34+
posEnd := bytes.IndexByte(data[pos:], '\n')
35+
if posEnd == -1 {
36+
posEnd = len(data)
37+
} else {
38+
posEnd += pos
39+
}
40+
line := data[pos:posEnd]
41+
posTab := bytes.IndexByte(line, '\t')
42+
if posTab == -1 {
43+
return nil, fmt.Errorf("invalid ls-tree output (no tab): %q", line)
44+
}
45+
2946
entry := new(TreeEntry)
3047
entry.ptree = ptree
31-
if pos+6 > len(data) {
32-
return nil, fmt.Errorf("Invalid ls-tree output: %s", string(data))
48+
49+
entryAttrs := line[:posTab]
50+
entryName := line[posTab+1:]
51+
52+
entryMode, entryAttrs, _ := bytes.Cut(entryAttrs, sepSpace)
53+
_ /* entryType */, entryAttrs, _ = bytes.Cut(entryAttrs, sepSpace) // the type is not used, the mode is enough to determine the type
54+
entryObjectID, entryAttrs, _ := bytes.Cut(entryAttrs, sepSpace)
55+
if len(entryAttrs) > 0 {
56+
entrySize := entryAttrs // the last field is the space-padded-size
57+
entry.size, _ = strconv.ParseInt(strings.TrimSpace(string(entrySize)), 10, 64)
58+
entry.sized = true
3359
}
34-
switch string(data[pos : pos+6]) {
60+
61+
switch string(entryMode) {
3562
case "100644":
3663
entry.entryMode = EntryModeBlob
37-
pos += 12 // skip over "100644 blob "
3864
case "100755":
3965
entry.entryMode = EntryModeExec
40-
pos += 12 // skip over "100755 blob "
4166
case "120000":
4267
entry.entryMode = EntryModeSymlink
43-
pos += 12 // skip over "120000 blob "
4468
case "160000":
4569
entry.entryMode = EntryModeCommit
46-
pos += 14 // skip over "160000 object "
4770
case "040000", "040755": // git uses 040000 for tree object, but some users may get 040755 for unknown reasons
4871
entry.entryMode = EntryModeTree
49-
pos += 12 // skip over "040000 tree "
5072
default:
51-
return nil, fmt.Errorf("unknown type: %v", string(data[pos:pos+6]))
73+
return nil, fmt.Errorf("unknown type: %v", string(entryMode))
5274
}
5375

54-
if pos+40 > len(data) {
55-
return nil, fmt.Errorf("Invalid ls-tree output: %s", string(data))
56-
}
57-
id, err := NewIDFromString(string(data[pos : pos+40]))
76+
entry.ID, err = NewIDFromString(string(entryObjectID))
5877
if err != nil {
59-
return nil, fmt.Errorf("Invalid ls-tree output: %v", err)
60-
}
61-
entry.ID = id
62-
pos += 41 // skip over sha and trailing space
63-
64-
end := pos + bytes.IndexByte(data[pos:], '\t')
65-
if end < pos {
66-
return nil, fmt.Errorf("Invalid ls-tree -l output: %s", string(data))
67-
}
68-
entry.size, _ = strconv.ParseInt(strings.TrimSpace(string(data[pos:end])), 10, 64)
69-
entry.sized = true
70-
71-
pos = end + 1
72-
73-
end = pos + bytes.IndexByte(data[pos:], '\n')
74-
if end < pos {
75-
return nil, fmt.Errorf("Invalid ls-tree output: %s", string(data))
78+
return nil, fmt.Errorf("invalid ls-tree output (invalid object id): %q, err: %w", line, err)
7679
}
7780

78-
// In case entry name is surrounded by double quotes(it happens only in git-shell).
79-
if data[pos] == '"' {
80-
entry.name, err = strconv.Unquote(string(data[pos:end]))
81+
if len(entryName) > 0 && entryName[0] == '"' {
82+
entry.name, err = strconv.Unquote(string(entryName))
8183
if err != nil {
82-
return nil, fmt.Errorf("Invalid ls-tree output: %v", err)
84+
return nil, fmt.Errorf("invalid ls-tree output (invalid name): %q, err: %w", line, err)
8385
}
8486
} else {
85-
entry.name = string(data[pos:end])
87+
entry.name = string(entryName)
8688
}
8789

88-
pos = end + 1
90+
pos = posEnd + 1
8991
entries = append(entries, entry)
9092
}
9193
return entries, nil

modules/git/parse_nogogit_test.go

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
"github.com/stretchr/testify/assert"
1313
)
1414

15-
func TestParseTreeEntries(t *testing.T) {
15+
func TestParseTreeEntriesLong(t *testing.T) {
1616
testCases := []struct {
1717
Input string
1818
Expected []*TreeEntry
@@ -59,11 +59,47 @@ func TestParseTreeEntries(t *testing.T) {
5959
assert.NoError(t, err)
6060
assert.Len(t, entries, len(testCase.Expected))
6161
for i, entry := range entries {
62-
assert.EqualValues(t, testCase.Expected[i].ID, entry.ID)
63-
assert.EqualValues(t, testCase.Expected[i].name, entry.name)
64-
assert.EqualValues(t, testCase.Expected[i].entryMode, entry.entryMode)
65-
assert.EqualValues(t, testCase.Expected[i].sized, entry.sized)
66-
assert.EqualValues(t, testCase.Expected[i].size, entry.size)
62+
assert.EqualValues(t, testCase.Expected[i], entry)
6763
}
6864
}
6965
}
66+
67+
func TestParseTreeEntriesShort(t *testing.T) {
68+
testCases := []struct {
69+
Input string
70+
Expected []*TreeEntry
71+
}{
72+
{
73+
Input: `100644 blob ea0d83c9081af9500ac9f804101b3fd0a5c293af README.md
74+
040000 tree 84b90550547016f73c5dd3f50dea662389e67b6d assets
75+
`,
76+
Expected: []*TreeEntry{
77+
{
78+
ID: MustIDFromString("ea0d83c9081af9500ac9f804101b3fd0a5c293af"),
79+
name: "README.md",
80+
entryMode: EntryModeBlob,
81+
},
82+
{
83+
ID: MustIDFromString("84b90550547016f73c5dd3f50dea662389e67b6d"),
84+
name: "assets",
85+
entryMode: EntryModeTree,
86+
},
87+
},
88+
},
89+
}
90+
for _, testCase := range testCases {
91+
entries, err := ParseTreeEntries([]byte(testCase.Input))
92+
assert.NoError(t, err)
93+
assert.Len(t, entries, len(testCase.Expected))
94+
for i, entry := range entries {
95+
assert.EqualValues(t, testCase.Expected[i], entry)
96+
}
97+
}
98+
}
99+
100+
func TestParseTreeEntriesInvalid(t *testing.T) {
101+
// there was a panic: "runtime error: slice bounds out of range" when the input was invalid: #20315
102+
entries, err := ParseTreeEntries([]byte("100644 blob ea0d83c9081af9500ac9f804101b3fd0a5c293af"))
103+
assert.Error(t, err)
104+
assert.Len(t, entries, 0)
105+
}

modules/git/repo_language_stats_nogogit.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err
5757

5858
tree := commit.Tree
5959

60-
entries, err := tree.ListEntriesRecursive()
60+
entries, err := tree.ListEntriesRecursiveWithSize()
6161
if err != nil {
6262
return nil, err
6363
}

modules/git/tree_gogit.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ func (t *Tree) ListEntries() (Entries, error) {
5757
return entries, nil
5858
}
5959

60-
// ListEntriesRecursive returns all entries of current tree recursively including all subtrees
61-
func (t *Tree) ListEntriesRecursive() (Entries, error) {
60+
// ListEntriesRecursiveWithSize returns all entries of current tree recursively including all subtrees
61+
func (t *Tree) ListEntriesRecursiveWithSize() (Entries, error) {
6262
if t.gogitTree == nil {
6363
err := t.loadTreeObject()
6464
if err != nil {
@@ -92,3 +92,8 @@ func (t *Tree) ListEntriesRecursive() (Entries, error) {
9292

9393
return entries, nil
9494
}
95+
96+
// ListEntriesRecursiveFast is the alias of ListEntriesRecursiveWithSize for the gogit version
97+
func (t *Tree) ListEntriesRecursiveFast() (Entries, error) {
98+
return t.ListEntriesRecursiveWithSize()
99+
}

modules/git/tree_nogogit.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,16 @@ func (t *Tree) ListEntries() (Entries, error) {
9999
return t.entries, err
100100
}
101101

102-
// ListEntriesRecursive returns all entries of current tree recursively including all subtrees
103-
func (t *Tree) ListEntriesRecursive() (Entries, error) {
102+
// listEntriesRecursive returns all entries of current tree recursively including all subtrees
103+
// extraArgs could be "-l" to get the size, which is slower
104+
func (t *Tree) listEntriesRecursive(extraArgs ...string) (Entries, error) {
104105
if t.entriesRecursiveParsed {
105106
return t.entriesRecursive, nil
106107
}
107108

108-
stdout, _, runErr := NewCommand(t.repo.Ctx, "ls-tree", "-t", "-l", "-r", t.ID.String()).RunStdBytes(&RunOpts{Dir: t.repo.Path})
109+
args := append([]string{"ls-tree", "-t", "-r"}, extraArgs...)
110+
args = append(args, t.ID.String())
111+
stdout, _, runErr := NewCommand(t.repo.Ctx, args...).RunStdBytes(&RunOpts{Dir: t.repo.Path})
109112
if runErr != nil {
110113
return nil, runErr
111114
}
@@ -118,3 +121,13 @@ func (t *Tree) ListEntriesRecursive() (Entries, error) {
118121

119122
return t.entriesRecursive, err
120123
}
124+
125+
// ListEntriesRecursiveFast returns all entries of current tree recursively including all subtrees, no size
126+
func (t *Tree) ListEntriesRecursiveFast() (Entries, error) {
127+
return t.listEntriesRecursive()
128+
}
129+
130+
// ListEntriesRecursiveWithSize returns all entries of current tree recursively including all subtrees, with size
131+
func (t *Tree) ListEntriesRecursiveWithSize() (Entries, error) {
132+
return t.listEntriesRecursive("--long")
133+
}

modules/packages/npm/creator.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ type PackageMetadata struct {
6666
License string `json:"license,omitempty"`
6767
}
6868

69-
// PackageMetadataVersion https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md#version
69+
// PackageMetadataVersion documentation: https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md#version
70+
// PackageMetadataVersion response: https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#abbreviated-version-object
7071
type PackageMetadataVersion struct {
7172
ID string `json:"_id"`
7273
Name string `json:"name"`
@@ -80,6 +81,7 @@ type PackageMetadataVersion struct {
8081
Dependencies map[string]string `json:"dependencies,omitempty"`
8182
DevDependencies map[string]string `json:"devDependencies,omitempty"`
8283
PeerDependencies map[string]string `json:"peerDependencies,omitempty"`
84+
Bin map[string]string `json:"bin,omitempty"`
8385
OptionalDependencies map[string]string `json:"optionalDependencies,omitempty"`
8486
Readme string `json:"readme,omitempty"`
8587
Dist PackageDistribution `json:"dist"`
@@ -220,6 +222,7 @@ func ParsePackage(r io.Reader) (*Package, error) {
220222
DevelopmentDependencies: meta.DevDependencies,
221223
PeerDependencies: meta.PeerDependencies,
222224
OptionalDependencies: meta.OptionalDependencies,
225+
Bin: meta.Bin,
223226
Readme: meta.Readme,
224227
},
225228
}

0 commit comments

Comments
 (0)