diff --git a/app/models/blob_viewer/go_mod.rb b/app/models/blob_viewer/go_mod.rb index ae57e2c05268535f7dda8b3c66cfdee27bf2c4ce..28eb06bf8fca398735c627c7f2e8c07bd9f5dc27 100644 --- a/app/models/blob_viewer/go_mod.rb +++ b/app/models/blob_viewer/go_mod.rb @@ -5,14 +5,6 @@ class GoMod < DependencyManager include ServerSide include Gitlab::Utils::StrongMemoize - MODULE_REGEX = / - \A (?# beginning of file) - module\s+ (?# module directive) - (?.*?) (?# module name) - \s*(?:\/\/.*)? (?# comment) - (?:\n|\z) (?# newline or end of file) - /x.freeze - self.file_types = %i(go_mod go_sum) def manager_name @@ -30,7 +22,7 @@ def package_type def package_name strong_memoize(:package_name) do next if blob.name != 'go.mod' - next unless match = MODULE_REGEX.match(blob.data) + next unless match = Gitlab::Regex.go_mod_module_regex.match(blob.data) match[:name] end diff --git a/doc/api/graphql/reference/gitlab_schema.graphql b/doc/api/graphql/reference/gitlab_schema.graphql index 23507172c6f167199d8a17b57625417f4bc08381..e418148e7c814894ccaac7fa82d621179ed8dccc 100644 --- a/doc/api/graphql/reference/gitlab_schema.graphql +++ b/doc/api/graphql/reference/gitlab_schema.graphql @@ -8130,6 +8130,11 @@ enum PackageTypeEnum { """ CONAN + """ + 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 06d5d50a4b0f740b450a0c5437b003b64c164c45..e81a047b660ec51425e52a4b4837cb9e2327017f 100644 --- a/doc/api/graphql/reference/gitlab_schema.json +++ b/doc/api/graphql/reference/gitlab_schema.json @@ -24257,6 +24257,12 @@ "description": "Packages from the composer package manager", "isDeprecated": false, "deprecationReason": null + }, + { + "name": "GOLANG", + "description": "Packages from the golang package manager", + "isDeprecated": false, + "deprecationReason": null } ], "possibleTypes": null diff --git a/ee/app/assets/javascripts/packages/details/components/app.vue b/ee/app/assets/javascripts/packages/details/components/app.vue index da4429f51347818d1dc732e0b08f44273471a929..30535c4cf3d33013d44b32044715117bb43fb478 100644 --- a/ee/app/assets/javascripts/packages/details/components/app.vue +++ b/ee/app/assets/javascripts/packages/details/components/app.vue @@ -18,6 +18,7 @@ import PackageActivity from './activity.vue'; import PackageInformation from './information.vue'; import PackageTitle from './package_title.vue'; import ConanInstallation from './conan_installation.vue'; +import GoInstallation from './go_installation.vue'; import MavenInstallation from './maven_installation.vue'; import NpmInstallation from './npm_installation.vue'; import NugetInstallation from './nuget_installation.vue'; @@ -50,6 +51,7 @@ export default { PackageInformation, PackageTitle, ConanInstallation, + GoInstallation, MavenInstallation, NpmInstallation, NugetInstallation, @@ -79,6 +81,8 @@ export default { switch (this.packageEntity.package_type) { case PackageType.CONAN: return ConanInstallation; + case PackageType.GO: + return GoInstallation; case PackageType.MAVEN: return MavenInstallation; case PackageType.NPM: diff --git a/ee/app/assets/javascripts/packages/details/components/go_installation.vue b/ee/app/assets/javascripts/packages/details/components/go_installation.vue new file mode 100644 index 0000000000000000000000000000000000000000..0b097c2d5581150dcd91a496a3ad772b86700c6c --- /dev/null +++ b/ee/app/assets/javascripts/packages/details/components/go_installation.vue @@ -0,0 +1,60 @@ + + + diff --git a/ee/app/assets/javascripts/packages/details/constants.js b/ee/app/assets/javascripts/packages/details/constants.js index d12f93dd27700485b9e8ce31626cc94d896d0302..0008eff7a749d75edc35c26257a3a39cb48b9a9a 100644 --- a/ee/app/assets/javascripts/packages/details/constants.js +++ b/ee/app/assets/javascripts/packages/details/constants.js @@ -3,6 +3,7 @@ import { s__ } from '~/locale'; export const TrackingLabels = { CODE_INSTRUCTION: 'code_instruction', CONAN_INSTALLATION: 'conan_installation', + GO_INSTALLATION: 'go_installation', MAVEN_INSTALLATION: 'maven_installation', NPM_INSTALLATION: 'npm_installation', NUGET_INSTALLATION: 'nuget_installation', @@ -16,6 +17,9 @@ export const TrackingActions = { COPY_CONAN_COMMAND: 'copy_conan_command', COPY_CONAN_SETUP_COMMAND: 'copy_conan_setup_command', + COPY_GO_GET_COMMAND: 'copy_go_get_command', + COPY_GO_ENV_COMMAND: 'copy_go_env_command', + COPY_MAVEN_XML: 'copy_maven_xml', COPY_MAVEN_COMMAND: 'copy_maven_command', COPY_MAVEN_SETUP: 'copy_maven_setup_xml', diff --git a/ee/app/assets/javascripts/packages/details/store/getters.js b/ee/app/assets/javascripts/packages/details/store/getters.js index bcf74713f03cbc5bd2e17cca74ad53e746cd3385..100334e1786d1f97397c96682b375cbf480fac5d 100644 --- a/ee/app/assets/javascripts/packages/details/store/getters.js +++ b/ee/app/assets/javascripts/packages/details/store/getters.js @@ -30,6 +30,12 @@ export const conanSetupCommand = ({ conanPath }) => // eslint-disable-next-line @gitlab/require-i18n-strings `conan remote add gitlab ${conanPath}`; +export const goInstallationCommand = ({ packageEntity }) => + // eslint-disable-next-line @gitlab/require-i18n-strings + `go get ${packageEntity.name}@${packageEntity.version}`; + +export const goSetupCommand = ({ goPath }) => `go env -w GOPROXY="${goPath},$(go env GOPROXY)"`; + export const mavenInstallationXml = ({ packageEntity = {} }) => { const { app_group: appGroup = '', diff --git a/ee/app/assets/javascripts/packages/list/components/packages_list_app.vue b/ee/app/assets/javascripts/packages/list/components/packages_list_app.vue index dabeb7f21f1f5f37c55e8b4f8e9837e7cdc3dbad..6d68f886c9f0410ee3cdd6048fe6d71f8772c812 100644 --- a/ee/app/assets/javascripts/packages/list/components/packages_list_app.vue +++ b/ee/app/assets/javascripts/packages/list/components/packages_list_app.vue @@ -2,6 +2,7 @@ import { mapActions, mapState } from 'vuex'; import { GlEmptyState, GlTab, GlTabs, GlLink, GlSprintf } from '@gitlab/ui'; import { s__, sprintf } from '~/locale'; +import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import PackageFilter from './packages_filter.vue'; import PackageList from './packages_list.vue'; import PackageSort from './packages_sort.vue'; @@ -20,12 +21,14 @@ export default { PackageSort, PackagesComingSoon, }, + mixins: [glFeatureFlagsMixin()], computed: { ...mapState({ emptyListIllustration: state => state.config.emptyListIllustration, emptyListHelpUrl: state => state.config.emptyListHelpUrl, comingSoon: state => state.config.comingSoon, filterQuery: state => state.filterQuery, + goHelpPath: state => state.config.goHelpPath, }), tabsToRender() { return PACKAGE_REGISTRY_TABS; @@ -50,11 +53,17 @@ export default { this.requestPackagesList(); } }, - emptyStateTitle({ title, type }) { + emptyStateTitle({ title, type, featureFlag }) { if (this.filterQuery) { return s__('PackageRegistry|Sorry, your filter produced no results'); } + if (featureFlag && !this.glFeatures[featureFlag]) { + return sprintf(s__('PackageRegistry|%{packageType} packages are disabled'), { + packageType: title, + }); + } + if (type) { return sprintf(s__('PackageRegistry|There are no %{packageType} packages yet'), { packageType: title, @@ -63,12 +72,21 @@ export default { return s__('PackageRegistry|There are no packages yet'); }, + tabDisabled({ featureFlag }) { + return featureFlag && !this.glFeatures[featureFlag]; + }, + tabFeatureHelpPath({ featureHelpPath }) { + return this[featureHelpPath]; + }, }, i18n: { widenFilters: s__('PackageRegistry|To widen your search, change or remove the filters above.'), noResults: s__( 'PackageRegistry|Learn how to %{noPackagesLinkStart}publish and share your packages%{noPackagesLinkEnd} with GitLab.', ), + featureHelpText: s__( + 'PackageRegistry|Use feature flags to enable %{packageType} packages. %{linkStart}See the documentation%{linkEnd} to find out more.', + ), }, }; @@ -87,7 +105,15 @@ export default {