Skip to content

Commit 634fbe0

Browse files
authored
Merge branch 'main' into add-file-tree-to-file-view-page
2 parents 143249f + 594edad commit 634fbe0

File tree

142 files changed

+1139
-838
lines changed

Some content is hidden

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

142 files changed

+1139
-838
lines changed

models/issues/dependency_test.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,25 @@ func TestCreateIssueDependency(t *testing.T) {
4949
assert.False(t, left)
5050

5151
// Close #2 and check again
52-
_, err = issues_model.ChangeIssueStatus(db.DefaultContext, issue2, user1, true)
52+
_, err = issues_model.CloseIssue(db.DefaultContext, issue2, user1)
5353
assert.NoError(t, err)
5454

55+
issue2Closed, err := issues_model.GetIssueByID(db.DefaultContext, 2)
56+
assert.NoError(t, err)
57+
assert.True(t, issue2Closed.IsClosed)
58+
5559
left, err = issues_model.IssueNoDependenciesLeft(db.DefaultContext, issue1)
5660
assert.NoError(t, err)
5761
assert.True(t, left)
5862

5963
// Test removing the dependency
6064
err = issues_model.RemoveIssueDependency(db.DefaultContext, user1, issue1, issue2, issues_model.DependencyTypeBlockedBy)
6165
assert.NoError(t, err)
66+
67+
_, err = issues_model.ReopenIssue(db.DefaultContext, issue2, user1)
68+
assert.NoError(t, err)
69+
70+
issue2Reopened, err := issues_model.GetIssueByID(db.DefaultContext, 2)
71+
assert.NoError(t, err)
72+
assert.False(t, issue2Reopened.IsClosed)
6273
}

models/issues/issue_update.go

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,16 +119,54 @@ func doChangeIssueStatus(ctx context.Context, issue *Issue, doer *user_model.Use
119119
})
120120
}
121121

