mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Lint action.go
This commit is contained in:
		| @@ -24,8 +24,10 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | // ActionType represents the type of an action. | ||||||
| type ActionType int | type ActionType int | ||||||
|  |  | ||||||
|  | // Possible action types. | ||||||
| const ( | const ( | ||||||
| 	ActionCreateRepo        ActionType = iota + 1 // 1 | 	ActionCreateRepo        ActionType = iota + 1 // 1 | ||||||
| 	ActionRenameRepo                              // 2 | 	ActionRenameRepo                              // 2 | ||||||
| @@ -45,12 +47,13 @@ const ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
| 	// Same as Github. See https://help.github.com/articles/closing-issues-via-commit-messages | 	// Same as Github. See | ||||||
| 	IssueCloseKeywords  = []string{"close", "closes", "closed", "fix", "fixes", "fixed", "resolve", "resolves", "resolved"} | 	// https://help.github.com/articles/closing-issues-via-commit-messages | ||||||
| 	IssueReopenKeywords = []string{"reopen", "reopens", "reopened"} | 	issueCloseKeywords  = []string{"close", "closes", "closed", "fix", "fixes", "fixed", "resolve", "resolves", "resolved"} | ||||||
|  | 	issueReopenKeywords = []string{"reopen", "reopens", "reopened"} | ||||||
|  |  | ||||||
| 	IssueCloseKeywordsPat, IssueReopenKeywordsPat *regexp.Regexp | 	issueCloseKeywordsPat, issueReopenKeywordsPat *regexp.Regexp | ||||||
| 	IssueReferenceKeywordsPat                     *regexp.Regexp | 	issueReferenceKeywordsPat                     *regexp.Regexp | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func assembleKeywordsPattern(words []string) string { | func assembleKeywordsPattern(words []string) string { | ||||||
| @@ -58,13 +61,14 @@ func assembleKeywordsPattern(words []string) string { | |||||||
| } | } | ||||||
|  |  | ||||||
| func init() { | func init() { | ||||||
| 	IssueCloseKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueCloseKeywords)) | 	issueCloseKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(issueCloseKeywords)) | ||||||
| 	IssueReopenKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueReopenKeywords)) | 	issueReopenKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(issueReopenKeywords)) | ||||||
| 	IssueReferenceKeywordsPat = regexp.MustCompile(`(?i)(?:)(^| )\S+`) | 	issueReferenceKeywordsPat = regexp.MustCompile(`(?i)(?:)(^| )\S+`) | ||||||
| } | } | ||||||
|  |  | ||||||
| // Action represents user operation type and other information to repository., | // Action represents user operation type and other information to | ||||||
| // it implemented interface base.Actioner so that can be used in template render. | // repository. It implemented interface base.Actioner so that can be | ||||||
|  | // used in template render. | ||||||
| type Action struct { | type Action struct { | ||||||
| 	ID           int64 `xorm:"pk autoincr"` | 	ID           int64 `xorm:"pk autoincr"` | ||||||
| 	UserID       int64 // Receiver user id. | 	UserID       int64 // Receiver user id. | ||||||
| @@ -82,10 +86,13 @@ type Action struct { | |||||||
| 	CreatedUnix  int64 | 	CreatedUnix  int64 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // BeforeInsert will be invoked by XORM before inserting a record | ||||||
|  | // representing this object. | ||||||
| func (a *Action) BeforeInsert() { | func (a *Action) BeforeInsert() { | ||||||
| 	a.CreatedUnix = time.Now().Unix() | 	a.CreatedUnix = time.Now().Unix() | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // AfterSet updates the webhook object upon setting a column. | ||||||
| func (a *Action) AfterSet(colName string, _ xorm.Cell) { | func (a *Action) AfterSet(colName string, _ xorm.Cell) { | ||||||
| 	switch colName { | 	switch colName { | ||||||
| 	case "created_unix": | 	case "created_unix": | ||||||
| @@ -93,42 +100,57 @@ func (a *Action) AfterSet(colName string, _ xorm.Cell) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetOpType gets the ActionType of this action. | ||||||
|  | // TODO: change return type to ActionType ? | ||||||
| func (a *Action) GetOpType() int { | func (a *Action) GetOpType() int { | ||||||
| 	return int(a.OpType) | 	return int(a.OpType) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetActUserName gets the action's user name. | ||||||
| func (a *Action) GetActUserName() string { | func (a *Action) GetActUserName() string { | ||||||
| 	return a.ActUserName | 	return a.ActUserName | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // ShortActUserName gets the action's user name trimmed to max 20 | ||||||
|  | // chars. | ||||||
| func (a *Action) ShortActUserName() string { | func (a *Action) ShortActUserName() string { | ||||||
| 	return base.EllipsisString(a.ActUserName, 20) | 	return base.EllipsisString(a.ActUserName, 20) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetRepoUserName returns the name of the action repository owner. | ||||||
| func (a *Action) GetRepoUserName() string { | func (a *Action) GetRepoUserName() string { | ||||||
| 	return a.RepoUserName | 	return a.RepoUserName | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // ShortRepoUserName returns the name of the action repository owner | ||||||
|  | // trimmed to max 20 chars. | ||||||
| func (a *Action) ShortRepoUserName() string { | func (a *Action) ShortRepoUserName() string { | ||||||
| 	return base.EllipsisString(a.RepoUserName, 20) | 	return base.EllipsisString(a.RepoUserName, 20) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetRepoName returns the name of the action repository. | ||||||
| func (a *Action) GetRepoName() string { | func (a *Action) GetRepoName() string { | ||||||
| 	return a.RepoName | 	return a.RepoName | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // ShortRepoName returns the name of the action repository | ||||||
|  | // trimmed to max 33 chars. | ||||||
| func (a *Action) ShortRepoName() string { | func (a *Action) ShortRepoName() string { | ||||||
| 	return base.EllipsisString(a.RepoName, 33) | 	return base.EllipsisString(a.RepoName, 33) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetRepoPath returns the virtual path to the action repository. | ||||||
| func (a *Action) GetRepoPath() string { | func (a *Action) GetRepoPath() string { | ||||||
| 	return path.Join(a.RepoUserName, a.RepoName) | 	return path.Join(a.RepoUserName, a.RepoName) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // ShortRepoPath returns the virtual path to the action repository | ||||||
|  | // trimed to max 20 + 1 + 33 chars. | ||||||
| func (a *Action) ShortRepoPath() string { | func (a *Action) ShortRepoPath() string { | ||||||
| 	return path.Join(a.ShortRepoUserName(), a.ShortRepoName()) | 	return path.Join(a.ShortRepoUserName(), a.ShortRepoName()) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetRepoLink returns relative link to action repository. | ||||||
| func (a *Action) GetRepoLink() string { | func (a *Action) GetRepoLink() string { | ||||||
| 	if len(setting.AppSubUrl) > 0 { | 	if len(setting.AppSubUrl) > 0 { | ||||||
| 		return path.Join(setting.AppSubUrl, a.GetRepoPath()) | 		return path.Join(setting.AppSubUrl, a.GetRepoPath()) | ||||||
| @@ -136,22 +158,29 @@ func (a *Action) GetRepoLink() string { | |||||||
| 	return "/" + a.GetRepoPath() | 	return "/" + a.GetRepoPath() | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetBranch returns the action's repository branch. | ||||||
| func (a *Action) GetBranch() string { | func (a *Action) GetBranch() string { | ||||||
| 	return a.RefName | 	return a.RefName | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetContent returns the action's content. | ||||||
| func (a *Action) GetContent() string { | func (a *Action) GetContent() string { | ||||||
| 	return a.Content | 	return a.Content | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetCreate returns the action creation time. | ||||||
| func (a *Action) GetCreate() time.Time { | func (a *Action) GetCreate() time.Time { | ||||||
| 	return a.Created | 	return a.Created | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetIssueInfos returns a list of issues associated with | ||||||
|  | // the action. | ||||||
| func (a *Action) GetIssueInfos() []string { | func (a *Action) GetIssueInfos() []string { | ||||||
| 	return strings.SplitN(a.Content, "|", 2) | 	return strings.SplitN(a.Content, "|", 2) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetIssueTitle returns the title of first issue associated | ||||||
|  | // with the action. | ||||||
| func (a *Action) GetIssueTitle() string { | func (a *Action) GetIssueTitle() string { | ||||||
| 	index := com.StrTo(a.GetIssueInfos()[0]).MustInt64() | 	index := com.StrTo(a.GetIssueInfos()[0]).MustInt64() | ||||||
| 	issue, err := GetIssueByIndex(a.RepoID, index) | 	issue, err := GetIssueByIndex(a.RepoID, index) | ||||||
| @@ -162,6 +191,8 @@ func (a *Action) GetIssueTitle() string { | |||||||
| 	return issue.Title | 	return issue.Title | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetIssueContent returns the content of first issue associated with | ||||||
|  | // this action. | ||||||
| func (a *Action) GetIssueContent() string { | func (a *Action) GetIssueContent() string { | ||||||
| 	index := com.StrTo(a.GetIssueInfos()[0]).MustInt64() | 	index := com.StrTo(a.GetIssueInfos()[0]).MustInt64() | ||||||
| 	issue, err := GetIssueByIndex(a.RepoID, index) | 	issue, err := GetIssueByIndex(a.RepoID, index) | ||||||
| @@ -221,6 +252,7 @@ func issueIndexTrimRight(c rune) bool { | |||||||
| 	return !unicode.IsDigit(c) | 	return !unicode.IsDigit(c) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // PushCommit represents a commit in a push operation. | ||||||
| type PushCommit struct { | type PushCommit struct { | ||||||
| 	Sha1           string | 	Sha1           string | ||||||
| 	Message        string | 	Message        string | ||||||
| @@ -231,6 +263,7 @@ type PushCommit struct { | |||||||
| 	Timestamp      time.Time | 	Timestamp      time.Time | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // PushCommits represents list of commits in a push operation. | ||||||
| type PushCommits struct { | type PushCommits struct { | ||||||
| 	Len        int | 	Len        int | ||||||
| 	Commits    []*PushCommit | 	Commits    []*PushCommit | ||||||
| @@ -239,13 +272,16 @@ type PushCommits struct { | |||||||
| 	avatars map[string]string | 	avatars map[string]string | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // NewPushCommits creates a new PushCommits object. | ||||||
| func NewPushCommits() *PushCommits { | func NewPushCommits() *PushCommits { | ||||||
| 	return &PushCommits{ | 	return &PushCommits{ | ||||||
| 		avatars: make(map[string]string), | 		avatars: make(map[string]string), | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func (pc *PushCommits) ToApiPayloadCommits(repoLink string) []*api.PayloadCommit { | // ToAPIPayloadCommits converts a PushCommits object to | ||||||
|  | // api.PayloadCommit format. | ||||||
|  | func (pc *PushCommits) ToAPIPayloadCommits(repoLink string) []*api.PayloadCommit { | ||||||
| 	commits := make([]*api.PayloadCommit, len(pc.Commits)) | 	commits := make([]*api.PayloadCommit, len(pc.Commits)) | ||||||
| 	for i, commit := range pc.Commits { | 	for i, commit := range pc.Commits { | ||||||
| 		authorUsername := "" | 		authorUsername := "" | ||||||
| @@ -281,21 +317,21 @@ func (pc *PushCommits) ToApiPayloadCommits(repoLink string) []*api.PayloadCommit | |||||||
|  |  | ||||||
| // AvatarLink tries to match user in database with e-mail | // AvatarLink tries to match user in database with e-mail | ||||||
| // in order to show custom avatar, and falls back to general avatar link. | // in order to show custom avatar, and falls back to general avatar link. | ||||||
| func (push *PushCommits) AvatarLink(email string) string { | func (pc *PushCommits) AvatarLink(email string) string { | ||||||
| 	_, ok := push.avatars[email] | 	_, ok := pc.avatars[email] | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		u, err := GetUserByEmail(email) | 		u, err := GetUserByEmail(email) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			push.avatars[email] = base.AvatarLink(email) | 			pc.avatars[email] = base.AvatarLink(email) | ||||||
| 			if !IsErrUserNotExist(err) { | 			if !IsErrUserNotExist(err) { | ||||||
| 				log.Error(4, "GetUserByEmail: %v", err) | 				log.Error(4, "GetUserByEmail: %v", err) | ||||||
| 			} | 			} | ||||||
| 		} else { | 		} else { | ||||||
| 			push.avatars[email] = u.RelAvatarLink() | 			pc.avatars[email] = u.RelAvatarLink() | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return push.avatars[email] | 	return pc.avatars[email] | ||||||
| } | } | ||||||
|  |  | ||||||
| // UpdateIssuesCommit checks if issues are manipulated by commit message. | // UpdateIssuesCommit checks if issues are manipulated by commit message. | ||||||
| @@ -305,7 +341,7 @@ func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) err | |||||||
| 		c := commits[i] | 		c := commits[i] | ||||||
|  |  | ||||||
| 		refMarked := make(map[int64]bool) | 		refMarked := make(map[int64]bool) | ||||||
| 		for _, ref := range IssueReferenceKeywordsPat.FindAllString(c.Message, -1) { | 		for _, ref := range issueReferenceKeywordsPat.FindAllString(c.Message, -1) { | ||||||
| 			ref = ref[strings.IndexByte(ref, byte(' '))+1:] | 			ref = ref[strings.IndexByte(ref, byte(' '))+1:] | ||||||
| 			ref = strings.TrimRightFunc(ref, issueIndexTrimRight) | 			ref = strings.TrimRightFunc(ref, issueIndexTrimRight) | ||||||
|  |  | ||||||
| @@ -343,7 +379,7 @@ func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) err | |||||||
|  |  | ||||||
| 		refMarked = make(map[int64]bool) | 		refMarked = make(map[int64]bool) | ||||||
| 		// FIXME: can merge this one and next one to a common function. | 		// FIXME: can merge this one and next one to a common function. | ||||||
| 		for _, ref := range IssueCloseKeywordsPat.FindAllString(c.Message, -1) { | 		for _, ref := range issueCloseKeywordsPat.FindAllString(c.Message, -1) { | ||||||
| 			ref = ref[strings.IndexByte(ref, byte(' '))+1:] | 			ref = ref[strings.IndexByte(ref, byte(' '))+1:] | ||||||
| 			ref = strings.TrimRightFunc(ref, issueIndexTrimRight) | 			ref = strings.TrimRightFunc(ref, issueIndexTrimRight) | ||||||
|  |  | ||||||
| @@ -383,7 +419,7 @@ func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) err | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		// It is conflict to have close and reopen at same time, so refsMarkd doesn't need to reinit here. | 		// It is conflict to have close and reopen at same time, so refsMarkd doesn't need to reinit here. | ||||||
| 		for _, ref := range IssueReopenKeywordsPat.FindAllString(c.Message, -1) { | 		for _, ref := range issueReopenKeywordsPat.FindAllString(c.Message, -1) { | ||||||
| 			ref = ref[strings.IndexByte(ref, byte(' '))+1:] | 			ref = ref[strings.IndexByte(ref, byte(' '))+1:] | ||||||
| 			ref = strings.TrimRightFunc(ref, issueIndexTrimRight) | 			ref = strings.TrimRightFunc(ref, issueIndexTrimRight) | ||||||
|  |  | ||||||
| @@ -425,6 +461,7 @@ func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) err | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // CommitRepoActionOptions represent options of a new commit action. | ||||||
| type CommitRepoActionOptions struct { | type CommitRepoActionOptions struct { | ||||||
| 	PusherName  string | 	PusherName  string | ||||||
| 	RepoOwnerID int64 | 	RepoOwnerID int64 | ||||||
| @@ -435,7 +472,8 @@ type CommitRepoActionOptions struct { | |||||||
| 	Commits     *PushCommits | 	Commits     *PushCommits | ||||||
| } | } | ||||||
|  |  | ||||||
| // CommitRepoAction adds new commit actio to the repository, and prepare corresponding webhooks. | // CommitRepoAction adds new commit action to the repository, and prepare | ||||||
|  | // corresponding webhooks. | ||||||
| func CommitRepoAction(opts CommitRepoActionOptions) error { | func CommitRepoAction(opts CommitRepoActionOptions) error { | ||||||
| 	pusher, err := GetUserByName(opts.PusherName) | 	pusher, err := GetUserByName(opts.PusherName) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -509,7 +547,7 @@ func CommitRepoAction(opts CommitRepoActionOptions) error { | |||||||
| 			Before:     opts.OldCommitID, | 			Before:     opts.OldCommitID, | ||||||
| 			After:      opts.NewCommitID, | 			After:      opts.NewCommitID, | ||||||
| 			CompareURL: setting.AppUrl + opts.Commits.CompareURL, | 			CompareURL: setting.AppUrl + opts.Commits.CompareURL, | ||||||
| 			Commits:    opts.Commits.ToApiPayloadCommits(repo.HTMLURL()), | 			Commits:    opts.Commits.ToAPIPayloadCommits(repo.HTMLURL()), | ||||||
| 			Repo:       apiRepo, | 			Repo:       apiRepo, | ||||||
| 			Pusher:     apiPusher, | 			Pusher:     apiPusher, | ||||||
| 			Sender:     apiPusher, | 			Sender:     apiPusher, | ||||||
|   | |||||||
| @@ -318,7 +318,7 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository) (err error | |||||||
| 		Before:     pr.MergeBase, | 		Before:     pr.MergeBase, | ||||||
| 		After:      pr.MergedCommitID, | 		After:      pr.MergedCommitID, | ||||||
| 		CompareURL: setting.AppUrl + pr.BaseRepo.ComposeCompareURL(pr.MergeBase, pr.MergedCommitID), | 		CompareURL: setting.AppUrl + pr.BaseRepo.ComposeCompareURL(pr.MergeBase, pr.MergedCommitID), | ||||||
| 		Commits:    ListToPushCommits(l).ToApiPayloadCommits(pr.BaseRepo.HTMLURL()), | 		Commits:    ListToPushCommits(l).ToAPIPayloadCommits(pr.BaseRepo.HTMLURL()), | ||||||
| 		Repo:       pr.BaseRepo.APIFormat(nil), | 		Repo:       pr.BaseRepo.APIFormat(nil), | ||||||
| 		Pusher:     pr.HeadRepo.MustOwner().APIFormat(), | 		Pusher:     pr.HeadRepo.MustOwner().APIFormat(), | ||||||
| 		Sender:     doer.APIFormat(), | 		Sender:     doer.APIFormat(), | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user