Add action feed for new release (#12324)
* Add action feed for new release Signed-off-by: a1012112796 <1012112796@qq.com> * fix lint * Apply suggestions from code review * Add ReleaseID to the action table * Remove error message * Fold the attachments download list * remove attchment download list * simplify code * fix create release from existing tag * simplify ui * translation change * fix test Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: techknowlogick <techknowlogick@gitea.io>
This commit is contained in:
		
							parent
							
								
									2fd78c151e
								
							
						
					
					
						commit
						1f12dc8e88
					
				
					 10 changed files with 49 additions and 15 deletions
				
			
		|  | @ -49,6 +49,7 @@ const ( | |||
| 	ActionApprovePullRequest                       // 21
 | ||||
| 	ActionRejectPullRequest                        // 22
 | ||||
| 	ActionCommentPull                              // 23
 | ||||
| 	ActionPublishRelease                           // 24
 | ||||
| ) | ||||
| 
 | ||||
| // Action represents user operation type and other information to
 | ||||
|  |  | |||
|  | @ -252,7 +252,7 @@ func notifyWatchers(e Engine, actions ...*Action) error { | |||
| 			act.Repo.Units = nil | ||||
| 
 | ||||
| 			switch act.OpType { | ||||
| 			case ActionCommitRepo, ActionPushTag, ActionDeleteTag, ActionDeleteBranch: | ||||
| 			case ActionCommitRepo, ActionPushTag, ActionDeleteTag, ActionPublishRelease, ActionDeleteBranch: | ||||
| 				if !permCode[i] { | ||||
| 					continue | ||||
| 				} | ||||
|  |  | |||
|  | @ -314,3 +314,22 @@ func (a *actionNotifier) NotifySyncDeleteRef(doer *models.User, repo *models.Rep | |||
| 		log.Error("notifyWatchers: %v", err) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (a *actionNotifier) NotifyNewRelease(rel *models.Release) { | ||||
| 	if err := rel.LoadAttributes(); err != nil { | ||||
| 		log.Error("NotifyNewRelease: %v", err) | ||||
| 		return | ||||
| 	} | ||||
| 	if err := models.NotifyWatchers(&models.Action{ | ||||
| 		ActUserID: rel.PublisherID, | ||||
| 		ActUser:   rel.Publisher, | ||||
| 		OpType:    models.ActionPublishRelease, | ||||
| 		RepoID:    rel.RepoID, | ||||
| 		Repo:      rel.Repo, | ||||
| 		IsPrivate: rel.Repo.IsPrivate, | ||||
| 		Content:   rel.Title, | ||||
| 		RefName:   rel.TagName, | ||||
| 	}); err != nil { | ||||
| 		log.Error("notifyWatchers: %v", err) | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -640,6 +640,8 @@ func ActionIcon(opType models.ActionType) string { | |||
| 		return "check" | ||||
| 	case models.ActionRejectPullRequest: | ||||
| 		return "diff" | ||||
| 	case models.ActionPublishRelease: | ||||
| 		return "tag" | ||||
| 	default: | ||||
| 		return "question" | ||||
| 	} | ||||
|  |  | |||
|  | @ -2331,6 +2331,7 @@ mirror_sync_create = synced new reference <a href="%s/src/%s">%[2]s</a> to <a hr | |||
| mirror_sync_delete = synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror | ||||
| approve_pull_request = `approved <a href="%s/pulls/%s">%s#%[2]s</a>` | ||||
| reject_pull_request = `suggested changes for <a href="%s/pulls/%s">%s#%[2]s</a>` | ||||
| publish_release  = `released <a href="%s/releases/tag/%s"> "%[4]s" </a> at <a href="%[1]s">%[3]s</a>` | ||||
| 
 | ||||
| [tool] | ||||
| ago = %s ago | ||||
|  |  | |||
|  | @ -194,8 +194,8 @@ func CreateRelease(ctx *context.APIContext, form api.CreateReleaseOption) { | |||
| 		rel.Repo = ctx.Repo.Repository | ||||
| 		rel.Publisher = ctx.User | ||||
| 
 | ||||
| 		if err = releaseservice.UpdateRelease(ctx.User, ctx.Repo.GitRepo, rel, nil); err != nil { | ||||
| 			ctx.ServerError("UpdateRelease", err) | ||||
| 		if err = releaseservice.UpdateReleaseOrCreatReleaseFromTag(ctx.User, ctx.Repo.GitRepo, rel, nil, true); err != nil { | ||||
| 			ctx.ServerError("UpdateReleaseOrCreatReleaseFromTag", err) | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
|  | @ -266,8 +266,8 @@ func EditRelease(ctx *context.APIContext, form api.EditReleaseOption) { | |||
| 	if form.IsPrerelease != nil { | ||||
| 		rel.IsPrerelease = *form.IsPrerelease | ||||
| 	} | ||||
| 	if err := releaseservice.UpdateRelease(ctx.User, ctx.Repo.GitRepo, rel, nil); err != nil { | ||||
| 		ctx.Error(http.StatusInternalServerError, "UpdateRelease", err) | ||||
| 	if err := releaseservice.UpdateReleaseOrCreatReleaseFromTag(ctx.User, ctx.Repo.GitRepo, rel, nil, false); err != nil { | ||||
| 		ctx.Error(http.StatusInternalServerError, "UpdateReleaseOrCreatReleaseFromTag", err) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -223,7 +223,7 @@ func NewReleasePost(ctx *context.Context, form auth.NewReleaseForm) { | |||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		rel := &models.Release{ | ||||
| 		rel = &models.Release{ | ||||
| 			RepoID:       ctx.Repo.Repository.ID, | ||||
| 			PublisherID:  ctx.User.ID, | ||||
| 			Title:        form.Title, | ||||
|  | @ -262,9 +262,9 @@ func NewReleasePost(ctx *context.Context, form auth.NewReleaseForm) { | |||
| 		rel.PublisherID = ctx.User.ID | ||||
| 		rel.IsTag = false | ||||
| 
 | ||||
| 		if err = releaseservice.UpdateRelease(ctx.User, ctx.Repo.GitRepo, rel, attachmentUUIDs); err != nil { | ||||
| 		if err = releaseservice.UpdateReleaseOrCreatReleaseFromTag(ctx.User, ctx.Repo.GitRepo, rel, attachmentUUIDs, true); err != nil { | ||||
| 			ctx.Data["Err_TagName"] = true | ||||
| 			ctx.ServerError("UpdateRelease", err) | ||||
| 			ctx.ServerError("UpdateReleaseOrCreatReleaseFromTag", err) | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
|  | @ -341,7 +341,7 @@ func EditReleasePost(ctx *context.Context, form auth.EditReleaseForm) { | |||
| 	rel.Note = form.Content | ||||
| 	rel.IsDraft = len(form.Draft) > 0 | ||||
| 	rel.IsPrerelease = form.Prerelease | ||||
| 	if err = releaseservice.UpdateRelease(ctx.User, ctx.Repo.GitRepo, rel, attachmentUUIDs); err != nil { | ||||
| 	if err = releaseservice.UpdateReleaseOrCreatReleaseFromTag(ctx.User, ctx.Repo.GitRepo, rel, attachmentUUIDs, false); err != nil { | ||||
| 		ctx.ServerError("UpdateRelease", err) | ||||
| 		return | ||||
| 	} | ||||
|  |  | |||
|  | @ -95,8 +95,8 @@ func CreateRelease(gitRepo *git.Repository, rel *models.Release, attachmentUUIDs | |||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // UpdateRelease updates information of a release.
 | ||||
| func UpdateRelease(doer *models.User, gitRepo *git.Repository, rel *models.Release, attachmentUUIDs []string) (err error) { | ||||
| // UpdateReleaseOrCreatReleaseFromTag updates information of a release or create release from tag.
 | ||||
| func UpdateReleaseOrCreatReleaseFromTag(doer *models.User, gitRepo *git.Repository, rel *models.Release, attachmentUUIDs []string, isCreate bool) (err error) { | ||||
| 	if err = createTag(gitRepo, rel); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | @ -110,7 +110,14 @@ func UpdateRelease(doer *models.User, gitRepo *git.Repository, rel *models.Relea | |||
| 		log.Error("AddReleaseAttachments: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	notification.NotifyUpdateRelease(doer, rel) | ||||
| 	if !isCreate { | ||||
| 		notification.NotifyUpdateRelease(doer, rel) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	if !rel.IsDraft { | ||||
| 		notification.NotifyNewRelease(rel) | ||||
| 	} | ||||
| 
 | ||||
| 	return err | ||||
| } | ||||
|  |  | |||
|  | @ -131,7 +131,7 @@ func TestRelease_Update(t *testing.T) { | |||
| 	releaseCreatedUnix := release.CreatedUnix | ||||
| 	time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
 | ||||
| 	release.Note = "Changed note" | ||||
| 	assert.NoError(t, UpdateRelease(user, gitRepo, release, nil)) | ||||
| 	assert.NoError(t, UpdateReleaseOrCreatReleaseFromTag(user, gitRepo, release, nil, false)) | ||||
| 	release, err = models.GetReleaseByID(release.ID) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix)) | ||||
|  | @ -153,7 +153,7 @@ func TestRelease_Update(t *testing.T) { | |||
| 	releaseCreatedUnix = release.CreatedUnix | ||||
| 	time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
 | ||||
| 	release.Title = "Changed title" | ||||
| 	assert.NoError(t, UpdateRelease(user, gitRepo, release, nil)) | ||||
| 	assert.NoError(t, UpdateReleaseOrCreatReleaseFromTag(user, gitRepo, release, nil, false)) | ||||
| 	release, err = models.GetReleaseByID(release.ID) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Less(t, int64(releaseCreatedUnix), int64(release.CreatedUnix)) | ||||
|  | @ -176,7 +176,7 @@ func TestRelease_Update(t *testing.T) { | |||
| 	time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp
 | ||||
| 	release.Title = "Changed title" | ||||
| 	release.Note = "Changed note" | ||||
| 	assert.NoError(t, UpdateRelease(user, gitRepo, release, nil)) | ||||
| 	assert.NoError(t, UpdateReleaseOrCreatReleaseFromTag(user, gitRepo, release, nil, false)) | ||||
| 	release, err = models.GetReleaseByID(release.ID) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix)) | ||||
|  |  | |||
|  | @ -70,6 +70,10 @@ | |||
| 						{{else if eq .GetOpType 23}} | ||||
| 							{{ $index := index .GetIssueInfos 0}} | ||||
| 							{{$.i18n.Tr "action.comment_pull" .GetRepoLink $index .ShortRepoPath | Str2html}} | ||||
| 						{{else if eq .GetOpType 24}} | ||||
| 							{{ $branchLink := .GetBranch | EscapePound | Escape}} | ||||
| 							{{ $linkText := .Content | RenderEmoji }} | ||||
| 							{{$.i18n.Tr "action.publish_release" .GetRepoLink $branchLink .ShortRepoPath $linkText | Str2html}} | ||||
| 						{{end}} | ||||
| 					</p> | ||||
| 					{{if or (eq .GetOpType 5) (eq .GetOpType 18)}} | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue