diff options
Diffstat (limited to 'models')
-rw-r--r-- | models/error.go | 14 | ||||
-rw-r--r-- | models/repo.go | 137 |
2 files changed, 72 insertions, 79 deletions
diff --git a/models/error.go b/models/error.go index e52d9b16..0e554e52 100644 --- a/models/error.go +++ b/models/error.go @@ -225,6 +225,20 @@ func (err ErrRepoNotExist) Error() string { return fmt.Sprintf("repository does not exist [id: %d, uid: %d, name: %s]", err.ID, err.UID, err.Name) } +type ErrRepoAlreadyExist struct { + Uname string + Name string +} + +func IsErrRepoAlreadyExist(err error) bool { + _, ok := err.(ErrRepoAlreadyExist) + return ok +} + +func (err ErrRepoAlreadyExist) Error() string { + return fmt.Sprintf("repository already exists [uname: %d, name: %s]", err.Uname, err.Name) +} + // _____ .__.__ __ // / \ |__| | ____ _______/ |_ ____ ____ ____ // / \ / \| | | _/ __ \ / ___/\ __\/ _ \ / \_/ __ \ diff --git a/models/repo.go b/models/repo.go index c61bef2f..8135bc57 100644 --- a/models/repo.go +++ b/models/repo.go @@ -21,6 +21,7 @@ import ( "github.com/Unknwon/cae/zip" "github.com/Unknwon/com" + "github.com/go-xorm/xorm" "github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/bindata" @@ -35,7 +36,6 @@ const ( ) var ( - ErrRepoAlreadyExist = errors.New("Repository already exist") ErrRepoFileNotExist = errors.New("Repository file does not exist") ErrRepoFileNotLoaded = errors.New("Repository file not loaded") ErrMirrorNotExist = errors.New("Mirror does not exist") @@ -222,15 +222,19 @@ func (repo *Repository) DescriptionHtml() template.HTML { return template.HTML(DescPattern.ReplaceAllStringFunc(base.Sanitizer.Sanitize(repo.Description), sanitize)) } -// IsRepositoryExist returns true if the repository with given name under user has already existed. -func IsRepositoryExist(u *User, repoName string) (bool, error) { - has, err := x.Get(&Repository{ +func isRepositoryExist(e Engine, u *User, repoName string) (bool, error) { + has, err := e.Get(&Repository{ OwnerId: u.Id, LowerName: strings.ToLower(repoName), }) return has && com.IsDir(RepoPath(u.Name, repoName)), err } +// IsRepositoryExist returns true if the repository with given name under user has already existed. +func IsRepositoryExist(u *User, repoName string) (bool, error) { + return isRepositoryExist(x, u, repoName) +} + // CloneLink represents different types of clone URLs of repository. type CloneLink struct { SSH string @@ -456,6 +460,7 @@ func initRepository(e Engine, repoPath string, u *User, repo *Repository, initRe // Clone to temprory path and do the init commit. tmpDir := filepath.Join(os.TempDir(), com.ToStr(time.Now().Nanosecond())) os.MkdirAll(tmpDir, os.ModePerm) + defer os.RemoveAll(tmpDir) _, stderr, err = process.Exec( fmt.Sprintf("initRepository(git clone): %s", repoPath), @@ -524,19 +529,50 @@ func initRepository(e Engine, repoPath string, u *User, repo *Repository, initRe return initRepoCommit(tmpDir, u.NewGitSig()) } -// CreateRepository creates a repository for given user or organization. -func CreateRepository(u *User, name, desc, lang, license string, isPrivate, isMirror, initReadme bool) (_ *Repository, err error) { - if err = IsUsableName(name); err != nil { - return nil, err +func createRepository(e *xorm.Session, u *User, repo *Repository) (err error) { + if err = IsUsableName(repo.Name); err != nil { + return err } - has, err := IsRepositoryExist(u, name) + has, err := isRepositoryExist(e, u, repo.Name) if err != nil { - return nil, fmt.Errorf("IsRepositoryExist: %v", err) + return fmt.Errorf("IsRepositoryExist: %v", err) } else if has { - return nil, ErrRepoAlreadyExist + return ErrRepoAlreadyExist{u.Name, repo.Name} + } + + if _, err = e.Insert(repo); err != nil { + return err + } else if _, err = e.Exec("UPDATE `user` SET num_repos=num_repos+1 WHERE id=?", u.Id); err != nil { + return err } + // Give access to all members in owner team. + if u.IsOrganization() { + t, err := u.getOwnerTeam(e) + if err != nil { + return fmt.Errorf("getOwnerTeam: %v", err) + } else if err = t.addRepository(e, repo); err != nil { + return fmt.Errorf("addRepository: %v", err) + } + } else { + // Organization automatically called this in addRepository method. + if err = repo.recalculateAccesses(e); err != nil { + return fmt.Errorf("recalculateAccesses: %v", err) + } + } + + if err = watchRepo(e, u.Id, repo.Id, true); err != nil { + return fmt.Errorf("watchRepo: %v", err) + } else if err = newRepoAction(e, u, repo); err != nil { + return fmt.Errorf("newRepoAction: %v", err) + } + + return nil +} + +// CreateRepository creates a repository for given user or organization. +func CreateRepository(u *User, name, desc, lang, license string, isPrivate, isMirror, initReadme bool) (_ *Repository, err error) { repo := &Repository{ OwnerId: u.Id, Owner: u, @@ -552,35 +588,10 @@ func CreateRepository(u *User, name, desc, lang, license string, isPrivate, isMi return nil, err } - if _, err = sess.Insert(repo); err != nil { - return nil, err - } else if _, err = sess.Exec("UPDATE `user` SET num_repos = num_repos + 1 WHERE id = ?", u.Id); err != nil { + if err = createRepository(sess, u, repo); err != nil { return nil, err } - // TODO fix code for mirrors? - - // Give access to all members in owner team. - if u.IsOrganization() { - t, err := u.getOwnerTeam(sess) - if err != nil { - return nil, fmt.Errorf("getOwnerTeam: %v", err) - } else if err = t.addRepository(sess, repo); err != nil { - return nil, fmt.Errorf("addRepository: %v", err) - } - } else { - // Organization called this in addRepository method. - if err = repo.recalculateAccesses(sess); err != nil { - return nil, fmt.Errorf("recalculateAccesses: %v", err) - } - } - - if err = watchRepo(sess, u.Id, repo.Id, true); err != nil { - return nil, fmt.Errorf("watchRepo: %v", err) - } else if err = newRepoAction(sess, u, repo); err != nil { - return nil, fmt.Errorf("newRepoAction: %v", err) - } - // No need for init mirror. if !isMirror { repoPath := RepoPath(u.Name, repo.Name) @@ -648,7 +659,7 @@ func TransferOwnership(u *User, newOwnerName string, repo *Repository) error { if err != nil { return fmt.Errorf("IsRepositoryExist: %v", err) } else if has { - return ErrRepoAlreadyExist + return ErrRepoAlreadyExist{newOwnerName, repo.Name} } sess := x.NewSession() @@ -766,7 +777,7 @@ func ChangeRepositoryName(u *User, oldRepoName, newRepoName string) (err error) if err != nil { return fmt.Errorf("IsRepositoryExist: %v", err) } else if has { - return ErrRepoAlreadyExist + return ErrRepoAlreadyExist{u.Name, newRepoName} } // Change repository directory name. @@ -1410,22 +1421,14 @@ func IsStaring(uid, repoId int64) bool { // \___ / \____/|__| |__|_ \ // \/ \/ -func ForkRepository(u *User, oldRepo *Repository, name, desc string) (_ *Repository, err error) { - has, err := IsRepositoryExist(u, name) - if err != nil { - return nil, fmt.Errorf("IsRepositoryExist: %v", err) - } else if has { - return nil, ErrRepoAlreadyExist - } - - // In case the old repository is a fork. - if oldRepo.IsFork { - oldRepo, err = GetRepositoryById(oldRepo.ForkId) - if err != nil { - return nil, err - } - } +// HasForkedRepo checks if given user has already forked a repository with given ID. +func HasForkedRepo(ownerID, repoID int64) (*Repository, bool) { + repo := new(Repository) + has, _ := x.Where("owner_id=? AND fork_id=?", ownerID, repoID).Get(repo) + return repo, has +} +func ForkRepository(u *User, oldRepo *Repository, name, desc string) (_ *Repository, err error) { repo := &Repository{ OwnerId: u.Id, Owner: u, @@ -1443,34 +1446,10 @@ func ForkRepository(u *User, oldRepo *Repository, name, desc string) (_ *Reposit return nil, err } - if _, err = sess.Insert(repo); err != nil { + if err = createRepository(sess, u, repo); err != nil { return nil, err } - if err = repo.recalculateAccesses(sess); err != nil { - return nil, err - } else if _, err = sess.Exec("UPDATE `user` SET num_repos = num_repos + 1 WHERE id = ?", u.Id); err != nil { - return nil, err - } - - if u.IsOrganization() { - // Update owner team info and count. - t, err := u.getOwnerTeam(sess) - if err != nil { - return nil, fmt.Errorf("getOwnerTeam: %v", err) - } else if err = t.addRepository(sess, repo); err != nil { - return nil, fmt.Errorf("addRepository: %v", err) - } - } else { - if err = watchRepo(sess, u.Id, repo.Id, true); err != nil { - return nil, fmt.Errorf("watchRepo: %v", err) - } - } - - if err = newRepoAction(sess, u, repo); err != nil { - return nil, fmt.Errorf("newRepoAction: %v", err) - } - if _, err = sess.Exec("UPDATE `repository` SET num_forks=num_forks+1 WHERE id=?", oldRepo.Id); err != nil { return nil, err } |