aboutsummaryrefslogtreecommitdiff
path: root/models/repo.go
diff options
context:
space:
mode:
Diffstat (limited to 'models/repo.go')
-rw-r--r--models/repo.go114
1 files changed, 71 insertions, 43 deletions
diff --git a/models/repo.go b/models/repo.go
index f0e46c71..9cf90a94 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -454,21 +454,27 @@ func initRepository(f string, user *User, repo *Repository, initReadme bool, rep
return initRepoCommit(tmpDir, user.NewGitSig())
}
-// CreateRepository creates a repository for given user or orgnaziation.
-func CreateRepository(user *User, name, desc, lang, license string, private, mirror, initReadme bool) (*Repository, error) {
+// CreateRepository creates a repository for given user or organization.
+func CreateRepository(u *User, name, desc, lang, license string, private, mirror, initReadme bool) (*Repository, error) {
if !IsLegalName(name) {
return nil, ErrRepoNameIllegal
}
- isExist, err := IsRepositoryExist(user, name)
+ isExist, err := IsRepositoryExist(u, name)
if err != nil {
return nil, err
} else if isExist {
return nil, ErrRepoAlreadyExist
}
+ sess := x.NewSession()
+ defer sess.Close()
+ if err = sess.Begin(); err != nil {
+ return nil, err
+ }
+
repo := &Repository{
- OwnerId: user.Id,
+ OwnerId: u.Id,
Name: name,
LowerName: strings.ToLower(name),
Description: desc,
@@ -479,69 +485,85 @@ func CreateRepository(user *User, name, desc, lang, license string, private, mir
repo.DefaultBranch = "master"
}
- repoPath := RepoPath(user.Name, repo.Name)
-
- sess := x.NewSession()
- defer sess.Close()
- if err = sess.Begin(); err != nil {
- return nil, err
- }
-
if _, err = sess.Insert(repo); err != nil {
- if err2 := os.RemoveAll(repoPath); err2 != nil {
- log.Error("repo.CreateRepository(repo): %v", err)
- return nil, errors.New(fmt.Sprintf(
- "delete repo directory %s/%s failed(1): %v", user.Name, repo.Name, err2))
- }
sess.Rollback()
return nil, err
}
+ var t *Team // Owner team.
+
mode := WRITABLE
if mirror {
mode = READABLE
}
- access := Access{
- UserName: user.LowerName,
- RepoName: strings.ToLower(path.Join(user.Name, repo.Name)),
+ access := &Access{
+ UserName: u.LowerName,
+ RepoName: strings.ToLower(path.Join(u.Name, repo.Name)),
Mode: mode,
}
- if _, err = sess.Insert(&access); err != nil {
- sess.Rollback()
- if err2 := os.RemoveAll(repoPath); err2 != nil {
- log.Error("repo.CreateRepository(access): %v", err)
- return nil, errors.New(fmt.Sprintf(
- "delete repo directory %s/%s failed(2): %v", user.Name, repo.Name, err2))
+ // Give access to all members in owner team.
+ if u.IsOrganization() {
+ t, err = u.GetOwnerTeam()
+ if err != nil {
+ sess.Rollback()
+ return nil, err
+ }
+ us, err := GetTeamMembers(u.Id, t.Id)
+ if err != nil {
+ sess.Rollback()
+ return nil, err
+ }
+ for _, u := range us {
+ access.UserName = u.LowerName
+ if _, err = sess.Insert(access); err != nil {
+ sess.Rollback()
+ return nil, err
+ }
+ }
+ } else {
+ if _, err = sess.Insert(access); err != nil {
+ sess.Rollback()
+ return nil, err
}
- return nil, err
}
rawSql := "UPDATE `user` SET num_repos = num_repos + 1 WHERE id = ?"
- if _, err = sess.Exec(rawSql, user.Id); err != nil {
+ if _, err = sess.Exec(rawSql, u.Id); err != nil {
sess.Rollback()
- if err2 := os.RemoveAll(repoPath); err2 != nil {
- log.Error("repo.CreateRepository(repo count): %v", err)
- return nil, errors.New(fmt.Sprintf(
- "delete repo directory %s/%s failed(3): %v", user.Name, repo.Name, err2))
- }
return nil, err
}
- if err = sess.Commit(); err != nil {
- sess.Rollback()
- if err2 := os.RemoveAll(repoPath); err2 != nil {
- log.Error("repo.CreateRepository(commit): %v", err)
- return nil, errors.New(fmt.Sprintf(
- "delete repo directory %s/%s failed(3): %v", user.Name, repo.Name, err2))
+ // Update owner team info and count.
+ if u.IsOrganization() {
+ t.RepoIds += "$" + base.ToStr(repo.Id) + "|"
+ t.NumRepos++
+ if _, err = sess.Id(t.Id).AllCols().Update(t); err != nil {
+ sess.Rollback()
+ return nil, err
}
+ }
+
+ if err = sess.Commit(); err != nil {
return nil, err
}
- if err = WatchRepo(user.Id, repo.Id, true); err != nil {
- log.Error("repo.CreateRepository(WatchRepo): %v", err)
+ if u.IsOrganization() {
+ ous, err := GetOrgUsersByOrgId(u.Id)
+ if err != nil {
+ log.Error("repo.CreateRepository(GetOrgUsersByOrgId): %v", err)
+ } else {
+ for _, ou := range ous {
+ if err = WatchRepo(ou.Uid, repo.Id, true); err != nil {
+ log.Error("repo.CreateRepository(WatchRepo): %v", err)
+ }
+ }
+ }
+ }
+ if err = WatchRepo(u.Id, repo.Id, true); err != nil {
+ log.Error("repo.CreateRepository(WatchRepo2): %v", err)
}
- if err = NewRepoAction(user, repo); err != nil {
+ if err = NewRepoAction(u, repo); err != nil {
log.Error("repo.CreateRepository(NewRepoAction): %v", err)
}
@@ -550,7 +572,13 @@ func CreateRepository(user *User, name, desc, lang, license string, private, mir
return repo, nil
}
- if err = initRepository(repoPath, user, repo, initReadme, lang, license); err != nil {
+ repoPath := RepoPath(u.Name, repo.Name)
+ if err = initRepository(repoPath, u, repo, initReadme, lang, license); err != nil {
+ if err2 := os.RemoveAll(repoPath); err2 != nil {
+ log.Error("repo.CreateRepository(initRepository): %v", err)
+ return nil, errors.New(fmt.Sprintf(
+ "delete repo directory %s/%s failed(2): %v", u.Name, repo.Name, err2))
+ }
return nil, err
}