@@ -742,6 +742,28 @@ func (repo *Repository) CanUserFork(user *User) (bool, error) {
742742 return false , nil
743743}
744744
745+ // CanUserDelete returns true if user could delete the repository
746+ func (repo * Repository ) CanUserDelete (user * User ) (bool , error ) {
747+ if user .IsAdmin || user .ID == repo .OwnerID {
748+ return true , nil
749+ }
750+
751+ if err := repo .GetOwner (); err != nil {
752+ return false , err
753+ }
754+
755+ if repo .Owner .IsOrganization () {
756+ isOwner , err := repo .Owner .IsOwnedBy (user .ID )
757+ if err != nil {
758+ return false , err
759+ } else if isOwner {
760+ return true , nil
761+ }
762+ }
763+
764+ return false , nil
765+ }
766+
745767// CanEnablePulls returns true if repository meets the requirements of accepting pulls.
746768func (repo * Repository ) CanEnablePulls () bool {
747769 return ! repo .IsMirror && ! repo .IsEmpty
@@ -1430,15 +1452,9 @@ func createRepository(e *xorm.Session, doer, u *User, repo *Repository) (err err
14301452 t , err := u .getOwnerTeam (e )
14311453 if err != nil {
14321454 return fmt .Errorf ("getOwnerTeam: %v" , err )
1433- } else if err = t .addRepository (e , repo ); err != nil {
1455+ }
1456+ if err = t .addRepository (e , repo ); err != nil {
14341457 return fmt .Errorf ("addRepository: %v" , err )
1435- } else if err = prepareWebhooks (e , repo , HookEventRepository , & api.RepositoryPayload {
1436- Action : api .HookRepoCreated ,
1437- Repository : repo .innerAPIFormat (e , AccessModeOwner , false ),
1438- Organization : u .APIFormat (),
1439- Sender : doer .APIFormat (),
1440- }); err != nil {
1441- return fmt .Errorf ("prepareWebhooks: %v" , err )
14421458 }
14431459 } else if err = repo .recalculateAccesses (e ); err != nil {
14441460 // Organization automatically called this in addRepository method.
@@ -1522,11 +1538,6 @@ func CreateRepository(doer, u *User, opts CreateRepoOptions) (_ *Repository, err
15221538 return nil , err
15231539 }
15241540
1525- // Add to hook queue for created repo after session commit.
1526- if u .IsOrganization () {
1527- go HookQueue .Add (repo .ID )
1528- }
1529-
15301541 return repo , err
15311542}
15321543
@@ -2044,18 +2055,6 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
20442055 return fmt .Errorf ("Commit: %v" , err )
20452056 }
20462057
2047- if org .IsOrganization () {
2048- if err = PrepareWebhooks (repo , HookEventRepository , & api.RepositoryPayload {
2049- Action : api .HookRepoDeleted ,
2050- Repository : repo .APIFormat (AccessModeOwner ),
2051- Organization : org .APIFormat (),
2052- Sender : doer .APIFormat (),
2053- }); err != nil {
2054- return err
2055- }
2056- go HookQueue .Add (repo .ID )
2057- }
2058-
20592058 if len (repo .Avatar ) > 0 {
20602059 avatarPath := repo .CustomAvatarPath ()
20612060 if com .IsExist (avatarPath ) {
@@ -2065,7 +2064,6 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
20652064 }
20662065 }
20672066
2068- DeleteRepoFromIndexer (repo )
20692067 return nil
20702068}
20712069
@@ -2521,22 +2519,22 @@ func HasForkedRepo(ownerID, repoID int64) (*Repository, bool) {
25212519}
25222520
25232521// ForkRepository forks a repository
2524- func ForkRepository (doer , u * User , oldRepo * Repository , name , desc string ) (_ * Repository , err error ) {
2525- forkedRepo , err := oldRepo .GetUserFork (u .ID )
2522+ func ForkRepository (doer , owner * User , oldRepo * Repository , name , desc string ) (_ * Repository , err error ) {
2523+ forkedRepo , err := oldRepo .GetUserFork (owner .ID )
25262524 if err != nil {
25272525 return nil , err
25282526 }
25292527 if forkedRepo != nil {
25302528 return nil , ErrForkAlreadyExist {
2531- Uname : u .Name ,
2529+ Uname : owner .Name ,
25322530 RepoName : oldRepo .FullName (),
25332531 ForkName : forkedRepo .FullName (),
25342532 }
25352533 }
25362534
25372535 repo := & Repository {
2538- OwnerID : u .ID ,
2539- Owner : u ,
2536+ OwnerID : owner .ID ,
2537+ Owner : owner ,
25402538 Name : name ,
25412539 LowerName : strings .ToLower (name ),
25422540 Description : desc ,
@@ -2553,17 +2551,17 @@ func ForkRepository(doer, u *User, oldRepo *Repository, name, desc string) (_ *R
25532551 return nil , err
25542552 }
25552553
2556- if err = createRepository (sess , doer , u , repo ); err != nil {
2554+ if err = createRepository (sess , doer , owner , repo ); err != nil {
25572555 return nil , err
25582556 }
25592557
25602558 if _ , err = sess .Exec ("UPDATE `repository` SET num_forks=num_forks+1 WHERE id=?" , oldRepo .ID ); err != nil {
25612559 return nil , err
25622560 }
25632561
2564- repoPath := RepoPath (u .Name , repo .Name )
2562+ repoPath := RepoPath (owner .Name , repo .Name )
25652563 _ , stderr , err := process .GetManager ().ExecTimeout (10 * time .Minute ,
2566- fmt .Sprintf ("ForkRepository(git clone): %s/%s" , u .Name , repo .Name ),
2564+ fmt .Sprintf ("ForkRepository(git clone): %s/%s" , owner .Name , repo .Name ),
25672565 git .GitExecutable , "clone" , "--bare" , oldRepo .repoPath (sess ), repoPath )
25682566 if err != nil {
25692567 return nil , fmt .Errorf ("git clone: %v" , stderr )
@@ -2586,24 +2584,6 @@ func ForkRepository(doer, u *User, oldRepo *Repository, name, desc string) (_ *R
25862584 return nil , err
25872585 }
25882586
2589- oldMode , _ := AccessLevel (doer , oldRepo )
2590- mode , _ := AccessLevel (doer , repo )
2591-
2592- if err = PrepareWebhooks (oldRepo , HookEventFork , & api.ForkPayload {
2593- Forkee : oldRepo .APIFormat (oldMode ),
2594- Repo : repo .APIFormat (mode ),
2595- Sender : doer .APIFormat (),
2596- }); err != nil {
2597- log .Error ("PrepareWebhooks [repo_id: %d]: %v" , oldRepo .ID , err )
2598- } else {
2599- go HookQueue .Add (oldRepo .ID )
2600- }
2601-
2602- // Add to hook queue for created repo after session commit.
2603- if u .IsOrganization () {
2604- go HookQueue .Add (repo .ID )
2605- }
2606-
26072587 if err = repo .UpdateSize (); err != nil {
26082588 log .Error ("Failed to update size for repository: %v" , err )
26092589 }
@@ -2612,20 +2592,19 @@ func ForkRepository(doer, u *User, oldRepo *Repository, name, desc string) (_ *R
26122592 sess2 := x .NewSession ()
26132593 defer sess2 .Close ()
26142594 if err = sess2 .Begin (); err != nil {
2615- return nil , err
2595+ return repo , err
26162596 }
26172597
26182598 var lfsObjects []* LFSMetaObject
2619-
26202599 if err = sess2 .Where ("repository_id=?" , oldRepo .ID ).Find (& lfsObjects ); err != nil {
2621- return nil , err
2600+ return repo , err
26222601 }
26232602
26242603 for _ , v := range lfsObjects {
26252604 v .ID = 0
26262605 v .RepositoryID = repo .ID
26272606 if _ , err = sess2 .Insert (v ); err != nil {
2628- return nil , err
2607+ return repo , err
26292608 }
26302609 }
26312610
0 commit comments