Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

shave sub-second precision off modification time #251

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
shave sub-second precision off modification time
It seems like System.Directory's `getModificationTime` is now providing
sub-second precision if it's available in the underlying system call,
which it seems to be for most systems.

The problem is that when the modification time is stored, the DiffTime,
the number of seconds from midnight, has its sub-second precision
shaved off, effectively becoming 0 the next time it's read.  When a
file is then checked to see if it has been modified, the file is
_always_ deemed to have been modified because this time still includes
the sub-second precision, which will almost always be later in time
than 0, unless of course it happened to be 0 to begin with.

This simply shaves the sub-second precision off of the time returned by
`getModificationTime`, and thus no longer rebuilds every single file
each time any one file is saved.

Closes #250
  • Loading branch information
blaenk committed May 9, 2014
commit 652ea9b797b291b1c87c379741b750d49afb502d
9 changes: 7 additions & 2 deletions src/Hakyll/Core/Provider/Internal.hs
Original file line number Diff line number Diff line change
Expand Up @@ -197,9 +197,14 @@ resourceModificationTime p i =
fileModificationTime :: FilePath -> IO UTCTime
fileModificationTime fp = do
#if MIN_VERSION_directory(1,2,0)
getModificationTime fp
time <- getModificationTime fp
#else
ct <- toCalendarTime =<< getModificationTime fp
let str = formatCalendarTime defaultTimeLocale "%s" ct
return $ readTime defaultTimeLocale "%s" str
time <- readTime defaultTimeLocale "%s" str
#endif

-- shave sub-second precision
let dt = secondsToDiffTime . floor $ utctDayTime time

return $ time { utctDayTime = dt }