|
|
@@ -936,17 +936,24 @@ func (repo *Repository) DescriptionHTML() template.HTML { |
|
|
|
return template.HTML(markup.Sanitize(string(desc))) |
|
|
|
} |
|
|
|
|
|
|
|
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 |
|
|
|
func isRepositoryExist(e Engine, u *User, repoName string, alias string) (bool, error) { |
|
|
|
var cond = builder.NewCond() |
|
|
|
cond = cond.And(builder.Eq{"owner_id": u.ID}) |
|
|
|
if alias != "" { |
|
|
|
subCon := builder.NewCond() |
|
|
|
subCon = subCon.Or(builder.Eq{"alias": alias}, builder.Eq{"lower_name": repoName}) |
|
|
|
cond = cond.And(subCon) |
|
|
|
} else { |
|
|
|
cond = cond.And(builder.Eq{"lower_name": repoName}) |
|
|
|
} |
|
|
|
count, err := e.Where(cond).Count(&Repository{}) |
|
|
|
//todo 确定从 && 改成 || 是否有问题 |
|
|
|
return count > 0 || 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) |
|
|
|
func IsRepositoryExist(u *User, repoName string, alias string) (bool, error) { |
|
|
|
return isRepositoryExist(x, u, repoName, alias) |
|
|
|
} |
|
|
|
|
|
|
|
// CloneLink represents different types of clone URLs of repository. |
|
|
@@ -990,20 +997,24 @@ func (repo *Repository) CloneLink() (cl *CloneLink) { |
|
|
|
} |
|
|
|
|
|
|
|
// CheckCreateRepository check if could created a repository |
|
|
|
func CheckCreateRepository(doer, u *User, name string) error { |
|
|
|
func CheckCreateRepository(doer, u *User, repoName, alias string) error { |
|
|
|
if !doer.CanCreateRepo() { |
|
|
|
return ErrReachLimitOfRepo{u.MaxRepoCreation} |
|
|
|
} |
|
|
|
|
|
|
|
if err := IsUsableRepoName(name); err != nil { |
|
|
|
if err := IsUsableRepoName(repoName); err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
|
|
|
|
if err := IsUsableRepoAlias(alias); err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
|
|
|
|
has, err := isRepositoryExist(x, u, name) |
|
|
|
has, err := isRepositoryExist(x, u, repoName, alias) |
|
|
|
if err != nil { |
|
|
|
return fmt.Errorf("IsRepositoryExist: %v", err) |
|
|
|
} else if has { |
|
|
|
return ErrRepoAlreadyExist{u.Name, name} |
|
|
|
return ErrRepoAlreadyExist{u.Name, repoName} |
|
|
|
} |
|
|
|
return nil |
|
|
|
} |
|
|
@@ -1052,8 +1063,10 @@ func GetRepoInitFile(tp, name string) ([]byte, error) { |
|
|
|
} |
|
|
|
|
|
|
|
var ( |
|
|
|
reservedRepoNames = []string{".", ".."} |
|
|
|
reservedRepoPatterns = []string{"*.git", "*.wiki"} |
|
|
|
reservedRepoNames = []string{".", ".."} |
|
|
|
reservedRepoPatterns = []string{"*.git", "*.wiki"} |
|
|
|
reservedRepoAliasNames = []string{} |
|
|
|
reservedRepoAliasPatterns = []string{} |
|
|
|
) |
|
|
|
|
|
|
|
// IsUsableRepoName returns true when repository is usable |
|
|
@@ -1061,13 +1074,21 @@ func IsUsableRepoName(name string) error { |
|
|
|
return isUsableName(reservedRepoNames, reservedRepoPatterns, name) |
|
|
|
} |
|
|
|
|
|
|
|
// IsUsableRepoAlias returns true when repository alias is usable |
|
|
|
func IsUsableRepoAlias(name string) error { |
|
|
|
return isUsableName(reservedRepoAliasNames, reservedRepoAliasPatterns, name) |
|
|
|
} |
|
|
|
|
|
|
|
// CreateRepository creates a repository for the user/organization. |
|
|
|
func CreateRepository(ctx DBContext, doer, u *User, repo *Repository) (err error) { |
|
|
|
if err = IsUsableRepoName(repo.Name); err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
|
|
|
|
has, err := isRepositoryExist(ctx.e, u, repo.Name) |
|
|
|
if err := IsUsableRepoAlias(repo.Alias); err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
has, err := isRepositoryExist(ctx.e, u, repo.Name, repo.Alias) |
|
|
|
if err != nil { |
|
|
|
return fmt.Errorf("IsRepositoryExist: %v", err) |
|
|
|
} else if has { |
|
|
@@ -1249,7 +1270,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error |
|
|
|
} |
|
|
|
|
|
|
|
// Check if new owner has repository with same name. |
|
|
|
has, err := IsRepositoryExist(newOwner, repo.Name) |
|
|
|
has, err := IsRepositoryExist(newOwner, repo.Name, repo.Alias) |
|
|
|
if err != nil { |
|
|
|
return fmt.Errorf("IsRepositoryExist: %v", err) |
|
|
|
} else if has { |
|
|
@@ -1382,7 +1403,7 @@ func ChangeRepositoryName(doer *User, repo *Repository, newRepoName string) (err |
|
|
|
return err |
|
|
|
} |
|
|
|
|
|
|
|
has, err := IsRepositoryExist(repo.Owner, newRepoName) |
|
|
|
has, err := IsRepositoryExist(repo.Owner, newRepoName, "") |
|
|
|
if err != nil { |
|
|
|
return fmt.Errorf("IsRepositoryExist: %v", err) |
|
|
|
} else if has { |
|
|
@@ -2538,6 +2559,9 @@ func UpdateRepositoryCommitNum(repo *Repository) error { |
|
|
|
} |
|
|
|
|
|
|
|
func GenerateDefaultRepoName(ownerName string) string { |
|
|
|
if len(ownerName) > 5 { |
|
|
|
ownerName = ownerName[:5] |
|
|
|
} |
|
|
|
now := time.Now().Format("20060102150405") |
|
|
|
return ownerName + now + fmt.Sprint(rand.Intn(10)) |
|
|
|
} |