simplify replaceFile using relatedTemplate

Now that truncateFilePath and relatedTemplate have both been optimised,
may as well use them in replaceFile, rather than the custom hack it
used.

Removed the windows-specific ifdef as well, because on Windows long
filepaths no longer really a problem, since ghc and git-annex use UNC
converted paths.

replaceFile no longer checks fileNameLengthLimit. That took a syscall,
and since we have an existing file, we know filenames of its length are
supported by the filesystem. Assuming that the withOtherTmp directory is
on the same filesystem as the file replaceFile is being called on, which
I believe it is.

Sponsored-by: Leon Schuermann
This commit is contained in:
Joey Hess 2025-01-22 13:22:51 -04:00
parent f17ec601c4
commit af3b9cbd36
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
2 changed files with 15 additions and 24 deletions

View file

@ -13,8 +13,9 @@ module Utility.Tmp (
viaTmp,
withTmpFile,
withTmpFileIn,
relatedTemplate,
openTmpFileIn,
relatedTemplate,
relatedTemplate',
) where
import System.IO
@ -107,14 +108,17 @@ withTmpFileIn tmpdir template a = bracket create remove use
- This generates a template that is never too long.
-}
relatedTemplate :: RawFilePath -> Template
relatedTemplate f
relatedTemplate = toOsPath . relatedTemplate'
relatedTemplate' :: RawFilePath -> RawFilePath
relatedTemplate' f
| len > templateAddedLength =
{- Some filesystems like FAT have issues with filenames
- ending in ".", so avoid truncating a filename to end
- that way. -}
toOsPath $ B.dropWhileEnd (== dot) $
B.dropWhileEnd (== dot) $
truncateFilePath (len - templateAddedLength) f
| otherwise = toOsPath f
| otherwise = f
where
len = B.length f
dot = fromIntegral (ord '.')