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