Improve deletion of files from rsync special remotes. Closes: #652849

Rsync is only run once, with include / exclude rules used to specify
exactly what to delete. This is faster, and avoids ugly error messages
from rsync, and doesn't fail if the content already got deleted somehow.
This commit is contained in:
Joey Hess 2011-12-21 16:56:48 -04:00
parent a76b13b848
commit 20482712d0
2 changed files with 24 additions and 16 deletions

View file

@ -92,11 +92,6 @@ rsyncUrls o k = map use annexHashes
use h = rsyncUrl o </> h k </> rsyncEscape o (f </> f) use h = rsyncUrl o </> h k </> rsyncEscape o (f </> f)
f = keyFile k f = keyFile k
rsyncUrlDirs :: RsyncOpts -> Key -> [String]
rsyncUrlDirs o k = map use annexHashes
where
use h = rsyncUrl o </> h k </> rsyncEscape o (keyFile k)
store :: RsyncOpts -> Key -> Annex Bool store :: RsyncOpts -> Key -> Annex Bool
store o k = rsyncSend o k =<< inRepo (gitAnnexLocation k) store o k = rsyncSend o k =<< inRepo (gitAnnexLocation k)
@ -125,17 +120,29 @@ retrieveEncrypted o (cipher, enck) f = withTmp enck $ \tmp -> do
else return res else return res
remove :: RsyncOpts -> Key -> Annex Bool remove :: RsyncOpts -> Key -> Annex Bool
remove o k = untilTrue (rsyncUrlDirs o k) $ \d -> remove o k = withRsyncScratchDir $ \tmp -> liftIO $ do
withRsyncScratchDir $ \tmp -> liftIO $ do {- Send an empty directory to rysnc to make it delete. -}
{- Send an empty directory to rysnc as the let dummy = tmp </> keyFile k
- parent directory of the file to remove. -} createDirectoryIfMissing True dummy
let dummy = tmp </> keyFile k rsync $ rsyncOptions o ++
createDirectoryIfMissing True dummy map (\s -> Param $ "--include=" ++ s) includes ++
rsync $ rsyncOptions o ++ [ Param "--exclude=*" -- exclude everything else
[ Params "--quiet --delete --recursive" , Params "--quiet --delete --recursive"
, partialParams , partialParams
, Param $ addTrailingPathSeparator dummy , Param $ addTrailingPathSeparator dummy
, Param d , Param $ rsyncUrl o
]
where
{- Specify include rules to match the directories where the
- content could be. Note that the parent directories have
- to also be explicitly included, due to how rsync
- traverses directories. -}
includes = concatMap use annexHashes
use h = let dir = h k in
[ parentDir dir
, dir
-- match content directory and anything in it
, dir </> keyFile k </> "***"
] ]
checkPresent :: Git.Repo -> RsyncOpts -> Key -> Annex (Either String Bool) checkPresent :: Git.Repo -> RsyncOpts -> Key -> Annex (Either String Bool)

1
debian/changelog vendored
View file

@ -6,6 +6,7 @@ git-annex (3.20111212) UNRELEASED; urgency=low
* Fix the hook special remote, which bitrotted a while ago. * Fix the hook special remote, which bitrotted a while ago.
* map: --fast disables use of dot to display map * map: --fast disables use of dot to display map
* Test suite improvements. Current top-level test coverage: 75% * Test suite improvements. Current top-level test coverage: 75%
* Improve deletion of files from rsync special remotes. Closes: #652849
-- Joey Hess <joeyh@debian.org> Mon, 12 Dec 2011 01:57:49 -0400 -- Joey Hess <joeyh@debian.org> Mon, 12 Dec 2011 01:57:49 -0400