@@ -34,6 +34,60 @@ func saveAsPackageBlob(hsr packages_module.HashedSizeReader, pi *packages_servic
3434
3535 contentStore := packages_module .NewContentStore ()
3636
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 ) {
3791 var uploadVersion * packages_model.PackageVersion
3892
3993 // FIXME: Replace usage of mutex with database transaction
@@ -84,66 +138,35 @@ func saveAsPackageBlob(hsr packages_module.HashedSizeReader, pi *packages_servic
84138 return nil
85139 })
86140 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- }
112141
113- filename := strings .ToLower (fmt .Sprintf ("sha256_%s" , pb .HashSHA256 ))
142+ return uploadVersion , err
143+ }
114144
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 ))
129147
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
133159 }
160+ log .Error ("Error inserting package file: %v" , err )
161+ return err
162+ }
134163
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
144167 }
145168
146- return pb , nil
169+ return nil
147170}
148171
149172func deleteBlob (ownerID int64 , image , digest string ) error {
0 commit comments