diff --git a/cmd/cmd.go b/cmd/cmd.go index 52db9da6..7874ea68 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -745,6 +745,15 @@ func RunServer(cmd *cobra.Command, _ []string) error { if err := server.PruneLayers(); err != nil { return err } + + manifestsPath, err := server.GetManifestPath() + if err != nil { + return err + } + + if err := server.PruneDirectory(manifestsPath); err != nil { + return err + } } return server.Serve(ln, origins) diff --git a/server/images.go b/server/images.go index a6b0a5ea..cd5224c9 100644 --- a/server/images.go +++ b/server/images.go @@ -1005,6 +1005,39 @@ func PruneLayers() error { return nil } +func PruneDirectory(path string) error { + info, err := os.Lstat(path) + if err != nil { + return err + } + + if info.IsDir() && info.Mode()&os.ModeSymlink == 0 { + entries, err := os.ReadDir(path) + if err != nil { + return err + } + + for _, entry := range entries { + if err := PruneDirectory(filepath.Join(path, entry.Name())); err != nil { + return err + } + } + + entries, err = os.ReadDir(path) + if err != nil { + return err + } + + if len(entries) > 0 { + return nil + } + + return os.Remove(path) + } + + return nil +} + func DeleteModel(name string) error { mp := ParseModelPath(name) manifest, _, err := GetManifest(mp) diff --git a/server/routes.go b/server/routes.go index 62fd806b..5bc06739 100644 --- a/server/routes.go +++ b/server/routes.go @@ -378,6 +378,18 @@ func DeleteModelHandler(c *gin.Context) { } return } + + manifestsPath, err := GetManifestPath() + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + if err := PruneDirectory(manifestsPath); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, nil) }