diff --git a/models/repo.go b/models/repo.go index 802a16465..3311869c0 100755 --- a/models/repo.go +++ b/models/repo.go @@ -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)) } diff --git a/modules/auth/repo_form.go b/modules/auth/repo_form.go index 6fefc135d..32890a5c1 100755 --- a/modules/auth/repo_form.go +++ b/modules/auth/repo_form.go @@ -63,6 +63,7 @@ type MigrateRepoForm struct { UID int64 `json:"uid" binding:"Required"` // required: true RepoName string `json:"repo_name" binding:"Required;AlphaDashDot;MaxSize(100)"` + Alias string `json:"alias" binding:"Required;AlphaDashDotChinese;MaxSize(100)"` Mirror bool `json:"mirror"` Private bool `json:"private"` Description string `json:"description" binding:"MaxSize(255)"` diff --git a/modules/structs/repo.go b/modules/structs/repo.go index 2928b6123..b824813bb 100755 --- a/modules/structs/repo.go +++ b/modules/structs/repo.go @@ -218,6 +218,7 @@ type MigrateRepoOption struct { UID int `json:"uid" binding:"Required"` // required: true RepoName string `json:"repo_name" binding:"Required"` + Alias string `json:"alias" binding:"Required"` Mirror bool `json:"mirror"` Private bool `json:"private"` Description string `json:"description"` diff --git a/modules/task/task.go b/modules/task/task.go index 72f111ecc..722e39bec 100644 --- a/modules/task/task.go +++ b/modules/task/task.go @@ -84,6 +84,7 @@ func CreateMigrateTask(doer, u *models.User, opts base.MigrateOptions) (*models. repo, err := repo_module.CreateRepository(doer, u, models.CreateRepoOptions{ Name: opts.RepoName, + Alias: opts.Alias, Description: opts.Description, OriginalURL: opts.OriginalURL, GitServiceType: opts.GitServiceType, diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 35f0a98bf..98b2a92f0 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -340,6 +340,7 @@ require_error = ` cannot be empty.` alpha_dash_error = ` should contain only alphanumeric, dash ('-') and underscore ('_') characters.` alpha_dash_dot_error = ` should contain only alphanumeric, dash ('-'), underscore ('_') and dot ('.') characters.` git_ref_name_error = ` must be a well-formed Git reference name.` +alpha_dash_dot_chinese_error= ` should contain only alphanumeric, chinese, dash ('-') and underscore ('_') characters.` size_error = ` must be size %s.` min_size_error = ` must contain at least %s characters.` max_size_error = ` must contain at most %s characters.` @@ -856,7 +857,7 @@ modelarts.train_job.description=Description modelarts.train_job.parameter_setting=Parameter setting modelarts.train_job.parameter_setting_info=Parameter Info modelarts.train_job.fast_parameter_setting=fast_parameter_setting -modelarts.train_job.fast_parameter_setting_config=fast_parameter_setting_config +modelarts.train_job.fast_parameter_setting_config=fast_parameter_setting_config modelarts.train_job.fast_parameter_setting_config_link=fast_parameter_setting_config_link modelarts.train_job.frames=frames modelarts.train_job.algorithm_origin=Algorithm Origin @@ -1136,7 +1137,7 @@ issues.filter_label_exclude = `Use alt + click/enter t issues.filter_label_no_select = All labels issues.filter_milestone = Milestone issues.filter_milestone_no_select = All milestones -issues.filter_milestone_no_add = Not add milestones +issues.filter_milestone_no_add = Not add milestones issues.filter_assignee = Assignee issues.filter_assginee_no_select = All assignees issues.filter_type = Type diff --git a/routers/repo/repo.go b/routers/repo/repo.go index e20bc7fb3..a509cb52e 100644 --- a/routers/repo/repo.go +++ b/routers/repo/repo.go @@ -362,6 +362,7 @@ func MigratePost(ctx *context.Context, form auth.MigrateRepoForm) { GitServiceType: gitServiceType, CloneAddr: remoteAddr, RepoName: form.RepoName, + Alias: form.Alias, Description: form.Description, Private: form.Private || setting.Repository.ForcePrivate, Mirror: form.Mirror, @@ -384,7 +385,7 @@ func MigratePost(ctx *context.Context, form auth.MigrateRepoForm) { opts.Releases = false } - err = models.CheckCreateRepository(ctx.User, ctxUser, opts.RepoName) + err = models.CheckCreateRepository(ctx.User, ctxUser, opts.RepoName, opts.Alias) if err != nil { handleMigrateError(ctx, ctxUser, err, "MigratePost", tplMigrate, &form) return