diff --git a/models/repo.go b/models/repo.go index 8ba48f7a3..f32b42ef7 100755 --- a/models/repo.go +++ b/models/repo.go @@ -956,6 +956,33 @@ func IsRepositoryExist(u *User, repoName string, alias string) (bool, error) { return isRepositoryExist(x, u, repoName, alias) } +// IsRepositoryAliasExist returns true if the repository with given alias under user has already existed. +func IsRepositoryAliasExist(u *User, alias string) (bool, error) { + return isRepositoryAliasExist(x, u, alias) +} + +func isRepositoryAliasExist(e Engine, u *User, alias string) (bool, error) { + var cond = builder.NewCond() + cond = cond.And(builder.Eq{"owner_id": u.ID}) + cond = cond.And(builder.Eq{"alias": alias}) + count, err := e.Where(cond).Count(&Repository{}) + return count > 0, err +} + +func IsRepositoryAliasAvailable(doer *User, alias string) error { + if err := IsUsableRepoAlias(alias); err != nil { + return err + } + + has, err := IsRepositoryAliasExist(doer, alias) + if err != nil { + return fmt.Errorf("IsRepositoryExist: %v", err) + } else if has { + return ErrRepoAlreadyExist{doer.Name, alias} + } + return nil +} + // CloneLink represents different types of clone URLs of repository. type CloneLink struct { SSH string diff --git a/routers/repo/setting.go b/routers/repo/setting.go index 055627fc1..f9461be0d 100644 --- a/routers/repo/setting.go +++ b/routers/repo/setting.go @@ -67,6 +67,28 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) { return } + newAlias := form.Alias + // Check if repository alias has been changed. + if repo.Alias != newAlias { + //check new alias is available or not + if err := models.IsRepositoryAliasAvailable(ctx.Repo.Owner, newAlias); err != nil { + ctx.Data["Err_Alias"] = true + switch { + case models.IsErrRepoAlreadyExist(err): + ctx.RenderWithErr(ctx.Tr("form.repo_name_been_taken"), tplSettingsOptions, &form) + case models.IsErrNameReserved(err): + ctx.RenderWithErr(ctx.Tr("repo.form.name_reserved", err.(models.ErrNameReserved).Name), tplSettingsOptions, &form) + case models.IsErrNamePatternNotAllowed(err): + ctx.RenderWithErr(ctx.Tr("repo.form.name_pattern_not_allowed", err.(models.ErrNamePatternNotAllowed).Pattern), tplSettingsOptions, &form) + default: + ctx.ServerError("ChangeRepositoryName", err) + } + return + } + + log.Trace("Repository alias changed: %s/%s -> %s", ctx.Repo.Owner.Name, repo.Alias, newAlias) + } + newRepoName := form.RepoName // Check if repository name has been changed. if repo.LowerName != strings.ToLower(newRepoName) { @@ -92,13 +114,14 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) { log.Trace("Repository name changed: %s/%s -> %s", ctx.Repo.Owner.Name, repo.Name, newRepoName) } + // In case it's just a case change. repo.Name = newRepoName repo.LowerName = strings.ToLower(newRepoName) repo.Description = form.Description repo.Website = form.Website repo.IsTemplate = form.Template - repo.Alias = form.Alias + repo.Alias = newAlias // Visibility of forked repository is forced sync with base repository. if repo.IsFork {