martin f krafft wrote:
>   1. .git/annex is missing g+rwx
>   2. .git/annex/** are missing g+x

fixed

>   3. the actual file object in the annex has the wrong group.

This is because git-annex moves files into the directory, so it is not
creating a new file, so the +S has no effect.

I am doubtful that it would make sense to make git-annex look at the +S
and try to honor it when moving files around.

-- 
see shy jo
From 04cbaef2458b1bb15e1631f1109cce0eb7502cad Mon Sep 17 00:00:00 2001
From: Joey Hess <j...@kitenet.net>
Date: Mon, 18 Nov 2013 18:05:37 -0400
Subject: [PATCH] Ensure execute bit is set on directories when
 core.sharedrepsitory is set.

---
 Annex/Branch.hs     |  2 +-
 Annex/Perms.hs      | 28 ++++++++++++++++++----------
 Utility/FileMode.hs |  7 +++++--
 debian/changelog    |  1 +
 4 files changed, 25 insertions(+), 13 deletions(-)

diff --git a/Annex/Branch.hs b/Annex/Branch.hs
index 5978260..22ab002 100644
--- a/Annex/Branch.hs
+++ b/Annex/Branch.hs
@@ -386,7 +386,7 @@ setIndexSha :: Git.Ref -> Annex ()
 setIndexSha ref = do
 	f <- fromRepo gitAnnexIndexStatus
 	liftIO $ writeFile f $ show ref ++ "\n"
-	setAnnexPerm f
+	setAnnexFilePerm f
 
 {- Stages the journal into the index and returns an action that will
  - clean up the staged journal files, which should only be run once
diff --git a/Annex/Perms.hs b/Annex/Perms.hs
index 9ce0fe2..e3a2fa6 100644
--- a/Annex/Perms.hs
+++ b/Annex/Perms.hs
@@ -6,7 +6,8 @@
  -}
 
 module Annex.Perms (
-	setAnnexPerm,
+	setAnnexFilePerm,
+	setAnnexDirPerm,
 	annexFileMode,
 	createAnnexDirectory,
 	noUmask,
@@ -33,17 +34,27 @@ withShared a = maybe startup a =<< Annex.getState Annex.shared
 		Annex.changeState $ \s -> s { Annex.shared = Just shared }
 		a shared
 
+setAnnexFilePerm :: FilePath -> Annex ()
+setAnnexFilePerm = setAnnexPerm False
+
+setAnnexDirPerm :: FilePath -> Annex ()
+setAnnexDirPerm = setAnnexPerm True
+
 {- Sets appropriate file mode for a file or directory in the annex,
  - other than the content files and content directory. Normally,
  - use the default mode, but with core.sharedRepository set,
  - allow the group to write, etc. -}
-setAnnexPerm :: FilePath -> Annex ()
-setAnnexPerm file = unlessM crippledFileSystem $
+setAnnexPerm :: Bool -> FilePath -> Annex ()
+setAnnexPerm isdir file = unlessM crippledFileSystem $
 	withShared $ liftIO . go
   where
-	go GroupShared = groupWriteRead file
+	go GroupShared = modifyFileMode file $ addModes $
+		groupSharedModes ++
+		if isdir then [ ownerExecuteMode, groupExecuteMode ] else []
 	go AllShared = modifyFileMode file $ addModes $
-		[ ownerWriteMode, groupWriteMode ] ++ readModes
+		readModes ++
+		[ ownerWriteMode, groupWriteMode ] ++
+		if isdir then executeModes else []
 	go _ = noop
 
 {- Gets the appropriate mode to use for creating a file in the annex
@@ -54,10 +65,7 @@ annexFileMode = withShared $ return . go
 	go GroupShared = sharedmode
 	go AllShared = combineModes (sharedmode:readModes)
 	go _ = stdFileMode
-	sharedmode = combineModes
-		[ ownerWriteMode, groupWriteMode
-		, ownerReadMode, groupReadMode
-		]
+	sharedmode = combineModes groupSharedModes
 
 {- Creates a directory inside the gitAnnexDir, including any parent
  - directories. Makes directories with appropriate permissions. -}
@@ -74,7 +82,7 @@ createAnnexDirectory dir = traverse dir [] =<< top
 	  where
 		done = forM_ below $ \p -> do
 			liftIO $ createDirectoryIfMissing True p
-			setAnnexPerm p
+			setAnnexDirPerm p
 
 {- Blocks writing to the directory an annexed file is in, to prevent the
  - file accidentially being deleted. However, if core.sharedRepository
diff --git a/Utility/FileMode.hs b/Utility/FileMode.hs
index d76fb57..1307d38 100644
--- a/Utility/FileMode.hs
+++ b/Utility/FileMode.hs
@@ -65,12 +65,15 @@ allowWrite :: FilePath -> IO ()
 allowWrite f = modifyFileMode f $ addModes [ownerWriteMode]
 
 {- Allows owner and group to read and write to a file. -}
-groupWriteRead :: FilePath -> IO ()
-groupWriteRead f = modifyFileMode f $ addModes
+groupSharedModes :: [FileMode]
+groupSharedModes =
 	[ ownerWriteMode, groupWriteMode
 	, ownerReadMode, groupReadMode
 	]
 
+groupWriteRead :: FilePath -> IO ()
+groupWriteRead f = modifyFileMode f $ addModes groupSharedModes
+
 checkMode :: FileMode -> FileMode -> Bool
 checkMode checkfor mode = checkfor `intersectFileModes` mode == checkfor
 
diff --git a/debian/changelog b/debian/changelog
index 6d8a3f7..85d4689 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,6 +2,7 @@ git-annex (5.20131119) UNRELEASED; urgency=low
 
   * dropunused, addunused: Allow "all" instead of a range to
     act on all unused data.
+  * Ensure execute bit is set on directories when core.sharedrepsitory is set.
 
  -- Joey Hess <jo...@debian.org>  Mon, 18 Nov 2013 17:09:21 -0400
 
-- 
1.8.4.3

Attachment: signature.asc
Description: Digital signature

Reply via email to