diff options
Diffstat (limited to 'models')
-rw-r--r-- | models/action.go | 80 | ||||
-rw-r--r-- | models/error.go | 83 | ||||
-rw-r--r-- | models/git_diff.go | 32 | ||||
-rw-r--r-- | models/pull.go | 2 |
4 files changed, 169 insertions, 28 deletions
diff --git a/models/action.go b/models/action.go index 29cf74a800..72d988955b 100644 --- a/models/action.go +++ b/models/action.go @@ -24,8 +24,10 @@ import ( "code.gitea.io/gitea/modules/setting" ) +// ActionType represents the type of an action. type ActionType int +// Possible action types. const ( ActionCreateRepo ActionType = iota + 1 // 1 ActionRenameRepo // 2 @@ -45,12 +47,13 @@ const ( ) var ( - // Same as Github. See https://help.github.com/articles/closing-issues-via-commit-messages - IssueCloseKeywords = []string{"close", "closes", "closed", "fix", "fixes", "fixed", "resolve", "resolves", "resolved"} - IssueReopenKeywords = []string{"reopen", "reopens", "reopened"} + // Same as Github. See + // https://help.github.com/articles/closing-issues-via-commit-messages + issueCloseKeywords = []string{"close", "closes", "closed", "fix", "fixes", "fixed", "resolve", "resolves", "resolved"} + issueReopenKeywords = []string{"reopen", "reopens", "reopened"} - IssueCloseKeywordsPat, IssueReopenKeywordsPat *regexp.Regexp - IssueReferenceKeywordsPat *regexp.Regexp + issueCloseKeywordsPat, issueReopenKeywordsPat *regexp.Regexp + issueReferenceKeywordsPat *regexp.Regexp ) func assembleKeywordsPattern(words []string) string { @@ -58,13 +61,14 @@ func assembleKeywordsPattern(words []string) string { } func init() { - IssueCloseKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueCloseKeywords)) - IssueReopenKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(IssueReopenKeywords)) - IssueReferenceKeywordsPat = regexp.MustCompile(`(?i)(?:)(^| )\S+`) + issueCloseKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(issueCloseKeywords)) + issueReopenKeywordsPat = regexp.MustCompile(assembleKeywordsPattern(issueReopenKeywords)) + issueReferenceKeywordsPat = regexp.MustCompile(`(?i)(?:)(^| )\S+`) } -// Action represents user operation type and other information to repository., -// it implemented interface base.Actioner so that can be used in template render. +// Action represents user operation type and other information to +// repository. It implemented interface base.Actioner so that can be +// used in template render. type Action struct { ID int64 `xorm:"pk autoincr"` UserID int64 // Receiver user id. @@ -82,10 +86,13 @@ type Action struct { CreatedUnix int64 } +// BeforeInsert will be invoked by XORM before inserting a record +// representing this object. func (a *Action) BeforeInsert() { a.CreatedUnix = time.Now().Unix() } +// AfterSet updates the webhook object upon setting a column. func (a *Action) AfterSet(colName string, _ xorm.Cell) { switch colName { 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 { return int(a.OpType) } +// GetActUserName gets the action's user name. func (a *Action) GetActUserName() string { return a.ActUserName } +// ShortActUserName gets the action's user name trimmed to max 20 +// chars. func (a *Action) ShortActUserName() string { return base.EllipsisString(a.ActUserName, 20) } +// GetRepoUserName returns the name of the action repository owner. func (a *Action) GetRepoUserName() string { return a.RepoUserName } +// ShortRepoUserName returns the name of the action repository owner +// trimmed to max 20 chars. func (a *Action) ShortRepoUserName() string { return base.EllipsisString(a.RepoUserName, 20) } +// GetRepoName returns the name of the action repository. func (a *Action) GetRepoName() string { return a.RepoName } +// ShortRepoName returns the name of the action repository +// trimmed to max 33 chars. func (a *Action) ShortRepoName() string { return base.EllipsisString(a.RepoName, 33) } +// GetRepoPath returns the virtual path to the action repository. func (a *Action) GetRepoPath() string { 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 { return path.Join(a.ShortRepoUserName(), a.ShortRepoName()) } +// GetRepoLink returns relative link to action repository. func (a *Action) GetRepoLink() string { if len(setting.AppSubUrl) > 0 { return path.Join(setting.AppSubUrl, a.GetRepoPath()) @@ -136,22 +158,29 @@ func (a *Action) GetRepoLink() string { return "/" + a.GetRepoPath() } +// GetBranch returns the action's repository branch. func (a *Action) GetBranch() string { return a.RefName } +// GetContent returns the action's content. func (a *Action) GetContent() string { return a.Content } +// GetCreate returns the action creation time. func (a *Action) GetCreate() time.Time { return a.Created } +// GetIssueInfos returns a list of issues associated with +// the action. func (a *Action) GetIssueInfos() []string { return strings.SplitN(a.Content, "|", 2) } +// GetIssueTitle returns the title of first issue associated +// with the action. func (a *Action) GetIssueTitle() string { index := com.StrTo(a.GetIssueInfos()[0]).MustInt64() issue, err := GetIssueByIndex(a.RepoID, index) @@ -162,6 +191,8 @@ func (a *Action) GetIssueTitle() string { return issue.Title } +// GetIssueContent returns the content of first issue associated with +// this action. func (a *Action) GetIssueContent() string { index := com.StrTo(a.GetIssueInfos()[0]).MustInt64() issue, err := GetIssueByIndex(a.RepoID, index) @@ -221,6 +252,7 @@ func issueIndexTrimRight(c rune) bool { return !unicode.IsDigit(c) } +// PushCommit represents a commit in a push operation. type PushCommit struct { Sha1 string Message string @@ -231,6 +263,7 @@ type PushCommit struct { Timestamp time.Time } +// PushCommits represents list of commits in a push operation. type PushCommits struct { Len int Commits []*PushCommit @@ -239,13 +272,16 @@ type PushCommits struct { avatars map[string]string } +// NewPushCommits creates a new PushCommits object. func NewPushCommits() *PushCommits { return &PushCommits{ 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)) for i, commit := range pc.Commits { authorUsername := "" @@ -281,21 +317,21 @@ func (pc *PushCommits) ToApiPayloadCommits(repoLink string) []*api.PayloadCommit // AvatarLink tries to match user in database with e-mail // in order to show custom avatar, and falls back to general avatar link. -func (push *PushCommits) AvatarLink(email string) string { - _, ok := push.avatars[email] +func (pc *PushCommits) AvatarLink(email string) string { + _, ok := pc.avatars[email] if !ok { u, err := GetUserByEmail(email) if err != nil { - push.avatars[email] = base.AvatarLink(email) + pc.avatars[email] = base.AvatarLink(email) if !IsErrUserNotExist(err) { log.Error(4, "GetUserByEmail: %v", err) } } 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. @@ -305,7 +341,7 @@ func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) err c := commits[i] 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 = strings.TrimRightFunc(ref, issueIndexTrimRight) @@ -343,7 +379,7 @@ func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) err refMarked = make(map[int64]bool) // 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 = 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. - for _, ref := range IssueReopenKeywordsPat.FindAllString(c.Message, -1) { + for _, ref := range issueReopenKeywordsPat.FindAllString(c.Message, -1) { ref = ref[strings.IndexByte(ref, byte(' '))+1:] ref = strings.TrimRightFunc(ref, issueIndexTrimRight) @@ -425,6 +461,7 @@ func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) err return nil } +// CommitRepoActionOptions represent options of a new commit action. type CommitRepoActionOptions struct { PusherName string RepoOwnerID int64 @@ -435,7 +472,8 @@ type CommitRepoActionOptions struct { 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 { pusher, err := GetUserByName(opts.PusherName) if err != nil { @@ -509,7 +547,7 @@ func CommitRepoAction(opts CommitRepoActionOptions) error { Before: opts.OldCommitID, After: opts.NewCommitID, CompareURL: setting.AppUrl + opts.Commits.CompareURL, - Commits: opts.Commits.ToApiPayloadCommits(repo.HTMLURL()), + Commits: opts.Commits.ToAPIPayloadCommits(repo.HTMLURL()), Repo: apiRepo, Pusher: apiPusher, Sender: apiPusher, diff --git a/models/error.go b/models/error.go index 459954545a..33815cdc96 100644 --- a/models/error.go +++ b/models/error.go @@ -8,10 +8,12 @@ import ( "fmt" ) +// ErrNameReserved represents a "reserved name" error. type ErrNameReserved struct { Name string } +// IsErrNameReserved checks if an error is a ErrNameReserved. func IsErrNameReserved(err error) bool { _, ok := err.(ErrNameReserved) return ok @@ -21,10 +23,13 @@ func (err ErrNameReserved) Error() string { return fmt.Sprintf("name is reserved [name: %s]", err.Name) } +// ErrNamePatternNotAllowed represents a "pattern not allowed" error. type ErrNamePatternNotAllowed struct { Pattern string } +// IsErrNamePatternNotAllowed checks if an error is an +// ErrNamePatternNotAllowed. func IsErrNamePatternNotAllowed(err error) bool { _, ok := err.(ErrNamePatternNotAllowed) return ok @@ -41,10 +46,12 @@ func (err ErrNamePatternNotAllowed) Error() string { // |______//____ >\___ >__| // \/ \/ +// ErrUserAlreadyExist represents a "user already exists" error. type ErrUserAlreadyExist struct { Name string } +// IsErrUserAlreadyExist checks if an error is a ErrUserAlreadyExists. func IsErrUserAlreadyExist(err error) bool { _, ok := err.(ErrUserAlreadyExist) return ok @@ -54,12 +61,14 @@ func (err ErrUserAlreadyExist) Error() string { return fmt.Sprintf("user already exists [name: %s]", err.Name) } +// ErrUserNotExist represents a "UserNotExist" kind of error. type ErrUserNotExist struct { UID int64 Name string KeyID int64 } +// IsErrUserNotExist checks if an error is a ErrUserNotExist. func IsErrUserNotExist(err error) bool { _, ok := err.(ErrUserNotExist) return ok @@ -69,10 +78,12 @@ func (err ErrUserNotExist) Error() string { return fmt.Sprintf("user does not exist [uid: %d, name: %s, keyid: %d]", err.UID, err.Name, err.KeyID) } +// ErrEmailAlreadyUsed represents a "EmailAlreadyUsed" kind of error. type ErrEmailAlreadyUsed struct { Email string } +// IsErrEmailAlreadyUsed checks if an error is a ErrEmailAlreadyUsed. func IsErrEmailAlreadyUsed(err error) bool { _, ok := err.(ErrEmailAlreadyUsed) return ok @@ -82,10 +93,12 @@ func (err ErrEmailAlreadyUsed) Error() string { return fmt.Sprintf("e-mail has been used [email: %s]", err.Email) } +// ErrUserOwnRepos represents a "UserOwnRepos" kind of error. type ErrUserOwnRepos struct { UID int64 } +// IsErrUserOwnRepos checks if an error is a ErrUserOwnRepos. func IsErrUserOwnRepos(err error) bool { _, ok := err.(ErrUserOwnRepos) return ok @@ -95,10 +108,12 @@ func (err ErrUserOwnRepos) Error() string { return fmt.Sprintf("user still has ownership of repositories [uid: %d]", err.UID) } +// ErrUserHasOrgs represents a "UserHasOrgs" kind of error. type ErrUserHasOrgs struct { UID int64 } +// IsErrUserHasOrgs checks if an error is a ErrUserHasOrgs. func IsErrUserHasOrgs(err error) bool { _, ok := err.(ErrUserHasOrgs) return ok @@ -108,10 +123,12 @@ func (err ErrUserHasOrgs) Error() string { return fmt.Sprintf("user still has membership of organizations [uid: %d]", err.UID) } +// ErrReachLimitOfRepo represents a "ReachLimitOfRepo" kind of error. type ErrReachLimitOfRepo struct { Limit int } +// IsErrReachLimitOfRepo checks if an error is a ErrReachLimitOfRepo. func IsErrReachLimitOfRepo(err error) bool { _, ok := err.(ErrReachLimitOfRepo) return ok @@ -128,10 +145,12 @@ func (err ErrReachLimitOfRepo) Error() string { // \__/\ / |__|__|_ \__| // \/ \/ +// ErrWikiAlreadyExist represents a "WikiAlreadyExist" kind of error. type ErrWikiAlreadyExist struct { Title string } +// IsErrWikiAlreadyExist checks if an error is a ErrWikiAlreadyExist. func IsErrWikiAlreadyExist(err error) bool { _, ok := err.(ErrWikiAlreadyExist) return ok @@ -148,10 +167,12 @@ func (err ErrWikiAlreadyExist) Error() string { // |____| |____/|___ /____/__|\___ > |____|__ \___ > ____| // \/ \/ \/ \/\/ +// ErrKeyUnableVerify represents a "KeyUnableVerify" kind of error. type ErrKeyUnableVerify struct { Result string } +// IsErrKeyUnableVerify checks if an error is a ErrKeyUnableVerify. func IsErrKeyUnableVerify(err error) bool { _, ok := err.(ErrKeyUnableVerify) return ok @@ -161,10 +182,12 @@ func (err ErrKeyUnableVerify) Error() string { return fmt.Sprintf("Unable to verify key content [result: %s]", err.Result) } +// ErrKeyNotExist represents a "KeyNotExist" kind of error. type ErrKeyNotExist struct { ID int64 } +// IsErrKeyNotExist checks if an error is a ErrKeyNotExist. func IsErrKeyNotExist(err error) bool { _, ok := err.(ErrKeyNotExist) return ok @@ -174,11 +197,13 @@ func (err ErrKeyNotExist) Error() string { return fmt.Sprintf("public key does not exist [id: %d]", err.ID) } +// ErrKeyAlreadyExist represents a "KeyAlreadyExist" kind of error. type ErrKeyAlreadyExist struct { OwnerID int64 Content string } +// IsErrKeyAlreadyExist checks if an error is a ErrKeyAlreadyExist. func IsErrKeyAlreadyExist(err error) bool { _, ok := err.(ErrKeyAlreadyExist) return ok @@ -188,11 +213,13 @@ func (err ErrKeyAlreadyExist) Error() string { return fmt.Sprintf("public key already exists [owner_id: %d, content: %s]", err.OwnerID, err.Content) } +// ErrKeyNameAlreadyUsed represents a "KeyNameAlreadyUsed" kind of error. type ErrKeyNameAlreadyUsed struct { OwnerID int64 Name string } +// IsErrKeyNameAlreadyUsed checks if an error is a ErrKeyNameAlreadyUsed. func IsErrKeyNameAlreadyUsed(err error) bool { _, ok := err.(ErrKeyNameAlreadyUsed) return ok @@ -202,12 +229,14 @@ func (err ErrKeyNameAlreadyUsed) Error() string { return fmt.Sprintf("public key already exists [owner_id: %d, name: %s]", err.OwnerID, err.Name) } +// ErrKeyAccessDenied represents a "KeyAccessDenied" kind of error. type ErrKeyAccessDenied struct { UserID int64 KeyID int64 Note string } +// IsErrKeyAccessDenied checks if an error is a ErrKeyAccessDenied. func IsErrKeyAccessDenied(err error) bool { _, ok := err.(ErrKeyAccessDenied) return ok @@ -218,12 +247,14 @@ func (err ErrKeyAccessDenied) Error() string { err.UserID, err.KeyID, err.Note) } +// ErrDeployKeyNotExist represents a "DeployKeyNotExist" kind of error. type ErrDeployKeyNotExist struct { ID int64 KeyID int64 RepoID int64 } +// IsErrDeployKeyNotExist checks if an error is a ErrDeployKeyNotExist. func IsErrDeployKeyNotExist(err error) bool { _, ok := err.(ErrDeployKeyNotExist) return ok @@ -233,11 +264,13 @@ func (err ErrDeployKeyNotExist) Error() string { return fmt.Sprintf("Deploy key does not exist [id: %d, key_id: %d, repo_id: %d]", err.ID, err.KeyID, err.RepoID) } +// ErrDeployKeyAlreadyExist represents a "DeployKeyAlreadyExist" kind of error. type ErrDeployKeyAlreadyExist struct { KeyID int64 RepoID int64 } +// IsErrDeployKeyAlreadyExist checks if an error is a ErrDeployKeyAlreadyExist. func IsErrDeployKeyAlreadyExist(err error) bool { _, ok := err.(ErrDeployKeyAlreadyExist) return ok @@ -247,11 +280,13 @@ func (err ErrDeployKeyAlreadyExist) Error() string { return fmt.Sprintf("public key already exists [key_id: %d, repo_id: %d]", err.KeyID, err.RepoID) } +// ErrDeployKeyNameAlreadyUsed represents a "DeployKeyNameAlreadyUsed" kind of error. type ErrDeployKeyNameAlreadyUsed struct { RepoID int64 Name string } +// IsErrDeployKeyNameAlreadyUsed checks if an error is a ErrDeployKeyNameAlreadyUsed. func IsErrDeployKeyNameAlreadyUsed(err error) bool { _, ok := err.(ErrDeployKeyNameAlreadyUsed) return ok @@ -268,10 +303,12 @@ func (err ErrDeployKeyNameAlreadyUsed) Error() string { // \____|__ /\___ >___ >___ >____ >____ > |____| \____/|__|_ \\___ >___| / // \/ \/ \/ \/ \/ \/ \/ \/ \/ +// ErrAccessTokenNotExist represents a "AccessTokenNotExist" kind of error. type ErrAccessTokenNotExist struct { SHA string } +// IsErrAccessTokenNotExist checks if an error is a ErrAccessTokenNotExist. func IsErrAccessTokenNotExist(err error) bool { _, ok := err.(ErrAccessTokenNotExist) return ok @@ -281,9 +318,11 @@ func (err ErrAccessTokenNotExist) Error() string { return fmt.Sprintf("access token does not exist [sha: %s]", err.SHA) } +// ErrAccessTokenEmpty represents a "AccessTokenEmpty" kind of error. type ErrAccessTokenEmpty struct { } +// IsErrAccessTokenEmpty checks if an error is a ErrAccessTokenEmpty. func IsErrAccessTokenEmpty(err error) bool { _, ok := err.(ErrAccessTokenEmpty) return ok @@ -300,10 +339,12 @@ func (err ErrAccessTokenEmpty) Error() string { // \_______ /__| \___ (____ /___| /__/_____ \(____ /__| |__|\____/|___| / // \/ /_____/ \/ \/ \/ \/ \/ +// ErrLastOrgOwner represents a "LastOrgOwner" kind of error. type ErrLastOrgOwner struct { UID int64 } +// IsErrLastOrgOwner checks if an error is a ErrLastOrgOwner. func IsErrLastOrgOwner(err error) bool { _, ok := err.(ErrLastOrgOwner) return ok @@ -320,12 +361,14 @@ func (err ErrLastOrgOwner) Error() string { // |____|_ /\___ > __/ \____/____ >__||__| \____/|__| / ____| // \/ \/|__| \/ \/ +// ErrRepoNotExist represents a "RepoNotExist" kind of error. type ErrRepoNotExist struct { ID int64 UID int64 Name string } +// IsErrRepoNotExist checks if an error is a ErrRepoNotExist. func IsErrRepoNotExist(err error) bool { _, ok := err.(ErrRepoNotExist) return ok @@ -335,11 +378,13 @@ func (err ErrRepoNotExist) Error() string { return fmt.Sprintf("repository does not exist [id: %d, uid: %d, name: %s]", err.ID, err.UID, err.Name) } +// ErrRepoAlreadyExist represents a "RepoAlreadyExist" kind of error. type ErrRepoAlreadyExist struct { Uname string Name string } +// IsErrRepoAlreadyExist checks if an error is a ErrRepoAlreadyExist. func IsErrRepoAlreadyExist(err error) bool { _, ok := err.(ErrRepoAlreadyExist) return ok @@ -349,12 +394,14 @@ func (err ErrRepoAlreadyExist) Error() string { return fmt.Sprintf("repository already exists [uname: %s, name: %s]", err.Uname, err.Name) } +// ErrInvalidCloneAddr represents a "InvalidCloneAddr" kind of error. type ErrInvalidCloneAddr struct { IsURLError bool IsInvalidPath bool IsPermissionDenied bool } +// IsErrInvalidCloneAddr checks if an error is a ErrInvalidCloneAddr. func IsErrInvalidCloneAddr(err error) bool { _, ok := err.(ErrInvalidCloneAddr) return ok @@ -365,10 +412,12 @@ func (err ErrInvalidCloneAddr) Error() string { err.IsURLError, err.IsInvalidPath, err.IsPermissionDenied) } +// ErrUpdateTaskNotExist represents a "UpdateTaskNotExist" kind of error. type ErrUpdateTaskNotExist struct { UUID string } +// IsErrUpdateTaskNotExist checks if an error is a ErrUpdateTaskNotExist. func IsErrUpdateTaskNotExist(err error) bool { _, ok := err.(ErrUpdateTaskNotExist) return ok @@ -378,10 +427,12 @@ func (err ErrUpdateTaskNotExist) Error() string { return fmt.Sprintf("update task does not exist [uuid: %s]", err.UUID) } +// ErrReleaseAlreadyExist represents a "ReleaseAlreadyExist" kind of error. type ErrReleaseAlreadyExist struct { TagName string } +// IsErrReleaseAlreadyExist checks if an error is a ErrReleaseAlreadyExist. func IsErrReleaseAlreadyExist(err error) bool { _, ok := err.(ErrReleaseAlreadyExist) return ok @@ -391,11 +442,13 @@ func (err ErrReleaseAlreadyExist) Error() string { return fmt.Sprintf("release tag already exist [tag_name: %s]", err.TagName) } +// ErrReleaseNotExist represents a "ReleaseNotExist" kind of error. type ErrReleaseNotExist struct { ID int64 TagName string } +// IsErrReleaseNotExist checks if an error is a ErrReleaseNotExist. func IsErrReleaseNotExist(err error) bool { _, ok := err.(ErrReleaseNotExist) return ok @@ -405,10 +458,12 @@ func (err ErrReleaseNotExist) Error() string { return fmt.Sprintf("release tag does not exist [id: %d, tag_name: %s]", err.ID, err.TagName) } +// ErrInvalidTagName represents a "InvalidTagName" kind of error. type ErrInvalidTagName struct { TagName string } +// IsErrInvalidTagName checks if an error is a ErrInvalidTagName. func IsErrInvalidTagName(err error) bool { _, ok := err.(ErrInvalidTagName) return ok @@ -418,10 +473,12 @@ func (err ErrInvalidTagName) Error() string { return fmt.Sprintf("release tag name is not valid [tag_name: %s]", err.TagName) } +// ErrRepoFileAlreadyExist represents a "RepoFileAlreadyExist" kind of error. type ErrRepoFileAlreadyExist struct { FileName string } +// IsErrRepoFileAlreadyExist checks if an error is a ErrRepoFileAlreadyExist. func IsErrRepoFileAlreadyExist(err error) bool { _, ok := err.(ErrRepoFileAlreadyExist) return ok @@ -438,10 +495,12 @@ func (err ErrRepoFileAlreadyExist) Error() string { // |______ / |__| (____ /___| /\___ >___| / // \/ \/ \/ \/ \/ +// ErrBranchNotExist represents a "BranchNotExist" kind of error. type ErrBranchNotExist struct { Name string } +// IsErrBranchNotExist checks if an error is a ErrBranchNotExist. func IsErrBranchNotExist(err error) bool { _, ok := err.(ErrBranchNotExist) return ok @@ -458,10 +517,12 @@ func (err ErrBranchNotExist) Error() string { // \__/\ / \___ >___ /___| /\____/ \____/|__|_ \ // \/ \/ \/ \/ \/ +// ErrWebhookNotExist represents a "WebhookNotExist" kind of error. type ErrWebhookNotExist struct { ID int64 } +// IsErrWebhookNotExist checks if an error is a ErrWebhookNotExist. func IsErrWebhookNotExist(err error) bool { _, ok := err.(ErrWebhookNotExist) return ok @@ -478,12 +539,14 @@ func (err ErrWebhookNotExist) Error() string { // |___/____ >____ >____/ \___ > // \/ \/ \/ +// ErrIssueNotExist represents a "IssueNotExist" kind of error. type ErrIssueNotExist struct { ID int64 RepoID int64 Index int64 } +// IsErrIssueNotExist checks if an error is a ErrIssueNotExist. func IsErrIssueNotExist(err error) bool { _, ok := err.(ErrIssueNotExist) return ok @@ -500,6 +563,7 @@ func (err ErrIssueNotExist) Error() string { // |____| |____/|____/____/____|_ /\___ >__ |____/ \___ >____ > |__| // \/ \/ |__| \/ \/ +// ErrPullRequestNotExist represents a "PullRequestNotExist" kind of error. type ErrPullRequestNotExist struct { ID int64 IssueID int64 @@ -509,6 +573,7 @@ type ErrPullRequestNotExist struct { BaseBranch string } +// IsErrPullRequestNotExist checks if an error is a ErrPullRequestNotExist. func IsErrPullRequestNotExist(err error) bool { _, ok := err.(ErrPullRequestNotExist) return ok @@ -526,11 +591,13 @@ func (err ErrPullRequestNotExist) Error() string { // \______ /\____/|__|_| /__|_| /\___ >___| /__| // \/ \/ \/ \/ \/ +// ErrCommentNotExist represents a "CommentNotExist" kind of error. type ErrCommentNotExist struct { ID int64 IssueID int64 } +// IsErrCommentNotExist checks if an error is a ErrCommentNotExist. func IsErrCommentNotExist(err error) bool { _, ok := err.(ErrCommentNotExist) return ok @@ -547,11 +614,13 @@ func (err ErrCommentNotExist) Error() string { // |_______ (____ /___ /\___ >____/ // \/ \/ \/ \/ +// ErrLabelNotExist represents a "LabelNotExist" kind of error. type ErrLabelNotExist struct { LabelID int64 RepoID int64 } +// IsErrLabelNotExist checks if an error is a ErrLabelNotExist. func IsErrLabelNotExist(err error) bool { _, ok := err.(ErrLabelNotExist) return ok @@ -568,11 +637,13 @@ func (err ErrLabelNotExist) Error() string { // \____|__ /__|____/\___ >____ > |__| \____/|___| /\___ > // \/ \/ \/ \/ \/ +// ErrMilestoneNotExist represents a "MilestoneNotExist" kind of error. type ErrMilestoneNotExist struct { ID int64 RepoID int64 } +// IsErrMilestoneNotExist checks if an error is a ErrMilestoneNotExist. func IsErrMilestoneNotExist(err error) bool { _, ok := err.(ErrMilestoneNotExist) return ok @@ -589,11 +660,13 @@ func (err ErrMilestoneNotExist) Error() string { // \____|__ /__| |__| (____ /\___ >___| /__|_| /\___ >___| /__| // \/ \/ \/ \/ \/ \/ \/ +// ErrAttachmentNotExist represents a "AttachmentNotExist" kind of error. type ErrAttachmentNotExist struct { ID int64 UUID string } +// IsErrAttachmentNotExist checks if an error is a ErrAttachmentNotExist. func IsErrAttachmentNotExist(err error) bool { _, ok := err.(ErrAttachmentNotExist) return ok @@ -610,10 +683,12 @@ func (err ErrAttachmentNotExist) Error() string { // |_______ \____/\___ /|__|___| / /_______ /\____/|____/ |__| \___ >___ > // \/ /_____/ \/ \/ \/ \/ +// ErrLoginSourceNotExist represents a "LoginSourceNotExist" kind of error. type ErrLoginSourceNotExist struct { ID int64 } +// IsErrLoginSourceNotExist checks if an error is a ErrLoginSourceNotExist. func IsErrLoginSourceNotExist(err error) bool { _, ok := err.(ErrLoginSourceNotExist) return ok @@ -623,10 +698,12 @@ func (err ErrLoginSourceNotExist) Error() string { return fmt.Sprintf("login source does not exist [id: %d]", err.ID) } +// ErrLoginSourceAlreadyExist represents a "LoginSourceAlreadyExist" kind of error. type ErrLoginSourceAlreadyExist struct { Name string } +// IsErrLoginSourceAlreadyExist checks if an error is a ErrLoginSourceAlreadyExist. func IsErrLoginSourceAlreadyExist(err error) bool { _, ok := err.(ErrLoginSourceAlreadyExist) return ok @@ -636,10 +713,12 @@ func (err ErrLoginSourceAlreadyExist) Error() string { return fmt.Sprintf("login source already exists [name: %s]", err.Name) } +// ErrLoginSourceInUse represents a "LoginSourceInUse" kind of error. type ErrLoginSourceInUse struct { ID int64 } +// IsErrLoginSourceInUse checks if an error is a ErrLoginSourceInUse. func IsErrLoginSourceInUse(err error) bool { _, ok := err.(ErrLoginSourceInUse) return ok @@ -656,11 +735,13 @@ func (err ErrLoginSourceInUse) Error() string { // |____| \___ >____ /__|_| / // \/ \/ \/ +// ErrTeamAlreadyExist represents a "TeamAlreadyExist" kind of error. type ErrTeamAlreadyExist struct { OrgID int64 Name string } +// IsErrTeamAlreadyExist checks if an error is a ErrTeamAlreadyExist. func IsErrTeamAlreadyExist(err error) bool { _, ok := err.(ErrTeamAlreadyExist) return ok @@ -678,11 +759,13 @@ func (err ErrTeamAlreadyExist) Error() string { // |__| \/ \/ // +// ErrUploadNotExist represents a "UploadNotExist" kind of error. type ErrUploadNotExist struct { ID int64 UUID string } +// IsErrUploadNotExist checks if an error is a ErrUploadNotExist. func IsErrUploadNotExist(err error) bool { _, ok := err.(ErrAttachmentNotExist) return ok diff --git a/models/git_diff.go b/models/git_diff.go index 7d4f5db7f5..b8f9cacec9 100644 --- a/models/git_diff.go +++ b/models/git_diff.go @@ -28,8 +28,10 @@ import ( "golang.org/x/text/transform" ) +// DiffLineType represents the type of a DiffLine. type DiffLineType uint8 +// DiffLineType possible values. const ( DiffLinePlain DiffLineType = iota + 1 DiffLineAdd @@ -37,8 +39,10 @@ const ( DiffLineSection ) +// DiffFileType represents the type of a DiffFile. type DiffFileType uint8 +// DiffFileType possible values. const ( DiffFileAdd DiffFileType = iota + 1 DiffFileChange @@ -46,6 +50,7 @@ const ( DiffFileRename ) +// DiffLine represents a line difference in a DiffSection. type DiffLine struct { LeftIdx int RightIdx int @@ -53,10 +58,12 @@ type DiffLine struct { Content string } +// GetType returns the type of a DiffLine. func (d *DiffLine) GetType() int { return int(d.Type) } +// DiffSection represents a section of a DiffFile. type DiffSection struct { Name string Lines []*DiffLine @@ -97,7 +104,7 @@ func diffToHTML(diffs []diffmatchpatch.Diff, lineType DiffLineType) template.HTM return template.HTML(buf.Bytes()) } -// get an specific line by type (add or del) and file line number +// GetLine gets a specific line by type (add or del) and file line number func (diffSection *DiffSection) GetLine(lineType DiffLineType, idx int) *DiffLine { var ( difference = 0 @@ -146,7 +153,7 @@ func init() { diffMatchPatch.DiffEditCost = 100 } -// computes inline diff for the given line +// GetComputedInlineDiffFor computes inline diff for the given line. func (diffSection *DiffSection) GetComputedInlineDiffFor(diffLine *DiffLine) template.HTML { if setting.Git.DisableDiffHighlight { return template.HTML(html.EscapeString(diffLine.Content[1:])) @@ -183,6 +190,7 @@ func (diffSection *DiffSection) GetComputedInlineDiffFor(diffLine *DiffLine) tem return diffToHTML(diffRecord, diffLine.Type) } +// DiffFile represents a file diff. type DiffFile struct { Name string OldName string @@ -198,26 +206,32 @@ type DiffFile struct { IsIncomplete bool } +// GetType returns type of diff file. func (diffFile *DiffFile) GetType() int { return int(diffFile.Type) } +// GetHighlightClass returns highlight class for a filename. func (diffFile *DiffFile) GetHighlightClass() string { return highlight.FileNameToHighlightClass(diffFile.Name) } +// Diff represents a difference between two git trees. type Diff struct { TotalAddition, TotalDeletion int Files []*DiffFile IsIncomplete bool } +// NumFiles returns number of files changes in a diff. func (diff *Diff) NumFiles() int { return len(diff.Files) } -const DIFF_HEAD = "diff --git " +const cmdDiffHead = "diff --git " +// ParsePatch builds a Diff object from a io.Reader and some +// parameters. // TODO: move this function to gogits/git-module func ParsePatch(maxLines, maxLineCharacteres, maxFiles int, reader io.Reader) (*Diff, error) { var ( @@ -307,19 +321,19 @@ func ParsePatch(maxLines, maxLineCharacteres, maxFiles int, reader io.Reader) (* } // Get new file. - if strings.HasPrefix(line, DIFF_HEAD) { + if strings.HasPrefix(line, cmdDiffHead) { middle := -1 // Note: In case file name is surrounded by double quotes (it happens only in git-shell). // e.g. diff --git "a/xxx" "b/xxx" - hasQuote := line[len(DIFF_HEAD)] == '"' + hasQuote := line[len(cmdDiffHead)] == '"' if hasQuote { middle = strings.Index(line, ` "b/`) } else { middle = strings.Index(line, " b/") } - beg := len(DIFF_HEAD) + beg := len(cmdDiffHead) a := line[beg+2 : middle] b := line[middle+3:] if hasQuote { @@ -405,6 +419,9 @@ func ParsePatch(maxLines, maxLineCharacteres, maxFiles int, reader io.Reader) (* return diff, nil } +// GetDiffRange builds a Diff between two commits of a repository. +// passing the empty string as beforeCommitID returns a diff from the +// parent commit. func GetDiffRange(repoPath, beforeCommitID, afterCommitID string, maxLines, maxLineCharacteres, maxFiles int) (*Diff, error) { gitRepo, err := git.OpenRepository(repoPath) if err != nil { @@ -456,8 +473,10 @@ func GetDiffRange(repoPath, beforeCommitID, afterCommitID string, maxLines, maxL return diff, nil } +// RawDiffType type of a raw diff. type RawDiffType string +// RawDiffType possible values. const ( RawDiffNormal RawDiffType = "diff" RawDiffPatch RawDiffType = "patch" @@ -509,6 +528,7 @@ func GetRawDiff(repoPath, commitID string, diffType RawDiffType, writer io.Write return nil } +// GetDiffCommit builds a Diff representing the given commitID. func GetDiffCommit(repoPath, commitID string, maxLines, maxLineCharacteres, maxFiles int) (*Diff, error) { return GetDiffRange(repoPath, "", commitID, maxLines, maxLineCharacteres, maxFiles) } diff --git a/models/pull.go b/models/pull.go index 4b7034ce4d..d1ff974371 100644 --- a/models/pull.go +++ b/models/pull.go @@ -318,7 +318,7 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository) (err error Before: pr.MergeBase, After: 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), Pusher: pr.HeadRepo.MustOwner().APIFormat(), Sender: doer.APIFormat(), |