Browse Source

add alias uniqueness check on repository check

tags/v1.22.1.3
chenyifan01 3 years ago
parent
commit
177533c1eb
2 changed files with 51 additions and 1 deletions
  1. +27
    -0
      models/repo.go
  2. +24
    -1
      routers/repo/setting.go

+ 27
- 0
models/repo.go View File

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


+ 24
- 1
routers/repo/setting.go View File

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


Loading…
Cancel
Save