Skip to content

Commit d96f802

Browse files
committed
Merge remote-tracking branch 'upstream/release/v1.17' into codeberg-1.17
2 parents d6d8e2e + 92d79b5 commit d96f802

File tree

14 files changed

+274
-117
lines changed

14 files changed

+274
-117
lines changed

integrations/api_packages_nuget_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ func TestPackageNuGet(t *testing.T) {
122122

123123
req = NewRequestWithBody(t, "PUT", url, bytes.NewReader(content))
124124
req = AddBasicAuthHeader(req, user.Name)
125-
MakeRequest(t, req, http.StatusBadRequest)
125+
MakeRequest(t, req, http.StatusConflict)
126126
})
127127

128128
t.Run("SymbolPackage", func(t *testing.T) {
@@ -208,7 +208,7 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`)
208208

209209
req = NewRequestWithBody(t, "PUT", fmt.Sprintf("%s/symbolpackage", url), createPackage(packageName, "SymbolsPackage"))
210210
req = AddBasicAuthHeader(req, user.Name)
211-
MakeRequest(t, req, http.StatusBadRequest)
211+
MakeRequest(t, req, http.StatusConflict)
212212
})
213213
})
214214

@@ -352,7 +352,7 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`)
352352

353353
req := NewRequest(t, "DELETE", fmt.Sprintf("%s/%s/%s", url, packageName, packageVersion))
354354
req = AddBasicAuthHeader(req, user.Name)
355-
MakeRequest(t, req, http.StatusOK)
355+
MakeRequest(t, req, http.StatusNoContent)
356356

357357
pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeNuGet)
358358
assert.NoError(t, err)

modules/doctor/breaking.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,29 @@ func checkUserEmail(ctx context.Context, logger log.Logger, _ bool) error {
5858
return nil
5959
}
6060

61+
// From time to time Gitea makes changes to the reserved usernames and which symbols
62+
// are allowed for various reasons. This check helps with detecting users that, according
63+
// to our reserved names, don't have a valid username.
64+
func checkUserName(ctx context.Context, logger log.Logger, _ bool) error {
65+
var invalidUserCount int64
66+
if err := iterateUserAccounts(ctx, func(u *user.User) error {
67+
if err := user.IsUsableUsername(u.Name); err != nil {
68+
invalidUserCount++
69+
logger.Warn("User[id=%d] does not have a valid username: %v", u.ID, err)
70+
}
71+
return nil
72+
}); err != nil {
73+
return fmt.Errorf("iterateUserAccounts: %v", err)
74+
}
75+
76+
if invalidUserCount == 0 {
77+
logger.Info("All users have a valid username.")
78+
} else {
79+
logger.Warn("%d user(s) have a non-valid username.", invalidUserCount)
80+
}
81+
return nil
82+
}
83+
6184
func init() {
6285
Register(&Check{
6386
Title: "Check if users has an valid email address",
@@ -66,4 +89,11 @@ func init() {
6689
Run: checkUserEmail,
6790
Priority: 9,
6891
})
92+
Register(&Check{
93+
Title: "Check if users have a valid username",
94+
Name: "check-user-names",
95+
IsDefault: false,
96+
Run: checkUserName,
97+
Priority: 9,
98+
})
6999
}

modules/highlight/highlight.go

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626
)
2727

2828
// don't index files larger than this many bytes for performance purposes
29-
const sizeLimit = 1000000
29+
const sizeLimit = 1024 * 1024
3030

