@@ -10,6 +10,7 @@ import (
1010 "strings"
1111
1212 "code.gitea.io/gitea/modules/git"
13+ "code.gitea.io/gitea/modules/log"
1314 "code.gitea.io/gitea/modules/setting"
1415
1516 "xorm.io/xorm"
@@ -35,9 +36,10 @@ func fixPublisherIDforTagReleases(x *xorm.Engine) error {
3536 }
3637
3738 type Repository struct {
38- ID int64
39- OwnerID int64
40- Name string
39+ ID int64
40+ OwnerID int64
41+ OwnerName string
42+ Name string
4143 }
4244
4345 type User struct {
@@ -50,27 +52,23 @@ func fixPublisherIDforTagReleases(x *xorm.Engine) error {
5052 sess := x .NewSession ()
5153 defer sess .Close ()
5254
53- if err := sess .Begin (); err != nil {
54- return err
55- }
56-
5755 var (
58- gitRepoCache = make (map [int64 ]* git.Repository )
59- gitRepo * git.Repository
60- repoCache = make (map [int64 ]* Repository )
61- userCache = make (map [int64 ]* User )
62- ok bool
63- err error
56+ repo * Repository
57+ gitRepo * git.Repository
6458 )
6559 defer func () {
66- for i := range gitRepoCache {
67- gitRepoCache [ i ] .Close ()
60+ if gitRepo != nil {
61+ gitRepo .Close ()
6862 }
6963 }()
7064 for start := 0 ; ; start += batchSize {
7165 releases := make ([]* Release , 0 , batchSize )
7266
73- if err := sess .Limit (batchSize , start ).Asc ("id" ).Where ("is_tag=?" , true ).Find (& releases ); err != nil {
67+ if err := sess .Begin (); err != nil {
68+ return err
69+ }
70+
71+ if err := sess .Limit (batchSize , start ).Asc ("repo_id" , "id" ).Where ("is_tag=?" , true ).Find (& releases ); err != nil {
7472 return err
7573 }
7674
@@ -79,39 +77,36 @@ func fixPublisherIDforTagReleases(x *xorm.Engine) error {
7977 }
8078
8179 for _ , release := range releases {
82- gitRepo , ok = gitRepoCache [ release .RepoID ]
83- if ! ok {
84- repo , ok := repoCache [ release . RepoID ]
85- if ! ok {
86- repo = new ( Repository )
87- has , err := sess . ID ( release . RepoID ). Get ( repo )
88- if err != nil {
89- return err
90- } else if ! has {
91- return fmt . Errorf ( "Repository %d is not exist" , release . RepoID )
92- }
93-
94- repoCache [ release . RepoID ] = repo
80+ if repo == nil || repo . ID != release .RepoID {
81+ if gitRepo != nil {
82+ gitRepo . Close ()
83+ gitRepo = nil
84+ }
85+ repo = new ( Repository )
86+ has , err := sess . ID ( release . RepoID ). Get ( repo )
87+ if err != nil {
88+ return err
89+ } else if ! has {
90+ log . Warn ( "Release[%d] is orphaned and refers to non-existing repository %d" , release . ID , release . RepoID )
91+ log . Warn ( "This release should be deleted" )
92+ continue
9593 }
9694
97- user , ok := userCache [repo .OwnerID ]
98- if ! ok {
99- user = new (User )
100- has , err := sess .ID (repo .OwnerID ).Get (user )
101- if err != nil {
95+ if repo .OwnerName == "" {
96+ // v120.go migration may not have been run correctly - we'll just replicate it here
97+ // because this appears to be a common-ish problem.
98+ if _ , err := sess .Exec ("UPDATE repository SET owner_name = (SELECT name FROM `user` WHERE `user`.id = repository.owner_id)" ); err != nil {
10299 return err
103- } else if ! has {
104- return fmt .Errorf ("User %d is not exist" , repo .OwnerID )
105100 }
106101
107- userCache [repo .OwnerID ] = user
102+ if _ , err := sess .ID (release .RepoID ).Get (repo ); err != nil {
103+ return err
104+ }
108105 }
109-
110- gitRepo , err = git .OpenRepository (repoPath (user .Name , repo .Name ))
106+ gitRepo , err = git .OpenRepository (repoPath (repo .OwnerName , repo .Name ))
111107 if err != nil {
112108 return err
113109 }
114- gitRepoCache [release .RepoID ] = gitRepo
115110 }
116111
117112 commit , err := gitRepo .GetTagCommit (release .TagName )
@@ -134,7 +129,11 @@ func fixPublisherIDforTagReleases(x *xorm.Engine) error {
134129 return err
135130 }
136131 }
132+
133+ if err := sess .Commit (); err != nil {
134+ return err
135+ }
137136 }
138137
139- return sess . Commit ()
138+ return nil
140139}
0 commit comments