@@ -33,6 +33,60 @@ func saveAsPackageBlob(hsr packages_module.HashedSizeReader, pi *packages_servic
3333
3434 contentStore := packages_module .NewContentStore ()
3535
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 ) {
3690 var uploadVersion * packages_model.PackageVersion
3791
3892 // FIXME: Replace usage of mutex with database transaction
@@ -83,66 +137,35 @@ func saveAsPackageBlob(hsr packages_module.HashedSizeReader, pi *packages_servic
83137 return nil
84138 })
85139 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- }
111140
112- filename := strings .ToLower (fmt .Sprintf ("sha256_%s" , pb .HashSHA256 ))
141+ return uploadVersion , err
142+ }
113143
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 ))
128146
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
132158 }
159+ log .Error ("Error inserting package file: %v" , err )
160+ return err
161+ }
133162
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
143166 }
144167
145- return pb , nil
168+ return nil
146169}
147170
148171func deleteBlob (ownerID int64 , image , digest string ) error {
0 commit comments