Skip to content

Commit f9f12b2

Browse files
committed
Merge remote-tracking branch 'giteaofficial/main'
* giteaofficial/main: [skip ci] Updated translations via Crowdin Remove extended glob pattern from branch protection UI (go-gitea#33125) fix empty repo updated time (go-gitea#33120) Refactor package (routes and error handling, npm peer dependency) (go-gitea#33111) Refactor legacy JS (go-gitea#33115) Fix repo empty guide (go-gitea#33114)
2 parents 6f15516 + 485d184 commit f9f12b2

File tree

40 files changed

+206
-278
lines changed

40 files changed

+206
-278
lines changed

models/repo/update.go

+6
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ func UpdateRepositoryCols(ctx context.Context, repo *Repository, cols ...string)
4646
return err
4747
}
4848

49+
// UpdateRepositoryColsNoAutoTime updates repository's columns and but applies time change automatically
50+
func UpdateRepositoryColsNoAutoTime(ctx context.Context, repo *Repository, cols ...string) error {
51+
_, err := db.GetEngine(ctx).ID(repo.ID).Cols(cols...).NoAutoTime().Update(repo)
52+
return err
53+
}
54+
4955
// ErrReachLimitOfRepo represents a "ReachLimitOfRepo" kind of error.
5056
type ErrReachLimitOfRepo struct {
5157
Limit int

modules/packages/npm/creator.go

+2
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ type PackageMetadataVersion struct {
8181
BundleDependencies []string `json:"bundleDependencies,omitempty"`
8282
DevDependencies map[string]string `json:"devDependencies,omitempty"`
8383
PeerDependencies map[string]string `json:"peerDependencies,omitempty"`
84+
PeerDependenciesMeta map[string]any `json:"peerDependenciesMeta,omitempty"`
8485
Bin map[string]string `json:"bin,omitempty"`
8586
OptionalDependencies map[string]string `json:"optionalDependencies,omitempty"`
8687
Readme string `json:"readme,omitempty"`
@@ -222,6 +223,7 @@ func ParsePackage(r io.Reader) (*Package, error) {
222223
BundleDependencies: meta.BundleDependencies,
223224
DevelopmentDependencies: meta.DevDependencies,
224225
PeerDependencies: meta.PeerDependencies,
226+
PeerDependenciesMeta: meta.PeerDependenciesMeta,
225227
OptionalDependencies: meta.OptionalDependencies,
226228
Bin: meta.Bin,
227229
Readme: meta.Readme,

modules/packages/npm/metadata.go

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ type Metadata struct {
1919
BundleDependencies []string `json:"bundleDependencies,omitempty"`
2020
DevelopmentDependencies map[string]string `json:"development_dependencies,omitempty"`
2121
PeerDependencies map[string]string `json:"peer_dependencies,omitempty"`
22+
PeerDependenciesMeta map[string]any `json:"peer_dependencies_meta,omitempty"`
2223
OptionalDependencies map[string]string `json:"optional_dependencies,omitempty"`
2324
Bin map[string]string `json:"bin,omitempty"`
2425
Readme string `json:"readme,omitempty"`

modules/web/router_path.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,23 @@ func (p *routerPathMatcher) matchPath(chiCtx *chi.Context, path string) bool {
8989
return true
9090
}
9191

92+
func isValidMethod(name string) bool {
93+
switch name {
94+
case http.MethodGet, http.MethodPost, http.MethodPut, http.MethodPatch, http.MethodDelete, http.MethodHead, http.MethodOptions, http.MethodConnect, http.MethodTrace:
95+
return true
96+
}
97+
return false
98+
}
99+
92100
func newRouterPathMatcher(methods, pattern string, h ...any) *routerPathMatcher {
93101
middlewares, handlerFunc := wrapMiddlewareAndHandler(nil, h)
94102
p := &routerPathMatcher{methods: make(container.Set[string]), middlewares: middlewares, handlerFunc: handlerFunc}
95103
for _, method := range strings.Split(methods, ",") {
96-
p.methods.Add(strings.TrimSpace(method))
104+
method = strings.TrimSpace(method)
105+
if !isValidMethod(method) {
106+
panic(fmt.Sprintf("invalid HTTP method: %s", method))
107+
}
108+
p.methods.Add(method)
97109
}
98110
re := []byte{'^'}
99111
lastEnd := 0

options/locale/locale_ja-JP.ini

+2
Original file line numberDiff line numberDiff line change
@@ -3763,6 +3763,8 @@ variables.creation.success=変数 "%s" を追加しました。
37633763
variables.update.failed=変数を更新できませんでした。
37643764
variables.update.success=変数を更新しました。
37653765

3766+
logs.always_auto_scroll=常にログを自動スクロール
3767+
logs.always_expand_running=常に実行中のログを展開
37663768

37673769
[projects]
37683770
deleted.display_name=削除されたプロジェクト

options/locale/locale_pt-PT.ini

+1
Original file line numberDiff line numberDiff line change
@@ -3764,6 +3764,7 @@ workflow.not_found=A sequência de trabalho '%s' não foi encontrada.
37643764
workflow.run_success=A sequência de trabalho '%s' foi executada com sucesso.
37653765
workflow.from_ref=Usar sequência de trabalho de
37663766
workflow.has_workflow_dispatch=Esta sequência de trabalho tem um despoletador de eventos workflow_dispatch.
3767+
workflow.has_no_workflow_dispatch=A sequência de trabalho '%s' não tem nenhum despoletador de eventos workflow_dispatch.
37673768

37683769
need_approval_desc=É necessária aprovação para executar sequências de trabalho para a derivação do pedido de integração.
37693770

routers/api/packages/alpine/alpine.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ func UploadPackageFile(ctx *context.Context) {
114114

115115
pck, err := alpine_module.ParsePackage(buf)
116116
if err != nil {
117-
if errors.Is(err, util.ErrInvalidArgument) || err == io.EOF {
117+
if errors.Is(err, util.ErrInvalidArgument) || errors.Is(err, io.EOF) {
118118
apiError(ctx, http.StatusBadRequest, err)
119119
} else {
120120
apiError(ctx, http.StatusInternalServerError, err)

routers/api/packages/api.go

+19-140
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,8 @@ func CommonRoutes() *web.Router {
138138
}, reqPackageAccess(perm.AccessModeRead))
139139
r.Group("/arch", func() {
140140
r.Methods("HEAD,GET", "/repository.key", arch.GetRepositoryKey)
141-
r.PathGroup("*", func(g *web.RouterPathGroup) {
141+
r.Methods("PUT", "" /* no repository */, reqPackageAccess(perm.AccessModeWrite), arch.UploadPackageFile)
142+
r.PathGroup("/*", func(g *web.RouterPathGroup) {
142143
g.MatchPath("PUT", "/<repository:*>", reqPackageAccess(perm.AccessModeWrite), arch.UploadPackageFile)
143144
g.MatchPath("HEAD,GET", "/<repository:*>/<architecture>/<filename>", arch.GetPackageOrRepositoryFile)
144145
g.MatchPath("DELETE", "/<repository:*>/<name>/<version>/<architecture>", reqPackageAccess(perm.AccessModeWrite), arch.DeletePackageVersion)
@@ -698,150 +699,28 @@ func ContainerRoutes() *web.Router {
698699
})
699700
r.Get("/_catalog", container.ReqContainerAccess, container.GetRepositoryList)
700701
r.Group("/{username}", func() {
701-
r.Group("/{image}", func() {
702-
r.Group("/blobs/uploads", func() {
703-
r.Post("", container.InitiateUploadBlob)
704-
r.Group("/{uuid}", func() {
705-
r.Get("", container.GetUploadBlob)
706-
r.Patch("", container.UploadBlob)
707-
r.Put("", container.EndUploadBlob)
708-
r.Delete("", container.CancelUploadBlob)
709-
})
710-
}, reqPackageAccess(perm.AccessModeWrite))
711-
r.Group("/blobs/{digest}", func() {
712-
r.Head("", container.HeadBlob)
713-
r.Get("", container.GetBlob)
714-
r.Delete("", reqPackageAccess(perm.AccessModeWrite), container.DeleteBlob)
715-
})
716-
r.Group("/manifests/{reference}", func() {
717-
r.Put("", reqPackageAccess(perm.AccessModeWrite), container.UploadManifest)
718-
r.Head("", container.HeadManifest)
719-
r.Get("", container.GetManifest)
720-
r.Delete("", reqPackageAccess(perm.AccessModeWrite), container.DeleteManifest)
721-
})
722-
r.Get("/tags/list", container.GetTagList)
723-
}, container.VerifyImageName)
724-
725-
var (
726-
blobsUploadsPattern = regexp.MustCompile(`\A(.+)/blobs/uploads/([a-zA-Z0-9-_.=]+)\z`)
727-
blobsPattern = regexp.MustCompile(`\A(.+)/blobs/([^/]+)\z`)
728-
manifestsPattern = regexp.MustCompile(`\A(.+)/manifests/([^/]+)\z`)
729-
)
730-
731-
// Manual mapping of routes because {image} can contain slashes which chi does not support
732-
r.Methods("HEAD,GET,POST,PUT,PATCH,DELETE", "/*", func(ctx *context.Context) {
733-
path := ctx.PathParam("*")
734-
isHead := ctx.Req.Method == "HEAD"
735-
isGet := ctx.Req.Method == "GET"
736-
isPost := ctx.Req.Method == "POST"
737-
isPut := ctx.Req.Method == "PUT"
738-
isPatch := ctx.Req.Method == "PATCH"
739-
isDelete := ctx.Req.Method == "DELETE"
740-
741-
if isPost && strings.HasSuffix(path, "/blobs/uploads") {
742-
reqPackageAccess(perm.AccessModeWrite)(ctx)
743-
if ctx.Written() {
744-
return
745-
}
746-
747-
ctx.SetPathParam("image", path[:len(path)-14])
748-
container.VerifyImageName(ctx)
749-
if ctx.Written() {
750-
return
751-
}
752-
753-
container.InitiateUploadBlob(ctx)
754-
return
755-
}
756-
if isGet && strings.HasSuffix(path, "/tags/list") {
757-
ctx.SetPathParam("image", path[:len(path)-10])
758-
container.VerifyImageName(ctx)
759-
if ctx.Written() {
760-
return
761-
}
762-
763-
container.GetTagList(ctx)
764-
return
765-
}
766-
767-
m := blobsUploadsPattern.FindStringSubmatch(path)
768-
if len(m) == 3 && (isGet || isPut || isPatch || isDelete) {
769-
reqPackageAccess(perm.AccessModeWrite)(ctx)
770-
if ctx.Written() {
771-
return
772-
}
773-
774-
ctx.SetPathParam("image", m[1])
775-
container.VerifyImageName(ctx)
776-
if ctx.Written() {
777-
return
778-
}
779-
780-
ctx.SetPathParam("uuid", m[2])
781-
782-
if isGet {
702+
r.PathGroup("/*", func(g *web.RouterPathGroup) {
703+
g.MatchPath("POST", "/<image:*>/blobs/uploads", reqPackageAccess(perm.AccessModeWrite), container.VerifyImageName, container.InitiateUploadBlob)
704+
g.MatchPath("GET", "/<image:*>/tags/list", container.VerifyImageName, container.GetTagList)
705+
g.MatchPath("GET,PATCH,PUT,DELETE", `/<image:*>/blobs/uploads/<uuid:[-.=\w]+>`, reqPackageAccess(perm.AccessModeWrite), container.VerifyImageName, func(ctx *context.Context) {
706+
if ctx.Req.Method == http.MethodGet {
783707
container.GetUploadBlob(ctx)
784-
} else if isPatch {
708+
} else if ctx.Req.Method == http.MethodPatch {
785709
container.UploadBlob(ctx)
786-
} else if isPut {
710+
} else if ctx.Req.Method == http.MethodPut {
787711
container.EndUploadBlob(ctx)
788-
} else {
712+
} else /* DELETE */ {
789713
container.CancelUploadBlob(ctx)
790714
}
791-
return
792-
}
793-
m = blobsPattern.FindStringSubmatch(path)
794-
if len(m) == 3 && (isHead || isGet || isDelete) {
795-
ctx.SetPathParam("image", m[1])
796-
container.VerifyImageName(ctx)
797-
if ctx.Written() {
798-
return
799-
}
800-
801-
ctx.SetPathParam("digest", m[2])
802-
803-
if isHead {
804-
container.HeadBlob(ctx)
805-
} else if isGet {
806-
container.GetBlob(ctx)
807-
} else {
808-
reqPackageAccess(perm.AccessModeWrite)(ctx)
809-
if ctx.Written() {
810-
return
811-
}
812-
container.DeleteBlob(ctx)
813-
}
814-
return
815-
}
816-
m = manifestsPattern.FindStringSubmatch(path)
817-
if len(m) == 3 && (isHead || isGet || isPut || isDelete) {
818-
ctx.SetPathParam("image", m[1])
819-
container.VerifyImageName(ctx)
820-
if ctx.Written() {
821-
return
822-
}
823-
824-
ctx.SetPathParam("reference", m[2])
825-
826-
if isHead {
827-
container.HeadManifest(ctx)
828-
} else if isGet {
829-
container.GetManifest(ctx)
830-
} else {
831-
reqPackageAccess(perm.AccessModeWrite)(ctx)
832-
if ctx.Written() {
833-
return
834-
}
835-
if isPut {
836-
container.UploadManifest(ctx)
837-
} else {
838-
container.DeleteManifest(ctx)
839-
}
840-
}
841-
return
842-
}
843-
844-
ctx.Status(http.StatusNotFound)
715+
})
716+
g.MatchPath("HEAD", `/<image:*>/blobs/<digest>`, container.VerifyImageName, container.HeadBlob)
717+
g.MatchPath("GET", `/<image:*>/blobs/<digest>`, container.VerifyImageName, container.GetBlob)
718+
g.MatchPath("DELETE", `/<image:*>/blobs/<digest>`, container.VerifyImageName, reqPackageAccess(perm.AccessModeWrite), container.DeleteBlob)
719+
720+
g.MatchPath("HEAD", `/<image:*>/manifests/<reference>`, container.VerifyImageName, container.HeadManifest)
721+
g.MatchPath("GET", `/<image:*>/manifests/<reference>`, container.VerifyImageName, container.GetManifest)
722+
g.MatchPath("PUT", `/<image:*>/manifests/<reference>`, container.VerifyImageName, reqPackageAccess(perm.AccessModeWrite), container.UploadManifest)
723+
g.MatchPath("DELETE", `/<image:*>/manifests/<reference>`, container.VerifyImageName, reqPackageAccess(perm.AccessModeWrite), container.DeleteManifest)
845724
})
846725
}, container.ReqContainerAccess, context.UserAssignmentWeb(), context.PackageAssignment(), reqPackageAccess(perm.AccessModeRead))
847726

routers/api/packages/arch/arch.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func UploadPackageFile(ctx *context.Context) {
6262

6363
pck, err := arch_module.ParsePackage(buf)
6464
if err != nil {
65-
if errors.Is(err, util.ErrInvalidArgument) || err == io.EOF {
65+
if errors.Is(err, util.ErrInvalidArgument) || errors.Is(err, io.EOF) {
6666
apiError(ctx, http.StatusBadRequest, err)
6767
} else {
6868
apiError(ctx, http.StatusInternalServerError, err)

routers/api/packages/cargo/cargo.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ func DownloadPackageFile(ctx *context.Context) {
181181
},
182182
)
183183
if err != nil {
184-
if err == packages_model.ErrPackageNotExist || err == packages_model.ErrPackageFileNotExist {
184+
if errors.Is(err, packages_model.ErrPackageNotExist) || errors.Is(err, packages_model.ErrPackageFileNotExist) {
185185
apiError(ctx, http.StatusNotFound, err)
186186
return
187187
}
@@ -276,7 +276,7 @@ func UnyankPackage(ctx *context.Context) {
276276
func yankPackage(ctx *context.Context, yank bool) {
277277
pv, err := packages_model.GetVersionByNameAndVersion(ctx, ctx.Package.Owner.ID, packages_model.TypeCargo, ctx.PathParam("package"), ctx.PathParam("version"))
278278
if err != nil {
279-
if err == packages_model.ErrPackageNotExist {
279+
if errors.Is(err, packages_model.ErrPackageNotExist) {
280280
apiError(ctx, http.StatusNotFound, err)
281281
return
282282
}

routers/api/packages/chef/chef.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ func PackageVersionMetadata(ctx *context.Context) {
216216

217217
pv, err := packages_model.GetVersionByNameAndVersion(ctx, ctx.Package.Owner.ID, packages_model.TypeChef, packageName, packageVersion)
218218
if err != nil {
219-
if err == packages_model.ErrPackageNotExist {
219+
if errors.Is(err, packages_model.ErrPackageNotExist) {
220220
apiError(ctx, http.StatusNotFound, err)
221221
return
222222
}
@@ -327,7 +327,7 @@ func UploadPackage(ctx *context.Context) {
327327
func DownloadPackage(ctx *context.Context) {
328328
pv, err := packages_model.GetVersionByNameAndVersion(ctx, ctx.Package.Owner.ID, packages_model.TypeChef, ctx.PathParam("name"), ctx.PathParam("version"))
329329
if err != nil {
330-
if err == packages_model.ErrPackageNotExist {
330+
if errors.Is(err, packages_model.ErrPackageNotExist) {
331331
apiError(ctx, http.StatusNotFound, err)
332332
return
333333
}
@@ -368,7 +368,7 @@ func DeletePackageVersion(ctx *context.Context) {
368368
},
369369
)
370370
if err != nil {
371-
if err == packages_model.ErrPackageNotExist {
371+
if errors.Is(err, packages_model.ErrPackageNotExist) {
372372
apiError(ctx, http.StatusNotFound, err)
373373
} else {
374374
apiError(ctx, http.StatusInternalServerError, err)

routers/api/packages/composer/composer.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ func DownloadPackageFile(ctx *context.Context) {
176176
},
177177
)
178178
if err != nil {
179-
if err == packages_model.ErrPackageNotExist || err == packages_model.ErrPackageFileNotExist {
179+
if errors.Is(err, packages_model.ErrPackageNotExist) || errors.Is(err, packages_model.ErrPackageFileNotExist) {
180180
apiError(ctx, http.StatusNotFound, err)
181181
return
182182
}

0 commit comments

Comments
 (0)