remove empty directories when removing from export

The subtle part of this is what happens when the remote fails to remove
an empty directory. The removal from the export needs to fail in that
case, so the removal will be tried again later. However, removeExportLocation
has already been run and changed the export db, so if the next run
checks getExportLocation, it might decide nothing remains to be done,
leaving the empty directory.

Dealt with that by making removeEmptyDirectories, handle a failure
by calling addExportLocation, reverting the database changes so the next
run will be guaranteed to try deleting the empty directory again.

This commit was sponsored by Thomas Hochstein on Patreon.
This commit is contained in:
Joey Hess 2017-09-15 15:04:29 -04:00
parent e223cf568f
commit c633144d28
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
4 changed files with 58 additions and 29 deletions

View file

@ -22,11 +22,13 @@ module Types.Remote
, ExportDirectory(..)
, isExportSupported
, ExportActions(..)
, exportedDirectories
)
where
import Data.Map as M
import qualified Data.Map as M
import Data.Ord
import qualified System.FilePath.Posix as Posix
import qualified Git
import Types.Key
@ -198,3 +200,14 @@ data ExportActions a = ExportActions
-- support renames.
, renameExport :: Key -> ExportLocation -> ExportLocation -> a Bool
}
-- | All directories down to the ExportLocation, with the deepest ones
-- last.
exportedDirectories :: ExportLocation -> [ExportDirectory]
exportedDirectories (ExportLocation f) =
map (ExportDirectory . Posix.joinPath . reverse) $
subs [] $ map Posix.dropTrailingPathSeparator $
Posix.splitPath $ Posix.takeDirectory f
where
subs _ [] = []
subs ps (d:ds) = (d:ps) : subs (d:ps) ds