aboutsummaryrefslogtreecommitdiffstats
path: root/models/packages
diff options
context:
space:
mode:
authorKN4CK3R <admin@oldschoolhack.me>2023-05-22 04:57:49 +0200
committerGitHub <noreply@github.com>2023-05-22 10:57:49 +0800
commitcdb088cec288a20e14240f86a689dd14f4cd603b (patch)
tree0a491ea8dcffa22b5b1033d04f5402425fbeb73c /models/packages
parentec2a01d1e20c0d33c1ea7e362a7dfd5b653dd15f (diff)
downloadgitea-cdb088cec288a20e14240f86a689dd14f4cd603b.tar.gz
gitea-cdb088cec288a20e14240f86a689dd14f4cd603b.zip
Add CRAN package registry (#22331)
This PR adds a [CRAN](https://cran.r-project.org/) package registry. ![grafik](https://user-images.githubusercontent.com/1666336/210450039-d6fa6f77-20cd-4741-89a8-1624def267f7.png)
Diffstat (limited to 'models/packages')
-rw-r--r--models/packages/cran/search.go90
-rw-r--r--models/packages/descriptor.go3
-rw-r--r--models/packages/package.go6
3 files changed, 99 insertions, 0 deletions
diff --git a/models/packages/cran/search.go b/models/packages/cran/search.go
new file mode 100644
index 0000000000..8a8b52a35e
--- /dev/null
+++ b/models/packages/cran/search.go
@@ -0,0 +1,90 @@
+// Copyright 2023 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package cran
+
+import (
+ "context"
+ "strconv"
+ "strings"
+
+ "code.gitea.io/gitea/models/db"
+ "code.gitea.io/gitea/models/packages"
+ cran_module "code.gitea.io/gitea/modules/packages/cran"
+
+ "xorm.io/builder"
+)
+
+type SearchOptions struct {
+ OwnerID int64
+ FileType string
+ Platform string
+ RVersion string
+ Filename string
+}
+
+func (opts *SearchOptions) toConds() builder.Cond {
+ var cond builder.Cond = builder.Eq{
+ "package.type": packages.TypeCran,
+ "package.owner_id": opts.OwnerID,
+ "package_version.is_internal": false,
+ }
+
+ if opts.Filename != "" {
+ cond = cond.And(builder.Eq{"package_file.lower_name": strings.ToLower(opts.Filename)})
+ }
+
+ var propsCond builder.Cond = builder.Eq{
+ "package_property.ref_type": packages.PropertyTypeFile,
+ }
+ propsCond = propsCond.And(builder.Expr("package_property.ref_id = package_file.id"))
+
+ count := 1
+ propsCondBlock := builder.Eq{"package_property.name": cran_module.PropertyType}.And(builder.Eq{"package_property.value": opts.FileType})
+
+ if opts.Platform != "" {
+ count += 2
+ propsCondBlock = propsCondBlock.
+ Or(builder.Eq{"package_property.name": cran_module.PropertyPlatform}.And(builder.Eq{"package_property.value": opts.Platform})).
+ Or(builder.Eq{"package_property.name": cran_module.PropertyRVersion}.And(builder.Eq{"package_property.value": opts.RVersion}))
+ }
+
+ propsCond = propsCond.And(propsCondBlock)
+
+ cond = cond.And(builder.Eq{
+ strconv.Itoa(count): builder.Select("COUNT(*)").Where(propsCond).From("package_property"),
+ })
+
+ return cond
+}
+
+func SearchLatestVersions(ctx context.Context, opts *SearchOptions) ([]*packages.PackageVersion, error) {
+ sess := db.GetEngine(ctx).
+ Table("package_version").
+ Select("package_version.*").
+ Join("LEFT", "package_version pv2", builder.Expr("package_version.package_id = pv2.package_id AND pv2.is_internal = ? AND (package_version.created_unix < pv2.created_unix OR (package_version.created_unix = pv2.created_unix AND package_version.id < pv2.id))", false)).
+ Join("INNER", "package", "package.id = package_version.package_id").
+ Join("INNER", "package_file", "package_file.version_id = package_version.id").
+ Where(opts.toConds().And(builder.Expr("pv2.id IS NULL"))).
+ Asc("package.name")
+
+ pvs := make([]*packages.PackageVersion, 0, 10)
+ return pvs, sess.Find(&pvs)
+}
+
+func SearchFile(ctx context.Context, opts *SearchOptions) (*packages.PackageFile, error) {
+ sess := db.GetEngine(ctx).
+ Table("package_version").
+ Select("package_file.*").
+ Join("INNER", "package", "package.id = package_version.package_id").
+ Join("INNER", "package_file", "package_file.version_id = package_version.id").
+ Where(opts.toConds())
+
+ pf := &packages.PackageFile{}
+ if has, err := sess.Get(pf); err != nil {
+ return nil, err
+ } else if !has {
+ return nil, packages.ErrPackageFileNotExist
+ }
+ return pf, nil
+}
diff --git a/models/packages/descriptor.go b/models/packages/descriptor.go
index 8e01650866..ee35ffe0f2 100644
--- a/models/packages/descriptor.go
+++ b/models/packages/descriptor.go
@@ -19,6 +19,7 @@ import (
"code.gitea.io/gitea/modules/packages/conan"
"code.gitea.io/gitea/modules/packages/conda"
"code.gitea.io/gitea/modules/packages/container"
+ "code.gitea.io/gitea/modules/packages/cran"
"code.gitea.io/gitea/modules/packages/debian"
"code.gitea.io/gitea/modules/packages/helm"
"code.gitea.io/gitea/modules/packages/maven"
@@ -151,6 +152,8 @@ func GetPackageDescriptor(ctx context.Context, pv *PackageVersion) (*PackageDesc
metadata = &conda.VersionMetadata{}
case TypeContainer:
metadata = &container.Metadata{}
+ case TypeCran:
+ metadata = &cran.Metadata{}
case TypeDebian:
metadata = &debian.Metadata{}
case TypeGeneric:
diff --git a/models/packages/package.go b/models/packages/package.go
index 2dfed78046..380a076f9d 100644
--- a/models/packages/package.go
+++ b/models/packages/package.go
@@ -37,6 +37,7 @@ const (
TypeConan Type = "conan"
TypeConda Type = "conda"
TypeContainer Type = "container"
+ TypeCran Type = "cran"
TypeDebian Type = "debian"
TypeGeneric Type = "generic"
TypeGo Type = "go"
@@ -60,6 +61,7 @@ var TypeList = []Type{
TypeConan,
TypeConda,
TypeContainer,
+ TypeCran,
TypeDebian,
TypeGeneric,
TypeGo,
@@ -92,6 +94,8 @@ func (pt Type) Name() string {
return "Conda"
case TypeContainer:
return "Container"
+ case TypeCran:
+ return "CRAN"
case TypeDebian:
return "Debian"
case TypeGeneric:
@@ -139,6 +143,8 @@ func (pt Type) SVGName() string {
return "gitea-conda"
case TypeContainer:
return "octicon-container"
+ case TypeCran:
+ return "gitea-cran"
case TypeDebian:
return "gitea-debian"
case TypeGeneric: