diff options
Diffstat (limited to 'Command/Fix.hs')
-rw-r--r-- | Command/Fix.hs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/Command/Fix.hs b/Command/Fix.hs new file mode 100644 index 000000000..f730226e3 --- /dev/null +++ b/Command/Fix.hs @@ -0,0 +1,59 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess <joey@kitenet.net> + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Command.Fix where + +import Common.Annex +import Command +import qualified Annex.Queue +#ifdef WITH_CLIBS +#ifndef __ANDROID__ +import Utility.Touch +#endif +#endif + +def :: [Command] +def = [notDirect $ noCommit $ command "fix" paramPaths seek + SectionMaintenance "fix up symlinks to point to annexed content"] + +seek :: CommandSeek +seek = withFilesInGit $ whenAnnexed start + +{- Fixes the symlink to an annexed file. -} +start :: FilePath -> (Key, Backend) -> CommandStart +start file (key, _) = do + link <- inRepo $ gitAnnexLink file key + stopUnless ((/=) (Just link) <$> liftIO (catchMaybeIO $ readSymbolicLink file)) $ do + showStart "fix" file + next $ perform file link + +perform :: FilePath -> FilePath -> CommandPerform +perform file link = do + liftIO $ do +#ifdef WITH_CLIBS +#ifndef __ANDROID__ + -- preserve mtime of symlink + mtime <- catchMaybeIO $ TimeSpec . modificationTime + <$> getSymbolicLinkStatus file +#endif +#endif + createDirectoryIfMissing True (parentDir file) + removeFile file + createSymbolicLink link file +#ifdef WITH_CLIBS +#ifndef __ANDROID__ + maybe noop (\t -> touch file t False) mtime +#endif +#endif + next $ cleanup file + +cleanup :: FilePath -> CommandCleanup +cleanup file = do + Annex.Queue.addCommand "add" [Param "--force", Param "--"] [file] + return True |