Move some repositories' operations to a standalone service package (#8557)
* Move some repositories' operations to a standalone service package * improve code * remove unused codes * add rollback when fork failed * add repo when return
This commit is contained in:
parent
d2d5910894
commit
9e85358777
10 changed files with 179 additions and 89 deletions
|
@ -742,6 +742,28 @@ func (repo *Repository) CanUserFork(user *User) (bool, error) {
|
|||
return false, nil
|
||||
}
|
||||
|
||||
// CanUserDelete returns true if user could delete the repository
|
||||
func (repo *Repository) CanUserDelete(user *User) (bool, error) {
|
||||
if user.IsAdmin || user.ID == repo.OwnerID {
|
||||
return true, nil
|
||||
}
|
||||
|
||||
if err := repo.GetOwner(); err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
if repo.Owner.IsOrganization() {
|
||||
isOwner, err := repo.Owner.IsOwnedBy(user.ID)
|
||||
if err != nil {
|
||||
return false, err
|
||||
} else if isOwner {
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
|
||||
return false, nil
|
||||
}
|
||||
|
||||
// CanEnablePulls returns true if repository meets the requirements of accepting pulls.
|
||||
func (repo *Repository) CanEnablePulls() bool {
|
||||
return !repo.IsMirror && !repo.IsEmpty
|
||||
|
@ -1430,15 +1452,9 @@ func createRepository(e *xorm.Session, doer, u *User, repo *Repository) (err err
|
|||
t, err := u.getOwnerTeam(e)
|
||||
if err != nil {
|
||||
return fmt.Errorf("getOwnerTeam: %v", err)
|
||||
} else if err = t.addRepository(e, repo); err != nil {
|
||||
}
|
||||
if err = t.addRepository(e, repo); err != nil {
|
||||
return fmt.Errorf("addRepository: %v", err)
|
||||
} else if err = prepareWebhooks(e, repo, HookEventRepository, &api.RepositoryPayload{
|
||||
Action: api.HookRepoCreated,
|
||||
Repository: repo.innerAPIFormat(e, AccessModeOwner, false),
|
||||
Organization: u.APIFormat(),
|
||||
Sender: doer.APIFormat(),
|
||||
}); err != nil {
|
||||
return fmt.Errorf("prepareWebhooks: %v", err)
|
||||
}
|
||||
} else if err = repo.recalculateAccesses(e); err != nil {
|
||||
// Organization automatically called this in addRepository method.
|
||||
|
@ -1522,11 +1538,6 @@ func CreateRepository(doer, u *User, opts CreateRepoOptions) (_ *Repository, err
|
|||
return nil, err
|
||||
}
|
||||
|
||||
// Add to hook queue for created repo after session commit.
|
||||
if u.IsOrganization() {
|
||||
go HookQueue.Add(repo.ID)
|
||||
}
|
||||
|
||||
return repo, err
|
||||
}
|
||||
|
||||
|
@ -2044,18 +2055,6 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
|
|||
return fmt.Errorf("Commit: %v", err)
|
||||
}
|
||||
|
||||
if org.IsOrganization() {
|
||||
if err = PrepareWebhooks(repo, HookEventRepository, &api.RepositoryPayload{
|
||||
Action: api.HookRepoDeleted,
|
||||
Repository: repo.APIFormat(AccessModeOwner),
|
||||
Organization: org.APIFormat(),
|
||||
Sender: doer.APIFormat(),
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
go HookQueue.Add(repo.ID)
|
||||
}
|
||||
|
||||
if len(repo.Avatar) > 0 {
|
||||
avatarPath := repo.CustomAvatarPath()
|
||||
if com.IsExist(avatarPath) {
|
||||
|
@ -2065,7 +2064,6 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
|
|||
}
|
||||
}
|
||||
|
||||
DeleteRepoFromIndexer(repo)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -2521,22 +2519,22 @@ func HasForkedRepo(ownerID, repoID int64) (*Repository, bool) {
|
|||
}
|
||||
|
||||
// ForkRepository forks a repository
|
||||
func ForkRepository(doer, u *User, oldRepo *Repository, name, desc string) (_ *Repository, err error) {
|
||||
forkedRepo, err := oldRepo.GetUserFork(u.ID)
|
||||
func ForkRepository(doer, owner *User, oldRepo *Repository, name, desc string) (_ *Repository, err error) {
|
||||
forkedRepo, err := oldRepo.GetUserFork(owner.ID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if forkedRepo != nil {
|
||||
return nil, ErrForkAlreadyExist{
|
||||
Uname: u.Name,
|
||||
Uname: owner.Name,
|
||||
RepoName: oldRepo.FullName(),
|
||||
ForkName: forkedRepo.FullName(),
|
||||
}
|
||||
}
|
||||
|
||||
repo := &Repository{
|
||||
OwnerID: u.ID,
|
||||
Owner: u,
|
||||
OwnerID: owner.ID,
|
||||
Owner: owner,
|
||||
Name: name,
|
||||
LowerName: strings.ToLower(name),
|
||||
Description: desc,
|
||||
|
@ -2553,7 +2551,7 @@ func ForkRepository(doer, u *User, oldRepo *Repository, name, desc string) (_ *R
|
|||
return nil, err
|
||||
}
|
||||
|
||||
if err = createRepository(sess, doer, u, repo); err != nil {
|
||||
if err = createRepository(sess, doer, owner, repo); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
@ -2561,9 +2559,9 @@ func ForkRepository(doer, u *User, oldRepo *Repository, name, desc string) (_ *R
|
|||
return nil, err
|
||||
}
|
||||
|
||||
repoPath := RepoPath(u.Name, repo.Name)
|
||||
repoPath := RepoPath(owner.Name, repo.Name)
|
||||
_, stderr, err := process.GetManager().ExecTimeout(10*time.Minute,
|
||||
fmt.Sprintf("ForkRepository(git clone): %s/%s", u.Name, repo.Name),
|
||||
fmt.Sprintf("ForkRepository(git clone): %s/%s", owner.Name, repo.Name),
|
||||
git.GitExecutable, "clone", "--bare", oldRepo.repoPath(sess), repoPath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("git clone: %v", stderr)
|
||||
|
@ -2586,24 +2584,6 @@ func ForkRepository(doer, u *User, oldRepo *Repository, name, desc string) (_ *R
|
|||
return nil, err
|
||||
}
|
||||
|
||||
oldMode, _ := AccessLevel(doer, oldRepo)
|
||||
mode, _ := AccessLevel(doer, repo)
|
||||
|
||||
if err = PrepareWebhooks(oldRepo, HookEventFork, &api.ForkPayload{
|
||||
Forkee: oldRepo.APIFormat(oldMode),
|
||||
Repo: repo.APIFormat(mode),
|
||||
Sender: doer.APIFormat(),
|
||||
}); err != nil {
|
||||
log.Error("PrepareWebhooks [repo_id: %d]: %v", oldRepo.ID, err)
|
||||
} else {
|
||||
go HookQueue.Add(oldRepo.ID)
|
||||
}
|
||||
|
||||
// Add to hook queue for created repo after session commit.
|
||||
if u.IsOrganization() {
|
||||
go HookQueue.Add(repo.ID)
|
||||
}
|
||||
|
||||
if err = repo.UpdateSize(); err != nil {
|
||||
log.Error("Failed to update size for repository: %v", err)
|
||||
}
|
||||
|
@ -2612,20 +2592,19 @@ func ForkRepository(doer, u *User, oldRepo *Repository, name, desc string) (_ *R
|
|||
sess2 := x.NewSession()
|
||||
defer sess2.Close()
|
||||
if err = sess2.Begin(); err != nil {
|
||||
return nil, err
|
||||
return repo, err
|
||||
}
|
||||
|
||||
var lfsObjects []*LFSMetaObject
|
||||
|
||||
if err = sess2.Where("repository_id=?", oldRepo.ID).Find(&lfsObjects); err != nil {
|
||||
return nil, err
|
||||
return repo, err
|
||||
}
|
||||
|
||||
for _, v := range lfsObjects {
|
||||
v.ID = 0
|
||||
v.RepositoryID = repo.ID
|
||||
if _, err = sess2.Insert(v); err != nil {
|
||||
return nil, err
|
||||
return repo, err
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue