Skip to content

Commit daaa355

Browse files
authored
Merge branch 'main' into lunny/fix_last_modify
2 parents c8878d8 + 5de4173 commit daaa355

File tree

8 files changed

+92
-8
lines changed

8 files changed

+92
-8
lines changed

.github/labeler.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,11 @@ modifies/go:
7070
- any-glob-to-any-file:
7171
- "**/*.go"
7272

73-
modifies/js:
73+
modifies/frontend:
7474
- changed-files:
7575
- any-glob-to-any-file:
7676
- "**/*.js"
77+
- "**/*.ts"
7778
- "**/*.vue"
7879

7980
docs-update-needed:

custom/conf/app.example.ini

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,8 @@ INTERNAL_TOKEN =
526526
;; HMAC to encode urls with, it **is required** if camo is enabled.
527527
;HMAC_KEY =
528528
;; Set to true to use camo for https too lese only non https urls are proxyed
529-
;ALLWAYS = false
529+
;; ALLWAYS is deprecated and will be removed in the future
530+
;ALWAYS = false
530531

531532
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
532533
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

models/activities/repo_activity.go

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ type ActivityStats struct {
3434
OpenedPRAuthorCount int64
3535
MergedPRs issues_model.PullRequestList
3636
MergedPRAuthorCount int64
37+
ActiveIssues issues_model.IssueList
3738
OpenedIssues issues_model.IssueList
3839
OpenedIssueAuthorCount int64
3940
ClosedIssues issues_model.IssueList
@@ -172,7 +173,7 @@ func (stats *ActivityStats) MergedPRPerc() int {
172173

173174
// ActiveIssueCount returns total active issue count
174175
func (stats *ActivityStats) ActiveIssueCount() int {
175-
return stats.OpenedIssueCount() + stats.ClosedIssueCount()
176+
return len(stats.ActiveIssues)
176177
}
177178

178179
// OpenedIssueCount returns open issue count
@@ -285,13 +286,21 @@ func (stats *ActivityStats) FillIssues(ctx context.Context, repoID int64, fromTi
285286
stats.ClosedIssueAuthorCount = count
286287

287288
// New issues
288-
sess = issuesForActivityStatement(ctx, repoID, fromTime, false, false)
289+
sess = newlyCreatedIssues(ctx, repoID, fromTime)
289290
sess.OrderBy("issue.created_unix ASC")
290291
stats.OpenedIssues = make(issues_model.IssueList, 0)
291292
if err = sess.Find(&stats.OpenedIssues); err != nil {
292293
return err
293294
}
294295

296+
// Active issues
297+
sess = activeIssues(ctx, repoID, fromTime)
298+
sess.OrderBy("issue.created_unix ASC")
299+
stats.ActiveIssues = make(issues_model.IssueList, 0)
300+
if err = sess.Find(&stats.ActiveIssues); err != nil {
301+
return err
302+
}
303+
295304
// Opened issue authors
296305
sess = issuesForActivityStatement(ctx, repoID, fromTime, false, false)
297306
if _, err = sess.Select("count(distinct issue.poster_id) as `count`").Table("issue").Get(&count); err != nil {
@@ -317,6 +326,23 @@ func (stats *ActivityStats) FillUnresolvedIssues(ctx context.Context, repoID int
317326
return sess.Find(&stats.UnresolvedIssues)
318327
}
319328

329+
func newlyCreatedIssues(ctx context.Context, repoID int64, fromTime time.Time) *xorm.Session {
330+
sess := db.GetEngine(ctx).Where("issue.repo_id = ?", repoID).
331+
And("issue.is_pull = ?", false). // Retain the is_pull check to exclude pull requests
332+
And("issue.created_unix >= ?", fromTime.Unix()) // Include all issues created after fromTime
333+
334+
return sess
335+
}
336+
337+
func activeIssues(ctx context.Context, repoID int64, fromTime time.Time) *xorm.Session {
338+
sess := db.GetEngine(ctx).Where("issue.repo_id = ?", repoID).
339+
And("issue.is_pull = ?", false).
340+
And("issue.created_unix >= ?", fromTime.Unix()).
341+
Or("issue.closed_unix >= ?", fromTime.Unix())
342+
343+
return sess
344+
}
345+
320346
func issuesForActivityStatement(ctx context.Context, repoID int64, fromTime time.Time, closed, unresolved bool) *xorm.Session {
321347
sess := db.GetEngine(ctx).Where("issue.repo_id = ?", repoID).
322348
And("issue.is_closed = ?", closed)

modules/markup/camo.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func camoHandleLink(link string) string {
3838
if setting.Camo.Enabled {
3939
lnkURL, err := url.Parse(link)
4040
if err == nil && lnkURL.IsAbs() && !strings.HasPrefix(link, setting.AppURL) &&
41-
(setting.Camo.Allways || lnkURL.Scheme != "https") {
41+
(setting.Camo.Always || lnkURL.Scheme != "https") {
4242
return CamoEncode(link)
4343
}
4444
}

modules/markup/camo_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func TestCamoHandleLink(t *testing.T) {
2828
"https://image.proxy/eivin43gJwGVIjR9MiYYtFIk0mw/aHR0cDovL3Rlc3RpbWFnZXMub3JnL2ltZy5qcGc",
2929
camoHandleLink("http://testimages.org/img.jpg"))
3030

31-
setting.Camo.Allways = true
31+
setting.Camo.Always = true
3232
assert.Equal(t,
3333
"https://gitea.com/img.jpg",
3434
camoHandleLink("https://gitea.com/img.jpg"))

modules/setting/camo.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,28 @@
33

44
package setting
55

6-
import "code.gitea.io/gitea/modules/log"
6+
import (
7+
"strconv"
8+
9+
"code.gitea.io/gitea/modules/log"
10+
)
711

812
var Camo = struct {
913
Enabled bool
1014
ServerURL string `ini:"SERVER_URL"`
1115
HMACKey string `ini:"HMAC_KEY"`
12-
Allways bool
16+
Always bool
1317
}{}
1418

1519
func loadCamoFrom(rootCfg ConfigProvider) {
1620
mustMapSetting(rootCfg, "camo", &Camo)
1721
if Camo.Enabled {
22+
oldValue := rootCfg.Section("camo").Key("ALLWAYS").MustString("")
23+
if oldValue != "" {
24+
log.Warn("camo.ALLWAYS is deprecated, use camo.ALWAYS instead")
25+
Camo.Always, _ = strconv.ParseBool(oldValue)
26+
}
27+
1828
if Camo.ServerURL == "" || Camo.HMACKey == "" {
1929
log.Fatal(`Camo settings require "SERVER_URL" and HMAC_KEY`)
2030
}

routers/api/packages/maven/maven.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"strings"
2121

2222
packages_model "code.gitea.io/gitea/models/packages"
23+
"code.gitea.io/gitea/modules/globallock"
2324
"code.gitea.io/gitea/modules/json"
2425
"code.gitea.io/gitea/modules/log"
2526
packages_module "code.gitea.io/gitea/modules/packages"
@@ -225,6 +226,10 @@ func servePackageFile(ctx *context.Context, params parameters, serveContent bool
225226
helper.ServePackageFile(ctx, s, u, pf, opts)
226227
}
227228

229+
func mavenPkgNameKey(packageName string) string {
230+
return "pkg_maven_" + packageName
231+
}
232+
228233
// UploadPackageFile adds a file to the package. If the package does not exist, it gets created.
229234
func UploadPackageFile(ctx *context.Context) {
230235
params, err := extractPathParameters(ctx)
@@ -243,6 +248,14 @@ func UploadPackageFile(ctx *context.Context) {
243248

244249
packageName := params.GroupID + "-" + params.ArtifactID
245250

251+
// for the same package, only one upload at a time
252+
releaser, err := globallock.Lock(ctx, mavenPkgNameKey(packageName))
253+
if err != nil {
254+
apiError(ctx, http.StatusInternalServerError, err)
255+
return
256+
}
257+
defer releaser()
258+
246259
buf, err := packages_module.CreateHashedBufferFromReader(ctx.Req.Body)
247260
if err != nil {
248261
apiError(ctx, http.StatusInternalServerError, err)

tests/integration/api_packages_maven_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"net/http"
99
"strconv"
1010
"strings"
11+
"sync"
1112
"testing"
1213

1314
"code.gitea.io/gitea/models/db"
@@ -252,3 +253,35 @@ func TestPackageMaven(t *testing.T) {
252253
assert.True(t, test.IsNormalPageCompleted(resp.Body.String()))
253254
})
254255
}
256+
257+
func TestPackageMavenConcurrent(t *testing.T) {
258+
defer tests.PrepareTestEnv(t)()
259+
260+
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
261+
262+
groupID := "com.gitea"
263+
artifactID := "test-project"
264+
packageVersion := "1.0.1"
265+
266+
root := fmt.Sprintf("/api/packages/%s/maven/%s/%s", user.Name, strings.ReplaceAll(groupID, ".", "/"), artifactID)
267+
268+
putFile := func(t *testing.T, path, content string, expectedStatus int) {
269+
req := NewRequestWithBody(t, "PUT", root+path, strings.NewReader(content)).
270+
AddBasicAuth(user.Name)
271+
MakeRequest(t, req, expectedStatus)
272+
}
273+
274+
t.Run("Concurrent Upload", func(t *testing.T) {
275+
defer tests.PrintCurrentTest(t)()
276+
277+
var wg sync.WaitGroup
278+
for i := 0; i < 10; i++ {
279+
wg.Add(1)
280+
go func(i int) {
281+
putFile(t, fmt.Sprintf("/%s/%s.jar", packageVersion, strconv.Itoa(i)), "test", http.StatusCreated)
282+
wg.Done()
283+
}(i)
284+
}
285+
wg.Wait()
286+
})
287+
}

0 commit comments

Comments
 (0)