diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index e718355f8349f..38ef30b7caea3 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -414,7 +414,7 @@ var migrations = []Migration{ // v222 -> v223 NewMigration("Drop old CredentialID column", v1_17.DropOldCredentialIDColumn), // v223 -> v224 - NewMigration("Rename CredentialIDBytes column to CredentialID", v1_17.RenameCredentialIDBytes), + NewMigration("Rename CredentialIDBytes column to CredentialID", renameCredentialIDBytes), // Gitea 1.17.0 ends at v224 @@ -442,6 +442,8 @@ var migrations = []Migration{ NewMigration("Add package cleanup rule table", v1_19.CreatePackageCleanupRuleTable), // v235 -> v236 NewMigration("Add index for access_token", v1_19.AddIndexForAccessToken), + + NewMigration("Add container repository property", addDescriptionAndReadmeColsForPackage), } // GetCurrentDBVersion returns the current db version diff --git a/models/migrations/v224.go b/models/migrations/v224.go new file mode 100644 index 0000000000000..9e5a653f16b8f --- /dev/null +++ b/models/migrations/v224.go @@ -0,0 +1,18 @@ +// Copyright 2022 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "xorm.io/xorm" +) + +func addDescriptionAndReadmeColsForPackage(x *xorm.Engine) error { + type Package struct { + Description string `xorm:"TEXT"` + Readme string `xorm:"LONGBLOB"` + } + + return x.Sync(new(Package)) +} diff --git a/models/packages/package.go b/models/packages/package.go index 5c4837d98b0c8..8891db17ccf10 100644 --- a/models/packages/package.go +++ b/models/packages/package.go @@ -130,6 +130,8 @@ type Package struct { Name string `xorm:"NOT NULL"` LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"` SemverCompatible bool `xorm:"NOT NULL DEFAULT false"` + Description string `xorm:"VARCHAR(255)"` + Readme string `xorm:"LONGBLOB"` } // TryInsertPackage inserts a package. If a package exists already, ErrDuplicatePackage is returned @@ -167,6 +169,15 @@ func SetRepositoryLink(ctx context.Context, packageID, repoID int64) error { return err } +// SetDescriptions sets descriptions +func SetDescriptions(ctx context.Context, packageID int64, description, readme string) error { + _, err := db.GetEngine(ctx).ID(packageID).Update(&Package{ + Description: description, + Readme: readme, + }) + return err +} + // UnlinkRepositoryFromAllPackages unlinks every package from the repository func UnlinkRepositoryFromAllPackages(ctx context.Context, repoID int64) error { _, err := db.GetEngine(ctx).Where("repo_id = ?", repoID).Cols("repo_id").Update(&Package{}) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 70f982b8dcc59..519460db611a6 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -3192,6 +3192,13 @@ settings.delete.description = Deleting a package is permanent and cannot be undo settings.delete.notice = You are about to delete %s (%s). This operation is irreversible, are you sure? settings.delete.success = The package has been deleted. settings.delete.error = Failed to delete the package. +settings.descriptions.success = Descriptions were successfully updated +settings.descriptions.error = Failed to update descriptions +settings.descriptions = Descriptions +settings.description.description = Description +settings.readme.description = Readme +settings.descriptions.button = Update descriptions +readme = Readme owner.settings.cleanuprules.title = Manage Cleanup Rules owner.settings.cleanuprules.add = Add Cleanup Rule owner.settings.cleanuprules.edit = Edit Cleanup Rule diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index c5c140404a5c6..ddce6e53c4b79 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -2824,7 +2824,13 @@ error.unit_not_allowed=Vous n'êtes pas autorisé à accéder à cette section d [packages] empty.repo=Avez-vous téléchargé un paquet, mais il n'est pas affiché ici? Allez dans les paramètres du paquet et liez le à ce dépôt. +settings.descriptions.success = Les descriptifs ont été mises à jour +settings.descriptions.error = Échec de la mise à jour des descriptifs +settings.descriptions = Descriptifs +settings.description.description = Description +settings.readme.description = Readme +settings.descriptions.button = Mettre à jour les descriptifs +readme = Readme published_by_in=%[1]s publié par %[3]s en %[5]s rubygems.required.ruby=Nécessite la version de Ruby rubygems.required.rubygems=Nécessite la version de RubyGem - diff --git a/routers/web/user/package.go b/routers/web/user/package.go index 3782f46b42420..13bf9225071d0 100644 --- a/routers/web/user/package.go +++ b/routers/web/user/package.go @@ -363,6 +363,19 @@ func PackageSettingsPost(ctx *context.Context) { ctx.Flash.Error(ctx.Tr("packages.settings.link.error")) } + ctx.Redirect(ctx.Link) + return + case "update": + description := form.Description + readme := form.Readme + + if err := packages_model.SetDescriptions(ctx, pd.Package.ID, description, readme); err != nil { + log.Error("Error updating package: %v", err) + ctx.Flash.Error(ctx.Tr("packages.settings.descriptions.error")) + } else { + ctx.Flash.Success(ctx.Tr("packages.settings.descriptions.success")) + } + ctx.Redirect(ctx.Link) return case "delete": diff --git a/routers/web/web.go b/routers/web/web.go index 889a89f0d4ae4..52b4f59b8f23e 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -821,6 +821,7 @@ func RegisterRoutes(m *web.Route) { m.Group("/{type}/{name}", func() { m.Get("", user.RedirectToLastVersion) m.Get("/versions", user.ListPackageVersions) + m.Post("/markdown", bindIgnErr(structs.MarkdownOption{}), misc.Markdown) m.Group("/{version}", func() { m.Get("", user.ViewPackageVersion) m.Get("/files/{fileid}", user.DownloadPackageFile) diff --git a/services/forms/user_form.go b/services/forms/user_form.go index cd2c45261b90e..2675815224f54 100644 --- a/services/forms/user_form.go +++ b/services/forms/user_form.go @@ -433,8 +433,10 @@ func (f *WebauthnDeleteForm) Validate(req *http.Request, errs binding.Errors) bi // PackageSettingForm form for package settings type PackageSettingForm struct { - Action string - RepoID int64 `form:"repo_id"` + Action string + RepoID int64 `form:"repo_id"` + Description string `form:"description"` + Readme string `form:"readme"` } // Validate validates the fields diff --git a/templates/package/content/composer.tmpl b/templates/package/content/composer.tmpl index 8cc18f8ba8fb7..3900885493a80 100644 --- a/templates/package/content/composer.tmpl +++ b/templates/package/content/composer.tmpl @@ -22,6 +22,8 @@ + {{template "package/content/readme" .}} + {{if .PackageDescriptor.Metadata.Description}}

{{.locale.Tr "packages.about"}}

diff --git a/templates/package/content/conan.tmpl b/templates/package/content/conan.tmpl index c496cee55cf62..c838a02eabac5 100644 --- a/templates/package/content/conan.tmpl +++ b/templates/package/content/conan.tmpl @@ -16,6 +16,8 @@
+ {{template "package/content/readme" .}} + {{if .PackageDescriptor.Metadata.Description}}

{{.locale.Tr "packages.about"}}

diff --git a/templates/package/content/container.tmpl b/templates/package/content/container.tmpl index a79963e732ba0..57e4340366c09 100644 --- a/templates/package/content/container.tmpl +++ b/templates/package/content/container.tmpl @@ -23,6 +23,9 @@
+ + {{template "package/content/readme" .}} + {{if .PackageDescriptor.Metadata.MultiArch}}

{{.locale.Tr "packages.container.multi_arch"}}

diff --git a/templates/package/content/generic.tmpl b/templates/package/content/generic.tmpl index 2948d9eb02cac..4040cb2272f0c 100644 --- a/templates/package/content/generic.tmpl +++ b/templates/package/content/generic.tmpl @@ -12,4 +12,6 @@
+ + {{template "package/content/readme" .}} {{end}} diff --git a/templates/package/content/helm.tmpl b/templates/package/content/helm.tmpl index 59cdc157b4087..90224cabec207 100644 --- a/templates/package/content/helm.tmpl +++ b/templates/package/content/helm.tmpl @@ -17,6 +17,8 @@ helm repo update + {{template "package/content/readme" .}} + {{if .PackageDescriptor.Metadata.Description}}

{{.locale.Tr "packages.about"}}

diff --git a/templates/package/content/maven.tmpl b/templates/package/content/maven.tmpl index 0b5612151c577..4bc5828dc10a3 100644 --- a/templates/package/content/maven.tmpl +++ b/templates/package/content/maven.tmpl @@ -45,6 +45,8 @@
+ {{template "package/content/readme" .}} + {{if .PackageDescriptor.Metadata.Description}}

{{.locale.Tr "packages.about"}}

diff --git a/templates/package/content/npm.tmpl b/templates/package/content/npm.tmpl index 33d51d4dfd87d..21cfd3437a96f 100644 --- a/templates/package/content/npm.tmpl +++ b/templates/package/content/npm.tmpl @@ -20,6 +20,8 @@
+ {{template "package/content/readme" .}} + {{if or .PackageDescriptor.Metadata.Description .PackageDescriptor.Metadata.Readme}}

{{.locale.Tr "packages.about"}}

diff --git a/templates/package/content/nuget.tmpl b/templates/package/content/nuget.tmpl index 4ea41fa826a28..c02243f3099d6 100644 --- a/templates/package/content/nuget.tmpl +++ b/templates/package/content/nuget.tmpl @@ -16,6 +16,8 @@
+ {{template "package/content/readme" .}} + {{if or .PackageDescriptor.Metadata.Description .PackageDescriptor.Metadata.ReleaseNotes}}

{{.locale.Tr "packages.about"}}

diff --git a/templates/package/content/readme.tmpl b/templates/package/content/readme.tmpl new file mode 100644 index 0000000000000..8a3f427b3c2b8 --- /dev/null +++ b/templates/package/content/readme.tmpl @@ -0,0 +1,6 @@ +{{if .PackageDescriptor.Package.Readme}} +

{{.locale.Tr "packages.readme"}}

+
+ {{RenderMarkdownToHtml .PackageDescriptor.Package.Readme}} +
+{{end}} diff --git a/templates/package/content/rubygems.tmpl b/templates/package/content/rubygems.tmpl index 0cb7b670b1dea..2927b3ac34686 100644 --- a/templates/package/content/rubygems.tmpl +++ b/templates/package/content/rubygems.tmpl @@ -17,6 +17,9 @@ end
+ + {{template "package/content/readme" .}} + {{if .PackageDescriptor.Metadata.Description}}

{{.locale.Tr "packages.about"}}

{{.PackageDescriptor.Metadata.Description}}
diff --git a/templates/package/readme_tab.tmpl b/templates/package/readme_tab.tmpl new file mode 100644 index 0000000000000..95ce5d17a6e71 --- /dev/null +++ b/templates/package/readme_tab.tmpl @@ -0,0 +1,14 @@ + +
+
+ +
+
+ {{.locale.Tr "loading"}} +
+
diff --git a/templates/package/settings.tmpl b/templates/package/settings.tmpl index 5f045e98b0870..b140c165e6384 100644 --- a/templates/package/settings.tmpl +++ b/templates/package/settings.tmpl @@ -1,5 +1,5 @@ {{template "base/head" .}} -
+
{{template "user/overview/header" .}}
{{template "base/alert" .}} @@ -34,6 +34,28 @@
+

+ {{.locale.Tr "packages.settings.descriptions"}} +

+
+
+ {{template "base/disable_form_autofill"}} + {{.CsrfTokenHtml}} + + +
+ + +
+ + + {{template "package/readme_tab" .}} + +
+ +
+
+

{{.locale.Tr "repo.settings.danger_zone"}}

diff --git a/templates/package/shared/list.tmpl b/templates/package/shared/list.tmpl index 37c47cef335d5..7b06b8462f98c 100644 --- a/templates/package/shared/list.tmpl +++ b/templates/package/shared/list.tmpl @@ -31,6 +31,10 @@ {{svg .Package.Type.SVGName 16}} {{.Package.Type.Name}}
+ {{if .Package.Description}} +

{{- .Package.Description -}}

+ {{end}} + {{$timeStr := TimeSinceUnix .Version.CreatedUnix $.locale}} {{$hasRepositoryAccess := false}} {{if .Repository}} diff --git a/templates/package/view.tmpl b/templates/package/view.tmpl index a5b2a2ef68a39..9e8c2aab35bc4 100644 --- a/templates/package/view.tmpl +++ b/templates/package/view.tmpl @@ -7,6 +7,12 @@

{{.PackageDescriptor.Package.Name}} ({{.PackageDescriptor.Version.Version}})

+ +

+ {{if .PackageDescriptor.Package.Description}} + {{- .PackageDescriptor.Package.Description -}} + {{end}} +

{{$timeStr := TimeSinceUnix .PackageDescriptor.Version.CreatedUnix $.locale}} @@ -18,6 +24,7 @@
+
{{template "package/content/composer" .}} {{template "package/content/conan" .}} diff --git a/web_src/js/features/package-editor.js b/web_src/js/features/package-editor.js new file mode 100644 index 0000000000000..5101d957b04da --- /dev/null +++ b/web_src/js/features/package-editor.js @@ -0,0 +1,31 @@ +import $ from 'jquery'; + +const {csrfToken} = window.config; + +function initEditPreviewTab($form) { + const $tabMenu = $form.find('.tabular.menu'); + $tabMenu.find('.item').tab(); + $tabMenu.find(`.item[data-tab="${$tabMenu.data('preview')}"]`).on('click', function () { + const $this = $(this); + const context = `/${$this.data('context')}`; + const mode = $this.data('markdown-mode') || 'comment'; + + $.post($this.data('url'), { + _csrf: csrfToken, + mode, + context, + text: $form.find(`.tab[data-tab="${$tabMenu.data('write')}"] textarea`).val(), + }, (data) => { + const $diffPreviewPanel = $form.find(`.tab[data-tab="${$tabMenu.data('preview')}"]`); + $diffPreviewPanel.html(data); + }); + }); +} + +export function initPackageEditor() { + if ($('.package.settings .descriptions').length === 0) { + return; + } + + initEditPreviewTab($('.package.settings .descriptions')); +} diff --git a/web_src/js/index.js b/web_src/js/index.js index f4638a60e09a7..2375de348b4b6 100644 --- a/web_src/js/index.js +++ b/web_src/js/index.js @@ -79,6 +79,7 @@ import {initOrgTeamSearchRepoBox, initOrgTeamSettings} from './features/org-team import {initUserAuthWebAuthn, initUserAuthWebAuthnRegister} from './features/user-auth-webauthn.js'; import {initRepoRelease, initRepoReleaseEditor} from './features/repo-release.js'; import {initRepoEditor} from './features/repo-editor.js'; +import {initPackageEditor} from './features/package-editor.js'; import {initCompSearchUserBox} from './features/comp/SearchUserBox.js'; import {initInstall} from './features/install.js'; import {initCompWebHookEditor} from './features/comp/WebHookEditor.js'; @@ -188,6 +189,8 @@ $(document).ready(() => { initRepoWikiForm(); initRepository(); + initPackageEditor(); + initCommitStatuses(); initMcaptcha();