@@ -33,6 +33,60 @@ func saveAsPackageBlob(hsr packages_module.HashedSizeReader, pi *packages_servic
33
33
34
34
contentStore := packages_module .NewContentStore ()
35
35
36
+ uploadVersion , err := getOrCreateUploadVersion (pi )
37
+ if err != nil {
38
+ return nil , err
39
+ }
40
+
41
+ err = db .WithTx (db .DefaultContext , func (ctx context.Context ) error {
42
+ pb , exists , err = packages_model .GetOrInsertBlob (ctx , pb )
43
+ if err != nil {
44
+ log .Error ("Error inserting package blob: %v" , err )
45
+ return err
46
+ }
47
+ // FIXME: Workaround to be removed in v1.20
48
+ // https://github.com/go-gitea/gitea/issues/19586
49
+ if exists {
50
+ err = contentStore .Has (packages_module .BlobHash256Key (pb .HashSHA256 ))
51
+ if err != nil && (errors .Is (err , util .ErrNotExist ) || errors .Is (err , os .ErrNotExist )) {
52
+ log .Debug ("Package registry inconsistent: blob %s does not exist on file system" , pb .HashSHA256 )
53
+ exists = false
54
+ }
55
+ }
56
+ if ! exists {
57
+ if err := contentStore .Save (packages_module .BlobHash256Key (pb .HashSHA256 ), hsr , hsr .Size ()); err != nil {
58
+ log .Error ("Error saving package blob in content store: %v" , err )
59
+ return err
60
+ }
61
+ }
62
+
63
+ return createFileForBlob (ctx , uploadVersion , pb )
64
+ })
65
+ if err != nil {
66
+ if ! exists {
67
+ if err := contentStore .Delete (packages_module .BlobHash256Key (pb .HashSHA256 )); err != nil {
68
+ log .Error ("Error deleting package blob from content store: %v" , err )
69
+ }
70
+ }
71
+ return nil , err
72
+ }
73
+
74
+ return pb , nil
75
+ }
76
+
77
+ // mountBlob mounts the specific blob to a different package
78
+ func mountBlob (pi * packages_service.PackageInfo , pb * packages_model.PackageBlob ) error {
79
+ uploadVersion , err := getOrCreateUploadVersion (pi )
80
+ if err != nil {
81
+ return err
82
+ }
83
+
84
+ return db .WithTx (db .DefaultContext , func (ctx context.Context ) error {
85
+ return createFileForBlob (ctx , uploadVersion , pb )
86
+ })
87
+ }
88
+
89
+ func getOrCreateUploadVersion (pi * packages_service.PackageInfo ) (* packages_model.PackageVersion , error ) {
36
90
var uploadVersion * packages_model.PackageVersion
37
91
38
92
// FIXME: Replace usage of mutex with database transaction
@@ -83,66 +137,35 @@ func saveAsPackageBlob(hsr packages_module.HashedSizeReader, pi *packages_servic
83
137
return nil
84
138
})
85
139
uploadVersionMutex .Unlock ()
86
- if err != nil {
87
- return nil , err
88
- }
89
-
90
- err = db .WithTx (db .DefaultContext , func (ctx context.Context ) error {
91
- pb , exists , err = packages_model .GetOrInsertBlob (ctx , pb )
92
- if err != nil {
93
- log .Error ("Error inserting package blob: %v" , err )
94
- return err
95
- }
96
- // FIXME: Workaround to be removed in v1.20
97
- // https://github.com/go-gitea/gitea/issues/19586
98
- if exists {
99
- err = contentStore .Has (packages_module .BlobHash256Key (pb .HashSHA256 ))
100
- if err != nil && (errors .Is (err , util .ErrNotExist ) || errors .Is (err , os .ErrNotExist )) {
101
- log .Debug ("Package registry inconsistent: blob %s does not exist on file system" , pb .HashSHA256 )
102
- exists = false
103
- }
104
- }
105
- if ! exists {
106
- if err := contentStore .Save (packages_module .BlobHash256Key (pb .HashSHA256 ), hsr , hsr .Size ()); err != nil {
107
- log .Error ("Error saving package blob in content store: %v" , err )
108
- return err
109
- }
110
- }
111
140
112
- filename := strings .ToLower (fmt .Sprintf ("sha256_%s" , pb .HashSHA256 ))
141
+ return uploadVersion , err
142
+ }
113
143
114
- pf := & packages_model.PackageFile {
115
- VersionID : uploadVersion .ID ,
116
- BlobID : pb .ID ,
117
- Name : filename ,
118
- LowerName : filename ,
119
- CompositeKey : packages_model .EmptyFileKey ,
120
- }
121
- if pf , err = packages_model .TryInsertFile (ctx , pf ); err != nil {
122
- if err == packages_model .ErrDuplicatePackageFile {
123
- return nil
124
- }
125
- log .Error ("Error inserting package file: %v" , err )
126
- return err
127
- }
144
+ func createFileForBlob (ctx context.Context , pv * packages_model.PackageVersion , pb * packages_model.PackageBlob ) error {
145
+ filename := strings .ToLower (fmt .Sprintf ("sha256_%s" , pb .HashSHA256 ))
128
146
129
- if _ , err := packages_model .InsertProperty (ctx , packages_model .PropertyTypeFile , pf .ID , container_module .PropertyDigest , digestFromPackageBlob (pb )); err != nil {
130
- log .Error ("Error setting package file property: %v" , err )
131
- return err
147
+ pf := & packages_model.PackageFile {
148
+ VersionID : pv .ID ,
149
+ BlobID : pb .ID ,
150
+ Name : filename ,
151
+ LowerName : filename ,
152
+ CompositeKey : packages_model .EmptyFileKey ,
153
+ }
154
+ var err error
155
+ if pf , err = packages_model .TryInsertFile (ctx , pf ); err != nil {
156
+ if err == packages_model .ErrDuplicatePackageFile {
157
+ return nil
132
158
}
159
+ log .Error ("Error inserting package file: %v" , err )
160
+ return err
161
+ }
133
162
134
- return nil
135
- })
136
- if err != nil {
137
- if ! exists {
138
- if err := contentStore .Delete (packages_module .BlobHash256Key (pb .HashSHA256 )); err != nil {
139
- log .Error ("Error deleting package blob from content store: %v" , err )
140
- }
141
- }
142
- return nil , err
163
+ if _ , err := packages_model .InsertProperty (ctx , packages_model .PropertyTypeFile , pf .ID , container_module .PropertyDigest , digestFromPackageBlob (pb )); err != nil {
164
+ log .Error ("Error setting package file property: %v" , err )
165
+ return err
143
166
}
144
167
145
- return pb , nil
168
+ return nil
146
169
}
147
170
148
171
func deleteBlob (ownerID int64 , image , digest string ) error {
0 commit comments