2019-10-26 09:54:11 +03:00
// Copyright 2019 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 repository
import (
2022-01-20 02:26:57 +03:00
"context"
2019-12-15 05:49:52 +03:00
"fmt"
2019-10-26 09:54:11 +03:00
"code.gitea.io/gitea/models"
2021-12-10 04:27:50 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2019-10-26 09:54:11 +03:00
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/notification"
2020-01-12 15:11:17 +03:00
repo_module "code.gitea.io/gitea/modules/repository"
2020-09-27 22:20:52 +03:00
cfg "code.gitea.io/gitea/modules/setting"
2020-01-25 05:48:22 +03:00
pull_service "code.gitea.io/gitea/services/pull"
2019-10-26 09:54:11 +03:00
)
// CreateRepository creates a repository for the user/organization.
2021-12-10 04:27:50 +03:00
func CreateRepository ( doer , owner * user_model . User , opts models . CreateRepoOptions ) ( * repo_model . Repository , error ) {
2020-01-12 15:11:17 +03:00
repo , err := repo_module . CreateRepository ( doer , owner , opts )
2019-10-26 09:54:11 +03:00
if err != nil {
2020-09-25 07:09:23 +03:00
// No need to rollback here we should do this in CreateRepository...
2019-10-26 09:54:11 +03:00
return nil , err
}
notification . NotifyCreateRepository ( doer , owner , repo )
return repo , nil
}
// DeleteRepository deletes a repository for a user or organization.
2022-01-20 02:26:57 +03:00
func DeleteRepository ( ctx context . Context , doer * user_model . User , repo * repo_model . Repository , notify bool ) error {
if err := pull_service . CloseRepoBranchesPulls ( ctx , doer , repo ) ; err != nil {
2020-01-25 05:48:22 +03:00
log . Error ( "CloseRepoBranchesPulls failed: %v" , err )
}
2021-12-10 11:14:24 +03:00
if notify {
// If the repo itself has webhooks, we need to trigger them before deleting it...
notification . NotifyDeleteRepository ( doer , repo )
}
2019-10-26 09:54:11 +03:00
2020-10-02 12:37:46 +03:00
err := models . DeleteRepository ( doer , repo . OwnerID , repo . ID )
return err
2019-10-26 09:54:11 +03:00
}
2019-12-15 05:49:52 +03:00
// PushCreateRepo creates a repository when a new repository is pushed to an appropriate namespace
2021-12-10 04:27:50 +03:00
func PushCreateRepo ( authUser , owner * user_model . User , repoName string ) ( * repo_model . Repository , error ) {
2019-12-15 05:49:52 +03:00
if ! authUser . IsAdmin {
if owner . IsOrganization ( ) {
2021-11-19 14:41:40 +03:00
if ok , err := models . CanCreateOrgRepo ( owner . ID , authUser . ID ) ; err != nil {
2019-12-15 05:49:52 +03:00
return nil , err
} else if ! ok {
return nil , fmt . Errorf ( "cannot push-create repository for org" )
}
} else if authUser . ID != owner . ID {
return nil , fmt . Errorf ( "cannot push-create repository for another user" )
}
}
repo , err := CreateRepository ( authUser , owner , models . CreateRepoOptions {
Name : repoName ,
2020-09-27 22:20:52 +03:00
IsPrivate : cfg . Repository . DefaultPushCreatePrivate ,
2019-12-15 05:49:52 +03:00
} )
if err != nil {
return nil , err
}
return repo , nil
}
2020-09-11 17:14:48 +03:00
// NewContext start repository service
func NewContext ( ) error {
return initPushQueue ( )
}