finish fixing removeLink on windows
9cb250f7be got the ones in RawFilePath,
but there were others that used the one from unix-compat, which fails at
runtime on windows. To avoid this,
import System.PosixCompat.Files hiding removeLink
This commit was sponsored by Ethan Aubin.
	
	
This commit is contained in:
		
					parent
					
						
							
								dce0781391
							
						
					
				
			
			
				commit
				
					
						a3b714ddd9
					
				
			
		
					 28 changed files with 73 additions and 64 deletions
				
			
		| 
						 | 
				
			
			@ -34,11 +34,11 @@ import qualified Database.Keys
 | 
			
		|||
import Annex.InodeSentinal
 | 
			
		||||
import Utility.InodeCache
 | 
			
		||||
import Utility.FileMode
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
 | 
			
		||||
import qualified Data.Set as S
 | 
			
		||||
import qualified Data.Map as M
 | 
			
		||||
import qualified Data.ByteString.Lazy as L
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
 | 
			
		||||
{- Merges from a branch into the current branch (which may not exist yet),
 | 
			
		||||
 - with automatic merge conflict resolution.
 | 
			
		||||
| 
						 | 
				
			
			@ -176,7 +176,7 @@ resolveMerge' unstagedmap (Just us) them inoverlay u = do
 | 
			
		|||
				-- files, so delete here.
 | 
			
		||||
				unless inoverlay $
 | 
			
		||||
					unless (islocked LsFiles.valUs) $
 | 
			
		||||
						liftIO $ removeWhenExistsWith removeLink file
 | 
			
		||||
						liftIO $ removeWhenExistsWith R.removeLink (toRawFilePath file)
 | 
			
		||||
			| otherwise -> do
 | 
			
		||||
				-- Only resolve using symlink when both
 | 
			
		||||
				-- were locked, otherwise use unlocked
 | 
			
		||||
| 
						 | 
				
			
			@ -309,7 +309,7 @@ cleanConflictCruft resolvedks resolvedfs unstagedmap = do
 | 
			
		|||
		<$> mapM Database.Keys.getInodeCaches resolvedks
 | 
			
		||||
	forM_ (M.toList unstagedmap) $ \(i, f) ->
 | 
			
		||||
		whenM (matchesresolved is i f) $
 | 
			
		||||
			liftIO $ removeWhenExistsWith removeLink f
 | 
			
		||||
			liftIO $ removeWhenExistsWith R.removeLink (toRawFilePath f)
 | 
			
		||||
  where
 | 
			
		||||
	fs = S.fromList resolvedfs
 | 
			
		||||
	ks = S.fromList resolvedks
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -535,7 +535,7 @@ stageJournal jl commitindex = withIndex $ withOtherTmp $ \tmpdir -> do
 | 
			
		|||
		stagedfs <- lines <$> hGetContents jlogh
 | 
			
		||||
		mapM_ (removeFile . (dir </>)) stagedfs
 | 
			
		||||
		hClose jlogh
 | 
			
		||||
		removeWhenExistsWith removeLink jlogf
 | 
			
		||||
		removeWhenExistsWith (R.removeLink) (toRawFilePath jlogf)
 | 
			
		||||
	openjlog tmpdir = liftIO $ openTempFile tmpdir "jlog"
 | 
			
		||||
 | 
			
		||||
{- This is run after the refs have been merged into the index,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,7 +18,6 @@ import Utility.DataUnits
 | 
			
		|||
import Utility.CopyFile
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
 | 
			
		||||
import System.PosixCompat.Files
 | 
			
		||||
import qualified System.FilePath.ByteString as P
 | 
			
		||||
 | 
			
		||||
{- Runs the secure erase command if set, otherwise does nothing.
 | 
			
		||||
| 
						 | 
				
			
			@ -75,8 +74,9 @@ checkedCopyFile key src dest destmode = catchBoolIO $
 | 
			
		|||
		=<< liftIO (R.getFileStatus src)
 | 
			
		||||
 | 
			
		||||
checkedCopyFile' :: Key -> RawFilePath -> RawFilePath -> Maybe FileMode -> FileStatus -> Annex Bool
 | 
			
		||||
checkedCopyFile' key src dest destmode s = catchBoolIO $
 | 
			
		||||
	ifM (checkDiskSpace' (fromIntegral $ fileSize s) (Just $ P.takeDirectory dest) key 0 True)
 | 
			
		||||
checkedCopyFile' key src dest destmode s = catchBoolIO $ do
 | 
			
		||||
	sz <- liftIO $ getFileSize' src s
 | 
			
		||||
	ifM (checkDiskSpace' sz (Just $ P.takeDirectory dest) key 0 True)
 | 
			
		||||
		( liftIO $
 | 
			
		||||
			copyFileExternal CopyAllMetaData (fromRawFilePath src) (fromRawFilePath dest)
 | 
			
		||||
				<&&> preserveGitMode dest destmode
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,12 +9,6 @@
 | 
			
		|||
 | 
			
		||||
module Annex.Content.PointerFile where
 | 
			
		||||
 | 
			
		||||
#if ! defined(mingw32_HOST_OS)
 | 
			
		||||
import System.Posix.Files
 | 
			
		||||
#else
 | 
			
		||||
import System.PosixCompat.Files
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
import Annex.Common
 | 
			
		||||
import Annex.Perms
 | 
			
		||||
import Annex.Link
 | 
			
		||||
| 
						 | 
				
			
			@ -22,10 +16,11 @@ import Annex.ReplaceFile
 | 
			
		|||
import Annex.InodeSentinal
 | 
			
		||||
import Annex.Content.LowLevel
 | 
			
		||||
import Utility.InodeCache
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
#if ! defined(mingw32_HOST_OS)
 | 
			
		||||
import Utility.Touch
 | 
			
		||||
import System.Posix.Files (modificationTimeHiRes)
 | 
			
		||||
#endif
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
 | 
			
		||||
{- Populates a pointer file with the content of a key. 
 | 
			
		||||
 -
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,9 +49,9 @@ import Git.FilePath
 | 
			
		|||
import Annex.InodeSentinal
 | 
			
		||||
import Annex.AdjustedBranch
 | 
			
		||||
import Annex.FileMatcher
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
 | 
			
		||||
import Control.Exception (IOException)
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
 | 
			
		||||
data LockedDown = LockedDown
 | 
			
		||||
	{ lockDownConfig :: LockDownConfig
 | 
			
		||||
| 
						 | 
				
			
			@ -113,7 +113,7 @@ lockDown' cfg file = tryIO $ ifM crippledFileSystem
 | 
			
		|||
			(tmpfile, h) <- openTempFile (fromRawFilePath tmpdir) $
 | 
			
		||||
				relatedTemplate $ "ingest-" ++ takeFileName file
 | 
			
		||||
			hClose h
 | 
			
		||||
			removeWhenExistsWith removeLink tmpfile
 | 
			
		||||
			removeWhenExistsWith R.removeLink (toRawFilePath tmpfile)
 | 
			
		||||
			withhardlink' delta tmpfile
 | 
			
		||||
				`catchIO` const (nohardlink' delta)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,8 +49,8 @@ import Annex.InodeSentinal
 | 
			
		|||
import Upgrade
 | 
			
		||||
import Annex.Tmp
 | 
			
		||||
import Utility.UserInfo
 | 
			
		||||
#ifndef mingw32_HOST_OS
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
#ifndef mingw32_HOST_OS
 | 
			
		||||
import Utility.ThreadScheduler
 | 
			
		||||
import Annex.Perms
 | 
			
		||||
import Utility.FileMode
 | 
			
		||||
| 
						 | 
				
			
			@ -212,9 +212,9 @@ probeCrippledFileSystem' tmp = do
 | 
			
		|||
  where
 | 
			
		||||
	probe f = catchDefaultIO (True, []) $ do
 | 
			
		||||
		let f2 = f ++ "2"
 | 
			
		||||
		removeWhenExistsWith removeLink f2
 | 
			
		||||
		removeWhenExistsWith R.removeLink (toRawFilePath f2)
 | 
			
		||||
		createSymbolicLink f f2
 | 
			
		||||
		removeWhenExistsWith removeLink f2
 | 
			
		||||
		removeWhenExistsWith R.removeLink (toRawFilePath f2)
 | 
			
		||||
		preventWrite (toRawFilePath f)
 | 
			
		||||
		-- Should be unable to write to the file, unless
 | 
			
		||||
		-- running as root, but some crippled
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -337,7 +337,7 @@ forceStopSsh socketfile = withNullHandle $ \nullh -> do
 | 
			
		|||
		}
 | 
			
		||||
	void $ liftIO $ catchMaybeIO $ withCreateProcess p $ \_ _ _ pid ->
 | 
			
		||||
		forceSuccessProcess p pid
 | 
			
		||||
	liftIO $ removeWhenExistsWith removeLink socketfile
 | 
			
		||||
	liftIO $ removeWhenExistsWith R.removeLink (toRawFilePath socketfile)
 | 
			
		||||
 | 
			
		||||
{- This needs to be as short as possible, due to limitations on the length
 | 
			
		||||
 - of the path to a socket file. At the same time, it needs to be unique
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,6 +12,7 @@ import qualified Annex
 | 
			
		|||
import Annex.LockFile
 | 
			
		||||
import Annex.Perms
 | 
			
		||||
import Types.CleanupActions
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
 | 
			
		||||
import Data.Time.Clock.POSIX
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -67,5 +68,5 @@ cleanupOtherTmp = do
 | 
			
		|||
		let oldenough = now - (60 * 60 * 24 * 7)
 | 
			
		||||
		catchMaybeIO (modificationTime <$> getSymbolicLinkStatus f) >>= \case
 | 
			
		||||
			Just mtime | realToFrac mtime <= oldenough -> 
 | 
			
		||||
				void $ tryIO $ removeWhenExistsWith removeLink f
 | 
			
		||||
				void $ tryIO $ removeWhenExistsWith R.removeLink (toRawFilePath f)
 | 
			
		||||
			_ -> return ()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,6 +30,7 @@ import qualified Data.Text as T
 | 
			
		|||
#endif
 | 
			
		||||
import qualified Utility.Lsof as Lsof
 | 
			
		||||
import Utility.ThreadScheduler
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
 | 
			
		||||
import Control.Concurrent.Async
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -149,7 +150,7 @@ repairStaleLocks lockfiles = go =<< getsizes
 | 
			
		|||
			waitforit "to check stale git lock file"
 | 
			
		||||
			l' <- getsizes
 | 
			
		||||
			if l' == l
 | 
			
		||||
				then liftIO $ mapM_ (removeWhenExistsWith removeLink . fst) l
 | 
			
		||||
				then liftIO $ mapM_ (removeWhenExistsWith R.removeLink . toRawFilePath . fst) l
 | 
			
		||||
				else go l'
 | 
			
		||||
		, do
 | 
			
		||||
			waitforit "for git lock file writer"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,6 +41,7 @@ import qualified BuildInfo
 | 
			
		|||
import qualified Utility.Url as Url
 | 
			
		||||
import qualified Annex.Url as Url hiding (download)
 | 
			
		||||
import Utility.Tuple
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
 | 
			
		||||
import Data.Either
 | 
			
		||||
import qualified Data.Map as M
 | 
			
		||||
| 
						 | 
				
			
			@ -220,7 +221,7 @@ upgradeToDistribution newdir cleanup distributionfile = do
 | 
			
		|||
			error $ "did not find " ++ dir ++ " in " ++ distributionfile
 | 
			
		||||
	makeorigsymlink olddir = do
 | 
			
		||||
		let origdir = fromRawFilePath (parentDir (toRawFilePath olddir)) </> installBase
 | 
			
		||||
		removeWhenExistsWith removeLink origdir
 | 
			
		||||
		removeWhenExistsWith R.removeLink (toRawFilePath origdir)
 | 
			
		||||
		createSymbolicLink newdir origdir
 | 
			
		||||
 | 
			
		||||
{- Finds where the old version was installed. -}
 | 
			
		||||
| 
						 | 
				
			
			@ -278,8 +279,8 @@ installBase = "git-annex." ++
 | 
			
		|||
deleteFromManifest :: FilePath -> IO ()
 | 
			
		||||
deleteFromManifest dir = do
 | 
			
		||||
	fs <- map (dir </>) . lines <$> catchDefaultIO "" (readFile manifest)
 | 
			
		||||
	mapM_ (removeWhenExistsWith removeLink) fs
 | 
			
		||||
	removeWhenExistsWith removeLink manifest
 | 
			
		||||
	mapM_ (removeWhenExistsWith R.removeLink . toRawFilePath) fs
 | 
			
		||||
	removeWhenExistsWith R.removeLink (toRawFilePath manifest)
 | 
			
		||||
	removeEmptyRecursive dir
 | 
			
		||||
  where
 | 
			
		||||
	manifest = dir </> "git-annex.MANIFEST"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,6 +17,7 @@ import Annex.Perms
 | 
			
		|||
import Utility.ThreadScheduler
 | 
			
		||||
import Utility.DiskFree
 | 
			
		||||
import Git.Types (fromConfigKey)
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
 | 
			
		||||
import Data.Time.Clock
 | 
			
		||||
import System.Random (getStdRandom, random, randomR)
 | 
			
		||||
| 
						 | 
				
			
			@ -178,7 +179,7 @@ runFuzzAction (FuzzAdd (FuzzFile f)) = do
 | 
			
		|||
	n <- liftIO (getStdRandom random :: IO Int)
 | 
			
		||||
	liftIO $ writeFile f $ show n ++ "\n"
 | 
			
		||||
runFuzzAction (FuzzDelete (FuzzFile f)) = liftIO $
 | 
			
		||||
	removeWhenExistsWith removeLink f
 | 
			
		||||
	removeWhenExistsWith R.removeLink (toRawFilePath f)
 | 
			
		||||
runFuzzAction (FuzzMove (FuzzFile src) (FuzzFile dest)) = liftIO $
 | 
			
		||||
	rename src dest
 | 
			
		||||
runFuzzAction (FuzzDeleteDir (FuzzDir d)) = liftIO $
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,6 +27,7 @@ import Utility.Hash
 | 
			
		|||
import Utility.Tmp
 | 
			
		||||
import Utility.Tmp.Dir
 | 
			
		||||
import Utility.Process.Transcript
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
 | 
			
		||||
import Data.Char
 | 
			
		||||
import qualified Data.ByteString.Lazy.UTF8 as B8
 | 
			
		||||
| 
						 | 
				
			
			@ -84,7 +85,7 @@ genAddress = starting "gen-address" (ActionItemOther Nothing) (SeekInput []) $ d
 | 
			
		|||
		KeyContainer s -> liftIO $ genkey (Param s)
 | 
			
		||||
		KeyFile f -> do
 | 
			
		||||
			createAnnexDirectory (toRawFilePath (takeDirectory f))
 | 
			
		||||
			liftIO $ removeWhenExistsWith removeLink f
 | 
			
		||||
			liftIO $ removeWhenExistsWith R.removeLink (toRawFilePath f)
 | 
			
		||||
			liftIO $ protectedOutput $ genkey (File f)
 | 
			
		||||
	case (ok, parseFingerprint s) of
 | 
			
		||||
		(False, _) -> giveup $ "uftp_keymgt failed: " ++ s
 | 
			
		||||
| 
						 | 
				
			
			@ -210,7 +211,7 @@ storeReceived f = do
 | 
			
		|||
	case deserializeKey (takeFileName f) of
 | 
			
		||||
		Nothing -> do
 | 
			
		||||
			warning $ "Received a file " ++ f ++ " that is not a git-annex key. Deleting this file."
 | 
			
		||||
			liftIO $ removeWhenExistsWith removeLink f
 | 
			
		||||
			liftIO $ removeWhenExistsWith R.removeLink (toRawFilePath f)
 | 
			
		||||
		Just k -> void $
 | 
			
		||||
			getViaTmpFromDisk RetrievalVerifiableKeysSecure AlwaysVerify k (AssociatedFile Nothing) $ \dest -> unVerified $
 | 
			
		||||
				liftIO $ catchBoolIO $ do
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,6 +24,7 @@ import Utility.AuthToken
 | 
			
		|||
import Utility.Tmp.Dir
 | 
			
		||||
import Utility.FileMode
 | 
			
		||||
import Utility.ThreadScheduler
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
import qualified Utility.MagicWormhole as Wormhole
 | 
			
		||||
 | 
			
		||||
import Control.Concurrent.Async
 | 
			
		||||
| 
						 | 
				
			
			@ -256,7 +257,7 @@ wormholePairing remotename ouraddrs ui = do
 | 
			
		|||
			Wormhole.sendFile sendf observer wormholeparams
 | 
			
		||||
				`concurrently`
 | 
			
		||||
			Wormhole.receiveFile recvf producer wormholeparams
 | 
			
		||||
		liftIO $ removeWhenExistsWith removeLink sendf
 | 
			
		||||
		liftIO $ removeWhenExistsWith R.removeLink (toRawFilePath sendf)
 | 
			
		||||
		if sendres /= True
 | 
			
		||||
			then return SendFailed
 | 
			
		||||
			else if recvres /= True
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,6 +32,7 @@ import Types.ScheduledActivity
 | 
			
		|||
import Types.NumCopies
 | 
			
		||||
import Remote
 | 
			
		||||
import Git.Types (fromConfigKey, fromConfigValue)
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
 | 
			
		||||
cmd :: Command
 | 
			
		||||
cmd = command "vicfg" SectionSetup "edit configuration in git-annex branch"
 | 
			
		||||
| 
						 | 
				
			
			@ -58,7 +59,7 @@ vicfg curcfg f = do
 | 
			
		|||
	unlessM (liftIO $ boolSystem "sh" [Param "-c", Param $ unwords [vi, shellEscape f]]) $
 | 
			
		||||
		giveup $ vi ++ " exited nonzero; aborting"
 | 
			
		||||
	r <- parseCfg (defCfg curcfg) <$> liftIO (readFileStrict f)
 | 
			
		||||
	liftIO $ removeWhenExistsWith removeLink f
 | 
			
		||||
	liftIO $ removeWhenExistsWith R.removeLink (toRawFilePath f)
 | 
			
		||||
	case r of
 | 
			
		||||
		Left s -> do
 | 
			
		||||
			liftIO $ writeFile f s
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ import Data.Default as X
 | 
			
		|||
import System.FilePath as X
 | 
			
		||||
import System.IO as X hiding (FilePath)
 | 
			
		||||
import System.Exit as X
 | 
			
		||||
import System.PosixCompat.Files as X hiding (fileSize)
 | 
			
		||||
import System.PosixCompat.Files as X hiding (fileSize, removeLink)
 | 
			
		||||
 | 
			
		||||
import Utility.Misc as X
 | 
			
		||||
import Utility.Exception as X
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										8
									
								
								Creds.hs
									
										
									
									
									
								
							
							
						
						
									
										8
									
								
								Creds.hs
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -32,12 +32,13 @@ import Crypto
 | 
			
		|||
import Types.ProposedAccepted
 | 
			
		||||
import Remote.Helper.Encryptable (remoteCipher, remoteCipher', embedCreds, EncryptionIsSetup, extractCipher)
 | 
			
		||||
import Utility.Env (getEnv)
 | 
			
		||||
import Utility.Base64
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
 | 
			
		||||
import qualified Data.ByteString.Lazy.Char8 as L
 | 
			
		||||
import qualified Data.ByteString.Char8 as S
 | 
			
		||||
import qualified Data.Map as M
 | 
			
		||||
import qualified System.FilePath.ByteString as P
 | 
			
		||||
import Utility.Base64
 | 
			
		||||
 | 
			
		||||
{- A CredPair can be stored in a file, or in the environment, or
 | 
			
		||||
 - in a remote's configuration. -}
 | 
			
		||||
| 
						 | 
				
			
			@ -211,9 +212,8 @@ decodeCredPair creds = case lines creds of
 | 
			
		|||
 | 
			
		||||
removeCreds :: FilePath -> Annex ()
 | 
			
		||||
removeCreds file = do
 | 
			
		||||
	d <- fromRawFilePath <$> fromRepo gitAnnexCredsDir
 | 
			
		||||
	let f = d </> file
 | 
			
		||||
	liftIO $ removeWhenExistsWith removeLink f
 | 
			
		||||
	d <- fromRepo gitAnnexCredsDir
 | 
			
		||||
	liftIO $ removeWhenExistsWith R.removeLink (d P.</> toRawFilePath file)
 | 
			
		||||
 | 
			
		||||
includeCredsInfo :: ParsedRemoteConfig -> CredPairStorage -> [(String, String)] -> Annex [(String, String)]
 | 
			
		||||
includeCredsInfo pc@(ParsedRemoteConfig cm _) storage info = do
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,6 +5,8 @@
 | 
			
		|||
 - Licensed under the GNU AGPL version 3 or higher.
 | 
			
		||||
 -}
 | 
			
		||||
 | 
			
		||||
{-# LANGUAGE OverloadedStrings #-}
 | 
			
		||||
 | 
			
		||||
module Git.Repair (
 | 
			
		||||
	runRepair,
 | 
			
		||||
	runRepairOf,
 | 
			
		||||
| 
						 | 
				
			
			@ -243,11 +245,12 @@ getAllRefs' refdir = do
 | 
			
		|||
explodePackedRefsFile :: Repo -> IO ()
 | 
			
		||||
explodePackedRefsFile r = do
 | 
			
		||||
	let f = packedRefsFile r
 | 
			
		||||
	let f' = toRawFilePath f
 | 
			
		||||
	whenM (doesFileExist f) $ do
 | 
			
		||||
		rs <- mapMaybe parsePacked . lines
 | 
			
		||||
			<$> catchDefaultIO "" (safeReadFile f)
 | 
			
		||||
			<$> catchDefaultIO "" (safeReadFile f')
 | 
			
		||||
		forM_ rs makeref
 | 
			
		||||
		removeWhenExistsWith removeLink f
 | 
			
		||||
		removeWhenExistsWith R.removeLink f'
 | 
			
		||||
  where
 | 
			
		||||
	makeref (sha, ref) = do
 | 
			
		||||
		let gitd = localGitDir r
 | 
			
		||||
| 
						 | 
				
			
			@ -444,13 +447,13 @@ displayList items header
 | 
			
		|||
preRepair :: Repo -> IO ()
 | 
			
		||||
preRepair g = do
 | 
			
		||||
	unlessM (validhead <$> catchDefaultIO "" (safeReadFile headfile)) $ do
 | 
			
		||||
		removeWhenExistsWith removeLink headfile
 | 
			
		||||
		writeFile headfile "ref: refs/heads/master"
 | 
			
		||||
		removeWhenExistsWith R.removeLink headfile
 | 
			
		||||
		writeFile (fromRawFilePath headfile) "ref: refs/heads/master"
 | 
			
		||||
	explodePackedRefsFile g
 | 
			
		||||
	unless (repoIsLocalBare g) $
 | 
			
		||||
		void $ tryIO $ allowWrite $ indexFile g
 | 
			
		||||
  where
 | 
			
		||||
	headfile = fromRawFilePath (localGitDir g) </> "HEAD"
 | 
			
		||||
	headfile = localGitDir g P.</> "HEAD"
 | 
			
		||||
	validhead s = "ref: refs/" `isPrefixOf` s
 | 
			
		||||
		|| isJust (extractSha (encodeBS' s))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -616,7 +619,7 @@ runRepair' removablebranch fsckresult forced referencerepo g = do
 | 
			
		|||
successfulRepair :: (Bool, [Branch]) -> Bool
 | 
			
		||||
successfulRepair = fst
 | 
			
		||||
 | 
			
		||||
safeReadFile :: FilePath -> IO String
 | 
			
		||||
safeReadFile :: RawFilePath -> IO String
 | 
			
		||||
safeReadFile f = do
 | 
			
		||||
	allowRead (toRawFilePath f)
 | 
			
		||||
	readFileStrict f
 | 
			
		||||
	allowRead f
 | 
			
		||||
	readFileStrict (fromRawFilePath f)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,6 +37,7 @@ import Utility.Tor
 | 
			
		|||
import Utility.FileMode
 | 
			
		||||
import Types.UUID
 | 
			
		||||
import Annex.ChangedRefs
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
 | 
			
		||||
import Control.Monad.Free
 | 
			
		||||
import Control.Monad.IO.Class
 | 
			
		||||
| 
						 | 
				
			
			@ -124,7 +125,7 @@ closeConnection conn = do
 | 
			
		|||
-- the callback.
 | 
			
		||||
serveUnixSocket :: FilePath -> (Handle -> IO ()) -> IO ()
 | 
			
		||||
serveUnixSocket unixsocket serveconn = do
 | 
			
		||||
	removeWhenExistsWith removeLink unixsocket
 | 
			
		||||
	removeWhenExistsWith R.removeLink (toRawFilePath unixsocket)
 | 
			
		||||
	soc <- S.socket S.AF_UNIX S.Stream S.defaultProtocol
 | 
			
		||||
	S.bind soc (S.SockAddrUnix unixsocket)
 | 
			
		||||
	-- Allow everyone to read and write to the socket,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -301,10 +301,10 @@ retrieveExportM d _k loc dest p =
 | 
			
		|||
 | 
			
		||||
removeExportM :: RawFilePath -> Key -> ExportLocation -> Annex ()
 | 
			
		||||
removeExportM d _k loc = liftIO $ do
 | 
			
		||||
	removeWhenExistsWith removeLink src
 | 
			
		||||
	removeWhenExistsWith R.removeLink src
 | 
			
		||||
	removeExportLocation d loc
 | 
			
		||||
  where
 | 
			
		||||
	src = fromRawFilePath $ exportPath d loc
 | 
			
		||||
	src = exportPath d loc
 | 
			
		||||
 | 
			
		||||
checkPresentExportM :: RawFilePath -> Key -> ExportLocation -> Annex Bool
 | 
			
		||||
checkPresentExportM d _k loc =
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,6 +22,7 @@ import qualified Remote.Helper.Chunked.Legacy as Legacy
 | 
			
		|||
import Annex.Tmp
 | 
			
		||||
import Utility.Metered
 | 
			
		||||
import Utility.Directory.Create
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
 | 
			
		||||
withCheckedFiles :: (FilePath -> IO Bool) -> FilePath -> (FilePath -> Key -> [FilePath]) -> Key -> ([FilePath] -> IO Bool) -> IO Bool
 | 
			
		||||
withCheckedFiles _ [] _locations _ _ = return False
 | 
			
		||||
| 
						 | 
				
			
			@ -98,15 +99,15 @@ store repotop chunksize finalizer k b p = storeHelper repotop finalizer k $ \des
 | 
			
		|||
retrieve :: (RawFilePath -> Key -> [RawFilePath]) -> RawFilePath -> Retriever
 | 
			
		||||
retrieve locations d basek p c = withOtherTmp $ \tmpdir -> do
 | 
			
		||||
	showLongNote "This remote uses the deprecated chunksize setting. So this will be quite slow."
 | 
			
		||||
	let tmp = fromRawFilePath $ 
 | 
			
		||||
		tmpdir P.</> keyFile basek <> ".directorylegacy.tmp"
 | 
			
		||||
	let tmp = tmpdir P.</> keyFile basek <> ".directorylegacy.tmp"
 | 
			
		||||
	let tmp' = fromRawFilePath tmp
 | 
			
		||||
	let go = \k sink -> do
 | 
			
		||||
		liftIO $ void $ withStoredFiles (fromRawFilePath d) (legacyLocations locations) k $ \fs -> do
 | 
			
		||||
			forM_ fs $
 | 
			
		||||
				S.appendFile tmp <=< S.readFile
 | 
			
		||||
				S.appendFile tmp' <=< S.readFile
 | 
			
		||||
			return True
 | 
			
		||||
		b <- liftIO $ L.readFile tmp
 | 
			
		||||
		liftIO $ removeWhenExistsWith removeLink tmp
 | 
			
		||||
		b <- liftIO $ L.readFile tmp'
 | 
			
		||||
		liftIO $ removeWhenExistsWith R.removeLink tmp
 | 
			
		||||
		sink b
 | 
			
		||||
	byteRetriever go basek p c
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,6 +51,7 @@ import Messages.Progress
 | 
			
		|||
import qualified Git
 | 
			
		||||
import qualified Git.Construct
 | 
			
		||||
import Git.Types
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
 | 
			
		||||
import qualified Data.ByteString as S
 | 
			
		||||
import qualified Data.ByteString.Lazy as L
 | 
			
		||||
| 
						 | 
				
			
			@ -284,10 +285,10 @@ sink dest enc c mh mp content = case (enc, mh, content) of
 | 
			
		|||
		withBytes content $ \b ->
 | 
			
		||||
			decrypt cmd c cipher (feedBytes b) $
 | 
			
		||||
				readBytes write
 | 
			
		||||
		liftIO $ removeWhenExistsWith removeLink f
 | 
			
		||||
		liftIO $ removeWhenExistsWith R.removeLink (toRawFilePath f)
 | 
			
		||||
	(Nothing, _, FileContent f) -> do
 | 
			
		||||
		withBytes content write
 | 
			
		||||
		liftIO $ removeWhenExistsWith removeLink f
 | 
			
		||||
		liftIO $ removeWhenExistsWith R.removeLink (toRawFilePath f)
 | 
			
		||||
	(Nothing, _, ByteContent b) -> write b
 | 
			
		||||
  where
 | 
			
		||||
	write b = case mh of
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										10
									
								
								Test.hs
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								Test.hs
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -412,7 +412,7 @@ test_ignore_deleted_files :: Assertion
 | 
			
		|||
test_ignore_deleted_files = intmpclonerepo $ do
 | 
			
		||||
	git_annex "get" [annexedfile] @? "get failed"
 | 
			
		||||
	git_annex_expectoutput "find" [] [annexedfile]
 | 
			
		||||
	removeWhenExistsWith removeLink annexedfile
 | 
			
		||||
	removeWhenExistsWith R.removeLink (toRawFilePath annexedfile)
 | 
			
		||||
	-- A file that has been deleted, but the deletion not staged,
 | 
			
		||||
	-- is a special case; make sure git-annex skips these.
 | 
			
		||||
	git_annex_expectoutput "find" [] []
 | 
			
		||||
| 
						 | 
				
			
			@ -1332,7 +1332,7 @@ test_remove_conflict_resolution = do
 | 
			
		|||
					@? "unlock conflictor failed"
 | 
			
		||||
				writecontent conflictor "newconflictor"
 | 
			
		||||
			indir r1 $
 | 
			
		||||
				removeWhenExistsWith removeLink conflictor
 | 
			
		||||
				removeWhenExistsWith R.removeLink (toRawFilePath conflictor)
 | 
			
		||||
			let l = if inr1 then [r1, r2, r1] else [r2, r1, r2]
 | 
			
		||||
			forM_ l $ \r -> indir r $
 | 
			
		||||
				git_annex "sync" [] @? "sync failed"
 | 
			
		||||
| 
						 | 
				
			
			@ -1861,7 +1861,7 @@ test_export_import = intmpclonerepo $ do
 | 
			
		|||
	git_annex "merge" ["foo/" ++ origbranch] @? "git annex merge failed"
 | 
			
		||||
	annexed_present_imported "import"
 | 
			
		||||
 | 
			
		||||
	removeWhenExistsWith removeLink "import"
 | 
			
		||||
	removeWhenExistsWith R.removeLink (toRawFilePath "import")
 | 
			
		||||
	writecontent "import" (content "newimport1")
 | 
			
		||||
	git_annex "add" ["import"] @? "add of import failed"
 | 
			
		||||
	commitchanges
 | 
			
		||||
| 
						 | 
				
			
			@ -1870,7 +1870,7 @@ test_export_import = intmpclonerepo $ do
 | 
			
		|||
 | 
			
		||||
	-- verify that export refuses to overwrite modified file
 | 
			
		||||
	writedir "import" (content "newimport2")
 | 
			
		||||
	removeWhenExistsWith removeLink "import"
 | 
			
		||||
	removeWhenExistsWith R.removeLink (toRawFilePath "import")
 | 
			
		||||
	writecontent "import" (content "newimport3")
 | 
			
		||||
	git_annex "add" ["import"] @? "add of import failed"
 | 
			
		||||
	commitchanges
 | 
			
		||||
| 
						 | 
				
			
			@ -1880,7 +1880,7 @@ test_export_import = intmpclonerepo $ do
 | 
			
		|||
	-- resolving import conflict
 | 
			
		||||
	git_annex "import" [origbranch, "--from", "foo"] @? "import from dir failed"
 | 
			
		||||
	not <$> boolSystem "git" [Param "merge", Param "foo/master", Param "-mmerge"] @? "git merge of conflict failed to exit nonzero"
 | 
			
		||||
	removeWhenExistsWith removeLink "import"
 | 
			
		||||
	removeWhenExistsWith R.removeLink (toRawFilePath "import")
 | 
			
		||||
	writecontent "import" (content "newimport3")
 | 
			
		||||
	git_annex "add" ["import"] @? "add of import failed"
 | 
			
		||||
	commitchanges
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,6 +32,7 @@ import Git.Ref
 | 
			
		|||
import Utility.InodeCache
 | 
			
		||||
import Utility.DottedVersion
 | 
			
		||||
import Annex.AdjustedBranch
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
 | 
			
		||||
import qualified Data.ByteString as S
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -156,7 +157,7 @@ upgradeDirectWorkTree = do
 | 
			
		|||
		)
 | 
			
		||||
	
 | 
			
		||||
	writepointer f k = liftIO $ do
 | 
			
		||||
		removeWhenExistsWith removeLink f
 | 
			
		||||
		removeWhenExistsWith R.removeLink (toRawFilePath f)
 | 
			
		||||
		S.writeFile f (formatPointer k)
 | 
			
		||||
 | 
			
		||||
{- Remove all direct mode bookkeeping files. -}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,7 +16,7 @@ module Utility.Directory (
 | 
			
		|||
 | 
			
		||||
import Control.Monad
 | 
			
		||||
import System.FilePath
 | 
			
		||||
import System.PosixCompat.Files
 | 
			
		||||
import System.PosixCompat.Files hiding (removeLink)
 | 
			
		||||
import Control.Applicative
 | 
			
		||||
import System.IO.Unsafe (unsafeInterleaveIO)
 | 
			
		||||
import Data.Maybe
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,7 +16,7 @@ module Utility.FileMode (
 | 
			
		|||
import System.IO
 | 
			
		||||
import Control.Monad
 | 
			
		||||
import System.PosixCompat.Types
 | 
			
		||||
import System.PosixCompat.Files
 | 
			
		||||
import System.PosixCompat.Files hiding (removeLink)
 | 
			
		||||
import Control.Monad.IO.Class
 | 
			
		||||
import Foreign (complement)
 | 
			
		||||
import Control.Monad.Catch
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,7 +14,7 @@ module Utility.FileSize (
 | 
			
		|||
	getFileSize',
 | 
			
		||||
) where
 | 
			
		||||
 | 
			
		||||
import System.PosixCompat.Files
 | 
			
		||||
import System.PosixCompat.Files hiding (removeLink)
 | 
			
		||||
import qualified Utility.RawFilePath as R
 | 
			
		||||
#ifdef mingw32_HOST_OS
 | 
			
		||||
import Control.Exception (bracket)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,7 +15,7 @@ module Utility.MoveFile (
 | 
			
		|||
 | 
			
		||||
import Control.Monad
 | 
			
		||||
import System.FilePath
 | 
			
		||||
import System.PosixCompat.Files
 | 
			
		||||
import System.PosixCompat.Files hiding (removeLink)
 | 
			
		||||
import System.IO.Error
 | 
			
		||||
import Prelude
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,7 @@ import System.IO
 | 
			
		|||
import System.FilePath
 | 
			
		||||
import System.Directory
 | 
			
		||||
import Control.Monad.IO.Class
 | 
			
		||||
import System.PosixCompat.Files
 | 
			
		||||
import System.PosixCompat.Files hiding (removeLink)
 | 
			
		||||
 | 
			
		||||
import Utility.Exception
 | 
			
		||||
import Utility.FileSystemEncoding
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue