diff --git a/api/publish.go b/api/publish.go index a38b80c2..538234a3 100644 --- a/api/publish.go +++ b/api/publish.go @@ -312,6 +312,8 @@ func apiPublishUpdateSwitch(c *gin.Context) { // DELETE /publish/:prefix/:distribution func apiPublishDrop(c *gin.Context) { + force := c.Request.URL.Query().Get("force") == "1" + param := parseEscapedPath(c.Params.ByName("prefix")) storage, prefix := deb.ParsePrefix(param) distribution := c.Params.ByName("distribution") @@ -326,7 +328,7 @@ func apiPublishDrop(c *gin.Context) { defer collection.Unlock() err := collection.Remove(context, storage, prefix, distribution, - context.CollectionFactory(), context.Progress()) + context.CollectionFactory(), context.Progress(), force) if err != nil { c.Fail(500, fmt.Errorf("unable to drop: %s", err)) return diff --git a/cmd/publish_drop.go b/cmd/publish_drop.go index 0bedc7d5..9c465828 100644 --- a/cmd/publish_drop.go +++ b/cmd/publish_drop.go @@ -23,7 +23,7 @@ func aptlyPublishDrop(cmd *commander.Command, args []string) error { storage, prefix := deb.ParsePrefix(param) err = context.CollectionFactory().PublishedRepoCollection().Remove(context, storage, prefix, distribution, - context.CollectionFactory(), context.Progress()) + context.CollectionFactory(), context.Progress(), context.Flags().Lookup("force-drop").Value.Get().(bool)) if err != nil { return fmt.Errorf("unable to remove: %s", err) } @@ -48,5 +48,7 @@ Example: `, } + cmd.Flag.Bool("force-drop", false, "remove published repository even if some files could not be cleaned up") + return cmd } diff --git a/deb/publish.go b/deb/publish.go index cec60d44..82ea06ab 100644 --- a/deb/publish.go +++ b/deb/publish.go @@ -1000,7 +1000,8 @@ func (collection *PublishedRepoCollection) CleanupPrefixComponentFiles(prefix st // Remove removes published repository, cleaning up directories, files func (collection *PublishedRepoCollection) Remove(publishedStorageProvider aptly.PublishedStorageProvider, - storage, prefix, distribution string, collectionFactory *CollectionFactory, progress aptly.Progress) error { + storage, prefix, distribution string, collectionFactory *CollectionFactory, progress aptly.Progress, + force bool) error { repo, err := collection.ByStoragePrefixDistribution(storage, prefix, distribution) if err != nil { return err @@ -1041,7 +1042,9 @@ func (collection *PublishedRepoCollection) Remove(publishedStorageProvider aptly err = collection.CleanupPrefixComponentFiles(repo.Prefix, cleanComponents, publishedStorageProvider.GetPublishedStorage(storage), collectionFactory, progress) if err != nil { - return err + if !force { + return fmt.Errorf("cleanup failed, use -force-drop to override: %s", err) + } } }