@@ -10,6 +10,7 @@ import (
10
10
"strings"
11
11
12
12
"code.gitea.io/gitea/modules/git"
13
+ "code.gitea.io/gitea/modules/log"
13
14
"code.gitea.io/gitea/modules/setting"
14
15
15
16
"xorm.io/xorm"
@@ -35,9 +36,10 @@ func fixPublisherIDforTagReleases(x *xorm.Engine) error {
35
36
}
36
37
37
38
type Repository struct {
38
- ID int64
39
- OwnerID int64
40
- Name string
39
+ ID int64
40
+ OwnerID int64
41
+ OwnerName string
42
+ Name string
41
43
}
42
44
43
45
type User struct {
@@ -50,27 +52,23 @@ func fixPublisherIDforTagReleases(x *xorm.Engine) error {
50
52
sess := x .NewSession ()
51
53
defer sess .Close ()
52
54
53
- if err := sess .Begin (); err != nil {
54
- return err
55
- }
56
-
57
55
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
64
58
)
65
59
defer func () {
66
- for i := range gitRepoCache {
67
- gitRepoCache [ i ] .Close ()
60
+ if gitRepo != nil {
61
+ gitRepo .Close ()
68
62
}
69
63
}()
70
64
for start := 0 ; ; start += batchSize {
71
65
releases := make ([]* Release , 0 , batchSize )
72
66
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 {
74
72
return err
75
73
}
76
74
@@ -79,39 +77,36 @@ func fixPublisherIDforTagReleases(x *xorm.Engine) error {
79
77
}
80
78
81
79
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
95
93
}
96
94
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 {
102
99
return err
103
- } else if ! has {
104
- return fmt .Errorf ("User %d is not exist" , repo .OwnerID )
105
100
}
106
101
107
- userCache [repo .OwnerID ] = user
102
+ if _ , err := sess .ID (release .RepoID ).Get (repo ); err != nil {
103
+ return err
104
+ }
108
105
}
109
-
110
- gitRepo , err = git .OpenRepository (repoPath (user .Name , repo .Name ))
106
+ gitRepo , err = git .OpenRepository (repoPath (repo .OwnerName , repo .Name ))
111
107
if err != nil {
112
108
return err
113
109
}
114
- gitRepoCache [release .RepoID ] = gitRepo
115
110
}
116
111
117
112
commit , err := gitRepo .GetTagCommit (release .TagName )
@@ -134,7 +129,11 @@ func fixPublisherIDforTagReleases(x *xorm.Engine) error {
134
129
return err
135
130
}
136
131
}
132
+
133
+ if err := sess .Commit (); err != nil {
134
+ return err
135
+ }
137
136
}
138
137
139
- return sess . Commit ()
138
+ return nil
140
139
}
0 commit comments