aboutsummaryrefslogtreecommitdiff
path: root/Remote
diff options
context:
space:
mode:
Diffstat (limited to 'Remote')
-rw-r--r--Remote/Helper/Export.hs38
1 files changed, 32 insertions, 6 deletions
diff --git a/Remote/Helper/Export.hs b/Remote/Helper/Export.hs
index 44fa47ca5..101124cef 100644
--- a/Remote/Helper/Export.hs
+++ b/Remote/Helper/Export.hs
@@ -120,12 +120,15 @@ adjustExportable r = case M.lookup "exporttree" (config r) of
, removeKey = \k -> do
locs <- liftIO $ getExportLocation db k
ea <- exportActions r
- oks <- forM locs $ \loc -> do
- ok <- removeExport ea k loc
- when ok $
- liftIO $ removeExportLocation db k loc
- return ok
- liftIO $ flushDbQueue db
+ oks <- forM locs $ \loc ->
+ ifM (removeExport ea k loc)
+ ( do
+ liftIO $ do
+ removeExportLocation db k loc
+ flushDbQueue db
+ removeEmptyDirectories ea db loc [k]
+ , return False
+ )
return (and oks)
-- Can't lock content on exports, since they're
-- not key/value stores, and someone else could
@@ -143,3 +146,26 @@ adjustExportable r = case M.lookup "exporttree" (config r) of
is <- getInfo r
return (is++[("export", "yes")])
}
+
+-- | Remove empty directories from the export. Call after removing an
+-- exported file, and after calling removeExportLocation and flushing the
+-- database.
+removeEmptyDirectories :: ExportActions Annex -> ExportHandle -> ExportLocation -> [Key] -> Annex Bool
+removeEmptyDirectories ea db loc ks = case removeExportDirectory ea of
+ Nothing -> return True
+ Just removeexportdirectory -> do
+ ok <- allM (go removeexportdirectory)
+ (reverse (exportedDirectories loc))
+ unless ok $ liftIO $ do
+ -- Add back to export database, so this is
+ -- tried again next time.
+ forM_ ks $ \k ->
+ addExportLocation db k loc
+ flushDbQueue db
+ return ok
+ where
+ go removeexportdirectory d =
+ ifM (liftIO $ isExportDirectoryEmpty db d)
+ ( removeexportdirectory d
+ , return True
+ )