loading up the forgejo repo on tangled to test page performance
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

[FEAT]Add Option to hide Release Archive links (#3139)

This adds a new options to releases to hide the links to the automatically generated archives. This is useful, when the automatically generated Archives are broken e.g. because of Submodules.

![grafik](/attachments/5686edf6-f318-4175-8459-89c33973b181)
![grafik](/attachments/74a8bf92-2abb-47a0-876d-d41024770d0b)

Note:
This juts hides the Archives from the UI. Users can still download 5the Archive if they know t correct URL.

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/3139
Reviewed-by: Otto <otto@codeberg.org>
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: JakobDev <jakobdev@gmx.de>
Co-committed-by: JakobDev <jakobdev@gmx.de>

authored by

JakobDev
JakobDev
and committed by
Earl Warren
1bce2dc5 6bcaf4f8

+220 -106
+2
models/forgejo_migrations/migrate.go
··· 62 62 NewMigration("Add the `created` column to the `issue` table", forgejo_v1_22.AddCreatedToIssue), 63 63 // v12 -> v13 64 64 NewMigration("Add repo_archive_download_count table", forgejo_v1_22.AddRepoArchiveDownloadCount), 65 + // v13 -> v14 66 + NewMigration("Add `hide_archive_links` column to `release` table", AddHideArchiveLinksToRelease), 65 67 } 66 68 67 69 // GetCurrentDBVersion returns the current Forgejo database version.
+15
models/forgejo_migrations/v13.go
··· 1 + // Copyright 2024 The Forgejo Authors. All rights reserved. 2 + // SPDX-License-Identifier: MIT 3 + 4 + package forgejo_migrations //nolint:revive 5 + 6 + import "xorm.io/xorm" 7 + 8 + func AddHideArchiveLinksToRelease(x *xorm.Engine) error { 9 + type Release struct { 10 + ID int64 `xorm:"pk autoincr"` 11 + HideArchiveLinks bool `xorm:"NOT NULL DEFAULT false"` 12 + } 13 + 14 + return x.Sync(&Release{}) 15 + }
+1
models/repo/release.go
··· 78 78 TargetBehind string `xorm:"-"` // to handle non-existing or empty target 79 79 Title string 80 80 Sha1 string `xorm:"VARCHAR(64)"` 81 + HideArchiveLinks bool `xorm:"NOT NULL DEFAULT false"` 81 82 NumCommits int64 82 83 NumCommitsBehind int64 `xorm:"-"` 83 84 Note string `xorm:"TEXT"`
+27 -24
modules/structs/release.go
··· 9 9 10 10 // Release represents a repository release 11 11 type Release struct { 12 - ID int64 `json:"id"` 13 - TagName string `json:"tag_name"` 14 - Target string `json:"target_commitish"` 15 - Title string `json:"name"` 16 - Note string `json:"body"` 17 - URL string `json:"url"` 18 - HTMLURL string `json:"html_url"` 19 - TarURL string `json:"tarball_url"` 20 - ZipURL string `json:"zipball_url"` 21 - UploadURL string `json:"upload_url"` 22 - IsDraft bool `json:"draft"` 23 - IsPrerelease bool `json:"prerelease"` 12 + ID int64 `json:"id"` 13 + TagName string `json:"tag_name"` 14 + Target string `json:"target_commitish"` 15 + Title string `json:"name"` 16 + Note string `json:"body"` 17 + URL string `json:"url"` 18 + HTMLURL string `json:"html_url"` 19 + TarURL string `json:"tarball_url"` 20 + ZipURL string `json:"zipball_url"` 21 + HideArchiveLinks bool `json:"hide_archive_links"` 22 + UploadURL string `json:"upload_url"` 23 + IsDraft bool `json:"draft"` 24 + IsPrerelease bool `json:"prerelease"` 24 25 // swagger:strfmt date-time 25 26 CreatedAt time.Time `json:"created_at"` 26 27 // swagger:strfmt date-time ··· 33 34 // CreateReleaseOption options when creating a release 34 35 type CreateReleaseOption struct { 35 36 // required: true 36 - TagName string `json:"tag_name" binding:"Required"` 37 - Target string `json:"target_commitish"` 38 - Title string `json:"name"` 39 - Note string `json:"body"` 40 - IsDraft bool `json:"draft"` 41 - IsPrerelease bool `json:"prerelease"` 37 + TagName string `json:"tag_name" binding:"Required"` 38 + Target string `json:"target_commitish"` 39 + Title string `json:"name"` 40 + Note string `json:"body"` 41 + IsDraft bool `json:"draft"` 42 + IsPrerelease bool `json:"prerelease"` 43 + HideArchiveLinks bool `json:"hide_archive_links"` 42 44 } 43 45 44 46 // EditReleaseOption options when editing a release 45 47 type EditReleaseOption struct { 46 - TagName string `json:"tag_name"` 47 - Target string `json:"target_commitish"` 48 - Title string `json:"name"` 49 - Note string `json:"body"` 50 - IsDraft *bool `json:"draft"` 51 - IsPrerelease *bool `json:"prerelease"` 48 + TagName string `json:"tag_name"` 49 + Target string `json:"target_commitish"` 50 + Title string `json:"name"` 51 + Note string `json:"body"` 52 + IsDraft *bool `json:"draft"` 53 + IsPrerelease *bool `json:"prerelease"` 54 + HideArchiveLinks *bool `json:"hide_archive_links"` 52 55 }
+2
options/locale/locale_en-US.ini
··· 2662 2662 release.download_count_one = %s download 2663 2663 release.download_count_few = %s downloads 2664 2664 release.add_tag_msg = Use the title and content of release as tag message. 2665 + release.hide_archive_links = Hide automatically generated archives 2666 + release.hide_archive_links_helper = Hide automatically generated source code archives for this release. For example, if you are uploading your own. 2665 2667 release.add_tag = Create Tag Only 2666 2668 release.releases_for = Releases for %s 2667 2669 release.tags_for = Tags for %s
+16 -11
routers/api/v1/repo/release.go
··· 231 231 form.Target = ctx.Repo.Repository.DefaultBranch 232 232 } 233 233 rel = &repo_model.Release{ 234 - RepoID: ctx.Repo.Repository.ID, 235 - PublisherID: ctx.Doer.ID, 236 - Publisher: ctx.Doer, 237 - TagName: form.TagName, 238 - Target: form.Target, 239 - Title: form.Title, 240 - Note: form.Note, 241 - IsDraft: form.IsDraft, 242 - IsPrerelease: form.IsPrerelease, 243 - IsTag: false, 244 - Repo: ctx.Repo.Repository, 234 + RepoID: ctx.Repo.Repository.ID, 235 + PublisherID: ctx.Doer.ID, 236 + Publisher: ctx.Doer, 237 + TagName: form.TagName, 238 + Target: form.Target, 239 + Title: form.Title, 240 + Note: form.Note, 241 + IsDraft: form.IsDraft, 242 + IsPrerelease: form.IsPrerelease, 243 + HideArchiveLinks: form.HideArchiveLinks, 244 + IsTag: false, 245 + Repo: ctx.Repo.Repository, 245 246 } 246 247 if err := release_service.CreateRelease(ctx.Repo.GitRepo, rel, nil, ""); err != nil { 247 248 if repo_model.IsErrReleaseAlreadyExist(err) { ··· 261 262 rel.Note = form.Note 262 263 rel.IsDraft = form.IsDraft 263 264 rel.IsPrerelease = form.IsPrerelease 265 + rel.HideArchiveLinks = form.HideArchiveLinks 264 266 rel.PublisherID = ctx.Doer.ID 265 267 rel.IsTag = false 266 268 rel.Repo = ctx.Repo.Repository ··· 340 342 } 341 343 if form.IsPrerelease != nil { 342 344 rel.IsPrerelease = *form.IsPrerelease 345 + } 346 + if form.HideArchiveLinks != nil { 347 + rel.HideArchiveLinks = *form.HideArchiveLinks 343 348 } 344 349 if err := release_service.UpdateRelease(ctx, ctx.Doer, ctx.Repo.GitRepo, rel, nil, nil, nil, false); err != nil { 345 350 ctx.Error(http.StatusInternalServerError, "UpdateRelease", err)
+30 -11
routers/web/repo/release.go
··· 441 441 } 442 442 ctx.Data["Tags"] = tags 443 443 444 + // We set the value of the hide_archive_link textbox depending on the latest release 445 + latestRelease, err := repo_model.GetLatestReleaseByRepoID(ctx, ctx.Repo.Repository.ID) 446 + if err != nil { 447 + if repo_model.IsErrReleaseNotExist(err) { 448 + ctx.Data["hide_archive_links"] = false 449 + } else { 450 + ctx.ServerError("GetLatestReleaseByRepoID", err) 451 + return 452 + } 453 + } 454 + if latestRelease != nil { 455 + ctx.Data["hide_archive_links"] = latestRelease.HideArchiveLinks 456 + } 457 + 444 458 ctx.HTML(http.StatusOK, tplReleaseNew) 445 459 } 446 460 ··· 525 539 } 526 540 527 541 rel = &repo_model.Release{ 528 - RepoID: ctx.Repo.Repository.ID, 529 - Repo: ctx.Repo.Repository, 530 - PublisherID: ctx.Doer.ID, 531 - Publisher: ctx.Doer, 532 - Title: form.Title, 533 - TagName: form.TagName, 534 - Target: form.Target, 535 - Note: form.Content, 536 - IsDraft: len(form.Draft) > 0, 537 - IsPrerelease: form.Prerelease, 538 - IsTag: false, 542 + RepoID: ctx.Repo.Repository.ID, 543 + Repo: ctx.Repo.Repository, 544 + PublisherID: ctx.Doer.ID, 545 + Publisher: ctx.Doer, 546 + Title: form.Title, 547 + TagName: form.TagName, 548 + Target: form.Target, 549 + Note: form.Content, 550 + IsDraft: len(form.Draft) > 0, 551 + IsPrerelease: form.Prerelease, 552 + HideArchiveLinks: form.HideArchiveLinks, 553 + IsTag: false, 539 554 } 540 555 541 556 if err = releaseservice.CreateRelease(ctx.Repo.GitRepo, rel, attachmentUUIDs, msg); err != nil { ··· 565 580 rel.IsDraft = len(form.Draft) > 0 566 581 rel.IsPrerelease = form.Prerelease 567 582 rel.PublisherID = ctx.Doer.ID 583 + rel.HideArchiveLinks = form.HideArchiveLinks 568 584 rel.IsTag = false 569 585 570 586 if err = releaseservice.UpdateRelease(ctx, ctx.Doer, ctx.Repo.GitRepo, rel, attachmentUUIDs, nil, nil, true); err != nil { ··· 602 618 ctx.Data["title"] = rel.Title 603 619 ctx.Data["content"] = rel.Note 604 620 ctx.Data["prerelease"] = rel.IsPrerelease 621 + ctx.Data["hide_archive_links"] = rel.HideArchiveLinks 605 622 ctx.Data["IsDraft"] = rel.IsDraft 606 623 607 624 rel.Repo = ctx.Repo.Repository ··· 648 665 ctx.Data["title"] = rel.Title 649 666 ctx.Data["content"] = rel.Note 650 667 ctx.Data["prerelease"] = rel.IsPrerelease 668 + ctx.Data["hide_archive_links"] = rel.HideArchiveLinks 651 669 652 670 if ctx.HasError() { 653 671 ctx.HTML(http.StatusOK, tplReleaseNew) ··· 673 691 rel.Note = form.Content 674 692 rel.IsDraft = len(form.Draft) > 0 675 693 rel.IsPrerelease = form.Prerelease 694 + rel.HideArchiveLinks = form.HideArchiveLinks 676 695 if err = releaseservice.UpdateRelease(ctx, ctx.Doer, ctx.Repo.GitRepo, 677 696 rel, addAttachmentUUIDs, delAttachmentUUIDs, editAttachments, false); err != nil { 678 697 ctx.ServerError("UpdateRelease", err)
+1
services/convert/release.go
··· 22 22 HTMLURL: r.HTMLURL(), 23 23 TarURL: r.TarURL(), 24 24 ZipURL: r.ZipURL(), 25 + HideArchiveLinks: r.HideArchiveLinks, 25 26 UploadURL: r.APIUploadURL(), 26 27 IsDraft: r.IsDraft, 27 28 IsPrerelease: r.IsPrerelease,
+16 -14
services/forms/repo_form.go
··· 559 559 560 560 // NewReleaseForm form for creating release 561 561 type NewReleaseForm struct { 562 - TagName string `binding:"Required;GitRefName;MaxSize(255)"` 563 - Target string `form:"tag_target" binding:"Required;MaxSize(255)"` 564 - Title string `binding:"MaxSize(255)"` 565 - Content string 566 - Draft string 567 - TagOnly string 568 - Prerelease bool 569 - AddTagMsg bool 570 - Files []string 562 + TagName string `binding:"Required;GitRefName;MaxSize(255)"` 563 + Target string `form:"tag_target" binding:"Required;MaxSize(255)"` 564 + Title string `binding:"MaxSize(255)"` 565 + Content string 566 + Draft string 567 + TagOnly string 568 + Prerelease bool 569 + AddTagMsg bool 570 + HideArchiveLinks bool 571 + Files []string 571 572 } 572 573 573 574 // Validate validates the fields ··· 578 579 579 580 // EditReleaseForm form for changing release 580 581 type EditReleaseForm struct { 581 - Title string `form:"title" binding:"Required;MaxSize(255)"` 582 - Content string `form:"content"` 583 - Draft string `form:"draft"` 584 - Prerelease bool `form:"prerelease"` 585 - Files []string 582 + Title string `form:"title" binding:"Required;MaxSize(255)"` 583 + Content string `form:"content"` 584 + Draft string `form:"draft"` 585 + Prerelease bool `form:"prerelease"` 586 + HideArchiveLinks bool 587 + Files []string 586 588 } 587 589 588 590 // Validate validates the fields
+43 -40
templates/repo/release/list.tmpl
··· 61 61 <div class="markup desc"> 62 62 {{$release.RenderedNote}} 63 63 </div> 64 - <div class="divider"></div> 65 - <details class="download" {{if eq $idx 0}}open{{end}}> 66 - <summary class="tw-my-4"> 67 - {{ctx.Locale.Tr "repo.release.downloads"}} 68 - </summary> 69 - <ul class="list"> 70 - {{$hasReleaseAttachment := gt (len $release.Attachments) 0}} 71 - {{if and (not $.DisableDownloadSourceArchives) (not $release.IsDraft) ($.Permission.CanRead $.UnitTypeCode)}} 72 - <li> 73 - <a class="archive-link tw-flex-1" href="{{$.RepoLink}}/archive/{{$release.TagName | PathEscapeSegments}}.zip" rel="nofollow"><strong>{{svg "octicon-file-zip" 16 "tw-mr-1"}}{{ctx.Locale.Tr "repo.release.source_code"}} (ZIP)</strong></a> 74 - <div class="tw-mr-1"> 75 - <span class="text grey">{{ctx.Locale.TrN .Release.ArchiveDownloadCount.Zip "repo.release.download_count_one" "repo.release.download_count_few" (ctx.Locale.PrettyNumber .Release.ArchiveDownloadCount.Zip)}}</span> 76 - </div> 77 - <span data-tooltip-content="{{ctx.Locale.Tr "repo.release.system_generated"}}"> 78 - {{svg "octicon-info"}} 79 - </span> 80 - </li> 81 - <li class="{{if $hasReleaseAttachment}}start-gap{{end}}"> 82 - <a class="archive-link tw-flex-1" href="{{$.RepoLink}}/archive/{{$release.TagName | PathEscapeSegments}}.tar.gz" rel="nofollow"><strong>{{svg "octicon-file-zip" 16 "tw-mr-1"}}{{ctx.Locale.Tr "repo.release.source_code"}} (TAR.GZ)</strong></a> 83 - <div class="tw-mr-1"> 84 - <span class="text grey">{{ctx.Locale.TrN .Release.ArchiveDownloadCount.TarGz "repo.release.download_count_one" "repo.release.download_count_few" (ctx.Locale.PrettyNumber .Release.ArchiveDownloadCount.TarGz)}}</span> 85 - </div> 86 - <span data-tooltip-content="{{ctx.Locale.Tr "repo.release.system_generated"}}"> 87 - {{svg "octicon-info"}} 88 - </span> 89 - </li> 90 - {{if $hasReleaseAttachment}}<hr>{{end}} 91 - {{end}} 92 - {{range $release.Attachments}} 93 - <li> 94 - <a target="_blank" rel="nofollow" href="{{.DownloadURL}}" download> 95 - <strong>{{svg "octicon-package" 16 "tw-mr-1"}}{{.Name}}</strong> 96 - </a> 97 - <div> 98 - <span class="text grey">{{ctx.Locale.TrN .DownloadCount "repo.release.download_count_one" "repo.release.download_count_few" (ctx.Locale.PrettyNumber .DownloadCount)}} · {{.Size | ctx.Locale.TrSize}}</span> 99 - </div> 100 - </li> 101 - {{end}} 102 - </ul> 103 - </details> 64 + {{$hasReleaseAttachment := gt (len $release.Attachments) 0}} 65 + {{$hasArchiveLinks := and (not $.DisableDownloadSourceArchives) (not $release.IsDraft) (not $release.HideArchiveLinks) ($.Permission.CanRead $.UnitTypeCode)}} 66 + {{if or $hasArchiveLinks $hasReleaseAttachment}} 67 + <div class="divider"></div> 68 + <details class="download" {{if eq $idx 0}}open{{end}}> 69 + <summary class="tw-my-4"> 70 + {{ctx.Locale.Tr "repo.release.downloads"}} 71 + </summary> 72 + <ul class="list"> 73 + {{if $hasArchiveLinks}} 74 + <li> 75 + <a class="archive-link tw-flex-1" href="{{$.RepoLink}}/archive/{{$release.TagName | PathEscapeSegments}}.zip" rel="nofollow"><strong>{{svg "octicon-file-zip" 16 "tw-mr-1"}}{{ctx.Locale.Tr "repo.release.source_code"}} (ZIP)</strong></a> 76 + <div class="tw-mr-1"> 77 + <span class="text grey">{{ctx.Locale.TrN .Release.ArchiveDownloadCount.Zip "repo.release.download_count_one" "repo.release.download_count_few" (ctx.Locale.PrettyNumber .Release.ArchiveDownloadCount.Zip)}}</span> 78 + </div> 79 + <span data-tooltip-content="{{ctx.Locale.Tr "repo.release.system_generated"}}"> 80 + {{svg "octicon-info"}} 81 + </span> 82 + </li> 83 + <li class="{{if $hasReleaseAttachment}}start-gap{{end}}"> 84 + <a class="archive-link tw-flex-1" href="{{$.RepoLink}}/archive/{{$release.TagName | PathEscapeSegments}}.tar.gz" rel="nofollow"><strong>{{svg "octicon-file-zip" 16 "tw-mr-1"}}{{ctx.Locale.Tr "repo.release.source_code"}} (TAR.GZ)</strong></a> 85 + <div class="tw-mr-1"> 86 + <span class="text grey">{{ctx.Locale.TrN .Release.ArchiveDownloadCount.TarGz "repo.release.download_count_one" "repo.release.download_count_few" (ctx.Locale.PrettyNumber .Release.ArchiveDownloadCount.TarGz)}}</span> 87 + </div> 88 + <span data-tooltip-content="{{ctx.Locale.Tr "repo.release.system_generated"}}"> 89 + {{svg "octicon-info"}} 90 + </span> 91 + </li> 92 + {{if $hasReleaseAttachment}}<hr>{{end}} 93 + {{end}} 94 + {{range $release.Attachments}} 95 + <li> 96 + <a target="_blank" rel="nofollow" href="{{.DownloadURL}}" download> 97 + <strong>{{svg "octicon-package" 16 "tw-mr-1"}}{{.Name}}</strong> 98 + </a> 99 + <div> 100 + <span class="text grey">{{ctx.Locale.TrN .DownloadCount "repo.release.download_count_one" "repo.release.download_count_few" (ctx.Locale.PrettyNumber .DownloadCount)}} · {{.Size | ctx.Locale.TrSize}}</span> 101 + </div> 102 + </li> 103 + {{end}} 104 + </ul> 105 + </details> 106 + {{end}} 104 107 <div class="dot"></div> 105 108 </div> 106 109 </li>
+9
templates/repo/release/new.tmpl
··· 98 98 </div> 99 99 </div> 100 100 <span class="help">{{ctx.Locale.Tr "repo.release.prerelease_helper"}}</span> 101 + {{if not .DisableDownloadSourceArchives}} 102 + <div class="field"> 103 + <div class="ui checkbox"> 104 + <input type="checkbox" name="hide_archive_links" {{if .hide_archive_links}}checked{{end}}> 105 + <label><strong>{{ctx.Locale.Tr "repo.release.hide_archive_links"}}</strong></label> 106 + </div> 107 + </div> 108 + <span class="help">{{ctx.Locale.Tr "repo.release.hide_archive_links_helper"}}</span> 109 + {{end}} 101 110 <div class="divider tw-mt-0"></div> 102 111 <div class="tw-flex tw-justify-end"> 103 112 {{if .PageIsEditRelease}}
+12
templates/swagger/v1_json.tmpl
··· 19890 19890 "type": "boolean", 19891 19891 "x-go-name": "IsDraft" 19892 19892 }, 19893 + "hide_archive_links": { 19894 + "type": "boolean", 19895 + "x-go-name": "HideArchiveLinks" 19896 + }, 19893 19897 "name": { 19894 19898 "type": "string", 19895 19899 "x-go-name": "Title" ··· 20794 20798 "draft": { 20795 20799 "type": "boolean", 20796 20800 "x-go-name": "IsDraft" 20801 + }, 20802 + "hide_archive_links": { 20803 + "type": "boolean", 20804 + "x-go-name": "HideArchiveLinks" 20797 20805 }, 20798 20806 "name": { 20799 20807 "type": "string", ··· 23561 23569 "draft": { 23562 23570 "type": "boolean", 23563 23571 "x-go-name": "IsDraft" 23572 + }, 23573 + "hide_archive_links": { 23574 + "type": "boolean", 23575 + "x-go-name": "HideArchiveLinks" 23564 23576 }, 23565 23577 "html_url": { 23566 23578 "type": "string",
+11 -6
tests/integration/api_releases_test.go
··· 133 133 assert.Equal(t, newRelease.TagName, release.TagName) 134 134 assert.Equal(t, newRelease.Title, release.Title) 135 135 assert.Equal(t, newRelease.Note, release.Note) 136 + assert.False(t, newRelease.HideArchiveLinks) 137 + 138 + hideArchiveLinks := true 136 139 137 140 req = NewRequestWithJSON(t, "PATCH", urlStr, &api.EditReleaseOption{ 138 - TagName: release.TagName, 139 - Title: release.Title, 140 - Note: "updated", 141 - IsDraft: &release.IsDraft, 142 - IsPrerelease: &release.IsPrerelease, 143 - Target: release.Target, 141 + TagName: release.TagName, 142 + Title: release.Title, 143 + Note: "updated", 144 + IsDraft: &release.IsDraft, 145 + IsPrerelease: &release.IsPrerelease, 146 + Target: release.Target, 147 + HideArchiveLinks: &hideArchiveLinks, 144 148 }).AddTokenAuth(token) 145 149 resp = MakeRequest(t, req, http.StatusOK) 146 150 ··· 152 156 } 153 157 unittest.AssertExistsAndLoadBean(t, rel) 154 158 assert.EqualValues(t, rel.Note, newRelease.Note) 159 + assert.True(t, newRelease.HideArchiveLinks) 155 160 } 156 161 157 162 func TestAPICreateReleaseToDefaultBranch(t *testing.T) {
+35
tests/integration/release_test.go
··· 9 9 "testing" 10 10 "time" 11 11 12 + auth_model "code.gitea.io/gitea/models/auth" 13 + "code.gitea.io/gitea/models/db" 12 14 repo_model "code.gitea.io/gitea/models/repo" 13 15 "code.gitea.io/gitea/models/unittest" 14 16 "code.gitea.io/gitea/modules/setting" 17 + api "code.gitea.io/gitea/modules/structs" 15 18 "code.gitea.io/gitea/modules/test" 16 19 "code.gitea.io/gitea/modules/translation" 17 20 "code.gitea.io/gitea/tests" 18 21 19 22 "github.com/PuerkitoBio/goquery" 20 23 "github.com/stretchr/testify/assert" 24 + "github.com/stretchr/testify/require" 21 25 ) 22 26 23 27 func createNewRelease(t *testing.T, session *TestSession, repoURL, tag, title string, preRelease, draft bool) { ··· 307 311 session := loginUser(t, "user2") 308 312 session.MakeRequest(t, req, http.StatusOK) 309 313 } 314 + 315 + func TestReleaseHideArchiveLinksUI(t *testing.T) { 316 + defer tests.PrepareTestEnv(t)() 317 + 318 + release := unittest.AssertExistsAndLoadBean(t, &repo_model.Release{TagName: "v2.0"}) 319 + 320 + require.NoError(t, release.LoadAttributes(db.DefaultContext)) 321 + 322 + session := loginUser(t, release.Repo.OwnerName) 323 + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) 324 + 325 + zipURL := fmt.Sprintf("%s/archive/%s.zip", release.Repo.Link(), release.TagName) 326 + tarGzURL := fmt.Sprintf("%s/archive/%s.tar.gz", release.Repo.Link(), release.TagName) 327 + 328 + resp := session.MakeRequest(t, NewRequest(t, "GET", release.HTMLURL()), http.StatusOK) 329 + body := resp.Body.String() 330 + assert.Contains(t, body, zipURL) 331 + assert.Contains(t, body, tarGzURL) 332 + 333 + hideArchiveLinks := true 334 + 335 + req := NewRequestWithJSON(t, "PATCH", release.APIURL(), &api.EditReleaseOption{ 336 + HideArchiveLinks: &hideArchiveLinks, 337 + }).AddTokenAuth(token) 338 + MakeRequest(t, req, http.StatusOK) 339 + 340 + resp = session.MakeRequest(t, NewRequest(t, "GET", release.HTMLURL()), http.StatusOK) 341 + body = resp.Body.String() 342 + assert.NotContains(t, body, zipURL) 343 + assert.NotContains(t, body, tarGzURL) 344 + }