This is groundwork for letting a repo be instantiated the first time it's actually used, instead of at startup. The only behavior change is that some old special cases for xmpp remotes were removed. Where before git-annex silently did nothing with those no-longer supported remotes, it may now fail in some way. The additional IO action should have no performance impact as long as it's simply return. This commit was sponsored by Boyd Stephen Smith Jr. on Patreon
		
			
				
	
	
		
			49 lines
		
	
	
	
		
			1.4 KiB
			
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
	
		
			1.4 KiB
			
		
	
	
	
		
			Haskell
		
	
	
	
	
	
{- Utilities for git remotes.
 | 
						|
 -
 | 
						|
 - Copyright 2011-2014 Joey Hess <id@joeyh.name>
 | 
						|
 -
 | 
						|
 - Licensed under the GNU GPL version 3 or higher.
 | 
						|
 -}
 | 
						|
 | 
						|
module Remote.Helper.Git where
 | 
						|
 | 
						|
import Annex.Common
 | 
						|
import qualified Git
 | 
						|
import Types.Availability
 | 
						|
import qualified Types.Remote as Remote
 | 
						|
 | 
						|
import Data.Time.Clock.POSIX
 | 
						|
 | 
						|
repoCheap :: Git.Repo -> Bool
 | 
						|
repoCheap = not . Git.repoIsUrl
 | 
						|
 | 
						|
localpathCalc :: Git.Repo -> Maybe FilePath
 | 
						|
localpathCalc r
 | 
						|
	| availabilityCalc r == GloballyAvailable = Nothing
 | 
						|
	| otherwise = Just $ Git.repoPath r
 | 
						|
 | 
						|
availabilityCalc :: Git.Repo -> Availability
 | 
						|
availabilityCalc r
 | 
						|
	| (Git.repoIsLocal r || Git.repoIsLocalUnknown r) = LocallyAvailable
 | 
						|
	| otherwise = GloballyAvailable
 | 
						|
 | 
						|
{- Avoids performing an action on a local repository that's not usable.
 | 
						|
 - Does not check that the repository is still available on disk. -}
 | 
						|
guardUsable :: Git.Repo -> Annex a -> Annex a -> Annex a
 | 
						|
guardUsable r fallback a
 | 
						|
	| Git.repoIsLocalUnknown r = fallback
 | 
						|
	| otherwise = a
 | 
						|
 | 
						|
gitRepoInfo :: Remote -> Annex [(String, String)]
 | 
						|
gitRepoInfo r = do
 | 
						|
	d <- fromRepo Git.localGitDir
 | 
						|
	mtimes <- liftIO $ mapM (modificationTime <$$> getFileStatus)
 | 
						|
		=<< dirContentsRecursive (d </> "refs" </> "remotes" </> Remote.name r)
 | 
						|
	let lastsynctime = case mtimes of
 | 
						|
		[] -> "never"
 | 
						|
		_ -> show $ posixSecondsToUTCTime $ realToFrac $ maximum mtimes
 | 
						|
	repo <- Remote.getRepo r
 | 
						|
	return
 | 
						|
		[ ("repository location", Git.repoLocation repo)
 | 
						|
		, ("last synced", lastsynctime)
 | 
						|
		]
 |