import Annex.GitOverlay
import Utility.Tmp.Dir
import Utility.CopyFile
+import Utility.Directory
import qualified Database.Keys
import Config
- index file is currently locked.)
-}
changestomerge (Just updatedorig) = withOtherTmp $ \othertmpdir -> do
- tmpwt <- fromRepo gitAnnexMergeDir
git_dir <- fromRawFilePath <$> fromRepo Git.localGitDir
+ tmpwt <- fromRepo gitAnnexMergeDir
withTmpDirIn othertmpdir "git" $ \tmpgit -> withWorkTreeRelated tmpgit $
- withemptydir tmpwt $ withWorkTree tmpwt $ do
+ withemptydir git_dir tmpwt $ withWorkTree tmpwt $ do
liftIO $ writeFile (tmpgit </> "HEAD") (fromRef updatedorig)
-- Copy in refs and packed-refs, to work
-- around bug in git 2.13.0, which
whenM (doesFileExist src) $ do
dest <- relPathDirToFile git_dir src
let dest' = tmpgit </> dest
- createDirectoryIfMissing True (takeDirectory dest')
+ createDirectoryUnder git_dir (takeDirectory dest')
void $ createLinkOrCopy src dest'
-- This reset makes git merge not care
-- that the work tree is empty; otherwise
else return $ return False
changestomerge Nothing = return $ return False
- withemptydir d a = bracketIO setup cleanup (const a)
+ withemptydir git_dir d a = bracketIO setup cleanup (const a)
where
setup = do
whenM (doesDirectoryExist d) $
removeDirectoryRecursive d
- createDirectoryIfMissing True d
+ createDirectoryUnder git_dir d
cleanup _ = removeDirectoryRecursive d
{- A merge commit has been made between the basisbranch and
chan <- liftIO $ newTBMChanIO 100
g <- gitRepo
- let refdir = fromRawFilePath (Git.localGitDir g) </> "refs"
- liftIO $ createDirectoryIfMissing True refdir
+ let gittop = fromRawFilePath (Git.localGitDir g)
+ let refdir = gittop </> "refs"
+ liftIO $ createDirectoryUnder gittop refdir
let notifyhook = Just $ notifyHook chan
let hooks = mkWatchHooks
liftIO $ writeFile obj ""
setAnnexFilePerm obj
let tmpdir = gitAnnexTmpWorkDir obj
- liftIO $ createDirectoryIfMissing True tmpdir
- setAnnexDirPerm tmpdir
+ createAnnexDirectory tmpdir
res <- action tmpdir
case res of
Just _ -> liftIO $ removeDirectoryRecursive tmpdir
pidfile <- fromRepo gitAnnexPidFile
logfile <- fromRepo gitAnnexLogFile
liftIO $ debugM desc $ "logging to " ++ logfile
+ createAnnexDirectory (parentDir pidfile)
#ifndef mingw32_HOST_OS
createAnnexDirectory (parentDir logfile)
logfd <- liftIO $ handleToFd =<< openLog logfile
gf <- Annex.fromRepo Git.attributes
lfs <- readattr lf
gfs <- readattr gf
+ gittop <- fromRawFilePath . Git.localGitDir <$> gitRepo
liftIO $ unless ("filter=annex" `isInfixOf` (lfs ++ gfs)) $ do
- createDirectoryIfMissing True (takeDirectory lf)
+ createDirectoryUnder gittop (takeDirectory lf)
writeFile lf (lfs ++ "\n" ++ unlines stdattr)
where
readattr = liftIO . catchDefaultIO "" . readFileStrict
{- Persistent sqlite database initialization
-
- - Copyright 2015-2018 Joey Hess <id@joeyh.name>
+ - Copyright 2015-2020 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU AGPL version 3 or higher.
-}
import Annex.Common
import Annex.Perms
import Utility.FileMode
+import Utility.Directory
import Database.Persist.Sqlite
import Control.Monad.IO.Class (liftIO)
let dbdir = takeDirectory db
let tmpdbdir = dbdir ++ ".tmp"
let tmpdb = tmpdbdir </> "db"
- let tdb = T.pack tmpdb
+ let tdb = T.pack tmpdb
+ top <- parentDir . fromRawFilePath <$> fromRepo gitAnnexDir
liftIO $ do
- createDirectoryIfMissing True tmpdbdir
+ createDirectoryUnder top tmpdbdir
runSqliteInfo (enableWAL tdb) migration
setAnnexDirPerm tmpdbdir
-- Work around sqlite bug that prevents it from honoring
store :: FilePath -> ChunkConfig -> Key -> L.ByteString -> MeterUpdate -> Annex Bool
store d chunkconfig k b p = liftIO $ do
- void $ tryIO $ createDirectoryIfMissing True tmpdir
+ void $ tryIO $ createDirectoryUnder d tmpdir
case chunkconfig of
- LegacyChunks chunksize -> Legacy.store chunksize finalizeStoreGeneric k b p tmpdir destdir
+ LegacyChunks chunksize -> Legacy.store d chunksize (finalizeStoreGeneric d) k b p tmpdir destdir
_ -> do
let tmpf = tmpdir </> kf
meteredWriteFile p tmpf b
- finalizeStoreGeneric tmpdir destdir
+ finalizeStoreGeneric d tmpdir destdir
return True
where
tmpdir = addTrailingPathSeparator $ d </> "tmp" </> kf
- in the dest directory, moves it into place. Anything already existing
- in the dest directory will be deleted. File permissions will be locked
- down. -}
-finalizeStoreGeneric :: FilePath -> FilePath -> IO ()
-finalizeStoreGeneric tmp dest = do
+finalizeStoreGeneric :: FilePath -> FilePath -> FilePath -> IO ()
+finalizeStoreGeneric d tmp dest = do
void $ tryIO $ allowWrite dest -- may already exist
void $ tryIO $ removeDirectoryRecursive dest -- or not exist
- createDirectoryIfMissing True (parentDir dest)
+ createDirectoryUnder d (parentDir dest)
renameDirectory tmp dest
-- may fail on some filesystems
void $ tryIO $ do
storeExportM :: FilePath -> FilePath -> Key -> ExportLocation -> MeterUpdate -> Annex Bool
storeExportM d src _k loc p = liftIO $ catchBoolIO $ do
- createDirectoryIfMissing True (takeDirectory dest)
+ createDirectoryUnder d (takeDirectory dest)
-- Write via temp file so that checkPresentGeneric will not
-- see it until it's fully stored.
viaTmp (\tmp () -> withMeteredFile src p (L.writeFile tmp)) dest ()
renameExportM d _k oldloc newloc = liftIO $ Just <$> go
where
go = catchBoolIO $ do
- createDirectoryIfMissing True (takeDirectory dest)
+ createDirectoryUnder d (takeDirectory dest)
renameFile src dest
removeExportLocation d oldloc
return True
catchIO go (return . Left . show)
where
go = do
- liftIO $ createDirectoryIfMissing True destdir
+ liftIO $ createDirectoryUnder dir destdir
withTmpFileIn destdir template $ \tmpf tmph -> do
liftIO $ withMeteredFile src p (L.hPut tmph)
liftIO $ hFlush tmph
feed bytes' (sz - s) ls h
else return (l:ls)
-storeHelper :: (FilePath -> FilePath -> IO ()) -> Key -> ([FilePath] -> IO [FilePath]) -> FilePath -> FilePath -> IO Bool
-storeHelper finalizer key storer tmpdir destdir = do
- void $ liftIO $ tryIO $ createDirectoryIfMissing True tmpdir
+storeHelper :: FilePath -> (FilePath -> FilePath -> IO ()) -> Key -> ([FilePath] -> IO [FilePath]) -> FilePath -> FilePath -> IO Bool
+storeHelper repotop finalizer key storer tmpdir destdir = do
+ void $ liftIO $ tryIO $ createDirectoryUnder repotop tmpdir
Legacy.storeChunks key tmpdir destdir storer recorder finalizer
where
recorder f s = do
writeFile f s
void $ tryIO $ preventWrite f
-store :: ChunkSize -> (FilePath -> FilePath -> IO ()) -> Key -> L.ByteString -> MeterUpdate -> FilePath -> FilePath -> IO Bool
-store chunksize finalizer k b p = storeHelper finalizer k $ \dests ->
+store :: FilePath -> ChunkSize -> (FilePath -> FilePath -> IO ()) -> Key -> L.ByteString -> MeterUpdate -> FilePath -> FilePath -> IO Bool
+store repotop chunksize finalizer k b p = storeHelper repotop finalizer k $ \dests ->
storeLegacyChunked p chunksize dests b
{- Need to get a single ByteString containing every chunk.
let tmpf = tmpdir </> fromRawFilePath (keyFile k)
meteredWriteFile p tmpf b
let destdir = parentDir $ gCryptLocation repo k
- Remote.Directory.finalizeStoreGeneric tmpdir destdir
+ Remote.Directory.finalizeStoreGeneric (Git.repoLocation repo) tmpdir destdir
return True
| Git.repoIsSsh repo = if accessShell r
then fileStorer $ \k f p -> do
dir <- fromRepo gitAnnexRemotesDir
let lck = dir </> remoteid ++ ".lck"
whenM (notElem lck . M.keys <$> getLockCache) $ do
- liftIO $ createDirectoryIfMissing True dir
+ createAnnexDirectory dir
firstrun lck
a
where
- Fails if the pid file is already locked by another process. -}
lockPidFile :: FilePath -> IO ()
lockPidFile pidfile = do
- createDirectoryIfMissing True (parentDir pidfile)
#ifndef mingw32_HOST_OS
fd <- openFd pidfile ReadWrite (Just stdFileMode) defaultFileFlags
locked <- catchMaybeIO $ setLock fd (WriteLock, AbsoluteSeek, 0, 0)
--- /dev/null
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2020-03-05T19:18:31Z"
+ content="""
+Most of the easy ones have been converted now.
+
+There's one in Annex.ReplaceFile that's hard, and is probably the only
+important one left unconverted.
+"""]]