packages feed

group-by-date-0.0: src/GroupByDate.hs

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)