summaryrefslogtreecommitdiff
path: root/Annex/Perms.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2013-01-26 20:09:15 +1100
committerGravatar Joey Hess <joey@kitenet.net>2013-01-26 20:09:15 +1100
commit8126c41bc247cfb31a3d2a9c57cb3e4783e8e37b (patch)
tree42ba9965d90455a7c9bf331803300e4bc5aab7c4 /Annex/Perms.hs
parent2b604c3556ad538ff573ec073fa1a298daf03151 (diff)
ensure that content directory is thawed when writing direct mode mapping and cache files
Diffstat (limited to 'Annex/Perms.hs')
-rw-r--r--Annex/Perms.hs26
1 files changed, 26 insertions, 0 deletions
diff --git a/Annex/Perms.hs b/Annex/Perms.hs
index 13deb20bd..27804ad3d 100644
--- a/Annex/Perms.hs
+++ b/Annex/Perms.hs
@@ -10,6 +10,8 @@ module Annex.Perms (
annexFileMode,
createAnnexDirectory,
noUmask,
+ createContentDir,
+ freezeContentDir,
) where
import Common.Annex
@@ -68,3 +70,27 @@ createAnnexDirectory dir = traverse dir [] =<< top
done = forM_ below $ \p -> do
liftIO $ createDirectory p
setAnnexPerm p
+
+{- Blocks writing to the directory an annexed file is in, to prevent the
+ - file accidentially being deleted. However, if core.sharedRepository
+ - is set, this is not done, since the group must be allowed to delete the
+ - file.
+ -}
+freezeContentDir :: FilePath -> Annex ()
+freezeContentDir file = liftIO . go =<< fromRepo getSharedRepository
+ where
+ dir = parentDir file
+ go GroupShared = groupWriteRead dir
+ go AllShared = groupWriteRead dir
+ go _ = preventWrite dir
+
+{- Makes the directory tree to store an annexed file's content,
+ - with appropriate permissions on each level. -}
+createContentDir :: FilePath -> Annex ()
+createContentDir dest = do
+ unlessM (liftIO $ doesDirectoryExist dir) $
+ createAnnexDirectory dir
+ -- might have already existed with restricted perms
+ liftIO $ allowWrite dir
+ where
+ dir = parentDir dest