3131
var (
3232
// For custom user mapping
@@ -58,7 +58,7 @@ func NewContext() {
5858
func Code(fileName, language, code string) string {
5959
NewContext()
6060

61-
// diff view newline will be passed as empty, change to literal \n so it can be copied
61+
// diff view newline will be passed as empty, change to literal '\n' so it can be copied
6262
// preserve literal newline in blame view
6363
if code == "" || code == "\n" {
6464
return "\n"
@@ -104,6 +104,11 @@ func Code(fileName, language, code string) string {
104104
return CodeFromLexer(lexer, code)
105105
}
106106

107+
type nopPreWrapper struct{}
108+
109+
func (nopPreWrapper) Start(code bool, styleAttr string) string { return "" }
110+
func (nopPreWrapper) End(code bool) string { return "" }
111+
107112
// CodeFromLexer returns a HTML version of code string with chroma syntax highlighting classes
108113
func CodeFromLexer(lexer chroma.Lexer, code string) string {
109114
formatter := html.New(html.WithClasses(true),
@@ -126,9 +131,9 @@ func CodeFromLexer(lexer chroma.Lexer, code string) string {
126131
return code
127132
}
128133

129-
htmlw.Flush()
134+
_ = htmlw.Flush()
130135
// Chroma will add newlines for certain lexers in order to highlight them properly
131-
// Once highlighted, strip them here so they don't cause copy/paste trouble in HTML output
136+
// Once highlighted, strip them here, so they don't cause copy/paste trouble in HTML output
132137
return strings.TrimSuffix(htmlbuf.String(), "\n")
133138
}
134139

@@ -141,7 +146,7 @@ func File(numLines int, fileName, language string, code []byte) []string {
141146
}
142147
formatter := html.New(html.WithClasses(true),
143148
html.WithLineNumbers(false),
144-
html.PreventSurroundingPre(true),
149+
html.WithPreWrapper(nopPreWrapper{}),
145150
)
146151

147152
if formatter == nil {
@@ -189,27 +194,19 @@ func File(numLines int, fileName, language string, code []byte) []string {
189194
return plainText(string(code), numLines)
190195
}
191196

192-
htmlw.Flush()
197+
_ = htmlw.Flush()
193198
finalNewLine := false
194199
if len(code) > 0 {
195200
finalNewLine = code[len(code)-1] == '\n'
196201
}
197202

198-
m := make([]string, 0, numLines)
199-
for _, v := range strings.SplitN(htmlbuf.String(), "\n", numLines) {
200-
content := string(v)
201-
// need to keep lines that are only \n so copy/paste works properly in browser
202-
if content == "" {
203-
content = "\n"
204-
} else if content == `</span><span class="w">` {
205-
content += "\n</span>"
206-
} else if content == `</span></span><span class="line"><span class="cl">` {
207-
content += "\n"
208-
}
209-
content = strings.TrimSuffix(content, `<span class="w">`)
210-
content = strings.TrimPrefix(content, `</span>`)
211-
m = append(m, content)
203+
m := strings.SplitN(htmlbuf.String(), `</span></span><span class="line"><span class="cl">`, numLines)
204+
if len(m) > 0 {
205+
m[0] = m[0][len(`<span class="line"><span class="cl">`):]
206+
last := m[len(m)-1]
207+
m[len(m)-1] = last[:len(last)-len(`</span></span>`)]
212208
}
209+
213210
if finalNewLine {
214211
m = append(m, "<span class=\"w\">\n</span>")
215212
}
@@ -219,14 +216,14 @@ func File(numLines int, fileName, language string, code []byte) []string {
219216

220217
// return unhiglighted map
221218
func plainText(code string, numLines int) []string {
222-
m := make([]string, 0, numLines)
223-
for _, v := range strings.SplitN(string(code), "\n", numLines) {
224-
content := string(v)
219+
m := strings.SplitN(code, "\n", numLines)
220+
221+
for i, content := range m {
225222
// need to keep lines that are only \n so copy/paste works properly in browser
226223
if content == "" {
227224
content = "\n"
228225
}
229-
m = append(m, gohtml.EscapeString(content))
226+
m[i] = gohtml.EscapeString(content)
230227
}
231228
return m
232229
}

modules/highlight/highlight_test.go

Lines changed: 47 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,29 @@ func TestFile(t *testing.T) {
4343
- go test -v -race -coverprofile=coverage.txt -covermode=atomic
4444
`),
4545
want: util.Dedent(`
46-
<span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">pipeline</span>
47-
</span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">default</span>
48-
</span></span><span class="line"><span class="cl">
49-
</span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">steps</span><span class="p">:</span>
50-
</span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">test</span>
51-
</span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">golang:1.13</span>
52-
</span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">environment</span><span class="p">:</span>
53-
</span></span><span class="line"><span class="cl"><span class="w"></span><span class="w"> </span><span class="nt">GOPROXY</span><span class="p">:</span><span class="w"> </span><span class="l">https://goproxy.cn</span>
54-
</span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">commands</span><span class="p">:</span>
55-
</span></span><span class="line"><span class="cl"><span class="w"></span><span class="w"> </span>- <span class="l">go get -u</span>
56-
</span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go build -v</span>
57-
</span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go test -v -race -coverprofile=coverage.txt -covermode=atomic</span></span></span>
46+
<span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">pipeline</span><span class="w">
47+
</span>
48+
<span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">default</span><span class="w">
49+
</span>
50+
<span class="w">
51+
</span>
52+
<span class="w"></span><span class="nt">steps</span><span class="p">:</span><span class="w">
53+
</span>
54+
<span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">test</span><span class="w">
55+
</span>
56+
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">golang:1.13</span><span class="w">
57+
</span>
58+
<span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w">
59+
</span>
60+
<span class="w"></span><span class="w"> </span><span class="nt">GOPROXY</span><span class="p">:</span><span class="w"> </span><span class="l">https://goproxy.cn</span><span class="w">
61+
</span>
62+
<span class="w"> </span><span class="nt">commands</span><span class="p">:</span><span class="w">
63+
</span>
64+
<span class="w"></span><span class="w"> </span>- <span class="l">go get -u</span><span class="w">
65+
</span>
66+
<span class="w"> </span>- <span class="l">go build -v</span><span class="w">
67+
</span>
68+
<span class="w"> </span>- <span class="l">go test -v -race -coverprofile=coverage.txt -covermode=atomic</span>
5869
`),
5970
},
6071
{
@@ -76,19 +87,30 @@ func TestFile(t *testing.T) {
7687
- go test -v -race -coverprofile=coverage.txt -covermode=atomic
7788
`)+"\n", "name: default", "name: default ", 1),
7889
want: util.Dedent(`
79-
<span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">pipeline</span>
80-
</span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">default </span>
81-
</span></span><span class="line"><span class="cl">
82-
</span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">steps</span><span class="p">:</span>
83-
</span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">test</span>
84-
</span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">golang:1.13</span>
85-
</span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">environment</span><span class="p">:</span>
86-
</span></span><span class="line"><span class="cl"><span class="w"></span><span class="w"> </span><span class="nt">GOPROXY</span><span class="p">:</span><span class="w"> </span><span class="l">https://goproxy.cn</span>
87-
</span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">commands</span><span class="p">:</span>
88-
</span></span><span class="line"><span class="cl"><span class="w"></span><span class="w"> </span>- <span class="l">go get -u</span>
89-
</span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go build -v</span>
90-
</span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go test -v -race -coverprofile=coverage.txt -covermode=atomic</span>
91-
</span></span>
90+
<span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">pipeline</span><span class="w">
91+
</span>
92+
<span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">default </span><span class="w">
93+
</span>
94+
<span class="w">
95+
</span>
96+
<span class="w"></span><span class="nt">steps</span><span class="p">:</span><span class="w">
97+
</span>
98+
<span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">test</span><span class="w">
99+
</span>
100+
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">golang:1.13</span><span class="w">
101+
</span>
102+
<span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w">
103+
</span>
104+
<span class="w"></span><span class="w"> </span><span class="nt">GOPROXY</span><span class="p">:</span><span class="w"> </span><span class="l">https://goproxy.cn</span><span class="w">
105+
</span>
106+
<span class="w"> </span><span class="nt">commands</span><span class="p">:</span><span class="w">
107+
</span>
108+
<span class="w"></span><span class="w"> </span>- <span class="l">go get -u</span><span class="w">
109+
</span>
110+
<span class="w"> </span>- <span class="l">go build -v</span><span class="w">
111+
</span>
112+
<span class="w"> </span>- <span class="l">go test -v -race -coverprofile=coverage.txt -covermode=atomic</span><span class="w">
113+
</span>
92114
<span class="w">
93115
</span>
94116
`),
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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 packages
6+
7+
import (
8+
"fmt"
9+
"io"
10+
"strings"
11+
"testing"
12+
13+
"github.com/stretchr/testify/assert"
14+
)
15+
16+
func TestHashedBuffer(t *testing.T) {
17+
cases := []struct {
18+
MaxMemorySize int
19+
Data string
20+
HashMD5 string
21+
HashSHA1 string
22+
HashSHA256 string
23+
HashSHA512 string
24+
}{
25+
{5, "test", "098f6bcd4621d373cade4e832627b4f6", "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08", "ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff"},
26+
{5, "testtest", "05a671c66aefea124cc08b76ea6d30bb", "51abb9636078defbf888d8457a7c76f85c8f114c", "37268335dd6931045bdcdf92623ff819a64244b53d0e746d438797349d4da578", "125d6d03b32c84d492747f79cf0bf6e179d287f341384eb5d6d3197525ad6be8e6df0116032935698f99a09e265073d1d6c32c274591bf1d0a20ad67cba921bc"},
27+
}
28+
29+
for _, c := range cases {
30+
buf, err := CreateHashedBufferFromReader(strings.NewReader(c.Data), c.MaxMemorySize)
31+
assert.NoError(t, err)
32+
33+
assert.EqualValues(t, len(c.Data), buf.Size())
34+
35+
data, err := io.ReadAll(buf)
36+
assert.NoError(t, err)
37+
assert.Equal(t, c.Data, string(data))
38+
39+
hashMD5, hashSHA1, hashSHA256, hashSHA512 := buf.Sums()
40+
assert.Equal(t, c.HashMD5, fmt.Sprintf("%x", hashMD5))
41+
assert.Equal(t, c.HashSHA1, fmt.Sprintf("%x", hashSHA1))
42+
assert.Equal(t, c.HashSHA256, fmt.Sprintf("%x", hashSHA256))
43+
assert.Equal(t, c.HashSHA512, fmt.Sprintf("%x", hashSHA512))
44+
45+
assert.NoError(t, buf.Close())
46+
}
47+
}

modules/util/filebuffer/file_backed_buffer.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,35 +103,45 @@ func (b *FileBackedBuffer) Size() int64 {
103103
return b.size
104104
}
105105

106-
func (b *FileBackedBuffer) switchToReader() {
106+
func (b *FileBackedBuffer) switchToReader() error {
107107
if b.reader != nil {
108-
return
108+
return nil
109109
}
110110

111111
if b.file != nil {
112+
if _, err := b.file.Seek(0, io.SeekStart); err != nil {
113+
return err
114+
}
112115
b.reader = b.file
113116
} else {
114117
b.reader = bytes.NewReader(b.buffer.Bytes())
115118
}
119+
return nil
116120
}
117121

118122
// Read implements io.Reader
119123
func (b *FileBackedBuffer) Read(p []byte) (int, error) {
120-
b.switchToReader()
124+
if err := b.switchToReader(); err != nil {
125+
return 0, err
126+
}
121127

122128
return b.reader.Read(p)
123129
}
124130

125131
// ReadAt implements io.ReaderAt
126132
func (b *FileBackedBuffer) ReadAt(p []byte, off int64) (int, error) {
127-
b.switchToReader()
133+
if err := b.switchToReader(); err != nil {
134+
return 0, err
135+
}
128136

129137
return b.reader.ReadAt(p, off)
130138
}
131139

132140
// Seek implements io.Seeker
133141
func (b *FileBackedBuffer) Seek(offset int64, whence int) (int64, error) {
134-
b.switchToReader()
142+
if err := b.switchToReader(); err != nil {
143+
return 0, err
144+
}
135145

136146
return b.reader.Seek(offset, whence)
137147
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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 filebuffer
6+
7+
import (
8+
"io"
9+
"strings"
10+
"testing"
11+
12+
"github.com/stretchr/testify/assert"
13+
)
14+
15+
func TestFileBackedBuffer(t *testing.T) {
16+
cases := []struct {
17+
MaxMemorySize int
18+
Data string
19+
}{
20+
{5, "test"},
21+
{5, "testtest"},
22+
}
23+
24+
for _, c := range cases {
25+
buf, err := CreateFromReader(strings.NewReader(c.Data), c.MaxMemorySize)
26+
assert.NoError(t, err)
27+
28+
assert.EqualValues(t, len(c.Data), buf.Size())
29+
30+
data, err := io.ReadAll(buf)
31+
assert.NoError(t, err)
32+
assert.Equal(t, c.Data, string(data))
33+
34+
assert.NoError(t, buf.Close())
35+
}
36+
}

0 commit comments

Comments
 (0)