module GroupByDate where
import qualified System.Directory as Dir
import qualified System.PosixCompat.Files as Files
import qualified System.FilePath as FilePath
import System.FilePath ((</>), )
import HsShellScript.Shell (shell_quote, )
import qualified Data.Time.Format as Time
import Data.Time.Clock.POSIX (posixSecondsToUTCTime, )
import System.Locale (defaultTimeLocale, )
import Text.Printf (printf, )
import Control.Monad (when, )
folderFromStatus :: String -> Files.FileStatus -> FilePath
folderFromStatus fmt =
Time.formatTime defaultTimeLocale fmt .
posixSecondsToUTCTime . realToFrac .
Files.modificationTime
folderFromPath :: String -> FilePath -> IO FilePath
folderFromPath fmt =
fmap (Time.formatTime defaultTimeLocale fmt) .
Dir.getModificationTime
makeDstPath :: FilePath -> FilePath -> FilePath
makeDstPath src dst = dst </> FilePath.takeFileName src
commandFromPath :: Bool -> String -> String -> FilePath -> IO ()
commandFromPath fullDst cmd fmt src = do
dst <- folderFromPath fmt src
printf "mkdir -p %s && %s %s %s\n"
(shell_quote dst)
cmd
(shell_quote src)
(shell_quote $
if fullDst then makeDstPath src dst else dst)
movePath :: String -> FilePath -> IO ()
movePath fmt src = do
dst <- folderFromPath fmt src
Dir.createDirectoryIfMissing True dst
Dir.renameFile src (makeDstPath src dst)
copyPath :: String -> FilePath -> IO ()
copyPath fmt src = do
dstDir <- folderFromPath fmt src
Dir.createDirectoryIfMissing True dstDir
let dst = makeDstPath src dstDir
Dir.copyFile src dst
status <- Files.getFileStatus src
Files.setFileTimes dst
(Files.accessTime status) (Files.modificationTime status)
when False $
-- this could fail, if the owner is 'root' e.g. for data on removeable media
Files.setOwnerAndGroup dst
(Files.fileOwner status) (Files.fileGroup status)
symLinkPath :: String -> FilePath -> IO ()
symLinkPath fmt src = do
dst <- folderFromPath fmt src
Dir.createDirectoryIfMissing True dst
Files.createSymbolicLink src (makeDstPath src dst)