@@ -1511,74 +1511,62 @@ func UpdateRepositoryUnits(repo *Repository, units []RepoUnit, deleteUnitTypes [
1511
1511
}
1512
1512
1513
1513
// DeleteRepository deletes a repository for a user or organization.
1514
+ // make sure if you call this func to close open sessions (sqlite will otherwise get a deadlock)
1514
1515
func DeleteRepository (doer * User , uid , repoID int64 ) error {
1515
1516
sess := x .NewSession ()
1516
1517
defer sess .Close ()
1517
1518
if err := sess .Begin (); err != nil {
1518
1519
return err
1519
1520
}
1520
1521
1521
- if err := deleteRepository (sess , doer , uid , repoID ); err != nil {
1522
- return err
1523
- }
1524
-
1525
- return sess .Commit ()
1526
- }
1527
-
1528
- // DeleteRepositoryWithContext deletes a repository for a user or organization.
1529
- func DeleteRepositoryWithContext (ctx DBContext , doer * User , uid , repoID int64 ) error {
1530
- return deleteRepository (ctx .e , doer , uid , repoID )
1531
- }
1532
-
1533
- func deleteRepository (e Engine , doer * User , uid , repoID int64 ) error {
1534
1522
// In case is a organization.
1535
- org , err := getUserByID (e , uid )
1523
+ org , err := getUserByID (sess , uid )
1536
1524
if err != nil {
1537
1525
return err
1538
1526
}
1539
1527
if org .IsOrganization () {
1540
- if err = org .getTeams (e ); err != nil {
1528
+ if err = org .getTeams (sess ); err != nil {
1541
1529
return err
1542
1530
}
1543
1531
}
1544
1532
1545
1533
repo := & Repository {OwnerID : uid }
1546
- has , err := e .ID (repoID ).Get (repo )
1534
+ has , err := sess .ID (repoID ).Get (repo )
1547
1535
if err != nil {
1548
1536
return err
1549
1537
} else if ! has {
1550
1538
return ErrRepoNotExist {repoID , uid , "" , "" }
1551
1539
}
1552
1540
1553
1541
// Delete Deploy Keys
1554
- deployKeys , err := listDeployKeys (e , repo .ID , ListOptions {})
1542
+ deployKeys , err := listDeployKeys (sess , repo .ID , ListOptions {})
1555
1543
if err != nil {
1556
1544
return fmt .Errorf ("listDeployKeys: %v" , err )
1557
1545
}
1558
1546
for _ , dKey := range deployKeys {
1559
- if err := deleteDeployKey (e , doer , dKey .ID ); err != nil {
1547
+ if err := deleteDeployKey (sess , doer , dKey .ID ); err != nil {
1560
1548
return fmt .Errorf ("deleteDeployKeys: %v" , err )
1561
1549
}
1562
1550
}
1563
1551
1564
- if cnt , err := e .ID (repoID ).Delete (& Repository {}); err != nil {
1552
+ if cnt , err := sess .ID (repoID ).Delete (& Repository {}); err != nil {
1565
1553
return err
1566
1554
} else if cnt != 1 {
1567
1555
return ErrRepoNotExist {repoID , uid , "" , "" }
1568
1556
}
1569
1557
1570
1558
if org .IsOrganization () {
1571
1559
for _ , t := range org .Teams {
1572
- if ! t .hasRepository (e , repoID ) {
1560
+ if ! t .hasRepository (sess , repoID ) {
1573
1561
continue
1574
- } else if err = t .removeRepository (e , repo , false ); err != nil {
1562
+ } else if err = t .removeRepository (sess , repo , false ); err != nil {
1575
1563
return err
1576
1564
}
1577
1565
}
1578
1566
}
1579
1567
1580
1568
attachments := make ([]* Attachment , 0 , 20 )
1581
- if err = e .Join ("INNER" , "`release`" , "`release`.id = `attachment`.release_id" ).
1569
+ if err = sess .Join ("INNER" , "`release`" , "`release`.id = `attachment`.release_id" ).
1582
1570
Where ("`release`.repo_id = ?" , repoID ).
1583
1571
Find (& attachments ); err != nil {
1584
1572
return err
@@ -1588,11 +1576,11 @@ func deleteRepository(e Engine, doer *User, uid, repoID int64) error {
1588
1576
releaseAttachments = append (releaseAttachments , attachments [i ].RelativePath ())
1589
1577
}
1590
1578
1591
- if _ , err = e .Exec ("UPDATE `user` SET num_stars=num_stars-1 WHERE id IN (SELECT `uid` FROM `star` WHERE repo_id = ?)" , repo .ID ); err != nil {
1579
+ if _ , err = sess .Exec ("UPDATE `user` SET num_stars=num_stars-1 WHERE id IN (SELECT `uid` FROM `star` WHERE repo_id = ?)" , repo .ID ); err != nil {
1592
1580
return err
1593
1581
}
1594
1582
1595
- if err = deleteBeans (e ,
1583
+ if err = deleteBeans (sess ,
1596
1584
& Access {RepoID : repo .ID },
1597
1585
& Action {RepoID : repo .ID },
1598
1586
& Watch {RepoID : repoID },
@@ -1618,79 +1606,85 @@ func deleteRepository(e Engine, doer *User, uid, repoID int64) error {
1618
1606
1619
1607
// Delete Issues and related objects
1620
1608
var attachmentPaths []string
1621
- if attachmentPaths , err = deleteIssuesByRepoID (e , repoID ); err != nil {
1609
+ if attachmentPaths , err = deleteIssuesByRepoID (sess , repoID ); err != nil {
1622
1610
return err
1623
1611
}
1624
1612
1625
- if _ , err = e .Where ("repo_id = ?" , repoID ).Delete (new (RepoUnit )); err != nil {
1613
+ if _ , err = sess .Where ("repo_id = ?" , repoID ).Delete (new (RepoUnit )); err != nil {
1626
1614
return err
1627
1615
}
1628
1616
1629
1617
if repo .IsFork {
1630
- if _ , err = e .Exec ("UPDATE `repository` SET num_forks=num_forks-1 WHERE id=?" , repo .ForkID ); err != nil {
1618
+ if _ , err = sess .Exec ("UPDATE `repository` SET num_forks=num_forks-1 WHERE id=?" , repo .ForkID ); err != nil {
1631
1619
return fmt .Errorf ("decrease fork count: %v" , err )
1632
1620
}
1633
1621
}
1634
1622
1635
- if _ , err = e .Exec ("UPDATE `user` SET num_repos=num_repos-1 WHERE id=?" , uid ); err != nil {
1623
+ if _ , err = sess .Exec ("UPDATE `user` SET num_repos=num_repos-1 WHERE id=?" , uid ); err != nil {
1636
1624
return err
1637
1625
}
1638
1626
1639
1627
if len (repo .Topics ) > 0 {
1640
- if err = removeTopicsFromRepo (e , repo .ID ); err != nil {
1628
+ if err = removeTopicsFromRepo (sess , repo .ID ); err != nil {
1641
1629
return err
1642
1630
}
1643
1631
}
1644
1632
1645
- projects , _ , err := getProjects (e , ProjectSearchOptions {
1633
+ projects , _ , err := getProjects (sess , ProjectSearchOptions {
1646
1634
RepoID : repoID ,
1647
1635
})
1648
1636
if err != nil {
1649
1637
return fmt .Errorf ("get projects: %v" , err )
1650
1638
}
1651
1639
for i := range projects {
1652
- if err := deleteProjectByID (e , projects [i ].ID ); err != nil {
1640
+ if err := deleteProjectByID (sess , projects [i ].ID ); err != nil {
1653
1641
return fmt .Errorf ("delete project [%d]: %v" , projects [i ].ID , err )
1654
1642
}
1655
1643
}
1656
1644
1657
1645
// FIXME: Remove repository files should be executed after transaction succeed.
1658
1646
repoPath := repo .RepoPath ()
1659
- removeAllWithNotice (e , "Delete repository files" , repoPath )
1647
+ removeAllWithNotice (sess , "Delete repository files" , repoPath )
1660
1648
1661
- err = repo .deleteWiki (e )
1649
+ err = repo .deleteWiki (sess )
1662
1650
if err != nil {
1663
1651
return err
1664
1652
}
1665
1653
1666
1654
// Remove LFS objects
1667
1655
var lfsObjects []* LFSMetaObject
1668
- if err = e .Where ("repository_id=?" , repoID ).Find (& lfsObjects ); err != nil {
1656
+ if err = sess .Where ("repository_id=?" , repoID ).Find (& lfsObjects ); err != nil {
1669
1657
return err
1670
1658
}
1671
1659
1672
1660
for _ , v := range lfsObjects {
1673
- count , err := e .Count (& LFSMetaObject {Oid : v .Oid })
1661
+ count , err := sess .Count (& LFSMetaObject {Oid : v .Oid })
1674
1662
if err != nil {
1675
1663
return err
1676
1664
}
1677
1665
if count > 1 {
1678
1666
continue
1679
1667
}
1680
1668
1681
- removeStorageWithNotice (e , storage .LFS , "Delete orphaned LFS file" , v .RelativePath ())
1669
+ removeStorageWithNotice (sess , storage .LFS , "Delete orphaned LFS file" , v .RelativePath ())
1682
1670
}
1683
1671
1684
- if _ , err := e .Delete (& LFSMetaObject {RepositoryID : repoID }); err != nil {
1672
+ if _ , err := sess .Delete (& LFSMetaObject {RepositoryID : repoID }); err != nil {
1685
1673
return err
1686
1674
}
1687
1675
1688
1676
if repo .NumForks > 0 {
1689
- if _ , err = e .Exec ("UPDATE `repository` SET fork_id=0,is_fork=? WHERE fork_id=?" , false , repo .ID ); err != nil {
1677
+ if _ , err = sess .Exec ("UPDATE `repository` SET fork_id=0,is_fork=? WHERE fork_id=?" , false , repo .ID ); err != nil {
1690
1678
log .Error ("reset 'fork_id' and 'is_fork': %v" , err )
1691
1679
}
1692
1680
}
1693
1681
1682
+ if err = sess .Commit (); err != nil {
1683
+ return err
1684
+ }
1685
+
1686
+ sess .Close ()
1687
+
1694
1688
// We should always delete the files after the database transaction succeed. If
1695
1689
// we delete the file but the database rollback, the repository will be borken.
1696
1690
0 commit comments