diff options
author | Joey Hess <joeyh@joeyh.name> | 2022-05-04 11:40:38 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2022-05-04 11:43:20 -0400 |
commit | c244daa32328f478bbf38a79f2fcacb138a1049f (patch) | |
tree | f1b2691357b88b267b9a77d5db23213bf0e2ac79 /Utility/CopyFile.hs | |
parent | 3c9630388ab0234df9e13473ac20c147e77074c5 (diff) | |
download | git-repair-c244daa32328f478bbf38a79f2fcacb138a1049f.tar.gz |
merge from git-annex
Diffstat (limited to 'Utility/CopyFile.hs')
-rw-r--r-- | Utility/CopyFile.hs | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/Utility/CopyFile.hs b/Utility/CopyFile.hs index f851326..9c93e70 100644 --- a/Utility/CopyFile.hs +++ b/Utility/CopyFile.hs @@ -1,6 +1,6 @@ {- file copying - - - Copyright 2010-2019 Joey Hess <id@joeyh.name> + - Copyright 2010-2021 Joey Hess <id@joeyh.name> - - License: BSD-2-clause -} @@ -30,6 +30,12 @@ copyMetaDataParams meta = map snd $ filter fst , Param "-p") , (not allmeta && BuildInfo.cp_preserve_timestamps , Param "--preserve=timestamps") + -- cp -a may preserve xattrs that have special meaning, + -- eg to NFS, and have even been observed to prevent later + -- changing the permissions of the file. So prevent preserving + -- xattrs. + , (allmeta && BuildInfo.cp_a && BuildInfo.cp_no_preserve_xattr_supported + , Param "--no-preserve=xattr") ] where allmeta = meta == CopyAllMetaData @@ -50,11 +56,17 @@ copyFileExternal meta src dest = do | otherwise = copyMetaDataParams meta {- When a filesystem supports CoW (and cp does), uses it to make - - an efficient copy of a file. Otherwise, returns False. -} + - an efficient copy of a file. Otherwise, returns False. + - + - The dest file must not exist yet, or it will fail to make a CoW copy, + - and will return False. + - + - Note that in coreutil 9.0, cp uses CoW by default, without needing an + - option. This code is only needed to support older versions. + -} copyCoW :: CopyMetaData -> FilePath -> FilePath -> IO Bool copyCoW meta src dest | BuildInfo.cp_reflink_supported = do - void $ tryIO $ removeFile dest -- When CoW is not supported, cp will complain to stderr, -- so have to discard its stderr. ok <- catchBoolIO $ withNullHandle $ \nullh -> |