diff --git a/models/repo.go b/models/repo.go index 4f4477c9a..482c96055 100644 --- a/models/repo.go +++ b/models/repo.go @@ -41,20 +41,40 @@ const ( var repoWorkingPool = sync.NewExclusivePool() var ( - ErrRepoFileNotExist = errors.New("Repository file does not exist") + // ErrRepoFileNotExist repository file does not exist error + ErrRepoFileNotExist = errors.New("Repository file does not exist") + + // ErrRepoFileNotLoaded repository file not loaded error ErrRepoFileNotLoaded = errors.New("Repository file not loaded") - ErrMirrorNotExist = errors.New("Mirror does not exist") - ErrInvalidReference = errors.New("Invalid reference specified") - ErrNameEmpty = errors.New("Name is empty") + + // ErrMirrorNotExist mirror does not exist error + ErrMirrorNotExist = errors.New("Mirror does not exist") + + // ErrInvalidReference invalid reference specified error + ErrInvalidReference = errors.New("Invalid reference specified") + + // ErrNameEmpty name is empty error + ErrNameEmpty = errors.New("Name is empty") ) var ( - Gitignores, Licenses, Readmes, LabelTemplates []string + // Gitignores contains the gitiginore files + Gitignores []string + + // Licenses contains the license files + Licenses []string + + // Readmes contains the readme files + Readmes []string + + // LabelTemplates contains the label template files + LabelTemplates []string - // Maximum items per page in forks, watchers and stars of a repo + // ItemsPerPage maximum items per page in forks, watchers and stars of a repo ItemsPerPage = 40 ) +// LoadRepoConfig loads the repository config func LoadRepoConfig() { // Load .gitignore and license files and readme templates. types := []string{"gitignore", "license", "readme", "label"} @@ -104,6 +124,7 @@ func LoadRepoConfig() { Licenses = sortedLicenses } +// NewRepoContext creates a new repository context func NewRepoContext() { zip.Verbose = false @@ -200,15 +221,18 @@ type Repository struct { UpdatedUnix int64 } +// BeforeInsert is invoked from XORM before inserting an object of this type. func (repo *Repository) BeforeInsert() { repo.CreatedUnix = time.Now().Unix() repo.UpdatedUnix = repo.CreatedUnix } +// BeforeUpdate is invoked from XORM before updating this object. func (repo *Repository) BeforeUpdate() { repo.UpdatedUnix = time.Now().Unix() } +// AfterSet is invoked from XORM after setting the value of a field of this object. func (repo *Repository) AfterSet(colName string, _ xorm.Cell) { switch colName { case "default_branch": @@ -241,14 +265,17 @@ func (repo *Repository) MustOwner() *User { return repo.mustOwner(x) } +// FullName returns the repository full name func (repo *Repository) FullName() string { return repo.MustOwner().Name + "/" + repo.Name } +// HTMLURL returns the repository HTML URL func (repo *Repository) HTMLURL() string { return setting.AppURL + repo.FullName() } +// APIFormat converts a Repository to api.Repository // Arguments that are allowed to be nil: permission func (repo *Repository) APIFormat(permission *api.Permission) *api.Repository { cloneLink := repo.CloneLink() @@ -284,6 +311,7 @@ func (repo *Repository) getOwner(e Engine) (err error) { return err } +// GetOwner returns the repository owner func (repo *Repository) GetOwner() error { return repo.getOwner(x) } @@ -381,11 +409,13 @@ func (repo *Repository) IssueStats(uid int64, filterMode int, isPull bool) (int6 return GetRepoIssueStats(repo.ID, uid, filterMode, isPull) } +// GetMirror sets the repository mirror, returns an error upon failure func (repo *Repository) GetMirror() (err error) { repo.Mirror, err = GetMirrorByRepoID(repo.ID) return err } +// GetBaseRepo returns the base repository func (repo *Repository) GetBaseRepo() (err error) { if !repo.IsFork { return nil @@ -399,31 +429,38 @@ func (repo *Repository) repoPath(e Engine) string { return RepoPath(repo.mustOwner(e).Name, repo.Name) } +// RepoPath returns the repository path func (repo *Repository) RepoPath() string { return repo.repoPath(x) } +// GitConfigPath returns the repository git config path func (repo *Repository) GitConfigPath() string { return filepath.Join(repo.RepoPath(), "config") } +// RelLink returns the repository relative link func (repo *Repository) RelLink() string { return "/" + repo.FullName() } +// Link returns the repository link func (repo *Repository) Link() string { return setting.AppSubURL + "/" + repo.FullName() } +// ComposeCompareURL returns the repository comparison URL func (repo *Repository) ComposeCompareURL(oldCommitID, newCommitID string) string { return fmt.Sprintf("%s/%s/compare/%s...%s", repo.MustOwner().Name, repo.Name, oldCommitID, newCommitID) } +// HasAccess returns true when user has access to this repository func (repo *Repository) HasAccess(u *User) bool { has, _ := HasAccess(u, repo, AccessModeRead) return has } +// IsOwnedBy returns true when user owns this repository func (repo *Repository) IsOwnedBy(userID int64) bool { return repo.OwnerID == userID } @@ -438,7 +475,7 @@ func (repo *Repository) CanEnablePulls() bool { return !repo.IsMirror } -// AllowPulls returns true if repository meets the requirements of accepting pulls and has them enabled. +// AllowsPulls returns true if repository meets the requirements of accepting pulls and has them enabled. func (repo *Repository) AllowsPulls() bool { return repo.CanEnablePulls() && repo.EnablePulls } @@ -448,6 +485,7 @@ func (repo *Repository) CanEnableEditor() bool { return !repo.IsMirror } +// NextIssueIndex returns the next issue index // FIXME: should have a mutex to prevent producing same index for two issues that are created // closely enough. func (repo *Repository) NextIssueIndex() int64 { @@ -455,22 +493,23 @@ func (repo *Repository) NextIssueIndex() int64 { } var ( - DescPattern = regexp.MustCompile(`https?://\S+`) + descPattern = regexp.MustCompile(`https?://\S+`) ) -// DescriptionHtml does special handles to description and return HTML string. -func (repo *Repository) DescriptionHtml() template.HTML { +// DescriptionHTML does special handles to description and return HTML string. +func (repo *Repository) DescriptionHTML() template.HTML { sanitize := func(s string) string { return fmt.Sprintf(`%[1]s`, s) } - return template.HTML(DescPattern.ReplaceAllStringFunc(markdown.Sanitizer.Sanitize(repo.Description), sanitize)) + return template.HTML(descPattern.ReplaceAllStringFunc(markdown.Sanitizer.Sanitize(repo.Description), sanitize)) } +// LocalCopyPath returns the local repository copy path func (repo *Repository) LocalCopyPath() string { return path.Join(setting.AppDataPath, "tmp/local-rpeo", com.ToStr(repo.ID)) } -// UpdateLocalCopy pulls latest changes of given branch from repoPath to localPath. +// UpdateLocalCopyBranch pulls latest changes of given branch from repoPath to localPath. // It creates a new clone if local copy does not exist. // This function checks out target branch by default, it is safe to assume subsequent // operations are operating against target branch when caller has confidence for no race condition. @@ -575,6 +614,7 @@ func (repo *Repository) CloneLink() (cl *CloneLink) { return repo.cloneLink(false) } +// MigrateRepoOptions contains the repository migrate options type MigrateRepoOptions struct { Name string Description string @@ -711,7 +751,7 @@ func createUpdateHook(repoPath string) error { fmt.Sprintf(tplUpdateHook, setting.ScriptType, "\""+setting.AppPath+"\"", setting.CustomConf)) } -// Finish migrating repository and/or wiki with things that don't need to be done for mirrors. +// CleanUpMigrateInfo finishes migrating repository and/or wiki with things that don't need to be done for mirrors. func CleanUpMigrateInfo(repo *Repository) (*Repository, error) { repoPath := repo.RepoPath() if err := createUpdateHook(repoPath); err != nil { @@ -759,6 +799,7 @@ func initRepoCommit(tmpPath string, sig *git.Signature) (err error) { return nil } +// CreateRepoOptions contains the create repository options type CreateRepoOptions struct { Name string Description string @@ -897,6 +938,7 @@ var ( reservedRepoPatterns = []string{"*.git", "*.wiki"} ) +// IsUsableRepoName returns true when repository is usable func IsUsableRepoName(name string) error { return isUsableName(reservedRepoNames, reservedRepoPatterns, name) } @@ -1030,6 +1072,7 @@ func CountUserRepositories(userID int64, private bool) int64 { return countRepositories(userID, private) } +// Repositories returns all repositories func Repositories(page, pageSize int) (_ []*Repository, err error) { repos := make([]*Repository, 0, pageSize) return repos, x.Limit(pageSize, (page-1)*pageSize).Asc("id").Find(&repos) @@ -1275,6 +1318,7 @@ func updateRepository(e Engine, repo *Repository, visibilityChanged bool) (err e return nil } +// UpdateRepository updates a repository func UpdateRepository(repo *Repository, visibilityChanged bool) (err error) { sess := x.NewSession() defer sessionRelease(sess) @@ -1474,7 +1518,7 @@ func GetUserRepositories(userID int64, private bool, page, pageSize int) ([]*Rep return repos, sess.Find(&repos) } -// GetUserRepositories returns a list of mirror repositories of given user. +// GetUserMirrorRepositories returns a list of mirror repositories of given user. func GetUserMirrorRepositories(userID int64) ([]*Repository, error) { repos := make([]*Repository, 0, 10) return repos, x. @@ -1502,6 +1546,7 @@ func GetRepositoryCount(u *User) (int64, error) { return getRepositoryCount(x, u) } +// SearchRepoOptions holds the search options type SearchRepoOptions struct { Keyword string OwnerID int64 @@ -1670,6 +1715,7 @@ func GitFsck() { } } +// GitGcRepos calls 'git gc' to remove unnecessary files and optimize the local repository func GitGcRepos() error { args := append([]string{"gc"}, setting.Git.GCArgs...) return x. @@ -1712,6 +1758,7 @@ func repoStatsCheck(checker *repoChecker) { } } +// CheckRepoStats checks the repository stats func CheckRepoStats() { if taskStatusTable.IsRunning(checkRepos) { return @@ -1806,6 +1853,7 @@ func CheckRepoStats() { // ***** END: Repository.NumForks ***** } +// RepositoryList contains a list of repositories type RepositoryList []*Repository func (repos RepositoryList) loadAttributes(e Engine) error { @@ -1838,10 +1886,12 @@ func (repos RepositoryList) loadAttributes(e Engine) error { return nil } +// LoadAttributes loads the attributes for the given RepositoryList func (repos RepositoryList) LoadAttributes() error { return repos.loadAttributes(x) } +// MirrorRepositoryList contains the mirror repositories type MirrorRepositoryList []*Repository func (repos MirrorRepositoryList) loadAttributes(e Engine) error { @@ -1876,6 +1926,7 @@ func (repos MirrorRepositoryList) loadAttributes(e Engine) error { return nil } +// LoadAttributes loads the attributes for the given MirrorRepositoryList func (repos MirrorRepositoryList) LoadAttributes() error { return repos.loadAttributes(x) } @@ -1925,7 +1976,7 @@ func watchRepo(e Engine, userID, repoID int64, watch bool) (err error) { return err } -// Watch or unwatch repository. +// WatchRepo watch or unwatch repository. func WatchRepo(userID, repoID int64, watch bool) (err error) { return watchRepo(x, userID, repoID, watch) } @@ -1940,7 +1991,7 @@ func GetWatchers(repoID int64) ([]*Watch, error) { return getWatchers(x, repoID) } -// Repository.GetWatchers returns range of users watching given repository. +// GetWatchers returns range of users watching given repository. func (repo *Repository) GetWatchers(page int) ([]*User, error) { users := make([]*User, 0, ItemsPerPage) sess := x. @@ -1993,13 +2044,14 @@ func NotifyWatchers(act *Action) error { // /_______ /|__| (____ /__| // \/ \/ +// Star contains the star information type Star struct { ID int64 `xorm:"pk autoincr"` UID int64 `xorm:"UNIQUE(s)"` RepoID int64 `xorm:"UNIQUE(s)"` } -// Star or unstar repository. +// StarRepo star or unstar repository. func StarRepo(userID, repoID int64, star bool) (err error) { if star { if IsStaring(userID, repoID) { @@ -2031,6 +2083,7 @@ func IsStaring(userID, repoID int64) bool { return has } +// GetStargazers returns the users who gave stars to this repository func (repo *Repository) GetStargazers(page int) ([]*User, error) { users := make([]*User, 0, ItemsPerPage) sess := x. @@ -2060,6 +2113,7 @@ func HasForkedRepo(ownerID, repoID int64) (*Repository, bool) { return repo, has } +// ForkRepository forks a repository func ForkRepository(u *User, oldRepo *Repository, name, desc string) (_ *Repository, err error) { repo := &Repository{ OwnerID: u.ID, @@ -2109,6 +2163,7 @@ func ForkRepository(u *User, oldRepo *Repository, name, desc string) (_ *Reposit return repo, sess.Commit() } +// GetForks returns all the forks of the repository func (repo *Repository) GetForks() ([]*Repository, error) { forks := make([]*Repository, 0, repo.NumForks) return forks, x.Find(&forks, &Repository{ForkID: repo.ID}) @@ -2122,6 +2177,7 @@ func (repo *Repository) GetForks() ([]*Repository, error) { // \/ \/ \/ \/ \/ // +// CreateNewBranch creates a new repository branch func (repo *Repository) CreateNewBranch(doer *User, oldBranchName, branchName string) (err error) { repoWorkingPool.CheckIn(com.ToStr(repo.ID)) defer repoWorkingPool.CheckOut(com.ToStr(repo.ID))