@@ -182,5 +182,98 @@ var _ = Describe("Model test", func() {
182182 _ , err = InstallModel (systemState , "../../../foo" , c , map [string ]interface {}{}, func (string , string , string , float64 ) {}, true )
183183 Expect (err ).To (HaveOccurred ())
184184 })
185+
186+ It ("does not delete shared model files when one config is deleted" , func () {
187+ tempdir , err := os .MkdirTemp ("" , "test" )
188+ Expect (err ).ToNot (HaveOccurred ())
189+ defer os .RemoveAll (tempdir )
190+
191+ systemState , err := system .GetSystemState (
192+ system .WithModelPath (tempdir ),
193+ )
194+ Expect (err ).ToNot (HaveOccurred ())
195+
196+ // Create a shared model file
197+ sharedModelFile := filepath .Join (tempdir , "shared_model.bin" )
198+ err = os .WriteFile (sharedModelFile , []byte ("fake model content" ), 0600 )
199+ Expect (err ).ToNot (HaveOccurred ())
200+
201+ // Create first model configuration
202+ config1 := `name: model1
203+ model: shared_model.bin`
204+ err = os .WriteFile (filepath .Join (tempdir , "model1.yaml" ), []byte (config1 ), 0600 )
205+ Expect (err ).ToNot (HaveOccurred ())
206+
207+ // Create first model's gallery file
208+ galleryConfig1 := ModelConfig {
209+ Name : "model1" ,
210+ Files : []File {
211+ {Filename : "shared_model.bin" },
212+ },
213+ }
214+ galleryData1 , err := yaml .Marshal (galleryConfig1 )
215+ Expect (err ).ToNot (HaveOccurred ())
216+ err = os .WriteFile (filepath .Join (tempdir , "._gallery_model1.yaml" ), galleryData1 , 0600 )
217+ Expect (err ).ToNot (HaveOccurred ())
218+
219+ // Create second model configuration sharing the same model file
220+ config2 := `name: model2
221+ model: shared_model.bin`
222+ err = os .WriteFile (filepath .Join (tempdir , "model2.yaml" ), []byte (config2 ), 0600 )
223+ Expect (err ).ToNot (HaveOccurred ())
224+
225+ // Create second model's gallery file
226+ galleryConfig2 := ModelConfig {
227+ Name : "model2" ,
228+ Files : []File {
229+ {Filename : "shared_model.bin" },
230+ },
231+ }
232+ galleryData2 , err := yaml .Marshal (galleryConfig2 )
233+ Expect (err ).ToNot (HaveOccurred ())
234+ err = os .WriteFile (filepath .Join (tempdir , "._gallery_model2.yaml" ), galleryData2 , 0600 )
235+ Expect (err ).ToNot (HaveOccurred ())
236+
237+ // Verify both configurations exist
238+ _ , err = os .Stat (filepath .Join (tempdir , "model1.yaml" ))
239+ Expect (err ).ToNot (HaveOccurred ())
240+ _ , err = os .Stat (filepath .Join (tempdir , "model2.yaml" ))
241+ Expect (err ).ToNot (HaveOccurred ())
242+
243+ // Verify the shared model file exists
244+ _ , err = os .Stat (sharedModelFile )
245+ Expect (err ).ToNot (HaveOccurred ())
246+
247+ // Delete the first model
248+ err = DeleteModelFromSystem (systemState , "model1" )
249+ Expect (err ).ToNot (HaveOccurred ())
250+
251+ // Verify the first configuration is deleted
252+ _ , err = os .Stat (filepath .Join (tempdir , "model1.yaml" ))
253+ Expect (err ).To (HaveOccurred ())
254+ Expect (errors .Is (err , os .ErrNotExist )).To (BeTrue ())
255+
256+ // Verify the shared model file still exists (not deleted because model2 still uses it)
257+ _ , err = os .Stat (sharedModelFile )
258+ Expect (err ).ToNot (HaveOccurred (), "shared model file should not be deleted when used by other configs" )
259+
260+ // Verify the second configuration still exists
261+ _ , err = os .Stat (filepath .Join (tempdir , "model2.yaml" ))
262+ Expect (err ).ToNot (HaveOccurred ())
263+
264+ // Now delete the second model
265+ err = DeleteModelFromSystem (systemState , "model2" )
266+ Expect (err ).ToNot (HaveOccurred ())
267+
268+ // Verify the second configuration is deleted
269+ _ , err = os .Stat (filepath .Join (tempdir , "model2.yaml" ))
270+ Expect (err ).To (HaveOccurred ())
271+ Expect (errors .Is (err , os .ErrNotExist )).To (BeTrue ())
272+
273+ // Verify the shared model file is now deleted (no more references)
274+ _ , err = os .Stat (sharedModelFile )
275+ Expect (err ).To (HaveOccurred (), "shared model file should be deleted when no configs reference it" )
276+ Expect (errors .Is (err , os .ErrNotExist )).To (BeTrue ())
277+ })
185278 })
186279})
0 commit comments