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"
2022-05-08 19:46:32 +03:00
"code.gitea.io/gitea/models/db"
2022-06-13 12:37:59 +03:00
issues_model "code.gitea.io/gitea/models/issues"
2022-03-29 09:29:02 +03:00
"code.gitea.io/gitea/models/organization"
2022-03-30 11:42:47 +03:00
packages_model "code.gitea.io/gitea/models/packages"
2021-12-10 04:27:50 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2022-10-17 02:29:26 +03:00
system_model "code.gitea.io/gitea/models/system"
2022-06-06 11:01:49 +03:00
"code.gitea.io/gitea/models/unit"
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"
2022-05-08 19:46:32 +03:00
"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.
2022-08-25 05:31:57 +03:00
func CreateRepository ( doer , owner * user_model . User , opts repo_module . 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
2022-03-30 11:42:47 +03:00
if err := models . DeleteRepository ( doer , repo . OwnerID , repo . ID ) ; err != nil {
return err
}
return packages_model . UnlinkRepositoryFromAllPackages ( ctx , repo . ID )
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 ( ) {
2022-03-29 09:29:02 +03:00
if ok , err := organization . 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" )
}
}
2022-08-25 05:31:57 +03:00
repo , err := CreateRepository ( authUser , owner , repo_module . CreateRepoOptions {
2019-12-15 05:49:52 +03:00
Name : repoName ,
2022-05-08 19:46:32 +03:00
IsPrivate : setting . 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
2022-05-08 19:46:32 +03:00
// Init start repository service
func Init ( ) error {
2022-03-29 10:23:45 +03:00
repo_module . LoadRepoConfig ( )
2022-10-17 02:29:26 +03:00
system_model . RemoveAllWithNotice ( db . DefaultContext , "Clean up temporary repository uploads" , setting . Repository . Upload . TempPath )
system_model . RemoveAllWithNotice ( db . DefaultContext , "Clean up temporary repositories" , repo_module . LocalCopyPath ( ) )
2020-09-11 17:14:48 +03:00
return initPushQueue ( )
}
2022-06-06 11:01:49 +03:00
// UpdateRepository updates a repository
func UpdateRepository ( repo * repo_model . Repository , visibilityChanged bool ) ( err error ) {
ctx , committer , err := db . TxContext ( )
if err != nil {
return err
}
defer committer . Close ( )
if err = repo_module . UpdateRepository ( ctx , repo , visibilityChanged ) ; err != nil {
return fmt . Errorf ( "updateRepository: %v" , err )
}
return committer . Commit ( )
}
// LinkedRepository returns the linked repo if any
func LinkedRepository ( a * repo_model . Attachment ) ( * repo_model . Repository , unit . Type , error ) {
if a . IssueID != 0 {
2022-06-13 12:37:59 +03:00
iss , err := issues_model . GetIssueByID ( db . DefaultContext , a . IssueID )
2022-06-06 11:01:49 +03:00
if err != nil {
return nil , unit . TypeIssues , err
}
repo , err := repo_model . GetRepositoryByID ( iss . RepoID )
unitType := unit . TypeIssues
if iss . IsPull {
unitType = unit . TypePullRequests
}
return repo , unitType , err
} else if a . ReleaseID != 0 {
2022-08-25 05:31:57 +03:00
rel , err := repo_model . GetReleaseByID ( db . DefaultContext , a . ReleaseID )
2022-06-06 11:01:49 +03:00
if err != nil {
return nil , unit . TypeReleases , err
}
repo , err := repo_model . GetRepositoryByID ( rel . RepoID )
return repo , unit . TypeReleases , err
}
return nil , - 1 , nil
}