mirror of https://github.com/go-gitea/gitea.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.1 KiB
72 lines
2.1 KiB
// Copyright 2017 The Gitea Authors. All rights reserved. |
|
// Use of this source code is governed by a MIT-style |
|
// license that can be found in the LICENSE file. |
|
|
|
package models |
|
|
|
import ( |
|
"strings" |
|
|
|
"code.gitea.io/gitea/modules/log" |
|
) |
|
|
|
// RepoRedirect represents that a repo name should be redirected to another |
|
type RepoRedirect struct { |
|
ID int64 `xorm:"pk autoincr"` |
|
OwnerID int64 `xorm:"UNIQUE(s)"` |
|
LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"` |
|
RedirectRepoID int64 // repoID to redirect to |
|
} |
|
|
|
// LookupRepoRedirect look up if a repository has a redirect name |
|
func LookupRepoRedirect(ownerID int64, repoName string) (int64, error) { |
|
repoName = strings.ToLower(repoName) |
|
redirect := &RepoRedirect{OwnerID: ownerID, LowerName: repoName} |
|
if has, err := x.Get(redirect); err != nil { |
|
return 0, err |
|
} else if !has { |
|
return 0, ErrRepoRedirectNotExist{OwnerID: ownerID, RepoName: repoName} |
|
} |
|
return redirect.RedirectRepoID, nil |
|
} |
|
|
|
// NewRepoRedirect create a new repo redirect |
|
func NewRepoRedirect(ownerID, repoID int64, oldRepoName, newRepoName string) error { |
|
oldRepoName = strings.ToLower(oldRepoName) |
|
newRepoName = strings.ToLower(newRepoName) |
|
sess := x.NewSession() |
|
defer sess.Close() |
|
|
|
if err := sess.Begin(); err != nil { |
|
return err |
|
} |
|
|
|
if err := deleteRepoRedirect(sess, ownerID, newRepoName); err != nil { |
|
errRollback := sess.Rollback() |
|
if errRollback != nil { |
|
log.Error("NewRepoRedirect sess.Rollback: %v", errRollback) |
|
} |
|
return err |
|
} |
|
|
|
if _, err := sess.Insert(&RepoRedirect{ |
|
OwnerID: ownerID, |
|
LowerName: oldRepoName, |
|
RedirectRepoID: repoID, |
|
}); err != nil { |
|
errRollback := sess.Rollback() |
|
if errRollback != nil { |
|
log.Error("NewRepoRedirect sess.Rollback: %v", errRollback) |
|
} |
|
return err |
|
} |
|
return sess.Commit() |
|
} |
|
|
|
// deleteRepoRedirect delete any redirect from the specified repo name to |
|
// anything else |
|
func deleteRepoRedirect(e Engine, ownerID int64, repoName string) error { |
|
repoName = strings.ToLower(repoName) |
|
_, err := e.Delete(&RepoRedirect{OwnerID: ownerID, LowerName: repoName}) |
|
return err |
|
}
|
|
|