Skip to content

Commit c98a705

Browse files
fix anything v2 ...
1 parent fcb84f1 commit c98a705

File tree

7 files changed

+307
-215
lines changed

7 files changed

+307
-215
lines changed

modules/packages/arch/metadata.go

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,15 @@ var (
4141
reVer = regexp.MustCompile(`^[a-zA-Z0-9:_.+]+-+[0-9]+$`)
4242
reOptDep = regexp.MustCompile(`^[a-zA-Z0-9@._+-]+$|^[a-zA-Z0-9@._+-]+(:.*)`)
4343
rePkgVer = regexp.MustCompile(`^[a-zA-Z0-9@._+-]+$|^[a-zA-Z0-9@._+-]+(>.*)|^[a-zA-Z0-9@._+-]+(<.*)|^[a-zA-Z0-9@._+-]+(=.*)`)
44+
45+
magicZSTD = []byte{0x28, 0xB5, 0x2F, 0xFD}
46+
magicXZ = []byte{0xFD, 0x37, 0x7A, 0x58, 0x5A}
4447
)
4548

4649
type Package struct {
4750
Name string `json:"name"`
4851
Version string `json:"version"` // Includes version, release and epoch
52+
CompressType string `json:"compress_type"`
4953
VersionMetadata VersionMetadata
5054
FileMetadata FileMetadata
5155
}
@@ -89,18 +93,38 @@ func ParsePackage(r *packages.HashedBuffer) (*Package, error) {
8993
if err != nil {
9094
return nil, err
9195
}
92-
zstd := archiver.NewTarZstd()
93-
err = zstd.Open(r, 0)
96+
header := make([]byte, 5)
97+
_, err = r.Read(header)
98+
if err != nil {
99+
return nil, err
100+
}
101+
_, err = r.Seek(0, io.SeekStart)
102+
if err != nil {
103+
return nil, err
104+
}
105+
106+
var tarball archiver.Reader
107+
var tarballType string
108+
if bytes.Equal(header[:len(magicZSTD)], magicZSTD) {
109+
tarballType = "zst"
110+
tarball = archiver.NewTarZstd()
111+
} else if bytes.Equal(header[:len(magicXZ)], magicXZ) {
112+
tarballType = "xz"
113+
tarball = archiver.NewTarXz()
114+
} else {
115+
return nil, errors.New("not supported compression")
116+
}
117+
err = tarball.Open(r, 0)
94118
if err != nil {
95119
return nil, err
96120
}
97-
defer zstd.Close()
121+
defer tarball.Close()
98122

99123
var pkg *Package
100124
var mtree bool
101125

102126
for {
103-
f, err := zstd.Read()
127+
f, err := tarball.Read()
104128
if err == io.EOF {
105129
break
106130
}
@@ -111,7 +135,7 @@ func ParsePackage(r *packages.HashedBuffer) (*Package, error) {
111135

112136
switch f.Name() {
113137
case ".PKGINFO":
114-
pkg, err = ParsePackageInfo(f)
138+
pkg, err = ParsePackageInfo(tarballType, f)
115139
if err != nil {
116140
return nil, err
117141
}
@@ -137,8 +161,10 @@ func ParsePackage(r *packages.HashedBuffer) (*Package, error) {
137161

138162
// ParsePackageInfo Function that accepts reader for .PKGINFO file from package archive,
139163
// validates all field according to PKGBUILD spec and returns package.
140-
func ParsePackageInfo(r io.Reader) (*Package, error) {
141-
p := &Package{}
164+
func ParsePackageInfo(compressType string, r io.Reader) (*Package, error) {
165+
p := &Package{
166+
CompressType: compressType,
167+
}
142168

143169
scanner := bufio.NewScanner(r)
144170
for scanner.Scan() {
@@ -281,7 +307,7 @@ func ValidatePackageSpec(p *Package) error {
281307
// Desc Create pacman package description file.
282308
func (p *Package) Desc() string {
283309
entries := []string{
284-
"FILENAME", fmt.Sprintf("%s-%s-%s.pkg.tar.zst", p.Name, p.Version, p.FileMetadata.Arch),
310+
"FILENAME", fmt.Sprintf("%s-%s-%s.pkg.tar.%s", p.Name, p.Version, p.FileMetadata.Arch, p.CompressType),
285311
"NAME", p.Name,
286312
"BASE", p.VersionMetadata.Base,
287313
"VERSION", p.Version,

modules/packages/arch/metadata_test.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -158,11 +158,12 @@ checkdepend = ola
158158
makedepend = cmake
159159
backup = usr/bin/paket1
160160
`
161-
p, err := ParsePackageInfo(strings.NewReader(PKGINFO))
161+
p, err := ParsePackageInfo("zst", strings.NewReader(PKGINFO))
162162
require.NoError(t, err)
163163
require.Equal(t, Package{
164-
Name: "a",
165-
Version: "1-2",
164+
CompressType: "zst",
165+
Name: "a",
166+
Version: "1-2",
166167
VersionMetadata: VersionMetadata{
167168
Base: "b",
168169
Description: "comment",
@@ -417,8 +418,9 @@ dummy6
417418
`
418419

419420
md := &Package{
420-
Name: "zstd",
421-
Version: "1.5.5-1",
421+
CompressType: "zst",
422+
Name: "zstd",
423+
Version: "1.5.5-1",
422424
VersionMetadata: VersionMetadata{
423425
Base: "zstd",
424426
Description: "Zstandard - Fast real-time compression algorithm",

routers/api/packages/api.go

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,59 @@ func CommonRoutes() *web.Router {
127127
r.Head("", arch.GetRepositoryKey)
128128
r.Get("", arch.GetRepositoryKey)
129129
})
130-
r.Group("/{distro}", func() {
131-
r.Put("", reqPackageAccess(perm.AccessModeWrite), arch.PushPackage)
132-
r.Get("/{arch}/{file}", arch.GetPackageOrDB)
133-
r.Delete("/{package}/{version}", reqPackageAccess(perm.AccessModeWrite), arch.RemovePackage)
130+
131+
r.Methods("HEAD,GET,PUT,DELETE", "*", func(ctx *context.Context) {
132+
pathGroups := strings.Split(strings.Trim(ctx.PathParam("*"), "/"), "/")
133+
groupLen := len(pathGroups)
134+
isGetHead := ctx.Req.Method == "HEAD" || ctx.Req.Method == "GET"
135+
isPut := ctx.Req.Method == "PUT"
136+
isDelete := ctx.Req.Method == "DELETE"
137+
if isGetHead {
138+
if groupLen < 2 {
139+
ctx.Status(http.StatusNotFound)
140+
return
141+
}
142+
if groupLen == 2 {
143+
ctx.SetPathParam("group", "")
144+
ctx.SetPathParam("arch", pathGroups[0])
145+
ctx.SetPathParam("file", pathGroups[1])
146+
} else {
147+
ctx.SetPathParam("group", strings.Join(pathGroups[:groupLen-2], "/"))
148+
ctx.SetPathParam("arch", pathGroups[groupLen-2])
149+
ctx.SetPathParam("file", pathGroups[groupLen-1])
150+
}
151+
arch.GetPackageOrDB(ctx)
152+
return
153+
} else if isPut {
154+
ctx.SetPathParam("group", strings.Join(pathGroups, "/"))
155+
reqPackageAccess(perm.AccessModeWrite)(ctx)
156+
if ctx.Written() {
157+
return
158+
}
159+
arch.PushPackage(ctx)
160+
return
161+
} else if isDelete {
162+
if groupLen < 2 {
163+
ctx.Status(http.StatusBadRequest)
164+
return
165+
}
166+
if groupLen == 2 {
167+
ctx.SetPathParam("group", "")
168+
ctx.SetPathParam("package", pathGroups[0])
169+
ctx.SetPathParam("version", pathGroups[1])
170+
} else {
171+
ctx.SetPathParam("group", strings.Join(pathGroups[:groupLen-2], "/"))
172+
ctx.SetPathParam("package", pathGroups[groupLen-2])
173+
ctx.SetPathParam("version", pathGroups[groupLen-1])
174+
}
175+
reqPackageAccess(perm.AccessModeWrite)(ctx)
176+
if ctx.Written() {
177+
return
178+
}
179+
arch.RemovePackage(ctx)
180+
return
181+
}
182+
ctx.Status(http.StatusNotFound)
134183
})
135184
}, reqPackageAccess(perm.AccessModeRead))
136185
r.Group("/cargo", func() {

routers/api/packages/arch/arch.go

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"fmt"
1010
"io"
1111
"net/http"
12+
"regexp"
1213
"strings"
1314

1415
packages_model "code.gitea.io/gitea/models/packages"
@@ -21,6 +22,11 @@ import (
2122
arch_service "code.gitea.io/gitea/services/packages/arch"
2223
)
2324

25+
var (
26+
archPkgOrSig = regexp.MustCompile(`^.*\.pkg\.tar\.\w+(\.sig)*$`)
27+
archDBOrSig = regexp.MustCompile(`^.*.db(\.tar\.gz)*(\.sig)*$`)
28+
)
29+
2430
func apiError(ctx *context.Context, status int, obj any) {
2531
helper.LogAndProcessError(ctx, status, obj, func(message string) {
2632
ctx.PlainText(status, message)
@@ -41,7 +47,7 @@ func GetRepositoryKey(ctx *context.Context) {
4147
}
4248

4349
func PushPackage(ctx *context.Context) {
44-
distro := ctx.PathParam("distro")
50+
group := ctx.PathParam("group")
4551

4652
upload, needToClose, err := ctx.UploadStream()
4753
if err != nil {
@@ -61,7 +67,7 @@ func PushPackage(ctx *context.Context) {
6167

6268
p, err := arch_module.ParsePackage(buf)
6369
if err != nil {
64-
apiError(ctx, http.StatusInternalServerError, err)
70+
apiError(ctx, http.StatusBadRequest, err)
6571
return
6672
}
6773

@@ -97,7 +103,7 @@ func PushPackage(ctx *context.Context) {
97103
properties := map[string]string{
98104
arch_module.PropertyDescription: p.Desc(),
99105
arch_module.PropertyArch: p.FileMetadata.Arch,
100-
arch_module.PropertyDistribution: distro,
106+
arch_module.PropertyDistribution: group,
101107
}
102108

103109
version, _, err := packages_service.CreatePackageOrAddFileToExisting(
@@ -114,8 +120,8 @@ func PushPackage(ctx *context.Context) {
114120
},
115121
&packages_service.PackageFileCreationInfo{
116122
PackageFileInfo: packages_service.PackageFileInfo{
117-
Filename: fmt.Sprintf("%s-%s-%s.pkg.tar.zst", p.Name, p.Version, p.FileMetadata.Arch),
118-
CompositeKey: distro,
123+
Filename: fmt.Sprintf("%s-%s-%s.pkg.tar.%s", p.Name, p.Version, p.FileMetadata.Arch, p.CompressType),
124+
CompositeKey: group,
119125
},
120126
OverwriteExisting: false,
121127
IsLead: true,
@@ -138,8 +144,8 @@ func PushPackage(ctx *context.Context) {
138144
// add sign file
139145
_, err = packages_service.AddFileToPackageVersionInternal(ctx, version, &packages_service.PackageFileCreationInfo{
140146
PackageFileInfo: packages_service.PackageFileInfo{
141-
CompositeKey: distro,
142-
Filename: fmt.Sprintf("%s-%s-%s.pkg.tar.zst.sig", p.Name, p.Version, p.FileMetadata.Arch),
147+
CompositeKey: group,
148+
Filename: fmt.Sprintf("%s-%s-%s.pkg.tar.%s.sig", p.Name, p.Version, p.FileMetadata.Arch, p.CompressType),
143149
},
144150
OverwriteExisting: true,
145151
IsLead: false,
@@ -149,7 +155,7 @@ func PushPackage(ctx *context.Context) {
149155
if err != nil {
150156
apiError(ctx, http.StatusInternalServerError, err)
151157
}
152-
if err = arch_service.BuildPacmanDB(ctx, ctx.Package.Owner.ID, distro, p.FileMetadata.Arch); err != nil {
158+
if err = arch_service.BuildPacmanDB(ctx, ctx.Package.Owner.ID, group, p.FileMetadata.Arch); err != nil {
153159
apiError(ctx, http.StatusInternalServerError, err)
154160
return
155161
}
@@ -158,13 +164,13 @@ func PushPackage(ctx *context.Context) {
158164

159165
func GetPackageOrDB(ctx *context.Context) {
160166
var (
161-
file = ctx.PathParam("file")
162-
distro = ctx.PathParam("distro")
163-
arch = ctx.PathParam("arch")
167+
file = ctx.PathParam("file")
168+
group = ctx.PathParam("group")
169+
arch = ctx.PathParam("arch")
164170
)
165171

166-
if strings.HasSuffix(file, ".pkg.tar.zst") || strings.HasSuffix(file, ".pkg.tar.zst.sig") {
167-
pkg, err := arch_service.GetPackageFile(ctx, distro, file, ctx.Package.Owner.ID)
172+
if archPkgOrSig.MatchString(file) {
173+
pkg, err := arch_service.GetPackageFile(ctx, group, file, ctx.Package.Owner.ID)
168174
if err != nil {
169175
if errors.Is(err, util.ErrNotExist) {
170176
apiError(ctx, http.StatusNotFound, err)
@@ -180,11 +186,8 @@ func GetPackageOrDB(ctx *context.Context) {
180186
return
181187
}
182188

183-
if strings.HasSuffix(file, ".db.tar.gz") ||
184-
strings.HasSuffix(file, ".db") ||
185-
strings.HasSuffix(file, ".db.tar.gz.sig") ||
186-
strings.HasSuffix(file, ".db.sig") {
187-
pkg, err := arch_service.GetPackageDBFile(ctx, distro, arch, ctx.Package.Owner.ID,
189+
if archDBOrSig.MatchString(file) {
190+
pkg, err := arch_service.GetPackageDBFile(ctx, group, arch, ctx.Package.Owner.ID,
188191
strings.HasSuffix(file, ".sig"))
189192
if err != nil {
190193
if errors.Is(err, util.ErrNotExist) {
@@ -205,9 +208,9 @@ func GetPackageOrDB(ctx *context.Context) {
205208

206209
func RemovePackage(ctx *context.Context) {
207210
var (
208-
distro = ctx.PathParam("distro")
209-
pkg = ctx.PathParam("package")
210-
ver = ctx.PathParam("version")
211+
group = ctx.PathParam("group")
212+
pkg = ctx.PathParam("package")
213+
ver = ctx.PathParam("version")
211214
)
212215
pv, err := packages_model.GetVersionByNameAndVersion(
213216
ctx, ctx.Package.Owner.ID, packages_model.TypeArch, pkg, ver,
@@ -227,7 +230,7 @@ func RemovePackage(ctx *context.Context) {
227230
}
228231
deleted := false
229232
for _, file := range files {
230-
if file.CompositeKey == distro {
233+
if file.CompositeKey == group {
231234
deleted = true
232235
err := packages_service.RemovePackageFileAndVersionIfUnreferenced(ctx, ctx.ContextUser, file)
233236
if err != nil {
@@ -237,7 +240,7 @@ func RemovePackage(ctx *context.Context) {
237240
}
238241
}
239242
if deleted {
240-
err = arch_service.BuildCustomRepositoryFiles(ctx, ctx.Package.Owner.ID, distro)
243+
err = arch_service.BuildCustomRepositoryFiles(ctx, ctx.Package.Owner.ID, group)
241244
if err != nil {
242245
apiError(ctx, http.StatusInternalServerError, err)
243246
}

services/forms/package_form.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
type PackageCleanupRuleForm struct {
1616
ID int64
1717
Enabled bool
18-
Type string `binding:"Required;In(alpine,cargo,chef,composer,conan,conda,container,cran,debian,generic,go,helm,maven,npm,nuget,pub,pypi,rpm,rubygems,swift,vagrant)"`
18+
Type string `binding:"Required;In(alpine,arch,cargo,chef,composer,conan,conda,container,cran,debian,generic,go,helm,maven,npm,nuget,pub,pypi,rpm,rubygems,swift,vagrant)"`
1919
KeepCount int `binding:"In(0,1,5,10,25,50,100)"`
2020
KeepPattern string `binding:"RegexPattern"`
2121
RemoveDays int `binding:"In(0,7,14,30,60,90,180)"`

0 commit comments

Comments
 (0)