merge from forgejo

This commit is contained in:
年幼涩批 2024-08-06 22:52:18 +08:00
parent c221fd3cfd
commit fffdc360c5
No known key found for this signature in database
GPG Key ID: 8C351B970754EF16
6 changed files with 193 additions and 202 deletions

View File

@ -15,7 +15,7 @@ import (
"code.gitea.io/gitea/modules/packages" "code.gitea.io/gitea/modules/packages"
"github.com/mholt/archiver/v3" "github.com/mholt/archiver/v3"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/require"
) )
func TestParsePackage(t *testing.T) { func TestParsePackage(t *testing.T) {
@ -40,23 +40,23 @@ arch = x86_64
// Test .PKGINFO file // Test .PKGINFO file
pinf, err := fs.Stat("pkginfo") pinf, err := fs.Stat("pkginfo")
assert.NoError(t, err) require.NoError(t, err)
pfile, err := fs.Open("pkginfo") pfile, err := fs.Open("pkginfo")
assert.NoError(t, err) require.NoError(t, err)
parcname, err := archiver.NameInArchive(pinf, ".PKGINFO", ".PKGINFO") parcname, err := archiver.NameInArchive(pinf, ".PKGINFO", ".PKGINFO")
assert.NoError(t, err) require.NoError(t, err)
// Test .MTREE file // Test .MTREE file
minf, err := fs.Stat("mtree") minf, err := fs.Stat("mtree")
assert.NoError(t, err) require.NoError(t, err)
mfile, err := fs.Open("mtree") mfile, err := fs.Open("mtree")
assert.NoError(t, err) require.NoError(t, err)
marcname, err := archiver.NameInArchive(minf, ".MTREE", ".MTREE") marcname, err := archiver.NameInArchive(minf, ".MTREE", ".MTREE")
assert.NoError(t, err) require.NoError(t, err)
t.Run("normal archive", func(t *testing.T) { t.Run("normal archive", func(t *testing.T) {
var buf bytes.Buffer var buf bytes.Buffer
@ -71,7 +71,7 @@ arch = x86_64
}, },
ReadCloser: pfile, ReadCloser: pfile,
}) })
assert.NoError(t, errors.Join(pfile.Close(), err)) require.NoError(t, errors.Join(pfile.Close(), err))
err = archive.Write(archiver.File{ err = archive.Write(archiver.File{
FileInfo: archiver.FileInfo{ FileInfo: archiver.FileInfo{
@ -80,7 +80,7 @@ arch = x86_64
}, },
ReadCloser: mfile, ReadCloser: mfile,
}) })
assert.NoError(t, errors.Join(mfile.Close(), archive.Close(), err)) require.NoError(t, errors.Join(mfile.Close(), archive.Close(), err))
reader, err := packages.CreateHashedBufferFromReader(&buf) reader, err := packages.CreateHashedBufferFromReader(&buf)
if err != nil { if err != nil {
@ -89,7 +89,7 @@ arch = x86_64
defer reader.Close() defer reader.Close()
_, err = ParsePackage(reader) _, err = ParsePackage(reader)
assert.NoError(t, err) require.NoError(t, err)
}) })
t.Run("missing .PKGINFO", func(t *testing.T) { t.Run("missing .PKGINFO", func(t *testing.T) {
@ -97,24 +97,23 @@ arch = x86_64
archive := archiver.NewTarZstd() archive := archiver.NewTarZstd()
archive.Create(&buf) archive.Create(&buf)
require.NoError(t, archive.Close())
assert.NoError(t, archive.Close())
reader, err := packages.CreateHashedBufferFromReader(&buf) reader, err := packages.CreateHashedBufferFromReader(&buf)
if err != nil { require.NoError(t, err)
t.Fatal(err)
}
defer reader.Close() defer reader.Close()
_, err = ParsePackage(reader) _, err = ParsePackage(reader)
assert.Error(t, err) require.Error(t, err)
assert.Contains(t, err.Error(), ".PKGINFO file not found") require.Contains(t, err.Error(), ".PKGINFO file not found")
}) })
t.Run("missing .MTREE", func(t *testing.T) { t.Run("missing .MTREE", func(t *testing.T) {
var buf bytes.Buffer var buf bytes.Buffer
pfile, err := fs.Open("pkginfo") pfile, err := fs.Open("pkginfo")
assert.NoError(t, err) require.NoError(t, err)
archive := archiver.NewTarZstd() archive := archiver.NewTarZstd()
archive.Create(&buf) archive.Create(&buf)
@ -126,16 +125,15 @@ arch = x86_64
}, },
ReadCloser: pfile, ReadCloser: pfile,
}) })
assert.NoError(t, errors.Join(pfile.Close(), archive.Close(), err)) require.NoError(t, errors.Join(pfile.Close(), archive.Close(), err))
reader, err := packages.CreateHashedBufferFromReader(&buf) reader, err := packages.CreateHashedBufferFromReader(&buf)
if err != nil { require.NoError(t, err)
t.Fatal(err)
}
defer reader.Close() defer reader.Close()
_, err = ParsePackage(reader) _, err = ParsePackage(reader)
assert.Error(t, err) require.Error(t, err)
assert.Contains(t, err.Error(), ".MTREE file not found") require.Contains(t, err.Error(), ".MTREE file not found")
}) })
} }
@ -161,8 +159,8 @@ makedepend = cmake
backup = usr/bin/paket1 backup = usr/bin/paket1
` `
p, err := ParsePackageInfo(strings.NewReader(PKGINFO)) p, err := ParsePackageInfo(strings.NewReader(PKGINFO))
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, Package{ require.Equal(t, Package{
Name: "a", Name: "a",
Version: "1-2", Version: "1-2",
VersionMetadata: VersionMetadata{ VersionMetadata: VersionMetadata{
@ -221,7 +219,7 @@ func TestValidatePackageSpec(t *testing.T) {
err := ValidatePackageSpec(&p) err := ValidatePackageSpec(&p)
assert.NoError(t, err) require.NoError(t, err)
}) })
t.Run("invalid package name", func(t *testing.T) { t.Run("invalid package name", func(t *testing.T) {
@ -230,8 +228,8 @@ func TestValidatePackageSpec(t *testing.T) {
err := ValidatePackageSpec(&p) err := ValidatePackageSpec(&p)
assert.Error(t, err) require.Error(t, err)
assert.Contains(t, err.Error(), "invalid package name") require.Contains(t, err.Error(), "invalid package name")
}) })
t.Run("invalid package base", func(t *testing.T) { t.Run("invalid package base", func(t *testing.T) {
@ -240,8 +238,8 @@ func TestValidatePackageSpec(t *testing.T) {
err := ValidatePackageSpec(&p) err := ValidatePackageSpec(&p)
assert.Error(t, err) require.Error(t, err)
assert.Contains(t, err.Error(), "invalid package base") require.Contains(t, err.Error(), "invalid package base")
}) })
t.Run("invalid package version", func(t *testing.T) { t.Run("invalid package version", func(t *testing.T) {
@ -250,8 +248,8 @@ func TestValidatePackageSpec(t *testing.T) {
err := ValidatePackageSpec(&p) err := ValidatePackageSpec(&p)
assert.Error(t, err) require.Error(t, err)
assert.Contains(t, err.Error(), "invalid package base") require.Contains(t, err.Error(), "invalid package base")
}) })
t.Run("invalid package version", func(t *testing.T) { t.Run("invalid package version", func(t *testing.T) {
@ -260,8 +258,8 @@ func TestValidatePackageSpec(t *testing.T) {
err := ValidatePackageSpec(&p) err := ValidatePackageSpec(&p)
assert.Error(t, err) require.Error(t, err)
assert.Contains(t, err.Error(), "invalid package version") require.Contains(t, err.Error(), "invalid package version")
}) })
t.Run("missing architecture", func(t *testing.T) { t.Run("missing architecture", func(t *testing.T) {
@ -270,8 +268,8 @@ func TestValidatePackageSpec(t *testing.T) {
err := ValidatePackageSpec(&p) err := ValidatePackageSpec(&p)
assert.Error(t, err) require.Error(t, err)
assert.Contains(t, err.Error(), "architecture should be specified") require.Contains(t, err.Error(), "architecture should be specified")
}) })
t.Run("invalid URL", func(t *testing.T) { t.Run("invalid URL", func(t *testing.T) {
@ -280,8 +278,8 @@ func TestValidatePackageSpec(t *testing.T) {
err := ValidatePackageSpec(&p) err := ValidatePackageSpec(&p)
assert.Error(t, err) require.Error(t, err)
assert.Contains(t, err.Error(), "invalid project URL") require.Contains(t, err.Error(), "invalid project URL")
}) })
t.Run("invalid check dependency", func(t *testing.T) { t.Run("invalid check dependency", func(t *testing.T) {
@ -290,8 +288,8 @@ func TestValidatePackageSpec(t *testing.T) {
err := ValidatePackageSpec(&p) err := ValidatePackageSpec(&p)
assert.Error(t, err) require.Error(t, err)
assert.Contains(t, err.Error(), "invalid check dependency") require.Contains(t, err.Error(), "invalid check dependency")
}) })
t.Run("invalid dependency", func(t *testing.T) { t.Run("invalid dependency", func(t *testing.T) {
@ -300,8 +298,8 @@ func TestValidatePackageSpec(t *testing.T) {
err := ValidatePackageSpec(&p) err := ValidatePackageSpec(&p)
assert.Error(t, err) require.Error(t, err)
assert.Contains(t, err.Error(), "invalid dependency") require.Contains(t, err.Error(), "invalid dependency")
}) })
t.Run("invalid make dependency", func(t *testing.T) { t.Run("invalid make dependency", func(t *testing.T) {
@ -310,8 +308,8 @@ func TestValidatePackageSpec(t *testing.T) {
err := ValidatePackageSpec(&p) err := ValidatePackageSpec(&p)
assert.Error(t, err) require.Error(t, err)
assert.Contains(t, err.Error(), "invalid make dependency") require.Contains(t, err.Error(), "invalid make dependency")
}) })
t.Run("invalid provides", func(t *testing.T) { t.Run("invalid provides", func(t *testing.T) {
@ -320,8 +318,8 @@ func TestValidatePackageSpec(t *testing.T) {
err := ValidatePackageSpec(&p) err := ValidatePackageSpec(&p)
assert.Error(t, err) require.Error(t, err)
assert.Contains(t, err.Error(), "invalid provides") require.Contains(t, err.Error(), "invalid provides")
}) })
t.Run("invalid optional dependency", func(t *testing.T) { t.Run("invalid optional dependency", func(t *testing.T) {
@ -330,8 +328,8 @@ func TestValidatePackageSpec(t *testing.T) {
err := ValidatePackageSpec(&p) err := ValidatePackageSpec(&p)
assert.Error(t, err) require.Error(t, err)
assert.Contains(t, err.Error(), "invalid optional dependency") require.Contains(t, err.Error(), "invalid optional dependency")
}) })
t.Run("invalid optional dependency", func(t *testing.T) { t.Run("invalid optional dependency", func(t *testing.T) {
@ -340,82 +338,62 @@ func TestValidatePackageSpec(t *testing.T) {
err := ValidatePackageSpec(&p) err := ValidatePackageSpec(&p)
assert.Error(t, err) require.Error(t, err)
assert.Contains(t, err.Error(), "backup file contains leading forward slash") require.Contains(t, err.Error(), "backup file contains leading forward slash")
}) })
} }
func TestDescString(t *testing.T) { func TestDescString(t *testing.T) {
const pkgdesc = `%FILENAME% const pkgdesc = `%FILENAME%
zstd-1.5.5-1-x86_64.pkg.tar.zst zstd-1.5.5-1-x86_64.pkg.tar.zst
%NAME% %NAME%
zstd zstd
%BASE% %BASE%
zstd zstd
%VERSION% %VERSION%
1.5.5-1 1.5.5-1
%DESC% %DESC%
Zstandard - Fast real-time compression algorithm Zstandard - Fast real-time compression algorithm
%GROUPS% %GROUPS%
dummy1 dummy1
dummy2 dummy2
%CSIZE% %CSIZE%
401 401
%ISIZE% %ISIZE%
1500453 1500453
%MD5SUM% %MD5SUM%
5016660ef3d9aa148a7b72a08d3df1b2 5016660ef3d9aa148a7b72a08d3df1b2
%SHA256SUM% %SHA256SUM%
9fa4ede47e35f5971e4f26ecadcbfb66ab79f1d638317ac80334a3362dedbabd 9fa4ede47e35f5971e4f26ecadcbfb66ab79f1d638317ac80334a3362dedbabd
%URL% %URL%
https://facebook.github.io/zstd/ https://facebook.github.io/zstd/
%LICENSE% %LICENSE%
BSD BSD
GPL2 GPL2
%ARCH% %ARCH%
x86_64 x86_64
%BUILDDATE% %BUILDDATE%
1681646714 1681646714
%PACKAGER% %PACKAGER%
Jelle van der Waa <jelle@archlinux.org> Jelle van der Waa <jelle@archlinux.org>
%PROVIDES% %PROVIDES%
libzstd.so=1-64 libzstd.so=1-64
%DEPENDS% %DEPENDS%
glibc glibc
gcc-libs gcc-libs
zlib zlib
xz xz
lz4 lz4
%OPTDEPENDS% %OPTDEPENDS%
dummy3 dummy3
dummy4 dummy4
%MAKEDEPENDS% %MAKEDEPENDS%
cmake cmake
gtest gtest
ninja ninja
%CHECKDEPENDS% %CHECKDEPENDS%
dummy5 dummy5
dummy6 dummy6
` `
md := &Package{ md := &Package{
@ -443,5 +421,5 @@ dummy6
Arch: "x86_64", Arch: "x86_64",
}, },
} }
assert.Equal(t, pkgdesc, md.Desc()) require.Equal(t, pkgdesc, md.Desc())
} }

View File

@ -3480,9 +3480,7 @@ alpine.repository = Repository Info
alpine.repository.branches = Branches alpine.repository.branches = Branches
alpine.repository.repositories = Repositories alpine.repository.repositories = Repositories
alpine.repository.architectures = Architectures alpine.repository.architectures = Architectures
arch.pacman.helper.gpg = Import gpg public key: arch.pacman.helper.gpg = Add trust certificate for pacman:
arch.pacman.helper.gpg.id = Use `gpg --homedir /etc/pacman.d/gnupg --list-keys` list added gpg key id.
arch.pacman.helper.pacman = For more pacman usage guides, see <a target="_blank" rel="noopener noreferrer" href="%s">pacman wiki</a> or <a target="_blank" rel="noopener noreferrer" href="%s">pacman sign wiki</a> .
arch.pacman.repo.multi = %s has the same version in different distributions. arch.pacman.repo.multi = %s has the same version in different distributions.
arch.pacman.repo.multi.item = Configuration for %s arch.pacman.repo.multi.item = Configuration for %s
arch.pacman.conf = Add server with related distribution and architecture to <code>/etc/pacman.conf</code> : arch.pacman.conf = Add server with related distribution and architecture to <code>/etc/pacman.conf</code> :
@ -3490,6 +3488,7 @@ arch.pacman.sync = Sync package with pacman:
arch.version.properties = Version Properties arch.version.properties = Version Properties
arch.version.description = Description arch.version.description = Description
arch.version.provides = Provides arch.version.provides = Provides
arch.version.groups = Group
arch.version.depends = Depends arch.version.depends = Depends
arch.version.optdepends = Optional depends arch.version.optdepends = Optional depends
arch.version.makedepends = Make depends arch.version.makedepends = Make depends

View File

@ -4,6 +4,7 @@
package user package user
import ( import (
"fmt"
"net/http" "net/http"
"net/url" "net/url"
@ -213,6 +214,7 @@ func ViewPackageVersion(ctx *context.Context) {
registryAppURL, _ = url.Parse(setting.AppURL) registryAppURL, _ = url.Parse(setting.AppURL)
} }
ctx.Data["RegistryHost"] = registryAppURL.Host ctx.Data["RegistryHost"] = registryAppURL.Host
ctx.Data["SignMail"] = fmt.Sprintf("%s@noreply.%s", ctx.Package.Owner.Name, registryAppURL.Host)
groups := make(container.Set[string]) groups := make(container.Set[string])
for _, f := range pd.Files { for _, f := range pd.Files {
for _, pp := range f.Properties { for _, pp := range f.Properties {

View File

@ -10,14 +10,17 @@ import (
"errors" "errors"
"fmt" "fmt"
"io" "io"
"net/url"
"os" "os"
"sort" "sort"
"strings" "strings"
packages_model "code.gitea.io/gitea/models/packages" packages_model "code.gitea.io/gitea/models/packages"
user_model "code.gitea.io/gitea/models/user" user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/httplib"
packages_module "code.gitea.io/gitea/modules/packages" packages_module "code.gitea.io/gitea/modules/packages"
arch_module "code.gitea.io/gitea/modules/packages/arch" arch_module "code.gitea.io/gitea/modules/packages/arch"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/util"
packages_service "code.gitea.io/gitea/services/packages" packages_service "code.gitea.io/gitea/services/packages"
@ -86,7 +89,10 @@ func NewFileSign(ctx context.Context, ownerID int64, input io.Reader) (*packages
if err != nil { if err != nil {
return nil, err return nil, err
} }
pkgSig, _ := packages_module.NewHashedBuffer() pkgSig, err := packages_module.NewHashedBuffer()
if err != nil {
return nil, err
}
defer pkgSig.Close() defer pkgSig.Close()
if err := openpgp.DetachSign(pkgSig, e, input, nil); err != nil { if err := openpgp.DetachSign(pkgSig, e, input, nil); err != nil {
return nil, err return nil, err
@ -286,7 +292,15 @@ func GetOrCreateKeyPair(ctx context.Context, ownerID int64) (string, string, err
} }
if priv == "" || pub == "" { if priv == "" || pub == "" {
priv, pub, err = generateKeypair() user, err := user_model.GetUserByID(ctx, ownerID)
if err != nil && !errors.Is(err, util.ErrNotExist) {
return "", "", err
}
registryAppURL, err := url.Parse(httplib.GuessCurrentAppURL(ctx))
if err != nil {
registryAppURL, _ = url.Parse(setting.AppURL)
}
priv, pub, err = generateKeypair(user.Name, registryAppURL.Host)
if err != nil { if err != nil {
return "", "", err return "", "", err
} }
@ -303,10 +317,13 @@ func GetOrCreateKeyPair(ctx context.Context, ownerID int64) (string, string, err
return priv, pub, nil return priv, pub, nil
} }
func generateKeypair() (string, string, error) { func generateKeypair(owner, host string) (string, string, error) {
e, err := openpgp.NewEntity("Arch Package Signer", "Arch Registry", "arch@localhost", &packet.Config{ e, err := openpgp.NewEntity(
RSABits: 4096, owner,
}) "Arch Package signature only",
fmt.Sprintf("%s@noreply.%s", owner, host), &packet.Config{
RSABits: 4096,
})
if err != nil { if err != nil {
return "", "", err return "", "", err
} }

View File

@ -1,57 +1,52 @@
{{if eq .PackageDescriptor.Package.Type "arch"}} {{if eq .PackageDescriptor.Package.Type "arch"}}
<h4 class="ui top attached header">{{ctx.Locale.Tr "packages.installation"}}</h4> <h4 class="ui top attached header">{{ctx.Locale.Tr "packages.installation"}}</h4>
<div class="ui attached segment"> <div class="ui attached segment">
<div class="ui form"> <div class="ui form">
<div class="field"> <div class="field">
<label>{{svg "octicon-terminal"}} {{ctx.Locale.Tr "packages.arch.pacman.helper.gpg"}}</label> <label>{{svg "octicon-terminal"}} {{ctx.Locale.Tr "packages.arch.pacman.helper.gpg"}}</label>
<div class="markup"> <div class="markup">
<pre class="code-block"><code>wget -O sign.gpg <origin-url data-url="{{AppSubUrl}}/api/packages/{{.PackageDescriptor.Owner.Name}}/arch/repository.key"></origin-url> <pre class="code-block"><code>wget -O sign.gpg <origin-url data-url="{{AppSubUrl}}/api/packages/{{.PackageDescriptor.Owner.Name}}/arch/repository.key"></origin-url>
pacman-key --add sign.gpg pacman-key --add sign.gpg
pacman-key --lsign-key '{{$.SignMail}}'</code></pre>
# {{ctx.Locale.Tr "packages.arch.pacman.helper.gpg.id"}} </div>
# {{ctx.Locale.Tr "packages.arch.pacman.helper.pacman" "https://wiki.archlinux.org/title/pacman" "https://wiki.archlinux.org/title/Pacman/Package_signing"}}
pacman-key --lsign-key "Key ID"</code></pre>
</div> </div>
</div> <div class="field">
<div class="field"> <label>{{svg "octicon-gear"}} {{ctx.Locale.Tr "packages.arch.pacman.conf"}}</label>
<label>{{svg "octicon-gear"}} {{ctx.Locale.Tr "packages.arch.pacman.conf"}}</label> <div class="markup">
<div class="markup">
<pre <pre
class="code-block"><code> class="code-block"><code>
{{- if gt (len $.Groups) 1 -}} {{- if gt (len $.Groups) 1 -}}
# {{ctx.Locale.Tr "packages.arch.pacman.repo.multi" $.PackageDescriptor.Package.LowerName}} # {{ctx.Locale.Tr "packages.arch.pacman.repo.multi" $.PackageDescriptor.Package.LowerName}}
{{end -}} {{end -}}
{{- $GroupSize := (len .Groups) -}} {{- $GroupSize := (len .Groups) -}}
{{- range $i,$v := .Groups -}} {{- range $i,$v := .Groups -}}
{{- if gt $i 0}} {{- if gt $i 0}}
{{end -}}{{- if gt $GroupSize 1 -}} {{end -}}{{- if gt $GroupSize 1 -}}
# {{ctx.Locale.Tr "packages.arch.pacman.repo.multi.item" .}} # {{ctx.Locale.Tr "packages.arch.pacman.repo.multi.item" .}}
{{end -}} {{end -}}
[{{$.PackageDescriptor.Owner.LowerName}}.{{$.RegistryHost}}] [{{$.PackageDescriptor.Owner.LowerName}}.{{$.RegistryHost}}]
SigLevel = Required SigLevel = Required
Server = <origin-url data-url="{{AppSubUrl}}/api/packages/{{$.PackageDescriptor.Owner.Name}}/arch/{{.}}/$arch"></origin-url> Server = <origin-url data-url="{{AppSubUrl}}/api/packages/{{$.PackageDescriptor.Owner.Name}}/arch/{{.}}/$arch"></origin-url>{{end -}}
{{end -}}
</code></pre> </code></pre>
</div>
</div> </div>
</div> <div class="field">
<div class="field"> <label>{{svg "octicon-sync"}} {{ctx.Locale.Tr "packages.arch.pacman.sync"}}</label>
<label>{{svg "octicon-sync"}} {{ctx.Locale.Tr "packages.arch.pacman.sync"}}</label> <div class="markup">
<div class="markup"> <pre class="code-block"><code>pacman -Sy {{.PackageDescriptor.Package.LowerName}}</code></pre>
<pre class="code-block"><code>pacman -Sy {{.PackageDescriptor.Package.LowerName}}</code></pre> </div>
</div>
<div class="field">
<label>{{ctx.Locale.Tr "packages.registry.documentation" "Arch" "https://docs.gitea.com/usage/packages/arch/"}}</label>
</div> </div>
</div>
<div class="field">
<label>{{ctx.Locale.Tr "packages.registry.documentation" "Arch"
"https://docs.gitea.com/usage/packages/arch/"}}</label>
</div> </div>
</div> </div>
</div>
<h4 class="ui top attached header">{{ctx.Locale.Tr "packages.arch.version.properties"}}</h4> <h4 class="ui top attached header">{{ctx.Locale.Tr "packages.arch.version.properties"}}</h4>
<div class="ui attached segment"> <div class="ui attached segment">
<table class="ui very basic compact table"> <table class="ui very basic compact table">
<tbody> <tbody>
<tr> <tr>
<td class="collapsing"> <td class="collapsing">
<h5>{{ctx.Locale.Tr "packages.arch.version.description"}}</h5> <h5>{{ctx.Locale.Tr "packages.arch.version.description"}}</h5>
@ -60,87 +55,87 @@ Server = <origin-url data-url="{{AppSubUrl}}/api/packages/{{$.PackageDescriptor.
</tr> </tr>
{{if .PackageDescriptor.Metadata.Groups}} {{if .PackageDescriptor.Metadata.Groups}}
<tr> <tr>
<td class="collapsing"> <td class="collapsing">
<h5>{{ctx.Locale.Tr "packages.arch.version.groups"}}</h5> <h5>{{ctx.Locale.Tr "packages.arch.version.groups"}}</h5>
</td> </td>
<td>{{StringUtils.Join $.PackageDescriptor.Metadata.Groups ", "}}</td> <td>{{StringUtils.Join $.PackageDescriptor.Metadata.Groups ", "}}</td>
</tr> </tr>
{{end}} {{end}}
{{if .PackageDescriptor.Metadata.Provides}} {{if .PackageDescriptor.Metadata.Provides}}
<tr> <tr>
<td class="collapsing"> <td class="collapsing">
<h5>{{ctx.Locale.Tr "packages.arch.version.provides"}}</h5> <h5>{{ctx.Locale.Tr "packages.arch.version.provides"}}</h5>
</td> </td>
<td>{{StringUtils.Join $.PackageDescriptor.Metadata.Provides ", "}}</td> <td>{{StringUtils.Join $.PackageDescriptor.Metadata.Provides ", "}}</td>
</tr> </tr>
{{end}} {{end}}
{{if .PackageDescriptor.Metadata.Depends}} {{if .PackageDescriptor.Metadata.Depends}}
<tr> <tr>
<td class="collapsing"> <td class="collapsing">
<h5>{{ctx.Locale.Tr "packages.arch.version.depends"}}</h5> <h5>{{ctx.Locale.Tr "packages.arch.version.depends"}}</h5>
</td> </td>
<td>{{StringUtils.Join $.PackageDescriptor.Metadata.Depends ", "}}</td> <td>{{StringUtils.Join $.PackageDescriptor.Metadata.Depends ", "}}</td>
</tr> </tr>
{{end}} {{end}}
{{if .PackageDescriptor.Metadata.OptDepends}} {{if .PackageDescriptor.Metadata.OptDepends}}
<tr> <tr>
<td class="collapsing"> <td class="collapsing">
<h5>{{ctx.Locale.Tr "packages.arch.version.optdepends"}}</h5> <h5>{{ctx.Locale.Tr "packages.arch.version.optdepends"}}</h5>
</td> </td>
<td>{{StringUtils.Join $.PackageDescriptor.Metadata.OptDepends ", "}}</td> <td>{{StringUtils.Join $.PackageDescriptor.Metadata.OptDepends ", "}}</td>
</tr> </tr>
{{end}} {{end}}
{{if .PackageDescriptor.Metadata.MakeDepends}} {{if .PackageDescriptor.Metadata.MakeDepends}}
<tr> <tr>
<td class="collapsing"> <td class="collapsing">
<h5>{{ctx.Locale.Tr "packages.arch.version.makedepends"}}</h5> <h5>{{ctx.Locale.Tr "packages.arch.version.makedepends"}}</h5>
</td> </td>
<td>{{StringUtils.Join $.PackageDescriptor.Metadata.MakeDepends ", "}}</td> <td>{{StringUtils.Join $.PackageDescriptor.Metadata.MakeDepends ", "}}</td>
</tr> </tr>
{{end}} {{end}}
{{if .PackageDescriptor.Metadata.CheckDepends}} {{if .PackageDescriptor.Metadata.CheckDepends}}
<tr> <tr>
<td class="collapsing"> <td class="collapsing">
<h5>{{ctx.Locale.Tr "packages.arch.version.checkdepends"}}</h5> <h5>{{ctx.Locale.Tr "packages.arch.version.checkdepends"}}</h5>
</td> </td>
<td>{{StringUtils.Join $.PackageDescriptor.Metadata.CheckDepends ", "}}</td> <td>{{StringUtils.Join $.PackageDescriptor.Metadata.CheckDepends ", "}}</td>
</tr> </tr>
{{end}} {{end}}
{{if .PackageDescriptor.Metadata.Conflicts}} {{if .PackageDescriptor.Metadata.Conflicts}}
<tr> <tr>
<td class="collapsing"> <td class="collapsing">
<h5>{{ctx.Locale.Tr "packages.arch.version.conflicts"}}</h5> <h5>{{ctx.Locale.Tr "packages.arch.version.conflicts"}}</h5>
</td> </td>
<td>{{StringUtils.Join $.PackageDescriptor.Metadata.Conflicts ", "}}</td> <td>{{StringUtils.Join $.PackageDescriptor.Metadata.Conflicts ", "}}</td>
</tr> </tr>
{{end}} {{end}}
{{if .PackageDescriptor.Metadata.Replaces}} {{if .PackageDescriptor.Metadata.Replaces}}
<tr> <tr>
<td class="collapsing"> <td class="collapsing">
<h5>{{ctx.Locale.Tr "packages.arch.version.replaces"}}</h5> <h5>{{ctx.Locale.Tr "packages.arch.version.replaces"}}</h5>
</td> </td>
<td>{{StringUtils.Join $.PackageDescriptor.Metadata.Replaces ", "}}</td> <td>{{StringUtils.Join $.PackageDescriptor.Metadata.Replaces ", "}}</td>
</tr> </tr>
{{end}} {{end}}
{{if .PackageDescriptor.Metadata.Backup}} {{if .PackageDescriptor.Metadata.Backup}}
<tr> <tr>
<td class="collapsing"> <td class="collapsing">
<h5>{{ctx.Locale.Tr "packages.arch.version.backup"}}</h5> <h5>{{ctx.Locale.Tr "packages.arch.version.backup"}}</h5>
</td> </td>
<td>{{StringUtils.Join $.PackageDescriptor.Metadata.Backup ", "}}</td> <td>{{StringUtils.Join $.PackageDescriptor.Metadata.Backup ", "}}</td>
</tr> </tr>
{{end}} {{end}}
</tbody> </tbody>
</table> </table>
</div> </div>
{{end}} {{end}}

View File

@ -9,6 +9,7 @@ import (
"bytes" "bytes"
"compress/gzip" "compress/gzip"
"encoding/base64" "encoding/base64"
"errors"
"fmt" "fmt"
"io" "io"
"net/http" "net/http"
@ -25,8 +26,7 @@ import (
"github.com/ProtonMail/go-crypto/openpgp/armor" "github.com/ProtonMail/go-crypto/openpgp/armor"
"github.com/ProtonMail/go-crypto/openpgp/packet" "github.com/ProtonMail/go-crypto/openpgp/packet"
"github.com/pkg/errors" "github.com/stretchr/testify/require"
"github.com/stretchr/testify/assert"
) )
func TestPackageArch(t *testing.T) { func TestPackageArch(t *testing.T) {
@ -101,8 +101,8 @@ nYAR`),
req := NewRequest(t, "GET", rootURL+"/repository.key") req := NewRequest(t, "GET", rootURL+"/repository.key")
resp := MakeRequest(t, req, http.StatusOK) resp := MakeRequest(t, req, http.StatusOK)
assert.Equal(t, "application/pgp-keys", resp.Header().Get("Content-Type")) require.Equal(t, "application/pgp-keys", resp.Header().Get("Content-Type"))
assert.Contains(t, resp.Body.String(), "-----BEGIN PGP PUBLIC KEY BLOCK-----") require.Contains(t, resp.Body.String(), "-----BEGIN PGP PUBLIC KEY BLOCK-----")
}) })
t.Run("Upload", func(t *testing.T) { t.Run("Upload", func(t *testing.T) {
@ -116,24 +116,24 @@ nYAR`),
MakeRequest(t, req, http.StatusCreated) MakeRequest(t, req, http.StatusCreated)
pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeArch) pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeArch)
assert.NoError(t, err) require.NoError(t, err)
assert.Len(t, pvs, 1) require.Len(t, pvs, 1)
pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0]) pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0])
assert.NoError(t, err) require.NoError(t, err)
assert.Nil(t, pd.SemVer) require.Nil(t, pd.SemVer)
assert.IsType(t, &arch_model.VersionMetadata{}, pd.Metadata) require.IsType(t, &arch_model.VersionMetadata{}, pd.Metadata)
assert.Equal(t, "test", pd.Package.Name) require.Equal(t, "test", pd.Package.Name)
assert.Equal(t, "1.0.0-1", pd.Version.Version) require.Equal(t, "1.0.0-1", pd.Version.Version)
pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID) pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID)
assert.NoError(t, err) require.NoError(t, err)
assert.Len(t, pfs, 2) // zst and zst.sig require.Len(t, pfs, 2) // zst and zst.sig
assert.True(t, pfs[0].IsLead) require.True(t, pfs[0].IsLead)
pb, err := packages.GetBlobByID(db.DefaultContext, pfs[0].BlobID) pb, err := packages.GetBlobByID(db.DefaultContext, pfs[0].BlobID)
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, int64(len(pkgs["any"])), pb.Size) require.Equal(t, int64(len(pkgs["any"])), pb.Size)
req = NewRequestWithBody(t, "PUT", rootURL+"/default", bytes.NewReader(pkgs["any"])). req = NewRequestWithBody(t, "PUT", rootURL+"/default", bytes.NewReader(pkgs["any"])).
AddBasicAuth(user.Name) AddBasicAuth(user.Name)
@ -163,11 +163,11 @@ nYAR`),
defer tests.PrintCurrentTest(t)() defer tests.PrintCurrentTest(t)()
req := NewRequest(t, "GET", rootURL+"/default/x86_64/test-1.0.0-1-x86_64.pkg.tar.zst") req := NewRequest(t, "GET", rootURL+"/default/x86_64/test-1.0.0-1-x86_64.pkg.tar.zst")
resp := MakeRequest(t, req, http.StatusOK) resp := MakeRequest(t, req, http.StatusOK)
assert.Equal(t, pkgs["x86_64"], resp.Body.Bytes()) require.Equal(t, pkgs["x86_64"], resp.Body.Bytes())
req = NewRequest(t, "GET", rootURL+"/default/x86_64/test-1.0.0-1-any.pkg.tar.zst") req = NewRequest(t, "GET", rootURL+"/default/x86_64/test-1.0.0-1-any.pkg.tar.zst")
resp = MakeRequest(t, req, http.StatusOK) resp = MakeRequest(t, req, http.StatusOK)
assert.Equal(t, pkgs["any"], resp.Body.Bytes()) require.Equal(t, pkgs["any"], resp.Body.Bytes())
req = NewRequest(t, "GET", rootURL+"/default/x86_64/test-1.0.0-1-aarch64.pkg.tar.zst") req = NewRequest(t, "GET", rootURL+"/default/x86_64/test-1.0.0-1-aarch64.pkg.tar.zst")
MakeRequest(t, req, http.StatusNotFound) MakeRequest(t, req, http.StatusNotFound)
@ -177,7 +177,7 @@ nYAR`),
req = NewRequest(t, "GET", rootURL+"/other/x86_64/test-1.0.0-1-any.pkg.tar.zst") req = NewRequest(t, "GET", rootURL+"/other/x86_64/test-1.0.0-1-any.pkg.tar.zst")
resp = MakeRequest(t, req, http.StatusOK) resp = MakeRequest(t, req, http.StatusOK)
assert.Equal(t, pkgs["any"], resp.Body.Bytes()) require.Equal(t, pkgs["any"], resp.Body.Bytes())
}) })
t.Run("SignVerify", func(t *testing.T) { t.Run("SignVerify", func(t *testing.T) {
@ -211,19 +211,19 @@ nYAR`),
t.Fatal(err) t.Fatal(err)
} }
files, err := listGzipFiles(respPkg.Body.Bytes()) files, err := listGzipFiles(respPkg.Body.Bytes())
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, 2, len(files)) require.Len(t, files, 2)
for s, d := range files { for s, d := range files {
name := getProperty(string(d.Data), "NAME") name := getProperty(string(d.Data), "NAME")
ver := getProperty(string(d.Data), "VERSION") ver := getProperty(string(d.Data), "VERSION")
assert.Equal(t, name+"-"+ver+"/desc", s) require.Equal(t, name+"-"+ver+"/desc", s)
fn := getProperty(string(d.Data), "FILENAME") fn := getProperty(string(d.Data), "FILENAME")
pgp := getProperty(string(d.Data), "PGPSIG") pgp := getProperty(string(d.Data), "PGPSIG")
req = NewRequest(t, "GET", rootURL+"/base/x86_64/"+fn+".sig") req = NewRequest(t, "GET", rootURL+"/base/x86_64/"+fn+".sig")
respSig := MakeRequest(t, req, http.StatusOK) respSig := MakeRequest(t, req, http.StatusOK)
decodeString, err := base64.StdEncoding.DecodeString(pgp) decodeString, err := base64.StdEncoding.DecodeString(pgp)
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, respSig.Body.Bytes(), decodeString) require.Equal(t, respSig.Body.Bytes(), decodeString)
} }
}) })
t.Run("Delete", func(t *testing.T) { t.Run("Delete", func(t *testing.T) {
@ -239,8 +239,8 @@ nYAR`),
req = NewRequest(t, "GET", rootURL+"/base/x86_64/base.db") req = NewRequest(t, "GET", rootURL+"/base/x86_64/base.db")
respPkg := MakeRequest(t, req, http.StatusOK) respPkg := MakeRequest(t, req, http.StatusOK)
files, err := listGzipFiles(respPkg.Body.Bytes()) files, err := listGzipFiles(respPkg.Body.Bytes())
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, 1, len(files)) require.Len(t, files, 1)
req = NewRequestWithBody(t, "DELETE", rootURL+"/base/test2/1.0.0-1", nil). req = NewRequestWithBody(t, "DELETE", rootURL+"/base/test2/1.0.0-1", nil).
AddBasicAuth(user.Name) AddBasicAuth(user.Name)
@ -251,8 +251,8 @@ nYAR`),
req = NewRequest(t, "GET", rootURL+"/default/x86_64/base.db") req = NewRequest(t, "GET", rootURL+"/default/x86_64/base.db")
respPkg = MakeRequest(t, req, http.StatusOK) respPkg = MakeRequest(t, req, http.StatusOK)
files, err = listGzipFiles(respPkg.Body.Bytes()) files, err = listGzipFiles(respPkg.Body.Bytes())
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, 1, len(files)) require.Len(t, files, 1)
}) })
} }