122-
// ChangeIssueStatus changes issue status to open or closed.
123-
func ChangeIssueStatus(ctx context.Context, issue *Issue, doer *user_model.User, isClosed bool) (*Comment, error) {
122+
// CloseIssue changes issue status to closed.
123+
func CloseIssue(ctx context.Context, issue *Issue, doer *user_model.User) (*Comment, error) {
124124
if err := issue.LoadRepo(ctx); err != nil {
125125
return nil, err
126126
}
127127
if err := issue.LoadPoster(ctx); err != nil {
128128
return nil, err
129129
}
130130

131-
return changeIssueStatus(ctx, issue, doer, isClosed, false)
131+
ctx, committer, err := db.TxContext(ctx)
132+
if err != nil {
133+
return nil, err
134+
}
135+
defer committer.Close()
136+
137+
comment, err := changeIssueStatus(ctx, issue, doer, true, false)
138+
if err != nil {
139+
return nil, err
140+
}
141+
if err := committer.Commit(); err != nil {
142+
return nil, err
143+
}
144+
return comment, nil
145+
}
146+
147+
// ReopenIssue changes issue status to open.
148+
func ReopenIssue(ctx context.Context, issue *Issue, doer *user_model.User) (*Comment, error) {
149+
if err := issue.LoadRepo(ctx); err != nil {
150+
return nil, err
151+
}
152+
if err := issue.LoadPoster(ctx); err != nil {
153+
return nil, err
154+
}
155+
156+
ctx, committer, err := db.TxContext(ctx)
157+
if err != nil {
158+
return nil, err
159+
}
160+
defer committer.Close()
161+
162+
comment, err := changeIssueStatus(ctx, issue, doer, false, false)
163+
if err != nil {
164+
return nil, err
165+
}
166+
if err := committer.Commit(); err != nil {
167+
return nil, err
168+
}
169+
return comment, nil
132170
}
133171

134172
// ChangeIssueTitle changes the title of this issue, as the given user.

models/issues/issue_xref_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ func TestXRef_ResolveCrossReferences(t *testing.T) {
9898
i1 := testCreateIssue(t, 1, 2, "title1", "content1", false)
9999
i2 := testCreateIssue(t, 1, 2, "title2", "content2", false)
100100
i3 := testCreateIssue(t, 1, 2, "title3", "content3", false)
101-
_, err := issues_model.ChangeIssueStatus(db.DefaultContext, i3, d, true)
101+
_, err := issues_model.CloseIssue(db.DefaultContext, i3, d)
102102
assert.NoError(t, err)
103103

104104
pr := testCreatePR(t, 1, 2, "titlepr", fmt.Sprintf("closes #%d", i1.Index))

modules/markup/html_link.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"strings"
1010

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

1314
"golang.org/x/net/html"
1415
"golang.org/x/net/html/atom"
@@ -171,6 +172,10 @@ func linkProcessor(ctx *RenderContext, node *html.Node) {
171172
}
172173

173174
uri := node.Data[m[0]:m[1]]
175+
remaining := node.Data[m[1]:]
176+
if util.IsLikelySplitLeftPart(remaining) {
177+
return
178+
}
174179
replaceContent(node, m[0], m[1], createLink(ctx, uri, uri, "" /*link*/))
175180
node = node.NextSibling.NextSibling
176181
}

modules/markup/html_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,16 @@ func TestRender_links(t *testing.T) {
206206
test(
207207
"ftps://gitea.com",
208208
`<p>ftps://gitea.com</p>`)
209+
210+
t.Run("LinkSplit", func(t *testing.T) {
211+
input, _ := util.SplitStringAtByteN("http://10.1.2.3", 12)
212+
assert.Equal(t, "http://10…", input)
213+
test(input, "<p>http://10…</p>")
214+
215+
input, _ = util.SplitStringAtByteN("http://10.1.2.3", 13)
216+
assert.Equal(t, "http://10.…", input)
217+
test(input, "<p>http://10.…</p>")
218+
})
209219
}
210220

211221
func TestRender_email(t *testing.T) {

modules/packages/maven/metadata.go

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"encoding/xml"
88
"io"
99

10+
"code.gitea.io/gitea/modules/util"
1011
"code.gitea.io/gitea/modules/validation"
1112

1213
"golang.org/x/net/html/charset"
@@ -31,18 +32,27 @@ type Dependency struct {
3132
}
3233

3334
type pomStruct struct {
34-
XMLName xml.Name `xml:"project"`
35-
GroupID string `xml:"groupId"`
36-
ArtifactID string `xml:"artifactId"`
37-
Version string `xml:"version"`
38-
Name string `xml:"name"`
39-
Description string `xml:"description"`
40-
URL string `xml:"url"`
41-
Licenses []struct {
35+
XMLName xml.Name `xml:"project"`
36+
37+
Parent struct {
38+
GroupID string `xml:"groupId"`
39+
ArtifactID string `xml:"artifactId"`
40+
Version string `xml:"version"`
41+
} `xml:"parent"`
42+
43+
GroupID string `xml:"groupId"`
44+
ArtifactID string `xml:"artifactId"`
45+
Version string `xml:"version"`
46+
Name string `xml:"name"`
47+
Description string `xml:"description"`
48+
URL string `xml:"url"`
49+
50+
Licenses []struct {
4251
Name string `xml:"name"`
4352
URL string `xml:"url"`
4453
Distribution string `xml:"distribution"`
4554
} `xml:"licenses>license"`
55+
4656
Dependencies []struct {
4757
GroupID string `xml:"groupId"`
4858
ArtifactID string `xml:"artifactId"`
@@ -81,8 +91,16 @@ func ParsePackageMetaData(r io.Reader) (*Metadata, error) {
8191
})
8292
}
8393

94+
pomGroupID := pom.GroupID
95+
if pomGroupID == "" {
96+
// the current module could inherit parent: https://maven.apache.org/pom.html#Inheritance
97+
pomGroupID = pom.Parent.GroupID
98+
}
99+
if pomGroupID == "" {
100+
return nil, util.ErrInvalidArgument
101+
}
84102
return &Metadata{
85-
GroupID: pom.GroupID,
103+
GroupID: pomGroupID,
86104
ArtifactID: pom.ArtifactID,
87105
Name: pom.Name,
88106
Description: pom.Description,

modules/packages/maven/metadata_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import (
77
"strings"
88
"testing"
99

10+
"code.gitea.io/gitea/modules/util"
11+
1012
"github.com/stretchr/testify/assert"
13+
"github.com/stretchr/testify/require"
1114
"golang.org/x/text/encoding/charmap"
1215
)
1316

@@ -86,4 +89,35 @@ func TestParsePackageMetaData(t *testing.T) {
8689
assert.NoError(t, err)
8790
assert.NotNil(t, m)
8891
})
92+
93+
t.Run("ParentInherit", func(t *testing.T) {
94+
pom := `<?xml version="1.0"?>
95+
<project>
96+
<modelVersion>4.0.0</modelVersion>
97+
<parent>
98+
<groupId>com.mycompany.app</groupId>
99+
<artifactId>my-app</artifactId>
100+
<version>1.0-SNAPSHOT</version>
101+
</parent>
102+
<artifactId>submodule1</artifactId>
103+
</project>
104+
`
105+
m, err := ParsePackageMetaData(strings.NewReader(pom))
106+
require.NoError(t, err)
107+
require.NotNil(t, m)
108+
109+
assert.Equal(t, "com.mycompany.app", m.GroupID)
110+
assert.Equal(t, "submodule1", m.ArtifactID)
111+
})
112+
113+
t.Run("ParentInherit", func(t *testing.T) {
114+
pom := `<?xml version="1.0"?>
115+
<project>
116+
<modelVersion>4.0.0</modelVersion>
117+
<artifactId></artifactId>
118+
</project>
119+
`
120+
_, err := ParsePackageMetaData(strings.NewReader(pom))
121+
require.ErrorIs(t, err, util.ErrInvalidArgument)
122+
})
89123
}

modules/setting/setting.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,3 +235,9 @@ func checkOverlappedPath(name, path string) {
235235
}
236236
configuredPaths[path] = name
237237
}
238+
239+
func PanicInDevOrTesting(msg string, a ...any) {
240+
if !IsProd || IsInTesting {
241+
panic(fmt.Sprintf(msg, a...))
242+
}
243+
}

modules/storage/azureblob.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func (a *azureBlobObject) Seek(offset int64, whence int) (int64, error) {
7070
case io.SeekCurrent:
7171
offset += a.offset
7272
case io.SeekEnd:
73-
offset = a.Size - offset
73+
offset = a.Size + offset
7474
default:
7575
return 0, errors.New("Seek: invalid whence")
7676
}

modules/storage/azureblob_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
package storage
55

66
import (
7+
"bytes"
8+
"io"
79
"os"
810
"testing"
911

@@ -54,3 +56,46 @@ func TestAzureBlobStoragePath(t *testing.T) {
5456
assert.Equal(t, "base/a", m.buildAzureBlobPath("/a"))
5557
assert.Equal(t, "base/a/b", m.buildAzureBlobPath("/a/b/"))
5658
}
59+
60+
func Test_azureBlobObject(t *testing.T) {
61+
if os.Getenv("CI") == "" {
62+
t.Skip("azureBlobStorage not present outside of CI")
63+
return
64+
}
65+
66+
s, err := NewStorage(setting.AzureBlobStorageType, &setting.Storage{
67+
AzureBlobConfig: setting.AzureBlobStorageConfig{
68+
// https://learn.microsoft.com/azure/storage/common/storage-use-azurite?tabs=visual-studio-code#ip-style-url
69+
Endpoint: "http://devstoreaccount1.azurite.local:10000",
70+
// https://learn.microsoft.com/azure/storage/common/storage-use-azurite?tabs=visual-studio-code#well-known-storage-account-and-key
71+
AccountName: "devstoreaccount1",
72+
AccountKey: "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==",
73+
Container: "test",
74+
},
75+
})
76+
assert.NoError(t, err)
77+
78+
data := "Q2xTckt6Y1hDOWh0"
79+
_, err = s.Save("test.txt", bytes.NewBufferString(data), int64(len(data)))
80+
assert.NoError(t, err)
81+
obj, err := s.Open("test.txt")
82+
assert.NoError(t, err)
83+
offset, err := obj.Seek(2, io.SeekStart)
84+
assert.NoError(t, err)
85+
assert.EqualValues(t, 2, offset)
86+
buf1 := make([]byte, 3)
87+
read, err := obj.Read(buf1)
88+
assert.NoError(t, err)
89+
assert.EqualValues(t, 3, read)
90+
assert.Equal(t, data[2:5], string(buf1))
91+
offset, err = obj.Seek(-5, io.SeekEnd)
92+
assert.NoError(t, err)
93+
assert.EqualValues(t, len(data)-5, offset)
94+
buf2 := make([]byte, 4)
95+
read, err = obj.Read(buf2)
96+
assert.NoError(t, err)
97+
assert.EqualValues(t, 4, read)
98+
assert.Equal(t, data[11:15], string(buf2))
99+
assert.NoError(t, obj.Close())
100+
assert.NoError(t, s.Delete("test.txt"))
101+
}

0 commit comments

Comments
 (0)