|
|
|
@ -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
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|