diff options
author | Joey Hess <joey@kitenet.net> | 2013-01-14 15:02:13 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2013-01-14 15:02:13 -0400 |
commit | 91c6b94aaf650aba6933a0dec65edeaadc82a14b (patch) | |
tree | 96d47507e168ab69e22e382381ee5c3193011f72 /Command | |
parent | 7efe7b0238b51188acd0ca0340b005c90cbf45ee (diff) |
assistant: Avoid committer crashing if a file is deleted at the wrong instant.
Diffstat (limited to 'Command')
-rw-r--r-- | Command/Add.hs | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/Command/Add.hs b/Command/Add.hs index 883be1b91..1bc38eecd 100644 --- a/Command/Add.hs +++ b/Command/Add.hs @@ -58,13 +58,16 @@ start file = ifAnnexed file fixup add {- The file that's being added is locked down before a key is generated, - to prevent it from being modified in between. It's hard linked into a - temporary location, and its writable bits are removed. It could still be - - written to by a process that already has it open for writing. -} -lockDown :: FilePath -> Annex KeySource + - written to by a process that already has it open for writing. + - + - Lockdown can fail if a file gets deleted, and Nothing will be returned. + -} +lockDown :: FilePath -> Annex (Maybe KeySource) lockDown file = do - liftIO $ preventWrite file tmp <- fromRepo gitAnnexTmpDir createAnnexDirectory tmp - liftIO $ do + liftIO $ catchMaybeIO $ do + preventWrite file (tmpfile, h) <- openTempFile tmp (takeFileName file) hClose h nukeFile tmpfile @@ -76,8 +79,9 @@ lockDown file = do - In direct mode, leaves the file alone, and just updates bookkeeping - information. -} -ingest :: KeySource -> Annex (Maybe Key) -ingest source = do +ingest :: (Maybe KeySource) -> Annex (Maybe Key) +ingest Nothing = return Nothing +ingest (Just source) = do backend <- chooseBackend $ keyFilename source ifM isDirect ( do |