diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index a974b17225..b3eb7b1f4a 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -3729,11 +3729,14 @@ swift.install = Add the package in your Package.swift
file:
swift.install2 = and run the following command:
vagrant.install = To add a Vagrant box, run the following command:
settings.link = Link this package to a repository
-settings.link.description = If you link a package with a repository, the package is listed in the repository's package list.
+settings.link.description = If you link a package with a repository, the package will appear in the repository's package list. Only repositories under the same owner can be linked. Leaving the field empty will remove the link.
settings.link.select = Select Repository
settings.link.button = Update Repository Link
settings.link.success = Repository link was successfully updated.
settings.link.error = Failed to update repository link.
+settings.link.repo_not_found = Repository %s not found.
+settings.unlink.error = Failed to remove repository link.
+settings.unlink.success = Repository link was successfully removed.
settings.delete = Delete package
settings.delete.description = Deleting a package is permanent and cannot be undone.
settings.delete.notice = You are about to delete %s (%s). This operation is irreversible, are you sure?
diff --git a/routers/web/user/package.go b/routers/web/user/package.go
index d130d1dca1..924a10041b 100644
--- a/routers/web/user/package.go
+++ b/routers/web/user/package.go
@@ -431,74 +431,81 @@ func PackageSettings(ctx *context.Context) {
ctx.Data["Title"] = pd.Package.Name
ctx.Data["IsPackagesPage"] = true
ctx.Data["PackageDescriptor"] = pd
-
- repos, _, _ := repo_model.GetUserRepositories(ctx, repo_model.SearchRepoOptions{
- Actor: pd.Owner,
- Private: true,
- })
- ctx.Data["Repos"] = repos
ctx.Data["CanWritePackages"] = ctx.Package.AccessMode >= perm.AccessModeWrite || ctx.IsUserSiteAdmin()
+ if pd.Package.RepoID > 0 {
+ repo, err := repo_model.GetRepositoryByID(ctx, pd.Package.RepoID)
+ if err != nil {
+ ctx.ServerError("GetRepositoryByID", err)
+ return
+ }
+ ctx.Data["LinkedRepoName"] = repo.Name
+ }
+
ctx.HTML(http.StatusOK, tplPackagesSettings)
}
// PackageSettingsPost updates the package settings
func PackageSettingsPost(ctx *context.Context) {
- pd := ctx.Package.Descriptor
-
form := web.GetForm(ctx).(*forms.PackageSettingForm)
switch form.Action {
case "link":
- success := func() bool {
- repoID := int64(0)
- if form.RepoID != 0 {
- repo, err := repo_model.GetRepositoryByID(ctx, form.RepoID)
- if err != nil {
- log.Error("Error getting repository: %v", err)
- return false
- }
-
- if repo.OwnerID != pd.Owner.ID {
- return false
- }
-
- repoID = repo.ID
- }
-
- if err := packages_model.SetRepositoryLink(ctx, pd.Package.ID, repoID); err != nil {
- log.Error("Error updating package: %v", err)
- return false
- }
-
- return true
- }()
-
- if success {
- ctx.Flash.Success(ctx.Tr("packages.settings.link.success"))
- } else {
- ctx.Flash.Error(ctx.Tr("packages.settings.link.error"))
- }
-
- ctx.Redirect(ctx.Link)
- return
+ packageSettingsPostActionLink(ctx, form)
case "delete":
- err := packages_service.RemovePackageVersion(ctx, ctx.Doer, ctx.Package.Descriptor.Version)
- if err != nil {
- log.Error("Error deleting package: %v", err)
- ctx.Flash.Error(ctx.Tr("packages.settings.delete.error"))
- } else {
- ctx.Flash.Success(ctx.Tr("packages.settings.delete.success"))
+ packageSettingsPostActionDelete(ctx)
+ default:
+ ctx.NotFound(nil)
+ }
+}
+
+func packageSettingsPostActionLink(ctx *context.Context, form *forms.PackageSettingForm) {
+ pd := ctx.Package.Descriptor
+ if form.RepoName == "" { // remove the link
+ if err := packages_model.SetRepositoryLink(ctx, pd.Package.ID, 0); err != nil {
+ ctx.JSONError(ctx.Tr("packages.settings.unlink.error"))
+ return
}
- redirectURL := ctx.Package.Owner.HomeLink() + "/-/packages"
- // redirect to the package if there are still versions available
- if has, _ := packages_model.ExistVersion(ctx, &packages_model.PackageSearchOptions{PackageID: ctx.Package.Descriptor.Package.ID, IsInternal: optional.Some(false)}); has {
- redirectURL = ctx.Package.Descriptor.PackageWebLink()
- }
-
- ctx.Redirect(redirectURL)
+ ctx.Flash.Success(ctx.Tr("packages.settings.unlink.success"))
+ ctx.JSONRedirect("")
return
}
+
+ repo, err := repo_model.GetRepositoryByName(ctx, pd.Owner.ID, form.RepoName)
+ if err != nil {
+ if repo_model.IsErrRepoNotExist(err) {
+ ctx.JSONError(ctx.Tr("packages.settings.link.repo_not_found", form.RepoName))
+ } else {
+ ctx.ServerError("GetRepositoryByOwnerAndName", err)
+ }
+ return
+ }
+
+ if err := packages_model.SetRepositoryLink(ctx, pd.Package.ID, repo.ID); err != nil {
+ ctx.JSONError(ctx.Tr("packages.settings.link.error"))
+ return
+ }
+
+ ctx.Flash.Success(ctx.Tr("packages.settings.link.success"))
+ ctx.JSONRedirect("")
+}
+
+func packageSettingsPostActionDelete(ctx *context.Context) {
+ err := packages_service.RemovePackageVersion(ctx, ctx.Doer, ctx.Package.Descriptor.Version)
+ if err != nil {
+ log.Error("Error deleting package: %v", err)
+ ctx.Flash.Error(ctx.Tr("packages.settings.delete.error"))
+ } else {
+ ctx.Flash.Success(ctx.Tr("packages.settings.delete.success"))
+ }
+
+ redirectURL := ctx.Package.Owner.HomeLink() + "/-/packages"
+ // redirect to the package if there are still versions available
+ if has, _ := packages_model.ExistVersion(ctx, &packages_model.PackageSearchOptions{PackageID: ctx.Package.Descriptor.Package.ID, IsInternal: optional.Some(false)}); has {
+ redirectURL = ctx.Package.Descriptor.PackageWebLink()
+ }
+
+ ctx.Redirect(redirectURL)
}
// DownloadPackageFile serves the content of a package file
diff --git a/services/forms/user_form.go b/services/forms/user_form.go
index ddf2bd09b0..618294d434 100644
--- a/services/forms/user_form.go
+++ b/services/forms/user_form.go
@@ -416,8 +416,8 @@ 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
+ RepoName string `form:"repo_name"`
}
// Validate validates the fields
diff --git a/templates/org/team/repositories.tmpl b/templates/org/team/repositories.tmpl
index 4f4667ca8b..2f38071e89 100644
--- a/templates/org/team/repositories.tmpl
+++ b/templates/org/team/repositories.tmpl
@@ -12,7 +12,7 @@