-- it needs to be able to store the agent socket there,
-- which can be problimatic when testing some filesystems.
absgpgtmp <- fromRawFilePath <$> absPath (toRawFilePath gpgtmp)
- testscheme' scheme absgpgtmp
+ res <- testscheme' scheme absgpgtmp
+ -- gpg may still be running and would prevent
+ -- removeDirectoryRecursive from succeeding, so
+ -- force removal of the temp directory.
+ liftIO $ removeDirectoryForCleanup gpgtmp
+ return res
testscheme' scheme absgpgtmp = intmpclonerepo $ do
-- Since gpg uses a unix socket, which is limited to a
-- short path, use whichever is shorter of absolute
go tmpdir
#endif
where
- -- Use removePathForcibly when available, to avoid crashing
- -- if some other process is removing files in the directory at the
- -- same time.
-#if MIN_VERSION_directory(1,2,7)
- go = removePathForcibly
-#else
go = removeDirectoryRecursive
-#endif
--- /dev/null
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2022-05-02T17:08:15Z"
+ content="""
+Here is the bug in action:
+
+ -r--r--r-- 1 joey joey 30 May 2 12:42 .git/annex/objects/Gj/8J/SHA256E-s30--3d65cafd9435fde3867a527d75ff8aea05a3632cb60574d45e0fc277f06c8a64/SHA256E-s30--3d65cafd9435fde3867a527d75ff8aea05a3632cb60574d45e0fc277f06c8a64
+ joey@darkstar:/tmp/x>git-annex copy --to foo
+ copy x (to foo...)
+ ok
+ joey@darkstar:/tmp/x>ls -l .git/annex/objects/Gj/8J/SHA256E-s30--3d65cafd9435fde3867a527d75ff8aea05a3632cb60574d45e0fc277f06c8a64/SHA256E-s30--3d65cafd9435fde3867a527d75ff8aea05a3632cb60574d45e0fc277f06c8a64
+ -rwxr--r-- 1 joey joey 30 May 2 12:42 .git/annex/objects/Gj/8J/SHA256E-s30--3d65cafd9435fde3867a527d75ff8aea05a3632cb60574d45e0fc277f06c8a64/SHA256E-s30--3d65cafd9435fde3867a527d75ff8aea05a3632cb60574d45e0fc277f06c8a64*
+
+At first I thought this was rsync modifying the permissions of the source file.
+
+But no... [[!commit 17b20a24502aee3bfc5683146c3899a233295aea]]
+changed how temp directories get cleaned up. removePathForcibly
+is actually changing the permissions of the object file hard link
+in the rsynctmp directory when deleting that directory. Which also
+changes the permissions of the object file.
+
+Filed a bug on removePathForcibly. <https://github.com/haskell/directory/issues/135>
+
+I think this makes removePathForcibly unsuitable for general purpose
+use in git-annex, because there are just too many ways for a hard link
+to enter the picture. (Eg annex.thin, or even a user making their own
+hard link that git-annex does not know about.)
+
+So, I've reverted that commit, and put in a more
+targeted fix for the problem it was addressing.
+"""]]