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