From a7c32fe2d11bd2c9cefc015f58bf2e11b19dfb34 Mon Sep 17 00:00:00 2001 From: Ethan Reesor Date: Mon, 7 Sep 2020 17:32:40 -0500 Subject: [PATCH] Add Golang Package type - Add `golang` as a valid `Packages::Package#package_type` - Add `golang_max_file_size` to `PlanLimits` - Add `prefixed_semver_regex` to `Gitlab::Regex::Packages` - Filter `Packages::Package#version` with `prefixed_semver_regex` for Go - Make appropriate changes to GraphQL, specs, factories, and docs --- app/models/packages/package.rb | 3 ++- changelogs/unreleased/add-golang-to-packages.yml | 5 +++++ ...d_golang_package_max_file_size_to_plan_limits.rb | 9 +++++++++ db/schema_migrations/20200905013247 | 1 + db/structure.sql | 3 ++- doc/api/graphql/reference/gitlab_schema.graphql | 5 +++++ doc/api/graphql/reference/gitlab_schema.json | 6 ++++++ doc/api/graphql/reference/index.md | 1 + doc/api/packages.md | 4 ++-- lib/gitlab/regex.rb | 5 +++++ spec/factories/packages.rb | 6 ++++++ spec/graphql/types/package_type_enum_spec.rb | 2 +- spec/lib/gitlab/regex_spec.rb | 13 +++++++++++++ .../services/packages_shared_examples.rb | 1 + 14 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 changelogs/unreleased/add-golang-to-packages.yml create mode 100644 db/migrate/20200905013247_add_golang_package_max_file_size_to_plan_limits.rb create mode 100644 db/schema_migrations/20200905013247 diff --git a/app/models/packages/package.rb b/app/models/packages/package.rb index bda111609574b7..61167546b257e7 100644 --- a/app/models/packages/package.rb +++ b/app/models/packages/package.rb @@ -40,12 +40,13 @@ class Packages::Package < ApplicationRecord validates :version, format: { with: Gitlab::Regex.conan_recipe_component_regex }, if: :conan? validates :version, format: { with: Gitlab::Regex.maven_version_regex }, if: -> { version? && maven? } validates :version, format: { with: Gitlab::Regex.pypi_version_regex }, if: :pypi? + validates :version, format: { with: Gitlab::Regex.prefixed_semver_regex }, if: :golang? validates :version, presence: true, format: { with: Gitlab::Regex.generic_package_version_regex }, if: :generic? - enum package_type: { maven: 1, npm: 2, conan: 3, nuget: 4, pypi: 5, composer: 6, generic: 7 } + enum package_type: { maven: 1, npm: 2, conan: 3, nuget: 4, pypi: 5, composer: 6, generic: 7, golang: 8 } scope :with_name, ->(name) { where(name: name) } scope :with_name_like, ->(name) { where(arel_table[:name].matches(name)) } diff --git a/changelogs/unreleased/add-golang-to-packages.yml b/changelogs/unreleased/add-golang-to-packages.yml new file mode 100644 index 00000000000000..601c799620667c --- /dev/null +++ b/changelogs/unreleased/add-golang-to-packages.yml @@ -0,0 +1,5 @@ +--- +title: Add Go(lang) to Packages +merge_request: 41712 +author: Ethan Reesor (@firelizzard) +type: added diff --git a/db/migrate/20200905013247_add_golang_package_max_file_size_to_plan_limits.rb b/db/migrate/20200905013247_add_golang_package_max_file_size_to_plan_limits.rb new file mode 100644 index 00000000000000..0a6d0ce73398d1 --- /dev/null +++ b/db/migrate/20200905013247_add_golang_package_max_file_size_to_plan_limits.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddGolangPackageMaxFileSizeToPlanLimits < ActiveRecord::Migration[6.0] + DOWNTIME = false + + def change + add_column(:plan_limits, :golang_max_file_size, :bigint, default: 100.megabytes, null: false) + end +end diff --git a/db/schema_migrations/20200905013247 b/db/schema_migrations/20200905013247 new file mode 100644 index 00000000000000..b0926ca1d99793 --- /dev/null +++ b/db/schema_migrations/20200905013247 @@ -0,0 +1 @@ +860c45fd6293f2f8f10d7351cb5a2fbab2cc9147e56b538cb62d75469b039ef0 \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 7668e3388004a0..88cbcda2bd229b 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -14364,7 +14364,8 @@ CREATE TABLE plan_limits ( npm_max_file_size bigint DEFAULT 524288000 NOT NULL, nuget_max_file_size bigint DEFAULT 524288000 NOT NULL, pypi_max_file_size bigint DEFAULT '3221225472'::bigint NOT NULL, - generic_packages_max_file_size bigint DEFAULT '5368709120'::bigint NOT NULL + generic_packages_max_file_size bigint DEFAULT '5368709120'::bigint NOT NULL, + golang_max_file_size bigint DEFAULT 104857600 NOT NULL ); CREATE SEQUENCE plan_limits_id_seq diff --git a/doc/api/graphql/reference/gitlab_schema.graphql b/doc/api/graphql/reference/gitlab_schema.graphql index 5aaea2829e72e0..1eb12abcc46a5a 100644 --- a/doc/api/graphql/reference/gitlab_schema.graphql +++ b/doc/api/graphql/reference/gitlab_schema.graphql @@ -11511,6 +11511,11 @@ enum PackageTypeEnum { """ GENERIC + """ + Packages from the golang package manager + """ + GOLANG + """ Packages from the maven package manager """ diff --git a/doc/api/graphql/reference/gitlab_schema.json b/doc/api/graphql/reference/gitlab_schema.json index 85e25af226f230..1ca7cd645dd5d5 100644 --- a/doc/api/graphql/reference/gitlab_schema.json +++ b/doc/api/graphql/reference/gitlab_schema.json @@ -34393,6 +34393,12 @@ "description": "Packages from the generic package manager", "isDeprecated": false, "deprecationReason": null + }, + { + "name": "GOLANG", + "description": "Packages from the golang package manager", + "isDeprecated": false, + "deprecationReason": null } ], "possibleTypes": null diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index d43f9f021e2ccc..d70695bc989d63 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -3279,6 +3279,7 @@ Values for sorting projects. | `COMPOSER` | Packages from the composer package manager | | `CONAN` | Packages from the conan package manager | | `GENERIC` | Packages from the generic package manager | +| `GOLANG` | Packages from the golang package manager | | `MAVEN` | Packages from the maven package manager | | `NPM` | Packages from the npm package manager | | `NUGET` | Packages from the nuget package manager | diff --git a/doc/api/packages.md b/doc/api/packages.md index cf65b5188448f5..2290fce9845169 100644 --- a/doc/api/packages.md +++ b/doc/api/packages.md @@ -26,7 +26,7 @@ GET /projects/:id/packages | `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) | | `order_by`| string | no | The field to use as order. One of `created_at` (default), `name`, `version`, or `type`. | | `sort` | string | no | The direction of the order, either `asc` (default) for ascending order or `desc` for descending order. | -| `package_type` | string | no | Filter the returned packages by type. One of `conan`, `maven`, `npm`, `pypi`, `composer`, or `nuget`. (_Introduced in GitLab 12.9_) +| `package_type` | string | no | Filter the returned packages by type. One of `conan`, `maven`, `npm`, `pypi`, `composer`, `nuget`, or `golang`. (_Introduced in GitLab 12.9_) | `package_name` | string | no | Filter the project packages with a fuzzy search by name. (_Introduced in GitLab 12.9_) ```shell @@ -73,7 +73,7 @@ GET /groups/:id/packages | `exclude_subgroups` | boolean | false | If the parameter is included as true, packages from projects from subgroups are not listed. Default is `false`. | | `order_by`| string | no | The field to use as order. One of `created_at` (default), `name`, `version`, `type`, or `project_path`. | | `sort` | string | no | The direction of the order, either `asc` (default) for ascending order or `desc` for descending order. | -| `package_type` | string | no | Filter the returned packages by type. One of `conan`, `maven`, `npm`, `pypi`, `composer`, or `nuget`. (_Introduced in GitLab 12.9_) | +| `package_type` | string | no | Filter the returned packages by type. One of `conan`, `maven`, `npm`, `pypi`, `composer`, `nuget`, or `golang`. (_Introduced in GitLab 12.9_) | | `package_name` | string | no | Filter the project packages with a fuzzy search by name. (_[Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30980) in GitLab 13.0_) ```shell diff --git a/lib/gitlab/regex.rb b/lib/gitlab/regex.rb index 7df8b69e843ade..736210bdc78fda 100644 --- a/lib/gitlab/regex.rb +++ b/lib/gitlab/regex.rb @@ -80,6 +80,11 @@ def semver_regex @semver_regex ||= Regexp.new("\\A#{::Gitlab::Regex.unbounded_semver_regex.source}\\z", ::Gitlab::Regex.unbounded_semver_regex.options) end + def prefixed_semver_regex + # identical to semver_regex, except starting with 'v' + @prefixed_semver_regex ||= Regexp.new("\\Av#{::Gitlab::Regex.unbounded_semver_regex.source}\\z", ::Gitlab::Regex.unbounded_semver_regex.options) + end + def go_package_regex # A Go package name looks like a URL but is not; it: # - Must not have a scheme, such as http:// or https:// diff --git a/spec/factories/packages.rb b/spec/factories/packages.rb index 52b2a32cd3b780..2b374a5ea3d62f 100644 --- a/spec/factories/packages.rb +++ b/spec/factories/packages.rb @@ -91,6 +91,12 @@ end end + factory :golang_package do + sequence(:name) { |n| "golang.org/x/pkg-#{n}"} + sequence(:version) { |n| "v1.0.#{n}" } + package_type { :golang } + end + factory :conan_package do conan_metadatum diff --git a/spec/graphql/types/package_type_enum_spec.rb b/spec/graphql/types/package_type_enum_spec.rb index 80a20a68bc27ba..638f8ccbaee545 100644 --- a/spec/graphql/types/package_type_enum_spec.rb +++ b/spec/graphql/types/package_type_enum_spec.rb @@ -4,6 +4,6 @@ RSpec.describe GitlabSchema.types['PackageTypeEnum'] do it 'exposes all package types' do - expect(described_class.values.keys).to contain_exactly(*%w[MAVEN NPM CONAN NUGET PYPI COMPOSER GENERIC]) + expect(described_class.values.keys).to contain_exactly(*%w[MAVEN NPM CONAN NUGET PYPI COMPOSER GENERIC GOLANG]) end end diff --git a/spec/lib/gitlab/regex_spec.rb b/spec/lib/gitlab/regex_spec.rb index 0a6fbeee672071..fa8fd5715991f6 100644 --- a/spec/lib/gitlab/regex_spec.rb +++ b/spec/lib/gitlab/regex_spec.rb @@ -448,4 +448,17 @@ it { is_expected.not_to match('my file name') } it { is_expected.not_to match('!!()()') } end + + describe '.prefixed_semver_regex' do + subject { described_class.prefixed_semver_regex } + + it { is_expected.to match('v1.2.3') } + it { is_expected.to match('v1.2.3-beta') } + it { is_expected.to match('v1.2.3-alpha.3') } + it { is_expected.not_to match('v1') } + it { is_expected.not_to match('v1.2') } + it { is_expected.not_to match('v1./2.3') } + it { is_expected.not_to match('v../../../../../1.2.3') } + it { is_expected.not_to match('v%2e%2e%2f1.2.3') } + end end diff --git a/spec/support/shared_examples/services/packages_shared_examples.rb b/spec/support/shared_examples/services/packages_shared_examples.rb index 7fd59c3d963ffc..c00a087311cbb1 100644 --- a/spec/support/shared_examples/services/packages_shared_examples.rb +++ b/spec/support/shared_examples/services/packages_shared_examples.rb @@ -170,6 +170,7 @@ def group_filter_url(filter, param) let_it_be(:package5) { create(:pypi_package, project: project) } let_it_be(:package6) { create(:composer_package, project: project) } let_it_be(:package7) { create(:generic_package, project: project) } + let_it_be(:package8) { create(:golang_package, project: project) } Packages::Package.package_types.keys.each do |package_type| context "for package type #{package_type}" do -- GitLab