2019-11-03 15:59:09 -05:00
// Copyright 2019 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 action
import (
"fmt"
2019-11-15 03:06:11 -05:00
"path"
2019-11-13 21:57:36 -05:00
"strings"
2019-11-03 15:59:09 -05:00
2022-08-24 22:31:57 -04:00
activities_model "code.gitea.io/gitea/models/activities"
2022-04-08 05:11:15 -04:00
"code.gitea.io/gitea/models/db"
2022-06-13 05:37:59 -04:00
issues_model "code.gitea.io/gitea/models/issues"
2021-12-09 20:27:50 -05:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-24 04:49:20 -05:00
user_model "code.gitea.io/gitea/models/user"
2022-01-19 18:26:57 -05:00
"code.gitea.io/gitea/modules/graceful"
2021-07-24 12:03:58 -04:00
"code.gitea.io/gitea/modules/json"
2019-11-03 15:59:09 -05:00
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/notification/base"
2022-01-19 18:26:57 -05:00
"code.gitea.io/gitea/modules/process"
2020-01-10 04:34:21 -05:00
"code.gitea.io/gitea/modules/repository"
2021-12-09 00:41:17 -05:00
"code.gitea.io/gitea/modules/util"
2019-11-03 15:59:09 -05:00
)
type actionNotifier struct {
base . NullNotifier
}
2022-01-20 12:46:10 -05:00
var _ base . Notifier = & actionNotifier { }
2019-11-03 15:59:09 -05:00
2019-11-08 15:54:50 -05:00
// NewNotifier create a new actionNotifier notifier
2019-11-03 15:59:09 -05:00
func NewNotifier ( ) base . Notifier {
return & actionNotifier { }
}
2022-06-13 05:37:59 -04:00
func ( a * actionNotifier ) NotifyNewIssue ( issue * issues_model . Issue , mentions [ ] * user_model . User ) {
2019-11-03 15:59:09 -05:00
if err := issue . LoadPoster ( ) ; err != nil {
log . Error ( "issue.LoadPoster: %v" , err )
return
}
2022-04-08 05:11:15 -04:00
if err := issue . LoadRepo ( db . DefaultContext ) ; err != nil {
2019-11-03 15:59:09 -05:00
log . Error ( "issue.LoadRepo: %v" , err )
return
}
repo := issue . Repo
2022-08-24 22:31:57 -04:00
if err := activities_model . NotifyWatchers ( & activities_model . Action {
2019-11-03 15:59:09 -05:00
ActUserID : issue . Poster . ID ,
ActUser : issue . Poster ,
2022-08-24 22:31:57 -04:00
OpType : activities_model . ActionCreateIssue ,
2019-11-03 15:59:09 -05:00
Content : fmt . Sprintf ( "%d|%s" , issue . Index , issue . Title ) ,
RepoID : repo . ID ,
Repo : repo ,
IsPrivate : repo . IsPrivate ,
} ) ; err != nil {
log . Error ( "NotifyWatchers: %v" , err )
}
}
2019-12-15 16:57:34 -05:00
// NotifyIssueChangeStatus notifies close or reopen issue to notifiers
2022-06-13 05:37:59 -04:00
func ( a * actionNotifier ) NotifyIssueChangeStatus ( doer * user_model . User , issue * issues_model . Issue , actionComment * issues_model . Comment , closeOrReopen bool ) {
2019-12-15 16:57:34 -05:00
// Compose comment action, could be plain comment, close or reopen issue/pull request.
// This object will be used to notify watchers in the end of function.
2022-08-24 22:31:57 -04:00
act := & activities_model . Action {
2019-12-15 16:57:34 -05:00
ActUserID : doer . ID ,
ActUser : doer ,
Content : fmt . Sprintf ( "%d|%s" , issue . Index , "" ) ,
RepoID : issue . Repo . ID ,
Repo : issue . Repo ,
Comment : actionComment ,
CommentID : actionComment . ID ,
IsPrivate : issue . Repo . IsPrivate ,
}
// Check comment type.
if closeOrReopen {
2022-08-24 22:31:57 -04:00
act . OpType = activities_model . ActionCloseIssue
2019-12-15 16:57:34 -05:00
if issue . IsPull {
2022-08-24 22:31:57 -04:00
act . OpType = activities_model . ActionClosePullRequest
2019-12-15 16:57:34 -05:00
}
} else {
2022-08-24 22:31:57 -04:00
act . OpType = activities_model . ActionReopenIssue
2019-12-15 16:57:34 -05:00
if issue . IsPull {
2022-08-24 22:31:57 -04:00
act . OpType = activities_model . ActionReopenPullRequest
2019-12-15 16:57:34 -05:00
}
}
// Notify watchers for whatever action comes in, ignore if no action type.
2022-08-24 22:31:57 -04:00
if err := activities_model . NotifyWatchers ( act ) ; err != nil {
2019-12-15 16:57:34 -05:00
log . Error ( "NotifyWatchers: %v" , err )
}
}
// NotifyCreateIssueComment notifies comment on an issue to notifiers
2021-12-09 20:27:50 -05:00
func ( a * actionNotifier ) NotifyCreateIssueComment ( doer * user_model . User , repo * repo_model . Repository ,
2022-06-13 05:37:59 -04:00
issue * issues_model . Issue , comment * issues_model . Comment , mentions [ ] * user_model . User ,
2022-02-23 15:16:07 -05:00
) {
2022-08-24 22:31:57 -04:00
act := & activities_model . Action {
2019-12-15 16:57:34 -05:00
ActUserID : doer . ID ,
ActUser : doer ,
RepoID : issue . Repo . ID ,
Repo : issue . Repo ,
Comment : comment ,
CommentID : comment . ID ,
IsPrivate : issue . Repo . IsPrivate ,
}
2020-09-18 03:38:21 -04:00
2021-12-09 00:41:17 -05:00
truncatedContent , truncatedRight := util . SplitStringAtByteN ( comment . Content , 200 )
if truncatedRight != "" {
// in case the content is in a Latin family language, we remove the last broken word.
lastSpaceIdx := strings . LastIndex ( truncatedContent , " " )
if lastSpaceIdx != - 1 && ( len ( truncatedContent ) - lastSpaceIdx < 15 ) {
truncatedContent = truncatedContent [ : lastSpaceIdx ] + "…"
}
2020-09-18 03:38:21 -04:00
}
2021-12-09 00:41:17 -05:00
act . Content = fmt . Sprintf ( "%d|%s" , issue . Index , truncatedContent )
2020-09-18 03:38:21 -04:00
2019-12-22 03:29:26 -05:00
if issue . IsPull {
2022-08-24 22:31:57 -04:00
act . OpType = activities_model . ActionCommentPull
2019-12-22 03:29:26 -05:00
} else {
2022-08-24 22:31:57 -04:00
act . OpType = activities_model . ActionCommentIssue
2019-12-22 03:29:26 -05:00
}
2019-12-15 16:57:34 -05:00
// Notify watchers for whatever action comes in, ignore if no action type.
2022-08-24 22:31:57 -04:00
if err := activities_model . NotifyWatchers ( act ) ; err != nil {
2019-12-15 16:57:34 -05:00
log . Error ( "NotifyWatchers: %v" , err )
}
}
2022-06-13 05:37:59 -04:00
func ( a * actionNotifier ) NotifyNewPullRequest ( pull * issues_model . PullRequest , mentions [ ] * user_model . User ) {
2019-11-03 15:59:09 -05:00
if err := pull . LoadIssue ( ) ; err != nil {
log . Error ( "pull.LoadIssue: %v" , err )
return
}
2022-04-08 05:11:15 -04:00
if err := pull . Issue . LoadRepo ( db . DefaultContext ) ; err != nil {
2019-11-03 15:59:09 -05:00
log . Error ( "pull.Issue.LoadRepo: %v" , err )
return
}
if err := pull . Issue . LoadPoster ( ) ; err != nil {
log . Error ( "pull.Issue.LoadPoster: %v" , err )
return
}
2022-08-24 22:31:57 -04:00
if err := activities_model . NotifyWatchers ( & activities_model . Action {
2019-11-03 15:59:09 -05:00
ActUserID : pull . Issue . Poster . ID ,
ActUser : pull . Issue . Poster ,
2022-08-24 22:31:57 -04:00
OpType : activities_model . ActionCreatePullRequest ,
2019-11-03 15:59:09 -05:00
Content : fmt . Sprintf ( "%d|%s" , pull . Issue . Index , pull . Issue . Title ) ,
RepoID : pull . Issue . Repo . ID ,
Repo : pull . Issue . Repo ,
IsPrivate : pull . Issue . Repo . IsPrivate ,
} ) ; err != nil {
log . Error ( "NotifyWatchers: %v" , err )
}
}
2019-11-08 15:54:50 -05:00
2021-12-09 20:27:50 -05:00
func ( a * actionNotifier ) NotifyRenameRepository ( doer * user_model . User , repo * repo_model . Repository , oldRepoName string ) {
2022-08-24 22:31:57 -04:00
if err := activities_model . NotifyWatchers ( & activities_model . Action {
2019-11-08 15:54:50 -05:00
ActUserID : doer . ID ,
ActUser : doer ,
2022-08-24 22:31:57 -04:00
OpType : activities_model . ActionRenameRepo ,
2019-11-08 15:54:50 -05:00
RepoID : repo . ID ,
Repo : repo ,
IsPrivate : repo . IsPrivate ,
2019-11-15 03:06:11 -05:00
Content : oldRepoName ,
2019-11-08 15:54:50 -05:00
} ) ; err != nil {
2019-11-15 03:06:11 -05:00
log . Error ( "NotifyWatchers: %v" , err )
}
}
2021-12-09 20:27:50 -05:00
func ( a * actionNotifier ) NotifyTransferRepository ( doer * user_model . User , repo * repo_model . Repository , oldOwnerName string ) {
2022-08-24 22:31:57 -04:00
if err := activities_model . NotifyWatchers ( & activities_model . Action {
2019-11-15 03:06:11 -05:00
ActUserID : doer . ID ,
ActUser : doer ,
2022-08-24 22:31:57 -04:00
OpType : activities_model . ActionTransferRepo ,
2019-11-15 03:06:11 -05:00
RepoID : repo . ID ,
Repo : repo ,
IsPrivate : repo . IsPrivate ,
Content : path . Join ( oldOwnerName , repo . Name ) ,
} ) ; err != nil {
log . Error ( "NotifyWatchers: %v" , err )
2019-11-08 15:54:50 -05:00
}
}
2019-11-10 22:39:41 -05:00
2021-12-19 23:41:31 -05:00
func ( a * actionNotifier ) NotifyCreateRepository ( doer , u * user_model . User , repo * repo_model . Repository ) {
2022-08-24 22:31:57 -04:00
if err := activities_model . NotifyWatchers ( & activities_model . Action {
2019-11-10 22:39:41 -05:00
ActUserID : doer . ID ,
ActUser : doer ,
2022-08-24 22:31:57 -04:00
OpType : activities_model . ActionCreateRepo ,
2019-11-10 22:39:41 -05:00
RepoID : repo . ID ,
Repo : repo ,
IsPrivate : repo . IsPrivate ,
} ) ; err != nil {
log . Error ( "notify watchers '%d/%d': %v" , doer . ID , repo . ID , err )
}
}
2021-12-09 20:27:50 -05:00
func ( a * actionNotifier ) NotifyForkRepository ( doer * user_model . User , oldRepo , repo * repo_model . Repository ) {
2022-08-24 22:31:57 -04:00
if err := activities_model . NotifyWatchers ( & activities_model . Action {
2019-11-10 22:39:41 -05:00
ActUserID : doer . ID ,
ActUser : doer ,
2022-08-24 22:31:57 -04:00
OpType : activities_model . ActionCreateRepo ,
2019-11-10 22:39:41 -05:00
RepoID : repo . ID ,
Repo : repo ,
IsPrivate : repo . IsPrivate ,
} ) ; err != nil {
log . Error ( "notify watchers '%d/%d': %v" , doer . ID , repo . ID , err )
}
}
2019-11-13 21:57:36 -05:00
2022-06-13 05:37:59 -04:00
func ( a * actionNotifier ) NotifyPullRequestReview ( pr * issues_model . PullRequest , review * issues_model . Review , comment * issues_model . Comment , mentions [ ] * user_model . User ) {
2022-01-19 18:26:57 -05:00
ctx , _ , finished := process . GetManager ( ) . AddContext ( graceful . GetManager ( ) . HammerContext ( ) , fmt . Sprintf ( "actionNotifier.NotifyPullRequestReview Pull[%d] #%d in [%d]" , pr . ID , pr . Index , pr . BaseRepoID ) )
defer finished ( )
2019-11-13 21:57:36 -05:00
if err := review . LoadReviewer ( ) ; err != nil {
log . Error ( "LoadReviewer '%d/%d': %v" , review . ID , review . ReviewerID , err )
return
}
2022-01-19 18:26:57 -05:00
if err := review . LoadCodeComments ( ctx ) ; err != nil {
2019-11-13 21:57:36 -05:00
log . Error ( "LoadCodeComments '%d/%d': %v" , review . Reviewer . ID , review . ID , err )
return
}
2022-08-24 22:31:57 -04:00
actions := make ( [ ] * activities_model . Action , 0 , 10 )
2019-11-13 21:57:36 -05:00
for _ , lines := range review . CodeComments {
for _ , comments := range lines {
for _ , comm := range comments {
2022-08-24 22:31:57 -04:00
actions = append ( actions , & activities_model . Action {
2019-11-13 21:57:36 -05:00
ActUserID : review . Reviewer . ID ,
ActUser : review . Reviewer ,
Content : fmt . Sprintf ( "%d|%s" , review . Issue . Index , strings . Split ( comm . Content , "\n" ) [ 0 ] ) ,
2022-08-24 22:31:57 -04:00
OpType : activities_model . ActionCommentPull ,
2019-11-13 21:57:36 -05:00
RepoID : review . Issue . RepoID ,
Repo : review . Issue . Repo ,
IsPrivate : review . Issue . Repo . IsPrivate ,
Comment : comm ,
CommentID : comm . ID ,
} )
}
}
}
2022-06-13 05:37:59 -04:00
if review . Type != issues_model . ReviewTypeComment || strings . TrimSpace ( comment . Content ) != "" {
2022-08-24 22:31:57 -04:00
action := & activities_model . Action {
2019-11-13 21:57:36 -05:00
ActUserID : review . Reviewer . ID ,
ActUser : review . Reviewer ,
Content : fmt . Sprintf ( "%d|%s" , review . Issue . Index , strings . Split ( comment . Content , "\n" ) [ 0 ] ) ,
RepoID : review . Issue . RepoID ,
Repo : review . Issue . Repo ,
IsPrivate : review . Issue . Repo . IsPrivate ,
Comment : comment ,
CommentID : comment . ID ,
2019-11-14 18:52:18 -05:00
}
switch review . Type {
2022-06-13 05:37:59 -04:00
case issues_model . ReviewTypeApprove :
2022-08-24 22:31:57 -04:00
action . OpType = activities_model . ActionApprovePullRequest
2022-06-13 05:37:59 -04:00
case issues_model . ReviewTypeReject :
2022-08-24 22:31:57 -04:00
action . OpType = activities_model . ActionRejectPullRequest
2019-11-14 18:52:18 -05:00
default :
2022-08-24 22:31:57 -04:00
action . OpType = activities_model . ActionCommentPull
2019-11-14 18:52:18 -05:00
}
actions = append ( actions , action )
2019-11-13 21:57:36 -05:00
}
2022-08-24 22:31:57 -04:00
if err := activities_model . NotifyWatchersActions ( actions ) ; err != nil {
2019-11-13 21:57:36 -05:00
log . Error ( "notify watchers '%d/%d': %v" , review . Reviewer . ID , review . Issue . RepoID , err )
}
}
2019-11-21 12:08:42 -05:00
2022-06-13 05:37:59 -04:00
func ( * actionNotifier ) NotifyMergePullRequest ( pr * issues_model . PullRequest , doer * user_model . User ) {
2022-08-24 22:31:57 -04:00
if err := activities_model . NotifyWatchers ( & activities_model . Action {
2019-11-21 12:08:42 -05:00
ActUserID : doer . ID ,
ActUser : doer ,
2022-08-24 22:31:57 -04:00
OpType : activities_model . ActionMergePullRequest ,
2019-11-21 12:08:42 -05:00
Content : fmt . Sprintf ( "%d|%s" , pr . Issue . Index , pr . Issue . Title ) ,
RepoID : pr . Issue . Repo . ID ,
Repo : pr . Issue . Repo ,
IsPrivate : pr . Issue . Repo . IsPrivate ,
} ) ; err != nil {
log . Error ( "NotifyWatchers [%d]: %v" , pr . ID , err )
}
}
2019-11-24 00:16:59 -05:00
2022-06-13 05:37:59 -04:00
func ( * actionNotifier ) NotifyPullRevieweDismiss ( doer * user_model . User , review * issues_model . Review , comment * issues_model . Comment ) {
2021-02-11 12:32:25 -05:00
reviewerName := review . Reviewer . Name
if len ( review . OriginalAuthor ) > 0 {
reviewerName = review . OriginalAuthor
}
2022-08-24 22:31:57 -04:00
if err := activities_model . NotifyWatchers ( & activities_model . Action {
2021-02-11 12:32:25 -05:00
ActUserID : doer . ID ,
ActUser : doer ,
2022-08-24 22:31:57 -04:00
OpType : activities_model . ActionPullReviewDismissed ,
2021-02-11 12:32:25 -05:00
Content : fmt . Sprintf ( "%d|%s|%s" , review . Issue . Index , reviewerName , comment . Content ) ,
RepoID : review . Issue . Repo . ID ,
Repo : review . Issue . Repo ,
IsPrivate : review . Issue . Repo . IsPrivate ,
CommentID : comment . ID ,
Comment : comment ,
} ) ; err != nil {
log . Error ( "NotifyWatchers [%d]: %v" , review . Issue . ID , err )
}
}
2021-12-09 20:27:50 -05:00
func ( a * actionNotifier ) NotifyPushCommits ( pusher * user_model . User , repo * repo_model . Repository , opts * repository . PushUpdateOptions , commits * repository . PushCommits ) {
2020-12-07 21:23:18 -05:00
data , err := json . Marshal ( commits )
if err != nil {
log . Error ( "Marshal: %v" , err )
return
}
2022-08-24 22:31:57 -04:00
opType := activities_model . ActionCommitRepo
2020-12-07 21:23:18 -05:00
// Check it's tag push or branch.
if opts . IsTag ( ) {
2022-08-24 22:31:57 -04:00
opType = activities_model . ActionPushTag
2020-12-07 21:23:18 -05:00
if opts . IsDelRef ( ) {
2022-08-24 22:31:57 -04:00
opType = activities_model . ActionDeleteTag
2020-12-07 21:23:18 -05:00
}
} else if opts . IsDelRef ( ) {
2022-08-24 22:31:57 -04:00
opType = activities_model . ActionDeleteBranch
2020-12-07 21:23:18 -05:00
}
2022-08-24 22:31:57 -04:00
if err = activities_model . NotifyWatchers ( & activities_model . Action {
2020-12-07 21:23:18 -05:00
ActUserID : pusher . ID ,
ActUser : pusher ,
OpType : opType ,
Content : string ( data ) ,
RepoID : repo . ID ,
Repo : repo ,
RefName : opts . RefFullName ,
IsPrivate : repo . IsPrivate ,
} ) ; err != nil {
log . Error ( "notifyWatchers: %v" , err )
}
}
2022-01-19 18:26:57 -05:00
func ( a * actionNotifier ) NotifyCreateRef ( doer * user_model . User , repo * repo_model . Repository , refType , refFullName , refID string ) {
2022-08-24 22:31:57 -04:00
opType := activities_model . ActionCommitRepo
2020-12-07 21:23:18 -05:00
if refType == "tag" {
2021-03-21 06:11:22 -04:00
// has sent same action in `NotifyPushCommits`, so skip it.
return
2020-12-07 21:23:18 -05:00
}
2022-08-24 22:31:57 -04:00
if err := activities_model . NotifyWatchers ( & activities_model . Action {
2020-12-07 21:23:18 -05:00
ActUserID : doer . ID ,
ActUser : doer ,
OpType : opType ,
RepoID : repo . ID ,
Repo : repo ,
IsPrivate : repo . IsPrivate ,
RefName : refFullName ,
} ) ; err != nil {
log . Error ( "notifyWatchers: %v" , err )
}
}
2021-12-09 20:27:50 -05:00
func ( a * actionNotifier ) NotifyDeleteRef ( doer * user_model . User , repo * repo_model . Repository , refType , refFullName string ) {
2022-08-24 22:31:57 -04:00
opType := activities_model . ActionDeleteBranch
2020-12-07 21:23:18 -05:00
if refType == "tag" {
2021-03-21 06:11:22 -04:00
// has sent same action in `NotifyPushCommits`, so skip it.
return
2020-12-07 21:23:18 -05:00
}
2022-08-24 22:31:57 -04:00
if err := activities_model . NotifyWatchers ( & activities_model . Action {
2020-12-07 21:23:18 -05:00
ActUserID : doer . ID ,
ActUser : doer ,
OpType : opType ,
RepoID : repo . ID ,
Repo : repo ,
IsPrivate : repo . IsPrivate ,
RefName : refFullName ,
} ) ; err != nil {
log . Error ( "notifyWatchers: %v" , err )
}
}
2021-12-09 20:27:50 -05:00
func ( a * actionNotifier ) NotifySyncPushCommits ( pusher * user_model . User , repo * repo_model . Repository , opts * repository . PushUpdateOptions , commits * repository . PushCommits ) {
2019-11-24 00:16:59 -05:00
data , err := json . Marshal ( commits )
if err != nil {
log . Error ( "json.Marshal: %v" , err )
return
}
2022-08-24 22:31:57 -04:00
if err := activities_model . NotifyWatchers ( & activities_model . Action {
2019-11-24 00:16:59 -05:00
ActUserID : repo . OwnerID ,
ActUser : repo . MustOwner ( ) ,
2022-08-24 22:31:57 -04:00
OpType : activities_model . ActionMirrorSyncPush ,
2019-11-24 00:16:59 -05:00
RepoID : repo . ID ,
Repo : repo ,
IsPrivate : repo . IsPrivate ,
2020-10-30 17:59:02 -04:00
RefName : opts . RefFullName ,
2019-11-24 00:16:59 -05:00
Content : string ( data ) ,
} ) ; err != nil {
log . Error ( "notifyWatchers: %v" , err )
}
}
2022-01-19 18:26:57 -05:00
func ( a * actionNotifier ) NotifySyncCreateRef ( doer * user_model . User , repo * repo_model . Repository , refType , refFullName , refID string ) {
2022-08-24 22:31:57 -04:00
if err := activities_model . NotifyWatchers ( & activities_model . Action {
2019-11-24 00:16:59 -05:00
ActUserID : repo . OwnerID ,
ActUser : repo . MustOwner ( ) ,
2022-08-24 22:31:57 -04:00
OpType : activities_model . ActionMirrorSyncCreate ,
2019-11-24 00:16:59 -05:00
RepoID : repo . ID ,
Repo : repo ,
IsPrivate : repo . IsPrivate ,
RefName : refFullName ,
} ) ; err != nil {
log . Error ( "notifyWatchers: %v" , err )
}
}
2021-12-09 20:27:50 -05:00
func ( a * actionNotifier ) NotifySyncDeleteRef ( doer * user_model . User , repo * repo_model . Repository , refType , refFullName string ) {
2022-08-24 22:31:57 -04:00
if err := activities_model . NotifyWatchers ( & activities_model . Action {
2019-11-24 00:16:59 -05:00
ActUserID : repo . OwnerID ,
ActUser : repo . MustOwner ( ) ,
2022-08-24 22:31:57 -04:00
OpType : activities_model . ActionMirrorSyncDelete ,
2019-11-24 00:16:59 -05:00
RepoID : repo . ID ,
Repo : repo ,
IsPrivate : repo . IsPrivate ,
RefName : refFullName ,
} ) ; err != nil {
log . Error ( "notifyWatchers: %v" , err )
}
}
2020-07-29 15:20:54 -04:00
2022-08-24 22:31:57 -04:00
func ( a * actionNotifier ) NotifyNewRelease ( rel * repo_model . Release ) {
2020-07-29 15:20:54 -04:00
if err := rel . LoadAttributes ( ) ; err != nil {
log . Error ( "NotifyNewRelease: %v" , err )
return
}
2022-08-24 22:31:57 -04:00
if err := activities_model . NotifyWatchers ( & activities_model . Action {
2020-07-29 15:20:54 -04:00
ActUserID : rel . PublisherID ,
ActUser : rel . Publisher ,
2022-08-24 22:31:57 -04:00
OpType : activities_model . ActionPublishRelease ,
2020-07-29 15:20:54 -04:00
RepoID : rel . RepoID ,
Repo : rel . Repo ,
IsPrivate : rel . Repo . IsPrivate ,
Content : rel . Title ,
RefName : rel . TagName ,
} ) ; err != nil {
log . Error ( "notifyWatchers: %v" , err )
}
}