packages feed

git-annex 3.20110705 → 3.20110707

raw patch · 198 files changed

+876/−3080 lines, 198 files

Files

Annex.hs view
@@ -34,7 +34,6 @@ data AnnexState = AnnexState 	{ repo :: Git.Repo 	, backends :: [Backend Annex]-	, supportedBackends :: [Backend Annex] 	, remotes :: [Remote Annex] 	, repoqueue :: Queue 	, quiet :: Bool@@ -52,12 +51,11 @@ 	, cipher :: Maybe Cipher 	} -newState :: [Backend Annex] -> Git.Repo -> AnnexState-newState allbackends gitrepo = AnnexState+newState :: Git.Repo -> AnnexState+newState gitrepo = AnnexState 	{ repo = gitrepo 	, backends = [] 	, remotes = []-	, supportedBackends = allbackends 	, repoqueue = empty 	, quiet = False 	, force = False@@ -75,9 +73,8 @@ 	}  {- Create and returns an Annex state object for the specified git repo. -}-new :: Git.Repo -> [Backend Annex] -> IO AnnexState-new gitrepo allbackends =-	newState allbackends `liftM` (liftIO . Git.configRead) gitrepo+new :: Git.Repo -> IO AnnexState+new gitrepo = newState `liftM` (liftIO . Git.configRead) gitrepo  {- performs an action in the Annex monad -} run :: AnnexState -> Annex a -> IO (a, AnnexState)
Backend.hs view
@@ -1,16 +1,4 @@-{- git-annex key-value storage backends- -- - git-annex uses a key-value abstraction layer to allow files contents to be- - stored in different ways. In theory, any key-value storage system could be- - used to store the file contents, and git-annex would then retrieve them- - as needed and put them in `.git/annex/`.- - - - When a file is annexed, a key is generated from its content and/or metadata.- - This key can later be used to retrieve the file's content (its value). This- - key generation must be stable for a given file content, name, and size.- - - - Multiple pluggable backends are supported, and more than one can be used- - to store different files' contents in a given repository.+{- git-annex key/value backends  -  - Copyright 2010 Joey Hess <joey@kitenet.net>  -@@ -19,15 +7,10 @@  module Backend ( 	list,-	storeFileKey,-	retrieveKeyFile,-	removeKey,-	hasKey,-	fsckKey,-	upgradableKey,+	orderedList,+	genKey, 	lookupFile, 	chooseBackends,-	keyBackend, 	lookupBackendName, 	maybeLookupBackendName ) where@@ -36,7 +19,6 @@ import System.IO.Error (try) import System.FilePath import System.Posix.Files-import System.Directory  import Locations import qualified Git@@ -45,12 +27,20 @@ import Types.Key import qualified Types.Backend as B import Messages-import Content-import DataUnits +-- When adding a new backend, import it here and add it to the list.+import qualified Backend.WORM+import qualified Backend.SHA++list :: [Backend Annex]+list = concat +	[ Backend.WORM.backends+	, Backend.SHA.backends+	]+ {- List of backends in the order to try them when storing a new key. -}-list :: Annex [Backend Annex]-list = do+orderedList :: Annex [Backend Annex]+orderedList = do 	l <- Annex.getState Annex.backends -- list is cached here 	if not $ null l 		then return l@@ -59,92 +49,49 @@ 			d <- Annex.getState Annex.forcebackend 			handle d s 	where-		parseBackendList l [] = l-		parseBackendList bs s = map (lookupBackendName bs) $ words s+		parseBackendList [] = list+		parseBackendList s = map lookupBackendName $ words s 		handle Nothing s = return s 		handle (Just "") s = return s 		handle (Just name) s = do-			bs <- Annex.getState Annex.supportedBackends-			let l' = (lookupBackendName bs name):s+			let l' = (lookupBackendName name):s 			Annex.changeState $ \state -> state { Annex.backends = l' } 			return l' 		getstandard = do-			bs <- Annex.getState Annex.supportedBackends 			g <- Annex.gitRepo-			return $ parseBackendList bs $+			return $ parseBackendList $ 				Git.configGet g "annex.backends" "" -{- Looks up a backend in a list. May fail if unknown. -}-lookupBackendName :: [Backend Annex] -> String -> Backend Annex-lookupBackendName bs s = maybe unknown id $ maybeLookupBackendName bs s-	where-		unknown = error $ "unknown backend " ++ s-maybeLookupBackendName :: [Backend Annex] -> String -> Maybe (Backend Annex)-maybeLookupBackendName bs s =-	if 1 /= length matches-		then Nothing-		else Just $ head matches-	where matches = filter (\b -> s == B.name b) bs--{- Attempts to store a file in one of the backends. -}-storeFileKey :: FilePath -> Maybe (Backend Annex) -> Annex (Maybe (Key, Backend Annex))-storeFileKey file trybackend = do-	bs <- list+{- Generates a key for a file, trying each backend in turn until one+ - accepts it. -}+genKey :: FilePath -> Maybe (Backend Annex) -> Annex (Maybe (Key, Backend Annex))+genKey file trybackend = do+	bs <- orderedList 	let bs' = maybe bs (:bs) trybackend-	storeFileKey' bs' file-storeFileKey' :: [Backend Annex] -> FilePath -> Annex (Maybe (Key, Backend Annex))-storeFileKey' [] _ = return Nothing-storeFileKey' (b:bs) file = maybe nextbackend store =<< (B.getKey b) file-	where-		nextbackend = storeFileKey' bs file-		store key = do-			stored <- (B.storeFileKey b) file key-			if (not stored)-				then nextbackend-				else return $ Just (key, b)--{- Attempts to retrieve an key from one of the backends, saving it to- - a specified location. -}-retrieveKeyFile :: Backend Annex -> Key -> FilePath -> Annex Bool-retrieveKeyFile backend key dest = (B.retrieveKeyFile backend) key dest--{- Removes a key from a backend. -}-removeKey :: Backend Annex -> Key -> Maybe Int -> Annex Bool-removeKey backend key numcopies = (B.removeKey backend) key numcopies--{- Checks if a key is present in its backend. -}-hasKey :: Key -> Annex Bool-hasKey key = do-	backend <- keyBackend key-	(B.hasKey backend) key--{- Checks a key for problems. -}-fsckKey :: Backend Annex -> Key -> Maybe FilePath -> Maybe Int -> Annex Bool-fsckKey backend key file numcopies = do-	size_ok <- checkKeySize key-	backend_ok <-(B.fsckKey backend) key file numcopies-	return $ size_ok && backend_ok--{- Checks if a key is upgradable to a newer representation. -}-upgradableKey :: Backend Annex -> Key -> Annex Bool-upgradableKey backend key = (B.upgradableKey backend) key+	genKey' bs' file+genKey' :: [Backend Annex] -> FilePath -> Annex (Maybe (Key, Backend Annex))+genKey' [] _ = return Nothing+genKey' (b:bs) file = do+	r <- (B.getKey b) file+	case r of+		Nothing -> genKey' bs file+		Just k -> return $ Just (k, b)  {- Looks up the key and backend corresponding to an annexed file,  - by examining what the file symlinks to. -} lookupFile :: FilePath -> Annex (Maybe (Key, Backend Annex)) lookupFile file = do-	bs <- Annex.getState Annex.supportedBackends 	tl <- liftIO $ try getsymlink 	case tl of 		Left _ -> return Nothing-		Right l -> makekey bs l+		Right l -> makekey l 	where 		getsymlink = do 			l <- readSymbolicLink file 			return $ takeFileName l-		makekey bs l = maybe (return Nothing) (makeret bs l) (fileKey l)-		makeret bs l k =-			case maybeLookupBackendName bs bname of+		makekey l = maybe (return Nothing) (makeret l) (fileKey l)+		makeret l k =+			case maybeLookupBackendName bname of 					Just backend -> return $ Just (k, backend) 					Nothing -> do 						when (isLinkToAnnex l) $@@ -164,37 +111,20 @@ 	forced <- Annex.getState Annex.forcebackend 	if forced /= Nothing 		then do-			l <- list+			l <- orderedList 			return $ map (\f -> (f, Just $ head l)) fs 		else do-			bs <- Annex.getState Annex.supportedBackends 			pairs <- liftIO $ Git.checkAttr g "annex.backend" fs-			return $ map (\(f,b) -> (f, maybeLookupBackendName bs b)) pairs--{- Returns the backend to use for a key. -}-keyBackend :: Key -> Annex (Backend Annex)-keyBackend key = do-	bs <- Annex.getState Annex.supportedBackends-	return $ lookupBackendName bs $ keyBackendName key+			return $ map (\(f,b) -> (f, maybeLookupBackendName b)) pairs -{- The size of the data for a key is checked against the size encoded in- - the key's metadata, if available. -}-checkKeySize :: Key -> Annex Bool-checkKeySize key = do-	g <- Annex.gitRepo-	let file = gitAnnexLocation g key-	present <- liftIO $ doesFileExist file-	case (present, keySize key) of-		(_, Nothing) -> return True-		(False, _) -> return True-		(True, Just size) -> do-			stat <- liftIO $ getFileStatus file-			let size' = fromIntegral (fileSize stat)-			if size == size'-				then return True-				else do-					dest <- moveBad key-					warning $ "Bad file size (" ++-						compareSizes storageUnits True size size' ++ -						"); moved to " ++ dest-					return False+{- Looks up a backend by name. May fail if unknown. -}+lookupBackendName :: String -> Backend Annex+lookupBackendName s = maybe unknown id $ maybeLookupBackendName s+	where+		unknown = error $ "unknown backend " ++ s+maybeLookupBackendName :: String -> Maybe (Backend Annex)+maybeLookupBackendName s =+	if 1 /= length matches+		then Nothing+		else Just $ head matches+	where matches = filter (\b -> s == B.name b) list
− Backend/File.hs
@@ -1,220 +0,0 @@-{- git-annex pseudo-backend- -- - This backend does not really do any independant data storage,- - it relies on the file contents in .git/annex/ in this repo,- - and other accessible repos.- -- - This is an abstract backend; name, getKey and fsckKey have to be implemented- - to complete it.- -- - Copyright 2010 Joey Hess <joey@kitenet.net>- -- - Licensed under the GNU GPL version 3 or higher.- -}--module Backend.File (backend, checkKey) where--import Data.List-import Data.String.Utils--import Types.Backend-import LocationLog-import qualified Remote-import qualified Git-import Content-import qualified Annex-import Types-import UUID-import Messages-import Trust-import Types.Key--backend :: Backend Annex-backend = Backend {-	name = mustProvide,-	getKey = mustProvide,-	storeFileKey = dummyStore,-	retrieveKeyFile = copyKeyFile,-	removeKey = checkRemoveKey,-	hasKey = inAnnex,-	fsckKey = checkKeyOnly,-	upgradableKey = checkUpgradableKey-}--mustProvide :: a-mustProvide = error "must provide this field"--{- Storing a key is a no-op. -}-dummyStore :: FilePath -> Key -> Annex Bool-dummyStore _ _ = return True--{- Try to find a copy of the file in one of the remotes,- - and copy it to here. -}-copyKeyFile :: Key -> FilePath -> Annex Bool-copyKeyFile key file = do-	remotes <- Remote.keyPossibilities key-	if null remotes-		then do-			showNote "not available"-			showLocations key []-			return False-		else trycopy remotes remotes-	where-		trycopy full [] = do-			showTriedRemotes full-			showLocations key []-			return False-		trycopy full (r:rs) = do-			probablythere <- probablyPresent r-			if probablythere-				then docopy r (trycopy full rs)-				else trycopy full rs-		-- This check is to avoid an ugly message if a remote is a-		-- drive that is not mounted.-		probablyPresent r =-			if Remote.hasKeyCheap r-				then do-					res <- Remote.hasKey r key-					case res of-						Right b -> return b-						Left _ -> return False-				else return True-		docopy r continue = do-			showNote $ "from " ++ Remote.name r ++ "..."-			copied <- Remote.retrieveKeyFile r key file-			if copied-				then return True-				else continue--{- Checks remotes to verify that enough copies of a key exist to allow- - for a key to be safely removed (with no data loss), and fails with an- - error if not. -}-checkRemoveKey :: Key -> Maybe Int -> Annex Bool-checkRemoveKey key numcopiesM = do-	force <- Annex.getState Annex.force-	if force || numcopiesM == Just 0-		then return True-		else do-			(remotes, trusteduuids) <- Remote.keyPossibilitiesTrusted key-			untrusteduuids <- trustGet UnTrusted-			let tocheck = Remote.remotesWithoutUUID remotes (trusteduuids++untrusteduuids)-			numcopies <- getNumCopies numcopiesM-			findcopies numcopies trusteduuids tocheck []-	where-		findcopies need have [] bad-			| length have >= need = return True-			| otherwise = notEnoughCopies need have bad-		findcopies need have (r:rs) bad-			| length have >= need = return True-			| otherwise = do-				let u = Remote.uuid r-				let dup = u `elem` have-				haskey <- Remote.hasKey r key-				case (dup, haskey) of-					(False, Right True)	-> findcopies need (u:have) rs bad-					(False, Left _)		-> findcopies need have rs (r:bad)-					_			-> findcopies need have rs bad-		notEnoughCopies need have bad = do-			unsafe-			showLongNote $-				"Could only verify the existence of " ++-				show (length have) ++ " out of " ++ show need ++ -				" necessary copies"-			showTriedRemotes bad-			showLocations key have-			hint-			return False-		unsafe = showNote "unsafe"-		hint = showLongNote "(Use --force to override this check, or adjust annex.numcopies.)"--showLocations :: Key -> [UUID] -> Annex ()-showLocations key exclude = do-	g <- Annex.gitRepo-	u <- getUUID g-	uuids <- keyLocations key-	untrusteduuids <- trustGet UnTrusted-	let uuidswanted = filteruuids uuids (u:exclude++untrusteduuids) -	let uuidsskipped = filteruuids uuids (u:exclude++uuidswanted)-	ppuuidswanted <- Remote.prettyPrintUUIDs uuidswanted-	ppuuidsskipped <- Remote.prettyPrintUUIDs uuidsskipped-	showLongNote $ message ppuuidswanted ppuuidsskipped-	where-		filteruuids list x = filter (`notElem` x) list-		message [] [] = "No other repository is known to contain the file."-		message rs [] = "Try making some of these repositories available:\n" ++ rs-		message [] us = "Also these untrusted repositories may contain the file:\n" ++ us-		message rs us = message rs [] ++ message [] us--showTriedRemotes :: [Remote.Remote Annex] -> Annex ()-showTriedRemotes [] = return ()	-showTriedRemotes remotes =-	showLongNote $ "Unable to access these remotes: " ++-		(join ", " $ map Remote.name remotes)--{- If a value is specified, it is used; otherwise the default is looked up- - in git config. forcenumcopies overrides everything. -}-getNumCopies :: Maybe Int -> Annex Int-getNumCopies v = -	Annex.getState Annex.forcenumcopies >>= maybe (use v) (return . id)-	where-		use (Just n) = return n-		use Nothing = do-			g <- Annex.gitRepo-			return $ read $ Git.configGet g config "1"-		config = "annex.numcopies"--{- Ideally, all keys have file size metadata. Old keys may not. -}-checkUpgradableKey :: Key -> Annex Bool-checkUpgradableKey key-	| keySize key == Nothing = return True-	| otherwise = return False--{- This is used to check that numcopies is satisfied for the key on fsck.- - This trusts data in the the location log, and so can check all keys, even- - those with data not present in the current annex.- -- - The passed action is first run to allow backends deriving this one- - to do their own checks.- -}-checkKey :: (Key -> Annex Bool) -> Key -> Maybe FilePath -> Maybe Int -> Annex Bool-checkKey a key file numcopies = do-	a_ok <- a key-	copies_ok <- checkKeyNumCopies key file numcopies-	return $ a_ok && copies_ok--checkKeyOnly :: Key -> Maybe FilePath -> Maybe Int -> Annex Bool-checkKeyOnly = checkKey (\_ -> return True)--checkKeyNumCopies :: Key -> Maybe FilePath -> Maybe Int -> Annex Bool-checkKeyNumCopies key file numcopies = do-	needed <- getNumCopies numcopies-	locations <- keyLocations key-	untrusted <- trustGet UnTrusted-	let untrustedlocations = intersect untrusted locations-	let safelocations = filter (`notElem` untrusted) locations-	let present = length safelocations-	if present < needed-		then do-			ppuuids <- Remote.prettyPrintUUIDs untrustedlocations-			warning $ missingNote (filename file key) present needed ppuuids-			return False-		else return True-	where-		filename Nothing k = show k-		filename (Just f) _ = f--missingNote :: String -> Int -> Int -> String -> String-missingNote file 0 _ [] = -		"** No known copies exist of " ++ file-missingNote file 0 _ untrusted =-		"Only these untrusted locations may have copies of " ++ file ++-		"\n" ++ untrusted ++-		"Back it up to trusted locations with git-annex copy."-missingNote file present needed [] =-		"Only " ++ show present ++ " of " ++ show needed ++ -		" trustworthy copies exist of " ++ file ++-		"\nBack it up with git-annex copy."-missingNote file present needed untrusted = -		missingNote file present needed [] ++-		"\nThe following untrusted locations may also have copies: " ++-		"\n" ++ untrusted
Backend/SHA.hs view
@@ -16,7 +16,6 @@ import System.Posix.Files import System.FilePath -import qualified Backend.File import Messages import qualified Annex import Locations@@ -42,10 +41,10 @@ 	| shaCommand size == Nothing = Nothing 	| otherwise = Just b 	where-		b = Backend.File.backend +		b = Types.Backend.Backend 			{ name = shaName size 			, getKey = keyValue size-			, fsckKey = Backend.File.checkKey $ checkKeyChecksum size+			, fsckKey = checkKeyChecksum size 			}  genBackendE :: SHASize -> Maybe (Backend Annex)
Backend/WORM.hs view
@@ -11,7 +11,6 @@ import System.FilePath import System.Posix.Files -import qualified Backend.File import Types.Backend import Types import Types.Key@@ -20,9 +19,10 @@ backends = [backend]  backend :: Backend Annex-backend = Backend.File.backend {+backend = Types.Backend.Backend { 	name = "WORM",-	getKey = keyValue+	getKey = keyValue,+	fsckKey = const (return True) }  {- The key includes the file size, modification time, and the
− BackendList.hs
@@ -1,19 +0,0 @@-{- git-annex backend list- -- - Copyright 2010 Joey Hess <joey@kitenet.net>- -- - Licensed under the GNU GPL version 3 or higher.- -}--module BackendList (allBackends) where---- When adding a new backend, import it here and add it to the list.-import qualified Backend.WORM-import qualified Backend.SHA-import Types--allBackends :: [Backend Annex]-allBackends = concat -	[ Backend.WORM.backends-	, Backend.SHA.backends-	]
− Base64.hs
@@ -1,18 +0,0 @@-{- Simple Base64 access- -- - Copyright 2011 Joey Hess <joey@kitenet.net>- -- - Licensed under the GNU GPL version 3 or higher.- -}--module Base64 (toB64, fromB64) where--import Codec.Binary.Base64-import Data.Bits.Utils--toB64 :: String -> String		-toB64 = encode . s2w8--fromB64 :: String -> String-fromB64 s = maybe bad w82s $ decode s-	where bad = error "bad base64 encoded data"
CHANGELOG view
@@ -1,3 +1,14 @@+git-annex (3.20110707) unstable; urgency=low++  * Fix sign bug in disk free space checking.+  * Bugfix: Forgot to de-escape keys when upgrading. Could result in+    bad location log data for keys that contain [&:%] in their names.+    (A workaround for this problem is to run git annex fsck.)+  * add: Avoid a failure mode that resulted in the file seemingly being+    deleted (content put in the annex but no symlink present).++ -- Joey Hess <joeyh@debian.org>  Thu, 07 Jul 2011 19:29:39 -0400+ git-annex (3.20110705) unstable; urgency=low    * uninit: Delete the git-annex branch and .git/annex/
CmdLine.hs view
@@ -22,7 +22,6 @@ import Content import Types import Command-import BackendList import Version import Options import Messages@@ -32,7 +31,7 @@ dispatch :: [String] -> [Command] -> [Option] -> String -> Git.Repo -> IO () dispatch args cmds options header gitrepo = do 	setupConsole-	state <- Annex.new gitrepo allBackends+	state <- Annex.new gitrepo 	(actions, state') <- Annex.run state $ parseCmd args header cmds options 	tryRun state' $ [startup] ++ actions ++ [shutdown] 
Command/Add.hs view
@@ -42,8 +42,8 @@  perform :: BackendFile -> CommandPerform perform (file, backend) = do-	stored <- Backend.storeFileKey file backend-	case stored of+	k <- Backend.genKey file backend+	case k of 		Nothing -> stop 		Just (key, _) -> do 			moveAnnex key file@@ -51,10 +51,10 @@  cleanup :: FilePath -> Key -> CommandCleanup cleanup file key = do-	logStatus key InfoPresent- 	link <- calcGitLink file key 	liftIO $ createSymbolicLink link file++	logStatus key InfoPresent  	-- touch the symlink to have the same mtime as the file it points to 	s <- liftIO $ getFileStatus file
Command/AddUrl.hs view
@@ -51,8 +51,8 @@ 	if ok 		then do 			[(_, backend)] <- Backend.chooseBackends [file]-			stored <- Backend.storeFileKey tmp backend-			case stored of+			k <- Backend.genKey tmp backend+			case k of 				Nothing -> stop 				Just (key, _) -> do 					moveAnnex key tmp
Command/Drop.hs view
@@ -8,12 +8,15 @@ module Command.Drop where  import Command-import qualified Backend+import qualified Remote+import qualified Annex import LocationLog import Types import Content import Messages import Utility+import Trust+import Config  command :: [Command] command = [repoCommand "drop" paramPath seek@@ -25,19 +28,19 @@ {- Indicates a file's content is not wanted anymore, and should be removed  - if it's safe to do so. -} start :: CommandStartAttrFile-start (file, attr) = isAnnexed file $ \(key, backend) -> do-	inbackend <- Backend.hasKey key-	if inbackend+start (file, attr) = isAnnexed file $ \(key, _) -> do+	present <- inAnnex key+	if present 		then do 			showStart "drop" file-			next $ perform key backend numcopies+			next $ perform key numcopies 		else stop 	where 		numcopies = readMaybe attr :: Maybe Int -perform :: Key -> Backend Annex -> Maybe Int -> CommandPerform-perform key backend numcopies = do-	success <- Backend.removeKey backend key numcopies+perform :: Key -> Maybe Int -> CommandPerform+perform key numcopies = do+	success <- dropKey key numcopies 	if success 		then next $ cleanup key 		else stop@@ -47,3 +50,44 @@ 	whenM (inAnnex key) $ removeAnnex key 	logStatus key InfoMissing 	return True++{- Checks remotes to verify that enough copies of a key exist to allow+ - for a key to be safely removed (with no data loss), and fails with an+ - error if not. -}+dropKey :: Key -> Maybe Int -> Annex Bool+dropKey key numcopiesM = do+	force <- Annex.getState Annex.force+	if force || numcopiesM == Just 0+		then return True+		else do+			(remotes, trusteduuids) <- Remote.keyPossibilitiesTrusted key+			untrusteduuids <- trustGet UnTrusted+			let tocheck = Remote.remotesWithoutUUID remotes (trusteduuids++untrusteduuids)+			numcopies <- getNumCopies numcopiesM+			findcopies numcopies trusteduuids tocheck []+	where+		findcopies need have [] bad+			| length have >= need = return True+			| otherwise = notEnoughCopies need have bad+		findcopies need have (r:rs) bad+			| length have >= need = return True+			| otherwise = do+				let u = Remote.uuid r+				let dup = u `elem` have+				haskey <- Remote.hasKey r key+				case (dup, haskey) of+					(False, Right True)	-> findcopies need (u:have) rs bad+					(False, Left _)		-> findcopies need have rs (r:bad)+					_			-> findcopies need have rs bad+		notEnoughCopies need have bad = do+			unsafe+			showLongNote $+				"Could only verify the existence of " +++				show (length have) ++ " out of " ++ show need ++ +				" necessary copies"+			Remote.showTriedRemotes bad+			Remote.showLocations key have+			hint+			return False+		unsafe = showNote "unsafe"+		hint = showLongNote "(Use --force to override this check, or adjust annex.numcopies.)"
Command/DropUnused.hs view
@@ -21,7 +21,6 @@ import qualified Command.Move import qualified Remote import qualified Git-import Backend import Types.Key import Utility @@ -64,9 +63,7 @@ 			r <- Remote.byName name 			showNote $ "from " ++ Remote.name r ++ "..." 			next $ Command.Move.fromCleanup r True key-		droplocal = do-			backend <- keyBackend key-			Command.Drop.perform key backend (Just 0) -- force drop+		droplocal = Command.Drop.perform key (Just 0) -- force drop  performOther :: (Git.Repo -> Key -> FilePath) -> Key -> CommandPerform performOther filespec key = do
Command/FromKey.hs view
@@ -15,7 +15,6 @@ import Command import qualified AnnexQueue import Utility-import qualified Backend import Content import Messages import Types.Key@@ -30,7 +29,7 @@ start :: CommandStartString start file = notBareRepo $ do 	key <- cmdlineKey-	inbackend <- Backend.hasKey key+	inbackend <- inAnnex key 	unless inbackend $ error $ 		"key ("++keyName key++") is not present in backend" 	showStart "fromkey" file
Command/Fsck.hs view
@@ -9,10 +9,15 @@  import Control.Monad (when) import Control.Monad.State (liftIO)+import System.Directory+import Data.List+import System.Posix.Files  import Command-import qualified Backend import qualified Annex+import qualified Remote+import qualified Types.Backend+import qualified Types.Key import UUID import Types import Messages@@ -20,6 +25,9 @@ import Content import LocationLog import Locations+import Trust+import Utility.DataUnits+import Config  command :: [Command] command = [repoCommand "fsck" (paramOptional $ paramRepeating paramPath) seek@@ -40,7 +48,7 @@ 	-- the location log is checked first, so that if it has bad data 	-- that gets corrected 	locationlogok <- verifyLocationLog key file-	backendok <- Backend.fsckKey backend key (Just file) numcopies+	backendok <- fsckKey backend key (Just file) numcopies 	if locationlogok && backendok 		then next $ return True 		else stop@@ -80,3 +88,68 @@ 		fix g u s = do 			showNote "fixing location log" 			logChange g key u s++{- Checks a key for problems. -}+fsckKey :: Backend Annex -> Key -> Maybe FilePath -> Maybe Int -> Annex Bool+fsckKey backend key file numcopies = do+	size_ok <- checkKeySize key+	copies_ok <- checkKeyNumCopies key file numcopies+	backend_ok <-(Types.Backend.fsckKey backend) key+	return $ size_ok && copies_ok && backend_ok++{- The size of the data for a key is checked against the size encoded in+ - the key's metadata, if available. -}+checkKeySize :: Key -> Annex Bool+checkKeySize key = do+	g <- Annex.gitRepo+	let file = gitAnnexLocation g key+	present <- liftIO $ doesFileExist file+	case (present, Types.Key.keySize key) of+		(_, Nothing) -> return True+		(False, _) -> return True+		(True, Just size) -> do+			stat <- liftIO $ getFileStatus file+			let size' = fromIntegral (fileSize stat)+			if size == size'+				then return True+				else do+					dest <- moveBad key+					warning $ "Bad file size (" +++						compareSizes storageUnits True size size' ++ +						"); moved to " ++ dest+					return False+++checkKeyNumCopies :: Key -> Maybe FilePath -> Maybe Int -> Annex Bool+checkKeyNumCopies key file numcopies = do+	needed <- getNumCopies numcopies+	locations <- keyLocations key+	untrusted <- trustGet UnTrusted+	let untrustedlocations = intersect untrusted locations+	let safelocations = filter (`notElem` untrusted) locations+	let present = length safelocations+	if present < needed+		then do+			ppuuids <- Remote.prettyPrintUUIDs untrustedlocations+			warning $ missingNote (filename file key) present needed ppuuids+			return False+		else return True+	where+		filename Nothing k = show k+		filename (Just f) _ = f++missingNote :: String -> Int -> Int -> String -> String+missingNote file 0 _ [] = +		"** No known copies exist of " ++ file+missingNote file 0 _ untrusted =+		"Only these untrusted locations may have copies of " ++ file +++		"\n" ++ untrusted +++		"Back it up to trusted locations with git-annex copy."+missingNote file present needed [] =+		"Only " ++ show present ++ " of " ++ show needed ++ +		" trustworthy copies exist of " ++ file +++		"\nBack it up with git-annex copy."+missingNote file present needed untrusted = +		missingNote file present needed [] +++		"\nThe following untrusted locations may also have copies: " +++		"\n" ++ untrusted
Command/Get.hs view
@@ -8,7 +8,6 @@ module Command.Get where  import Command-import qualified Backend import qualified Annex import qualified Remote import Types@@ -24,7 +23,7 @@ seek = [withFilesInGit start]  start :: CommandStartString-start file = isAnnexed file $ \(key, backend) -> do+start file = isAnnexed file $ \(key, _) -> do 	inannex <- inAnnex key 	if inannex 		then stop@@ -32,14 +31,52 @@ 			showStart "get" file 			from <- Annex.getState Annex.fromremote 			case from of-				Nothing -> next $ perform key backend+				Nothing -> next $ perform key 				Just name -> do 					src <- Remote.byName name 					next $ Command.Move.fromPerform src False key -perform :: Key -> Backend Annex -> CommandPerform-perform key backend = do-	ok <- getViaTmp key (Backend.retrieveKeyFile backend key)+perform :: Key -> CommandPerform+perform key = do+	ok <- getViaTmp key (getKeyFile key) 	if ok 		then next $ return True -- no cleanup needed 		else stop++{- Try to find a copy of the file in one of the remotes,+ - and copy it to here. -}+getKeyFile :: Key -> FilePath -> Annex Bool+getKeyFile key file = do+	remotes <- Remote.keyPossibilities key+	if null remotes+		then do+			showNote "not available"+			Remote.showLocations key []+			return False+		else trycopy remotes remotes+	where+		trycopy full [] = do+			Remote.showTriedRemotes full+			Remote.showLocations key []+			return False+		trycopy full (r:rs) = do+			probablythere <- probablyPresent r+			if probablythere+				then docopy r (trycopy full rs)+				else trycopy full rs+		-- This check is to avoid an ugly message if a remote is a+		-- drive that is not mounted.+		probablyPresent r =+			if Remote.hasKeyCheap r+				then do+					res <- Remote.hasKey r key+					case res of+						Right b -> return b+						Left _ -> return False+				else return True+		docopy r continue = do+			showNote $ "from " ++ Remote.name r ++ "..."+			copied <- Remote.retrieveKeyFile r key file+			if copied+				then return True+				else continue
Command/InitRemote.hs view
@@ -15,6 +15,7 @@  import Command import qualified Remote+import qualified RemoteLog import qualified Types.Remote as R import Types import UUID@@ -42,7 +43,7 @@  	where 		name = head ws-		config = Remote.keyValToConfig $ tail ws+		config = RemoteLog.keyValToConfig $ tail ws 		needname = do 			let err s = error $ "Specify a name for the remote. " ++ s 			names <- remoteNames@@ -58,13 +59,13 @@  cleanup :: UUID -> R.RemoteConfig -> CommandCleanup cleanup u c = do-	Remote.configSet u c+	RemoteLog.configSet u c         return True  {- Look up existing remote's UUID and config by name, or generate a new one -} findByName :: String -> Annex (UUID, R.RemoteConfig) findByName name = do-	m <- Remote.readRemoteLog+	m <- RemoteLog.readRemoteLog 	maybe generate return $ findByName' name m 	where 		generate = do@@ -83,7 +84,7 @@  remoteNames :: Annex [String] remoteNames = do-	m <- Remote.readRemoteLog+	m <- RemoteLog.readRemoteLog 	return $ catMaybes $ map ((M.lookup nameKey) . snd) $ M.toList m  {- find the specified remote type -}
Command/Map.hs view
@@ -21,8 +21,8 @@ import Utility import UUID import Trust-import Ssh-import qualified Dot+import Remote.Ssh+import qualified Utility.Dot as Dot  -- a link from the first repository to the second (its remote) data Link = Link Git.Repo Git.Repo
Command/Migrate.hs view
@@ -15,6 +15,7 @@ import Command import qualified Annex import qualified Backend+import qualified Types.Key import Locations import Types import Content@@ -32,18 +33,20 @@ start (file, b) = isAnnexed file $ \(key, oldbackend) -> do 	exists <- inAnnex key 	newbackend <- choosebackend b-	upgradable <- Backend.upgradableKey oldbackend key-	if (newbackend /= oldbackend || upgradable) && exists+	if (newbackend /= oldbackend || upgradableKey key) && exists 		then do 			showStart "migrate" file 			next $ perform file key newbackend 		else stop 	where-		choosebackend Nothing = do-			backends <- Backend.list-			return $ head backends+		choosebackend Nothing = return . head =<< Backend.orderedList 		choosebackend (Just backend) = return backend +{- Checks if a key is upgradable to a newer representation. -}+{- Ideally, all keys have file size metadata. Old keys may not. -}+upgradableKey :: Key -> Bool+upgradableKey key = Types.Key.keySize key == Nothing+ perform :: FilePath -> Key -> Backend Annex -> CommandPerform perform file oldkey newbackend = do 	g <- Annex.gitRepo@@ -55,9 +58,9 @@ 	let src = gitAnnexLocation g oldkey 	let tmpfile = gitAnnexTmpDir g </> takeFileName file 	liftIO $ createLink src tmpfile-	stored <- Backend.storeFileKey tmpfile $ Just newbackend+	k <- Backend.genKey tmpfile $ Just newbackend 	liftIO $ cleantmp tmpfile-	case stored of+	case k of 		Nothing -> stop 		Just (newkey, _) -> do 			ok <- getViaTmpUnchecked newkey $ \t -> do
Command/RecvKey.hs view
@@ -14,7 +14,7 @@ import CmdLine import Content import Utility-import RsyncFile+import Utility.RsyncFile  command :: [Command] command = [repoCommand "recvkey" paramKey seek
Command/SendKey.hs view
@@ -15,7 +15,7 @@ import Command import Content import Utility-import RsyncFile+import Utility.RsyncFile import Messages  command :: [Command]
Command/Status.hs view
@@ -21,10 +21,11 @@ import qualified Git import Command import Types-import DataUnits+import Utility.DataUnits import Content import Types.Key import Locations+import Backend  -- a named computation that produces a statistic type Stat = StatState (Maybe (String, StatState String))@@ -95,9 +96,8 @@ 		calc Nothing = return ()  supported_backends :: Stat-supported_backends = stat "supported backends" $-	lift (Annex.getState Annex.supportedBackends) >>=-		return . unwords . (map B.name)+supported_backends = stat "supported backends" $ +	return $ unwords $ map B.name Backend.list  supported_remote_types :: Stat supported_remote_types = stat "supported remote types" $
Command/Unannex.hs view
@@ -13,10 +13,10 @@ import System.Posix.Files  import Command+import qualified Command.Drop import qualified Annex import qualified AnnexQueue import Utility-import qualified Backend import LocationLog import Types import Content@@ -33,7 +33,7 @@  {- The unannex subcommand undoes an add. -} start :: CommandStartString-start file = isAnnexed file $ \(key, backend) -> do+start file = isAnnexed file $ \(key, _) -> do 	ishere <- inAnnex key 	if ishere 		then do@@ -46,13 +46,12 @@ 				Annex.changeState $ \s -> s { Annex.force = True }  			showStart "unannex" file-			next $ perform file key backend+			next $ perform file key 		else stop -perform :: FilePath -> Key -> Backend Annex -> CommandPerform-perform file key backend = do-	-- force backend to always remove-	ok <- Backend.removeKey backend key (Just 0)+perform :: FilePath -> Key -> CommandPerform+perform file key = do+	ok <- Command.Drop.dropKey key (Just 0) -- always remove 	if ok 		then next $ cleanup file key 		else stop
Command/Unlock.hs view
@@ -12,12 +12,11 @@  import Command import qualified Annex-import qualified Backend import Types import Messages import Locations import Content-import CopyFile+import Utility.CopyFile import Utility  command :: [Command]@@ -38,7 +37,7 @@  perform :: FilePath -> Key -> CommandPerform perform dest key = do-	unlessM (Backend.hasKey key) $ error "content not present"+	unlessM (inAnnex key) $ error "content not present" 	 	checkDiskSpace key 
Config.hs view
@@ -86,3 +86,16 @@ 		match a = do 			n <- Annex.getState a 			return $ n == Git.repoRemoteName r++{- If a value is specified, it is used; otherwise the default is looked up+ - in git config. forcenumcopies overrides everything. -}+getNumCopies :: Maybe Int -> Annex Int+getNumCopies v = +	Annex.getState Annex.forcenumcopies >>= maybe (use v) (return . id)+	where+		use (Just n) = return n+		use Nothing = do+			g <- Annex.gitRepo+			return $ read $ Git.configGet g config "1"+		config = "annex.numcopies"+
Content.hs view
@@ -43,7 +43,7 @@ import Utility import StatFS import Types.Key-import DataUnits+import Utility.DataUnits import Config  {- Checks if a given key is currently present in the gitAnnexLocation. -}
− CopyFile.hs
@@ -1,29 +0,0 @@-{- git-annex file copying- -- - Copyright 2010 Joey Hess <joey@kitenet.net>- -- - Licensed under the GNU GPL version 3 or higher.- -}--module CopyFile (copyFile) where--import System.Directory (doesFileExist, removeFile)--import Utility-import qualified SysConfig--{- The cp command is used, because I hate reinventing the wheel,- - and because this allows easy access to features like cp --reflink. -}-copyFile :: FilePath -> FilePath -> IO Bool-copyFile src dest = do-	whenM (doesFileExist dest) $-		removeFile dest-	boolSystem "cp" [params, File src, File dest]-	where-		params = if SysConfig.cp_reflink_auto-			then Params "--reflink=auto"-			else if SysConfig.cp_a-				then Params "-a"-				else if SysConfig.cp_p-					then Params "-p"-					else Params ""
Crypto.hs view
@@ -46,7 +46,7 @@ import Types.Key import Types.Remote import Utility-import Base64+import Utility.Base64 import Types.Crypto  {- The first half of a Cipher is used for HMAC; the remainder
− DataUnits.hs
@@ -1,161 +0,0 @@-{- data size display and parsing- -- - Copyright 2011 Joey Hess <joey@kitenet.net>- -- - Licensed under the GNU GPL version 3 or higher.- -}--module DataUnits (-	dataUnits,-	storageUnits,-	memoryUnits,-	bandwidthUnits,-	oldSchoolUnits,--	roughSize,-	compareSizes,-	readSize-) where--import Data.List-import Data.Char--type ByteSize = Integer-type Name = String-type Abbrev = String-data Unit = Unit ByteSize Abbrev Name-	deriving (Ord, Show, Eq)--{- And now a rant: - -- - In the beginning, we had powers of two, and they were good.- -- - Disk drive manufacturers noticed that some powers of two were- - sorta close to some powers of ten, and that rounding down to the nearest- - power of ten allowed them to advertise their drives were bigger. This- - was sorta annoying.- -- - Then drives got big. Really, really big. This was good.- -- - Except that the small rounding error perpretrated by the drive- - manufacturers suffered the fate of a small error, and became a large- - error. This was bad.- -- - So, a committee was formed. And it arrived at a committee-like decision,- - which satisfied noone, confused everyone, and made the world an uglier- - place. As with all committees, this was meh.- -- - And the drive manufacturers happily continued selling drives that are- - increasingly smaller than you'd expect, if you don't count on your- - fingers. But that are increasingly too big for anyone to much notice.- - This caused me to need git-annex.- -- - Thus, I use units here that I loathe. Because if I didn't, people would- - be confused that their drives seem the wrong size, and other people would- - complain at me for not being standards compliant. And we call this- - progress?- -}--dataUnits :: [Unit]-dataUnits = storageUnits ++ memoryUnits--{- Storage units are (stupidly) powers of ten. -}-storageUnits :: [Unit]-storageUnits =-	[ Unit (p 8) "YB" "yottabyte"-	, Unit (p 7) "ZB" "zettabyte"-	, Unit (p 6) "EB" "exabyte"-	, Unit (p 5) "PB" "petabyte"-	, Unit (p 4) "TB" "terabyte"-	, Unit (p 3) "GB" "gigabyte"-	, Unit (p 2) "MB" "megabyte"-	, Unit (p 1) "kB" "kilobyte" -- weird capitalization thanks to committe-	, Unit (p 0) "B" "byte"-	]-	where-		p :: Integer -> Integer-		p n = 1000^n--{- Memory units are (stupidly named) powers of 2. -}-memoryUnits :: [Unit]-memoryUnits =-	[ Unit (p 8) "YiB" "yobibyte"-	, Unit (p 7) "ZiB" "zebibyte"-	, Unit (p 6) "EiB" "exbibyte"-	, Unit (p 5) "PiB" "pebibyte"-	, Unit (p 4) "TiB" "tebibyte"-	, Unit (p 3) "GiB" "gigabyte"-	, Unit (p 2) "MiB" "mebibyte"-	, Unit (p 1) "KiB" "kibibyte"-	, Unit (p 0) "B" "byte"-	]-	where-		p :: Integer -> Integer-		p n = 2^(n*10)--{- Bandwidth units are only measured in bits if you're some crazy telco. -}-bandwidthUnits :: [Unit]-bandwidthUnits = error "stop trying to rip people off"--{- Do you yearn for the days when men were men and megabytes were megabytes? -}-oldSchoolUnits :: [Unit]-oldSchoolUnits = map mingle $ zip storageUnits memoryUnits-	where-		mingle (Unit _ a n, Unit s' _ _) = Unit s' a n--{- approximate display of a particular number of bytes -}-roughSize :: [Unit] -> Bool -> ByteSize -> String-roughSize units abbrev i-	| i < 0 = "-" ++ findUnit units' (negate i)-	| otherwise = findUnit units' i-	where-		units' = reverse $ sort units -- largest first--		findUnit (u@(Unit s _ _):us) i'-			| i' >= s = showUnit i' u-			| otherwise = findUnit us i'-		findUnit [] i' = showUnit i' (last units') -- bytes--		showUnit i' (Unit s a n) = let num = chop i' s in-			show num ++ " " ++-			(if abbrev then a else plural num n)--		chop :: Integer -> Integer -> Integer-		chop i' d = round $ (fromInteger i' :: Double) / fromInteger d--		plural n u-			| n == 1 = u-			| otherwise = u ++ "s"--{- displays comparison of two sizes -}-compareSizes :: [Unit] -> Bool -> ByteSize -> ByteSize -> String-compareSizes units abbrev old new-	| old > new = roughSize units abbrev (old - new) ++ " smaller"-	| old < new = roughSize units abbrev (new - old) ++ " larger"-	| otherwise = "same"--{- Parses strings like "10 kilobytes" or "0.5tb". -}-readSize :: [Unit] -> String -> Maybe ByteSize-readSize units input-	| null parsednum = Nothing-	| null parsedunit = Nothing-	| otherwise = Just $ round $ number * (fromIntegral multiplier)-	where-		(number, rest) = head parsednum-		multiplier = head $ parsedunit-		unitname = takeWhile isAlpha $ dropWhile isSpace rest--		parsednum = reads input :: [(Double, String)]-		parsedunit = lookupUnit units unitname--		lookupUnit _ [] = [1] -- no unit given, assume bytes-		lookupUnit [] _ = []-		lookupUnit (Unit s a n:us) v-			| a ~~ v || n ~~ v = [s]-			| plural n ~~ v || a ~~ byteabbrev v = [s]-			| otherwise = lookupUnit us v-		-		a ~~ b = map toLower a == map toLower b-		-		plural n = n ++ "s"-		byteabbrev a = a ++ "b"
− Dot.hs
@@ -1,63 +0,0 @@-{- a simple graphviz / dot(1) digraph description generator library- -- - Copyright 2010 Joey Hess <joey@kitenet.net>- -- - Licensed under the GNU GPL version 3 or higher.- -}--module Dot where -- import qualified--{- generates a graph description from a list of lines -}-graph :: [String] -> String-graph s = unlines $ [header] ++ map indent s ++ [footer]-	where-		header = "digraph map {"-		footer= "}"--{- a node in the graph -}-graphNode :: String -> String -> String-graphNode nodeid desc = label desc $ quote nodeid--{- an edge between two nodes -}-graphEdge :: String -> String -> Maybe String -> String-graphEdge fromid toid desc = indent $ maybe edge (\d -> label d edge) desc-	where-		edge = quote fromid ++ " -> " ++ quote toid--{- adds a label to a node or edge -}-label :: String -> String -> String-label l s = attr "label" l s--{- adds an attribute to a node or edge- - (can be called multiple times for multiple attributes) -}-attr :: String -> String -> String -> String-attr a v s = s ++ " [ " ++ a ++ "=" ++ quote v ++ " ]"--{- fills a node with a color -}-fillColor :: String -> String -> String-fillColor color s = attr "fillcolor" color $ attr "style" "filled" $ s--{- apply to graphNode to put the node in a labeled box -}-subGraph :: String -> String -> String -> String -> String-subGraph subid l color s =-	"subgraph " ++ name ++ " {\n" ++-		ii setlabel ++-		ii setfilled ++-		ii setcolor ++-		ii s ++-		indent "}"-	where-		-- the "cluster_" makes dot draw a box-		name = quote ("cluster_" ++ subid)-		setlabel = "label=" ++ quote l-		setfilled = "style=" ++ quote "filled"-		setcolor = "fillcolor=" ++ quote color-		ii x = (indent $ indent x) ++ "\n"--indent ::String -> String-indent s = "\t" ++ s--quote :: String -> String-quote s = "\"" ++ s' ++ "\""-	where-		s' = filter (/= '"') s
LocationLog.hs view
@@ -19,7 +19,7 @@ 	keyLocations, 	loggedKeys, 	logFile,-	logFileKey	+	logFileKey ) where  import System.FilePath@@ -60,7 +60,7 @@ {- Converts a log filename into a key. -} logFileKey :: FilePath -> Maybe Key logFileKey file-	| end == ".log" = readKey beginning+	| end == ".log" = fileKey beginning 	| otherwise = Nothing 	where 		(beginning, end) = splitAt (length file - 4) file
Makefile view
@@ -91,7 +91,7 @@ # generate a file list there. sdist: clean 	@if [ ! -e git-annex.cabal.orig ]; then cp git-annex.cabal git-annex.cabal.orig; fi-	@sed -e "s!\(Extra-Source-Files: \).*!\1$(shell find . -name .git -prune -or -not -name \\*.orig -not -type d -print)!i" < git-annex.cabal.orig > git-annex.cabal+	@sed -e "s!\(Extra-Source-Files: \).*!\1$(shell find . -name .git -prune -or -not -name \\*.orig -not -type d -print | perl -ne 'print unless length >= 100')!i" < git-annex.cabal.orig > git-annex.cabal 	@cabal sdist 	@mv git-annex.cabal.orig git-annex.cabal 
Remote.hs view
@@ -14,34 +14,26 @@ 	removeKey, 	hasKey, 	hasKeyCheap,-	keyPossibilities,-	keyPossibilitiesTrusted,-	forceTrust,  	remoteTypes, 	genList, 	byName,-	nameToUUID,+	prettyPrintUUIDs, 	remotesWithUUID, 	remotesWithoutUUID,-	prettyPrintUUIDs,--	remoteLog,-	readRemoteLog,-	configSet,-	keyValToConfig,-	configToKeyVal,-	-	prop_idempotent_configEscape+	keyPossibilities,+	keyPossibilitiesTrusted,+	nameToUUID,+	showTriedRemotes,+	showLocations,+	forceTrust ) where  import Control.Monad (filterM, liftM2) import Data.List import qualified Data.Map as M-import Data.Maybe-import Data.Char+import Data.String.Utils -import qualified Branch import Types import Types.Remote import UUID@@ -49,6 +41,8 @@ import Config import Trust import LocationLog+import Messages+import RemoteLog  import qualified Remote.Git import qualified Remote.S3@@ -181,79 +175,33 @@  	return (sort validremotes, validtrusteduuids) +{- Displays known locations of a key. -}+showLocations :: Key -> [UUID] -> Annex ()+showLocations key exclude = do+	g <- Annex.gitRepo+	u <- getUUID g+	uuids <- keyLocations key+	untrusteduuids <- trustGet UnTrusted+	let uuidswanted = filteruuids uuids (u:exclude++untrusteduuids) +	let uuidsskipped = filteruuids uuids (u:exclude++uuidswanted)+	ppuuidswanted <- Remote.prettyPrintUUIDs uuidswanted+	ppuuidsskipped <- Remote.prettyPrintUUIDs uuidsskipped+	showLongNote $ message ppuuidswanted ppuuidsskipped+	where+		filteruuids l x = filter (`notElem` x) l+		message [] [] = "No other repository is known to contain the file."+		message rs [] = "Try making some of these repositories available:\n" ++ rs+		message [] us = "Also these untrusted repositories may contain the file:\n" ++ us+		message rs us = message rs [] ++ message [] us++showTriedRemotes :: [Remote Annex] -> Annex ()+showTriedRemotes [] = return ()	+showTriedRemotes remotes =+	showLongNote $ "Unable to access these remotes: " +++		(join ", " $ map name remotes)+ forceTrust :: TrustLevel -> String -> Annex () forceTrust level remotename = do-	r <- Remote.nameToUUID remotename+	r <- nameToUUID remotename 	Annex.changeState $ \s -> 		s { Annex.forcetrust = (r, level):Annex.forcetrust s }--{- Filename of remote.log. -}-remoteLog :: FilePath-remoteLog = "remote.log"--{- Adds or updates a remote's config in the log. -}-configSet :: UUID -> RemoteConfig -> Annex ()-configSet u c = do-	m <- readRemoteLog-	Branch.change remoteLog $ unlines $ sort $-		map toline $ M.toList $ M.insert u c m-	where-		toline (u', c') = u' ++ " " ++ (unwords $ configToKeyVal c')--{- Map of remotes by uuid containing key/value config maps. -}-readRemoteLog :: Annex (M.Map UUID RemoteConfig)-readRemoteLog = return . remoteLogParse =<< Branch.get remoteLog--remoteLogParse :: String -> M.Map UUID RemoteConfig-remoteLogParse s =-	M.fromList $ catMaybes $ map parseline $ filter (not . null) $ lines s-	where-		parseline l-			| length w > 2 = Just (u, c)-			| otherwise = Nothing-			where-				w = words l-				u = w !! 0-				c = keyValToConfig $ tail w--{- Given Strings like "key=value", generates a RemoteConfig. -}-keyValToConfig :: [String] -> RemoteConfig-keyValToConfig ws = M.fromList $ map (/=/) ws-	where-		(/=/) s = (k, v)-			where-				k = takeWhile (/= '=') s-				v = configUnEscape $ drop (1 + length k) s--configToKeyVal :: M.Map String String -> [String]-configToKeyVal m = map toword $ sort $ M.toList m-	where-		toword (k, v) = k ++ "=" ++ configEscape v--configEscape :: String -> String-configEscape = (>>= escape)-	where-		escape c-			| isSpace c || c `elem` "&" = "&" ++ show (ord c) ++ ";"-			| otherwise = [c]--configUnEscape :: String -> String-configUnEscape = unescape-	where-		unescape [] = []-		unescape (c:rest)-			| c == '&' = entity rest-			| otherwise = c : unescape rest-		entity s = if ok-				then chr (read num) : unescape rest-				else '&' : unescape s-			where-				num = takeWhile isNumber s-				r = drop (length num) s-				rest = drop 1 r-				ok = not (null num) && -					not (null r) && r !! 0 == ';'--{- for quickcheck -}-prop_idempotent_configEscape :: String -> Bool-prop_idempotent_configEscape s = s == (configUnEscape $ configEscape s)
Remote/Bup.hs view
@@ -28,7 +28,7 @@ import Config import Utility import Messages-import Ssh+import Remote.Ssh import Remote.Special import Remote.Encryptable import Crypto
Remote/Directory.hs view
@@ -22,7 +22,7 @@ import qualified Annex import UUID import Locations-import CopyFile+import Utility.CopyFile import Config import Content import Utility
Remote/Git.hs view
@@ -22,9 +22,9 @@ import Utility import qualified Content import Messages-import CopyFile-import RsyncFile-import Ssh+import Utility.CopyFile+import Utility.RsyncFile+import Remote.Ssh import Config  remote :: RemoteType Annex@@ -112,7 +112,7 @@ 		checklocal = do 			-- run a local check inexpensively, 			-- by making an Annex monad using the remote-			a <- Annex.new r []+			a <- Annex.new r 			Annex.eval a (Content.inAnnex key) 		checkremote = do 			showNote ("checking " ++ Git.repoDescribe r ++ "...")@@ -142,7 +142,7 @@ 		let keysrc = gitAnnexLocation g key 		-- run copy from perspective of remote 		liftIO $ do-			a <- Annex.new r []+			a <- Annex.new r 			Annex.eval a $ do 				ok <- Content.getViaTmp key $ 					rsyncOrCopyFile r keysrc
Remote/Rsync.hs view
@@ -29,7 +29,7 @@ import Remote.Encryptable import Crypto import Messages-import RsyncFile+import Utility.RsyncFile  type RsyncUrl = String 
Remote/S3real.hs view
@@ -37,7 +37,7 @@ import Remote.Encryptable import Crypto import Content-import Base64+import Utility.Base64  remote :: RemoteType Annex remote = RemoteType {
+ Remote/Ssh.hs view
@@ -0,0 +1,61 @@+{- git-annex remote access with ssh+ -+ - Copyright 2011 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Remote.Ssh where++import Control.Monad.State (liftIO)++import qualified Git+import Utility+import Types+import Config++{- Generates parameters to ssh to a repository's host and run a command.+ - Caller is responsible for doing any neccessary shellEscaping of the+ - passed command. -}+sshToRepo :: Git.Repo -> [CommandParam] -> Annex [CommandParam]+sshToRepo repo sshcmd = do+	s <- getConfig repo "ssh-options" ""+	let sshoptions = map Param (words s)+	let sshport = case Git.urlPort repo of+		Nothing -> []+		Just p -> [Param "-p", Param (show p)]+	let sshhost = Param $ Git.urlHostUser repo+	return $ sshoptions ++ sshport ++ [sshhost] ++ sshcmd++{- Generates parameters to run a git-annex-shell command on a remote+ - repository. -}+git_annex_shell :: Git.Repo -> String -> [CommandParam] -> Annex (Maybe (FilePath, [CommandParam]))+git_annex_shell r command params+	| not $ Git.repoIsUrl r = return $ Just (shellcmd, shellopts)+	| Git.repoIsSsh r = do+		sshparams <- sshToRepo r [Param sshcmd]+		return $ Just ("ssh", sshparams)+	| otherwise = return Nothing+	where+		dir = Git.workTree r+		shellcmd = "git-annex-shell"+		shellopts = (Param command):(File dir):params+		sshcmd = shellcmd ++ " " ++ +			unwords (map shellEscape $ toCommand shellopts)++{- Uses a supplied function (such as boolSystem) to run a git-annex-shell+ - command on a remote.+ -+ - Or, if the remote does not support running remote commands, returns+ - a specified error value. -}+onRemote +	:: Git.Repo+	-> (FilePath -> [CommandParam] -> IO a, a)+	-> String+	-> [CommandParam]+	-> Annex a+onRemote r (with, errorval) command params = do+	s <- git_annex_shell r command params+	case s of+		Just (c, ps) -> liftIO $ with c ps+		Nothing -> return errorval
+ RemoteLog.hs view
@@ -0,0 +1,97 @@+{- git-annex remote log+ - + - Copyright 2011 Joey Hess <joey@kitenet.net>+ - + - Licensed under the GNU GPL version 3 or higher.+ -}++module RemoteLog (+	remoteLog,+	readRemoteLog,+	configSet,+	keyValToConfig,+	configToKeyVal,++	prop_idempotent_configEscape+) where++import Data.List+import qualified Data.Map as M+import Data.Maybe+import Data.Char++import qualified Branch+import Types+import Types.Remote+import UUID++{- Filename of remote.log. -}+remoteLog :: FilePath+remoteLog = "remote.log"++{- Adds or updates a remote's config in the log. -}+configSet :: UUID -> RemoteConfig -> Annex ()+configSet u c = do+	m <- readRemoteLog+	Branch.change remoteLog $ unlines $ sort $+		map toline $ M.toList $ M.insert u c m+	where+		toline (u', c') = u' ++ " " ++ (unwords $ configToKeyVal c')++{- Map of remotes by uuid containing key/value config maps. -}+readRemoteLog :: Annex (M.Map UUID RemoteConfig)+readRemoteLog = return . remoteLogParse =<< Branch.get remoteLog++remoteLogParse :: String -> M.Map UUID RemoteConfig+remoteLogParse s =+	M.fromList $ catMaybes $ map parseline $ filter (not . null) $ lines s+	where+		parseline l+			| length w > 2 = Just (u, c)+			| otherwise = Nothing+			where+				w = words l+				u = w !! 0+				c = keyValToConfig $ tail w++{- Given Strings like "key=value", generates a RemoteConfig. -}+keyValToConfig :: [String] -> RemoteConfig+keyValToConfig ws = M.fromList $ map (/=/) ws+	where+		(/=/) s = (k, v)+			where+				k = takeWhile (/= '=') s+				v = configUnEscape $ drop (1 + length k) s++configToKeyVal :: M.Map String String -> [String]+configToKeyVal m = map toword $ sort $ M.toList m+	where+		toword (k, v) = k ++ "=" ++ configEscape v++configEscape :: String -> String+configEscape = (>>= escape)+	where+		escape c+			| isSpace c || c `elem` "&" = "&" ++ show (ord c) ++ ";"+			| otherwise = [c]++configUnEscape :: String -> String+configUnEscape = unescape+	where+		unescape [] = []+		unescape (c:rest)+			| c == '&' = entity rest+			| otherwise = c : unescape rest+		entity s = if ok+				then chr (read num) : unescape rest+				else '&' : unescape s+			where+				num = takeWhile isNumber s+				r = drop (length num) s+				rest = drop 1 r+				ok = not (null num) && +					not (null r) && r !! 0 == ';'++{- for quickcheck -}+prop_idempotent_configEscape :: String -> Bool+prop_idempotent_configEscape s = s == (configUnEscape $ configEscape s)
− RsyncFile.hs
@@ -1,48 +0,0 @@-{- git-annex file copying with rsync- -- - Copyright 2010 Joey Hess <joey@kitenet.net>- -- - Licensed under the GNU GPL version 3 or higher.- -}--module RsyncFile where--import Data.String.Utils--import Utility--{- Generates parameters to make rsync use a specified command as its remote- - shell. -}-rsyncShell :: [CommandParam] -> [CommandParam]-rsyncShell command = [Param "-e", Param $ unwords $ map escape (toCommand command)]-	where-		{- rsync requires some weird, non-shell like quoting in-                 - here. A doubled single quote inside the single quoted-                 - string is a single quote. -}-		escape s = "'" ++  (join "''" $ split "'" s) ++ "'"--{- Runs rsync in server mode to send a file, and exits. -}-rsyncServerSend :: FilePath -> IO ()-rsyncServerSend file = rsyncExec $-	rsyncServerParams ++ [Param "--sender", File file]--{- Runs rsync in server mode to receive a file. -}-rsyncServerReceive :: FilePath -> IO Bool-rsyncServerReceive file = rsync $ rsyncServerParams ++ [File file]--rsyncServerParams :: [CommandParam]-rsyncServerParams =-	[ Param "--server"-	-- preserve permissions-	, Param "-p"-	-- allow resuming of transfers of big files-	, Param "--inplace"-	-- other options rsync normally uses in server mode-	, Params "-e.Lsf ."-	]--rsync :: [CommandParam] -> IO Bool-rsync = boolSystem "rsync"--rsyncExec :: [CommandParam] -> IO ()-rsyncExec params = executeFile "rsync" True (toCommand params) Nothing
− Ssh.hs
@@ -1,61 +0,0 @@-{- git-annex repository access with ssh- -- - Copyright 2011 Joey Hess <joey@kitenet.net>- -- - Licensed under the GNU GPL version 3 or higher.- -}--module Ssh where--import Control.Monad.State (liftIO)--import qualified Git-import Utility-import Types-import Config--{- Generates parameters to ssh to a repository's host and run a command.- - Caller is responsible for doing any neccessary shellEscaping of the- - passed command. -}-sshToRepo :: Git.Repo -> [CommandParam] -> Annex [CommandParam]-sshToRepo repo sshcmd = do-	s <- getConfig repo "ssh-options" ""-	let sshoptions = map Param (words s)-	let sshport = case Git.urlPort repo of-		Nothing -> []-		Just p -> [Param "-p", Param (show p)]-	let sshhost = Param $ Git.urlHostUser repo-	return $ sshoptions ++ sshport ++ [sshhost] ++ sshcmd--{- Generates parameters to run a git-annex-shell command on a remote- - repository. -}-git_annex_shell :: Git.Repo -> String -> [CommandParam] -> Annex (Maybe (FilePath, [CommandParam]))-git_annex_shell r command params-	| not $ Git.repoIsUrl r = return $ Just (shellcmd, shellopts)-	| Git.repoIsSsh r = do-		sshparams <- sshToRepo r [Param sshcmd]-		return $ Just ("ssh", sshparams)-	| otherwise = return Nothing-	where-		dir = Git.workTree r-		shellcmd = "git-annex-shell"-		shellopts = (Param command):(File dir):params-		sshcmd = shellcmd ++ " " ++ -			unwords (map shellEscape $ toCommand shellopts)--{- Uses a supplied function (such as boolSystem) to run a git-annex-shell- - command on a remote.- -- - Or, if the remote does not support running remote commands, returns- - a specified error value. -}-onRemote -	:: Git.Repo-	-> (FilePath -> [CommandParam] -> IO a, a)-	-> String-	-> [CommandParam]-	-> Annex a-onRemote r (with, errorval) command params = do-	s <- git_annex_shell r command params-	case s of-		Just (c, ps) -> liftIO $ with c ps-		Nothing -> return errorval
StatFS.hsc view
@@ -96,7 +96,7 @@   c_statfs :: CString -> Ptr CStatfs -> IO CInt #endif -toI :: CLong -> Integer+toI :: CULong -> Integer toI = toInteger  getFileSystemStats :: String -> IO (Maybe FileSystemStats)
Types/Backend.hs view
@@ -16,22 +16,8 @@ 	name :: String, 	-- converts a filename to a key 	getKey :: FilePath -> a (Maybe Key),-	-- stores a file's contents to a key-	storeFileKey :: FilePath -> Key -> a Bool,-	-- retrieves a key's contents to a file-	retrieveKeyFile :: Key -> FilePath -> a Bool,-	-- removes a key, optionally checking that enough copies are stored-	-- elsewhere-	removeKey :: Key -> Maybe Int -> a Bool,-	-- checks if a backend is storing the content of a key-	hasKey :: Key -> a Bool, 	-- called during fsck to check a key-	-- (second parameter may be the filename associated with it)-	-- (third parameter may be the number of copies that there should-	-- be of the key)-	fsckKey :: Key -> Maybe FilePath -> Maybe Int -> a Bool,-	-- Is a newer repesentation possible for a key?-	upgradableKey :: Key -> a Bool+	fsckKey :: Key -> a Bool }  instance Show (Backend a) where
Upgrade/V1.hs view
@@ -191,17 +191,16 @@  lookupFile1 :: FilePath -> Annex (Maybe (Key, Backend Annex)) lookupFile1 file = do-	bs <- Annex.getState Annex.supportedBackends 	tl <- liftIO $ try getsymlink 	case tl of 		Left _ -> return Nothing-		Right l -> makekey bs l+		Right l -> makekey l 	where 		getsymlink = do 			l <- readSymbolicLink file 			return $ takeFileName l-		makekey bs l = do-			case maybeLookupBackendName bs bname of+		makekey l = do+			case maybeLookupBackendName bname of 				Nothing -> do 					unless (null kname || null bname || 					        not (isLinkToAnnex l)) $
+ Utility/Base64.hs view
@@ -0,0 +1,18 @@+{- Simple Base64 access+ -+ - Copyright 2011 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Utility.Base64 (toB64, fromB64) where++import Codec.Binary.Base64+import Data.Bits.Utils++toB64 :: String -> String		+toB64 = encode . s2w8++fromB64 :: String -> String+fromB64 s = maybe bad w82s $ decode s+	where bad = error "bad base64 encoded data"
+ Utility/CopyFile.hs view
@@ -0,0 +1,29 @@+{- git-annex file copying+ -+ - Copyright 2010 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Utility.CopyFile (copyFile) where++import System.Directory (doesFileExist, removeFile)++import Utility+import qualified SysConfig++{- The cp command is used, because I hate reinventing the wheel,+ - and because this allows easy access to features like cp --reflink. -}+copyFile :: FilePath -> FilePath -> IO Bool+copyFile src dest = do+	whenM (doesFileExist dest) $+		removeFile dest+	boolSystem "cp" [params, File src, File dest]+	where+		params = if SysConfig.cp_reflink_auto+			then Params "--reflink=auto"+			else if SysConfig.cp_a+				then Params "-a"+				else if SysConfig.cp_p+					then Params "-p"+					else Params ""
+ Utility/DataUnits.hs view
@@ -0,0 +1,161 @@+{- data size display and parsing+ -+ - Copyright 2011 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Utility.DataUnits (+	dataUnits,+	storageUnits,+	memoryUnits,+	bandwidthUnits,+	oldSchoolUnits,++	roughSize,+	compareSizes,+	readSize+) where++import Data.List+import Data.Char++type ByteSize = Integer+type Name = String+type Abbrev = String+data Unit = Unit ByteSize Abbrev Name+	deriving (Ord, Show, Eq)++{- And now a rant: + -+ - In the beginning, we had powers of two, and they were good.+ -+ - Disk drive manufacturers noticed that some powers of two were+ - sorta close to some powers of ten, and that rounding down to the nearest+ - power of ten allowed them to advertise their drives were bigger. This+ - was sorta annoying.+ -+ - Then drives got big. Really, really big. This was good.+ -+ - Except that the small rounding error perpretrated by the drive+ - manufacturers suffered the fate of a small error, and became a large+ - error. This was bad.+ -+ - So, a committee was formed. And it arrived at a committee-like decision,+ - which satisfied noone, confused everyone, and made the world an uglier+ - place. As with all committees, this was meh.+ -+ - And the drive manufacturers happily continued selling drives that are+ - increasingly smaller than you'd expect, if you don't count on your+ - fingers. But that are increasingly too big for anyone to much notice.+ - This caused me to need git-annex.+ -+ - Thus, I use units here that I loathe. Because if I didn't, people would+ - be confused that their drives seem the wrong size, and other people would+ - complain at me for not being standards compliant. And we call this+ - progress?+ -}++dataUnits :: [Unit]+dataUnits = storageUnits ++ memoryUnits++{- Storage units are (stupidly) powers of ten. -}+storageUnits :: [Unit]+storageUnits =+	[ Unit (p 8) "YB" "yottabyte"+	, Unit (p 7) "ZB" "zettabyte"+	, Unit (p 6) "EB" "exabyte"+	, Unit (p 5) "PB" "petabyte"+	, Unit (p 4) "TB" "terabyte"+	, Unit (p 3) "GB" "gigabyte"+	, Unit (p 2) "MB" "megabyte"+	, Unit (p 1) "kB" "kilobyte" -- weird capitalization thanks to committe+	, Unit (p 0) "B" "byte"+	]+	where+		p :: Integer -> Integer+		p n = 1000^n++{- Memory units are (stupidly named) powers of 2. -}+memoryUnits :: [Unit]+memoryUnits =+	[ Unit (p 8) "YiB" "yobibyte"+	, Unit (p 7) "ZiB" "zebibyte"+	, Unit (p 6) "EiB" "exbibyte"+	, Unit (p 5) "PiB" "pebibyte"+	, Unit (p 4) "TiB" "tebibyte"+	, Unit (p 3) "GiB" "gigabyte"+	, Unit (p 2) "MiB" "mebibyte"+	, Unit (p 1) "KiB" "kibibyte"+	, Unit (p 0) "B" "byte"+	]+	where+		p :: Integer -> Integer+		p n = 2^(n*10)++{- Bandwidth units are only measured in bits if you're some crazy telco. -}+bandwidthUnits :: [Unit]+bandwidthUnits = error "stop trying to rip people off"++{- Do you yearn for the days when men were men and megabytes were megabytes? -}+oldSchoolUnits :: [Unit]+oldSchoolUnits = map mingle $ zip storageUnits memoryUnits+	where+		mingle (Unit _ a n, Unit s' _ _) = Unit s' a n++{- approximate display of a particular number of bytes -}+roughSize :: [Unit] -> Bool -> ByteSize -> String+roughSize units abbrev i+	| i < 0 = "-" ++ findUnit units' (negate i)+	| otherwise = findUnit units' i+	where+		units' = reverse $ sort units -- largest first++		findUnit (u@(Unit s _ _):us) i'+			| i' >= s = showUnit i' u+			| otherwise = findUnit us i'+		findUnit [] i' = showUnit i' (last units') -- bytes++		showUnit i' (Unit s a n) = let num = chop i' s in+			show num ++ " " +++			(if abbrev then a else plural num n)++		chop :: Integer -> Integer -> Integer+		chop i' d = round $ (fromInteger i' :: Double) / fromInteger d++		plural n u+			| n == 1 = u+			| otherwise = u ++ "s"++{- displays comparison of two sizes -}+compareSizes :: [Unit] -> Bool -> ByteSize -> ByteSize -> String+compareSizes units abbrev old new+	| old > new = roughSize units abbrev (old - new) ++ " smaller"+	| old < new = roughSize units abbrev (new - old) ++ " larger"+	| otherwise = "same"++{- Parses strings like "10 kilobytes" or "0.5tb". -}+readSize :: [Unit] -> String -> Maybe ByteSize+readSize units input+	| null parsednum = Nothing+	| null parsedunit = Nothing+	| otherwise = Just $ round $ number * (fromIntegral multiplier)+	where+		(number, rest) = head parsednum+		multiplier = head $ parsedunit+		unitname = takeWhile isAlpha $ dropWhile isSpace rest++		parsednum = reads input :: [(Double, String)]+		parsedunit = lookupUnit units unitname++		lookupUnit _ [] = [1] -- no unit given, assume bytes+		lookupUnit [] _ = []+		lookupUnit (Unit s a n:us) v+			| a ~~ v || n ~~ v = [s]+			| plural n ~~ v || a ~~ byteabbrev v = [s]+			| otherwise = lookupUnit us v+		+		a ~~ b = map toLower a == map toLower b+		+		plural n = n ++ "s"+		byteabbrev a = a ++ "b"
+ Utility/Dot.hs view
@@ -0,0 +1,63 @@+{- a simple graphviz / dot(1) digraph description generator library+ -+ - Copyright 2010 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Utility.Dot where -- import qualified++{- generates a graph description from a list of lines -}+graph :: [String] -> String+graph s = unlines $ [header] ++ map indent s ++ [footer]+	where+		header = "digraph map {"+		footer= "}"++{- a node in the graph -}+graphNode :: String -> String -> String+graphNode nodeid desc = label desc $ quote nodeid++{- an edge between two nodes -}+graphEdge :: String -> String -> Maybe String -> String+graphEdge fromid toid desc = indent $ maybe edge (\d -> label d edge) desc+	where+		edge = quote fromid ++ " -> " ++ quote toid++{- adds a label to a node or edge -}+label :: String -> String -> String+label l s = attr "label" l s++{- adds an attribute to a node or edge+ - (can be called multiple times for multiple attributes) -}+attr :: String -> String -> String -> String+attr a v s = s ++ " [ " ++ a ++ "=" ++ quote v ++ " ]"++{- fills a node with a color -}+fillColor :: String -> String -> String+fillColor color s = attr "fillcolor" color $ attr "style" "filled" $ s++{- apply to graphNode to put the node in a labeled box -}+subGraph :: String -> String -> String -> String -> String+subGraph subid l color s =+	"subgraph " ++ name ++ " {\n" +++		ii setlabel +++		ii setfilled +++		ii setcolor +++		ii s +++		indent "}"+	where+		-- the "cluster_" makes dot draw a box+		name = quote ("cluster_" ++ subid)+		setlabel = "label=" ++ quote l+		setfilled = "style=" ++ quote "filled"+		setcolor = "fillcolor=" ++ quote color+		ii x = (indent $ indent x) ++ "\n"++indent ::String -> String+indent s = "\t" ++ s++quote :: String -> String+quote s = "\"" ++ s' ++ "\""+	where+		s' = filter (/= '"') s
+ Utility/RsyncFile.hs view
@@ -0,0 +1,48 @@+{- git-annex file copying with rsync+ -+ - Copyright 2010 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Utility.RsyncFile where++import Data.String.Utils++import Utility++{- Generates parameters to make rsync use a specified command as its remote+ - shell. -}+rsyncShell :: [CommandParam] -> [CommandParam]+rsyncShell command = [Param "-e", Param $ unwords $ map escape (toCommand command)]+	where+		{- rsync requires some weird, non-shell like quoting in+                 - here. A doubled single quote inside the single quoted+                 - string is a single quote. -}+		escape s = "'" ++  (join "''" $ split "'" s) ++ "'"++{- Runs rsync in server mode to send a file, and exits. -}+rsyncServerSend :: FilePath -> IO ()+rsyncServerSend file = rsyncExec $+	rsyncServerParams ++ [Param "--sender", File file]++{- Runs rsync in server mode to receive a file. -}+rsyncServerReceive :: FilePath -> IO Bool+rsyncServerReceive file = rsync $ rsyncServerParams ++ [File file]++rsyncServerParams :: [CommandParam]+rsyncServerParams =+	[ Param "--server"+	-- preserve permissions+	, Param "-p"+	-- allow resuming of transfers of big files+	, Param "--inplace"+	-- other options rsync normally uses in server mode+	, Params "-e.Lsf ."+	]++rsync :: [CommandParam] -> IO Bool+rsync = boolSystem "rsync"++rsyncExec :: [CommandParam] -> IO ()+rsyncExec params = executeFile "rsync" True (toCommand params) Nothing
debian/changelog view
@@ -1,3 +1,14 @@+git-annex (3.20110707) unstable; urgency=low++  * Fix sign bug in disk free space checking.+  * Bugfix: Forgot to de-escape keys when upgrading. Could result in+    bad location log data for keys that contain [&:%] in their names.+    (A workaround for this problem is to run git annex fsck.)+  * add: Avoid a failure mode that resulted in the file seemingly being+    deleted (content put in the annex but no symlink present).++ -- Joey Hess <joeyh@debian.org>  Thu, 07 Jul 2011 19:29:39 -0400+ git-annex (3.20110705) unstable; urgency=low    * uninit: Delete the git-annex branch and .git/annex/
− df.hs
@@ -1,6 +0,0 @@-import System.Environment-import StatFS--main = mapM_ df =<< getArgs--df d = print =<< getFileSystemStats d
− doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_1_c871605e187f539f3bfe7478433e7fb5._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-04-03T01:46:16Z"- content="""-Have you seen [[walkthrough/recover_data_from_lost+found]]? The method described there will also work in this scenario.-"""]]
− doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_2_e6f1e9eee8b8dfb60ca10c8cfd807ac9._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 2"- date="2011-04-03T09:00:17Z"- content="""-I did not. Thanks :)--This still means that you can't re-inject a new version of a file unless you have the old one if you are using a SHA* backend, but that might be a corner case anyway.-"""]]
− doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_3_be62be5fe819acc0cb8b878802decd46._comment
@@ -1,14 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 3"- date="2011-05-14T16:28:36Z"- content="""-To re-inject new content for a file, you really want to get a new key for the file. Otherwise, other repos that have the old file will never get the new content. So:--<pre>-git rm file-mv ~/newcontent file-git annex add file-</pre>-"""]]
− doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_4_480a4f72445a636eab1b1c0f816d365c._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 4"- date="2011-05-14T16:29:35Z"- content="""-Although, if you really do want to shoot yourself in the foot, or know you have the old content, you can use `git-annex setkey`.-"""]]
− doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_1_dc5ae7af499203cfd903e866595b8fea._comment
@@ -1,18 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-03-30T14:32:34Z"- content="""-S3 doesn't support encryption at all, yet.--It certainly makes sense to use a different portion of the encrypted secret key for HMAC than is uses as the gpg symmetric encryption key.--The two keys used in HMAC would be the secret key and the key/value key for the content being stored.--There is a difficult problem with encrypting filenames in S3 buckets, and that is determining when some data in the bucket is unused for dropunused. I've considered two choices:--1. gpg encrypt the filenames. This would allow dropunused to recover the original filenames, and is probably more robust encryption. But it would double the number of times gpg is run when moving content in/out, and to check for unused content, gpg would have to be run once for every item in the bucket, which just feels way excessive, even though it would not be prompting for a passphrase. Still, haven't ruled this out.--2. HMAC or other hash. To determine what data was unused the same hash and secret key would have to be used to hash all filenames currently used, and then that set of hashes could be interested with the set in the bucket. But then git-annex could only say \"here are some opaque hashes of content that appears unused by anything in your current git repository, but there's no way, short of downloading it and examining it to tell what it is\". (This could be improved by keeping a local mapping between filenames and S3 keys, but maintaining and committing that would bring pain of its own.)-"""]]
− doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_2_c62daf5b3bfcd2f684262c96ef6628c1._comment
@@ -1,12 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 2"- date="2011-03-30T17:01:40Z"- content="""-After mulling this over, I think actually encrypting the filenames is preferable.--Did you consider encrypting the symmetric key with an asymmetric one? That's what TrueCrypt etc are using to allow different people access to a shared volume. This has the added benefit that you could, potentially, add new keys for data that new people should have access to while making access to old data impossible. Or keys per subdirectory, or, or, or.--As an aside, could the same mechanism be extended to transparently encrypt data for a remote annex repo? A friend of mine is interested to host his data with me, but he wants to encrypt his data for obvious reasons.-"""]]
− doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_3_e1f39c4af5bdb0daabf000da80858cd9._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 3"- date="2011-03-30T18:15:18Z"- content="""-Yes, encrypting the symmetric key with users' regular gpg keys is the plan.--I don't think that encryption of content in a git annex remote makes much sense; the filenames obviously cannot be encrypted there. It's more likely that the same encryption would get used for a bup remote, or with the [[special_remotes/directory]] remote I threw in today.-"""]]
− doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_4_bb6b814ab961818d514f6553455d2bf3._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 4"- date="2011-03-30T18:20:56Z"- content="""-Picking up the automagic encryption idea for annex remotes, this would allow you to host a branchable-esque git-annex hosting service. (Nexenta with ZFS is a cheap and reliable option until btrfs becomes stable in a year or five).-"""]]
− doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_5_5bb128f6d2ca4b5e4d881fae297fa1f8._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 5"- date="2011-03-30T18:59:19Z"- content="""-This is brain-storming only so the idea might be crap, but a branch could keep encrypted filenames while master keeps the real deal. This might fit into the whole scheme just nicely or break future stuff in a dozen places, I am not really sure yet. But at least I can't forget the idea, now.-"""]]
− doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_6_63fb74da342751fc35e1850409c506f6._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 6"- date="2011-03-30T19:02:20Z"- content="""-OTOH, if encryption makes a bup backend more likely disregard the idea above ;)-"""]]
− doc/bugs/Unfortunate_interaction_with_Calibre/comment_1_7cb5561f11dfc7726a537ddde2477489._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 1"- date="2011-03-21T13:15:03Z"- content="""-Maybe I will run into issues myself somewhere down the road, but generally speaking, I really really like the fact that files are immutable by default.-"""]]
− doc/bugs/Unfortunate_interaction_with_Calibre/comment_2_b8ae4bc589c787dacc08ab2ee5491d6e._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 2"- date="2011-03-31T19:32:25Z"- content="""-One option would be to use the new [[news/sharebox_a_FUSE_filesystem_for_git-annex]], which would hide the immutable file details from Calibre, and proxy any changes it made through to git-annex as a series of `git annex unlock; modify; git-annex lock`-"""]]
− doc/bugs/WORM:_Handle_long_filenames_correctly/comment_1_77aa9cafbe20367a41377f3edccc9ddb._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-04-08T17:14:25Z"- content="""-Seems like you probably have files in git with nearly as long filenames as the key files. Course, you can rename those yourself.--This couldn't be changed directly in WORM without some ugly transition, but it would be possible to implement it as a WORM100 or so. OTOH, if you're going to git annex migrate, you might as well use SHA1.-"""]]
− doc/bugs/WORM:_Handle_long_filenames_correctly/comment_2_fe735d728878d889ccd34ec12b3a7dea._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 2"- date="2011-04-08T22:02:41Z"- content="""-What if your files have the same prefix and it happens to be 100 chars long? This can not be solved within WORM, but as Joey pointed out, SHA* exists.-"""]]
− doc/bugs/WORM:_Handle_long_filenames_correctly/comment_3_2bf0f02d27190578e8f4a32ddb195a0a._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 3"- date="2011-04-09T20:11:59Z"- content="""-I wouldn't say it's completly impossible for a WORM100 to work. It would just have the contract that the pair of mtime+100chars has to be unique for each unique piece of data.--But, I have yet to be convinced there's any point, since SHA1 exists.-"""]]
− doc/bugs/WORM:_Handle_long_filenames_correctly/comment_4_8f7ba9372463863dda5aae13205861bf._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 4"- date="2011-04-09T23:45:28Z"- content="""-mtime+100chars can still get collisions and a _lot_ easier than even SHA1. This introduces more problems that it solves, imo.-"""]]
− doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_1_c896ff6589f62178b60e606771e4f2bf._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w"- nickname="Rafaël"- subject="comment 1"- date="2011-07-04T16:57:25Z"- content="""-You convince me for unannex, but isn't the goal of uninit to revert all annex operations? In the current state, a clean revert is not possible (because of the broken symlinks after uninit). Instead of copying, using hard links is out of question?--For my needs, is the command \"git annex unlock .\" (from the root of the repo) a correct workaround?-"""]]
− doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_2_9249609f83f8e9c7521cd2f007c1a39e._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawmJfIszzreLNvCqzqzvTayA9_9L6gb9RtY"- nickname="Joey"- subject="comment 2"- date="2011-07-04T20:25:38Z"- content="""-Indeed, uninit needed to be improved. I've done so. Also, unannex --fast can be used to make hard links to content left in the annex.-"""]]
− doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_10_435f87d54052f264096a8f23e99eae06._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 10"- date="2011-05-15T16:47:53Z"- content="""-The key is the basename of the symlink target.-"""]]
− doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_11_9be0aef403a002c1706d17deee45763c._comment
@@ -1,24 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 11"- date="2011-05-15T18:53:26Z"- content="""-It seems the objects are in the remote after all, but the remote is unaware of this fact. No idea where/why the remote lost that info, but.. Anyway, with the SHA backends, wouldn't it make sense to simply return \"OK\" and update the annex logs accordingly, no?--Local:--    % ls -l foo-    lrwxrwxrwx 1 richih richih 312 Apr  3 01:18 foo -> .git/annex/objects/gG/VW/SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491/SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491-    % --Remote:--    % git-annex-shell recvkey <remote> SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491-    git-annex-shell: key is already present in annex-    % strace git-annex-shell recvkey /base/git-annex/fun SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491 2>&1 | grep SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491-    stat64(\"/base/git-annex/fun/annex/objects/gG/VW/SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491/SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491\", {st_mode=S_IFREG|0444, st_size=80781, ...}) = 0-    % ls -l /base/git-annex/fun/annex/objects/gG/VW/SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491/SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491-    -r--r--r-- 1 richih richih 80781 2011-04-01 12:44 /base/git-annex/fun/annex/objects/gG/VW/SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491/SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491-    % -"""]]
− doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_12_26d60661196f63fd01ee4fbb6e2340e7._comment
@@ -1,11 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 12"- date="2011-05-15T19:40:47Z"- content="""-So, it appears that you're using git annex copy --fast. As documented that assumes the location log is correct. So it avoids directly checking if the bare repo contains the file, and tries to upload it, and the bare repo is all like \"but I've already got this file!\". The only way to improve that behavior might be to let rsync go ahead and retransfer the file, which, with recovery, should require sending little data etc. But I can't say I like the idea much, as the repo already has the content, so unlocking it and letting rsync mess with it is an unnecessary risk. I think it's ok for --force to blow up-if its assumptions turn out to be wrong.--If you use git annex copy without --fast in this situation, it will do the right thing.-"""]]
− doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_13_ead55b915d3b92a62549b2957ad211c8._comment
@@ -1,35 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 13"- date="2011-05-15T20:25:25Z"- content="""-Yes, makes sense. I am so used to using --fast, I forgot a non-fast mode existed. I still think it would be a good idea to fall back to non-fast mode if --fast runs into an error from the remote, but as that is well without my abilities how about this patch?---    From 4855510c7a84eb5d28fdada429580a8a42b7112a Mon Sep 17 00:00:00 2001-    From: Richard Hartmann <richih.mailinglist@gmail.com>-    Date: Sun, 15 May 2011 22:20:42 +0200-    Subject: [PATCH] Make error in RecvKey.hs suggest possible solution-    -    ----     Command/RecvKey.hs |    2 +--     1 files changed, 1 insertions(+), 1 deletions(-)-    -    diff --git a/Command/RecvKey.hs b/Command/RecvKey.hs-    index 126608f..b917a1c 100644-    --- a/Command/RecvKey.hs-    +++ b/Command/RecvKey.hs-    @@ -27,7 +27,7 @@ start :: CommandStartKey-     start key = do-        present <- inAnnex key-        when present $-    -       error \"key is already present in annex\"-    +       error \"key is already present in annex. If you are running copy, try without '--fast'\"-        -        ok <- getViaTmp key (liftIO . rsyncServerReceive)-        if ok-    -- -    1.7.4.4--"""]]
− doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_14_191de89d3988083d9cf001799818ff4a._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 14"- date="2011-05-15T20:50:26Z"- content="""-Or, even better, wouldn't it make sense to have SHA backends always default to --fast and only use non-fast when any snags are hit, use non-fast mode for that file.--Though if we continue here, we should probably move this to its own page.-"""]]
− doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_15_b3e3b338ccfa0a32510c78ba1b1bb617._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 15"- date="2011-05-15T21:38:47Z"- content="""-PS: Just to make this clear, I am using a custom alias for all my copying needs and thus didn't even see that I used --fast. :p-"""]]
− doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_16_04a9f4468c3246c8eff3dbe21dd90101._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 16"- date="2011-05-16T20:01:28Z"- content="""-Thanks.-"""]]
− doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_1_6a41bf7e2db83db3a01722b516fb6886._comment
@@ -1,18 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 1"- date="2011-05-12T00:07:29Z"- content="""-I followed this to re-inject files which git annex fsck listed as missing.--For everyone of those files, I get --    git-annex-shell: key is already present in annex-    rsync: connection unexpectedly closed (0 bytes received so far) [sender]-    rsync error: error in rsync protocol data stream (code 12) at io.c(601) [sender=3.0.8]--when trying to copy the files to the remote.---- Richard-"""]]
− doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_2_9f5f1dbffb2dd24f4fcf8c2027bf0384._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 2"- date="2011-05-12T01:01:34Z"- content="""-Sounds like you probably didn't commit after the fsck, or didn't push so the other repository did not know the first had the content again -- but I'm not 100% sure.-"""]]
− doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_3_b596b5cfd3377e58dbbb5d509d026b90._comment
@@ -1,14 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 3"- date="2011-05-14T09:06:54Z"- content="""-As my comment from work is stuck in moderation:--I ran this twice:--    git pull && git annex add . && git annex copy . --to <remote> --fast --quiet && git commit -a -m \"$HOST $(date +%F--%H-%M-%S-%Z)\" && git push--but nothing changed-"""]]
− doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_4_d7112c315fb016a8a399e24e9b6461d8._comment
@@ -1,12 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 4"- date="2011-05-14T16:13:58Z"- content="""-Hmm. Old versions may have forgotten to git add a .git-annex location log file when recovering content with fsck. That could be another reason things are out of sync.--But I'm not clear on which repo is trying to copy files to which.--(NB: If the files were recovered on a bare git repo, fsck cannot update the location log there, which could also explain this.)-"""]]
− doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_5_4ea29a6f8152eddf806c536de33ef162._comment
@@ -1,14 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 5"- date="2011-05-14T19:03:43Z"- content="""-Version: 0.20110503--My local non-bare repo is copying to a remote bare repo.--I have been recovering in a non-bare repo.--If there is anything I can send you to help... If I removed said files and went through http://git-annex.branchable.com/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/ -- would that help?-"""]]
− doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_6_0d85f114a103bd6532a3b3b24466012e._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 6"- date="2011-05-14T19:23:45Z"- content="""-Well, focus on a specific file that exhibits the problem. What does `git annex whereis` say about it? Is the content actually present in annex/objects/ on the bare repository? Does that contradict whereis?-"""]]
− doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_7_d38d5bee6d360b0ea852f39e3a7b1bc6._comment
@@ -1,12 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 7"- date="2011-05-14T23:13:15Z"- content="""-It exists locally, whereis tells me it exists locally and locally, only.--The object is _not_ in the bare repo.--The file _might_ have gone missing before I upgraded my annex backend version to 2. Could this be a factor?-"""]]
− doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_8_29c3de4bf5fbd990b230c443c0303cbe._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 8"- date="2011-05-15T00:09:34Z"- content="""-What you're describing should be impossible; the error message shown can only occur if the object is present in the annex where `git-annex-shell recvkey` is run. So something strange is going on.--Try reproducing it by running on the remote system, `git-annex-shell recvkey /remote/repo.git $key` .. if you can reproduce it, I guess the next thing to do will be to strace the command and see why it's thinking the object is there.-"""]]
− doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_9_2cee4f6bd6db7518fd61453c595162c6._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 9"- date="2011-05-15T09:16:49Z"- content="""-Just to make sure: How do I get $key? What I did was look at the path in the object store of the local repo and see if that exact same path & file existed in the remote.-"""]]
− doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799.mdwn
@@ -1,75 +0,0 @@-I ran git-annex (git version) on three machines with ghc-7.0.2 for about a month, but recently (no more than a week ago) I've started getting this error for every file on "git annex get":--    git-annex-shell: internal error: evacuate(static): strange closure type 30799-        (GHC version 7.0.2 for i386_unknown_linux)-        Please report this as a GHC bug:  http://www.haskell.org/ghc/reportabug--There were no changes to ghc or it's modules, so I assume something has changed in git-annex itself.--strace shows "git annnex get" (on "host1") performing following exec's:--    [pid  9481] execve("/usr/bin/rsync", ["rsync", "-p", "--progress", "--inplace", "-e", "'ssh' 'user@host2' 'git-annex-shell ''sendkey'' ''/remote/path'' ''SHA1-s6654080--abd8edec20648ade69351d68ae1c64c8074a6f0b'' ''--'''", ":", "/local/path/.git/annex/tmp/SHA1-s6654080--abd8edec20648ade69351d68ae1c64c8074a6f0b"], [/* 41 vars */]) = 0-    [pid  9482] execve("/usr/bin/ssh", ["ssh", "user@host2", "git-annex-shell 'sendkey' '/remote/path' 'SHA1-s6654080--abd8edec20648ade69351d68ae1c64c8074a6f0b' '--'", "", "rsync", "--server", "--sender", "-vpe.Lsf", "--inplace", ".", ""], [/* 41 vars */] <unfinished ...>--I've tried running the second command directly from the shell and got the same error message from a remote GHC.-Adding strace before git-annex-shell to remote command yielded something like this in the end:--    stat64("/local/path.git", 0xb727d610) = -1 ENOENT (No such file or directory)-    stat64("/local/path.git", 0xb727d6b0) = -1 ENOENT (No such file or directory)-    waitpid(7525, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0) = 7525-    chdir("/home/user")                  = 0-    rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0-    write(2, "git-annex-shell: internal error: ", 33git-annex-shell: internal error: ) = 33-    ...--Note that "/local/path" here is not what's specified in rsync arguments at all, and git repo with files-to-be-fetched on "host2" is in "/remote/path", but "/local/path" is present in git remotes there since I mount it via nfs from "host1" (yes, to the same path as it's there):--    [remote "nfs"]-      url = /local/path-      fetch = +refs/heads/*:refs/remotes/nfs/*-      push = refs/heads/*:refs/remotes/host2/*-      annex-uuid = 0a4e14ba-5236-11e0-9004-7f24452c0f05--If I comment that remote out from "/remote/path/.git/config", "git annex get" works fine.-The only git-command git-annex-shell seem to exec there (on "host2") is "git config --list", so it's shouldn't be git trying to do something with it's remotes - it's git-annex itself, right?--Anyways, looks like a simple path-joining error, if "/local/path.git" should be "/local/path/.git" there.--I'm actually quite confused about what it's trying to do with that path.-Connect from "host1" to "host2" just to connect back to "host1"?-What for, when it should just fetch files from "host2"?--> git-annex (and git-annex shell) always start up by learning what git-> remotes are locally configured, and this includes checking them to-> try to look up their annex.uuid setting.-> -> Since git will, given a remote like "url = /foo", first look in-> "/foo.git" for a bare git repository, so too does git-annex.-> I do not think this is a path joining error. That seems likely to-> be a red herring. --[[Joey]]--Not sure if it's a bug or I'm doing something wrong, but if git-annex really need to check something in git remotes' paths, error message (the one at the top of this post) can be a more descriptive, I guess.-Something like "error: failed to do something with git remote X on a remote host" would've been a lot less confusing than that GHC thing.--Thanks!--> I've never seen anything like this error message. I don't know if the-> problem is caused by building with GHC 7, or what. You didn't say what-> OS you're using. Searching for the error message, it seems to involve-> Mac OS X. --> For example: <http://hackage.haskell.org/trac/ghc/ticket/3771>->> The error "strange closure type" indicates some kind of memory corruption, which can have many different causes, from bugs in the GC to hardware failures.-> -> You said that you'd been using git-annex built with that version of GHC-> successfully before. Perhaps you could use `git bisect` to see if you can-> identify a point in git-annex's history where this started happening?-> Since you  can reproduce the problem by just running git-annex-shell at-> the command line with the right parameters, it should be easy to bisect it.-> -> Probably your best bet will be changing to a different version or build of-> GHC.. --[[Joey]] -------forwarded to GHC upstream; closing [[done]] --[[Joey]] 
− doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_1_1c19e716069911f17bbebd196d9e4b61._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://fraggod.pip.verisignlabs.com.pip.verisignlabs.com/"- subject="Bisect it is, then"- date="2011-04-03T04:45:49Z"- content="""-Hm, if path's ok, guess there's no way around git-bisect indeed. Wonder if there's some kind of ccache for haskell...--OS is linux, amd64 on \"host1\" and i386 on \"host2\" where git-annex-shell is crashing.-I'll try to come up with a commit, thanks for clarifications.-"""]]
− doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_2_a4d66f29d257044e548313e014ca3dc3._comment
@@ -1,66 +0,0 @@-[[!comment format=mdwn- username="http://fraggod.pip.verisignlabs.com.pip.verisignlabs.com/"- subject="Bisect results"- date="2011-04-03T06:22:15Z"- content="""-Completed git-bisect twice, getting roughly the same results:--    828a84ba3341d4b7a84292d8b9002a8095dd2382 is the first bad commit-    commit 828a84ba3341d4b7a84292d8b9002a8095dd2382-    Author: Joey Hess <joey@kitenet.net>-    Date:   Sat Mar 19 14:33:24 2011 -0400--        Add version command to show git-annex version as well as repository version information.--    :040000 040000 ed849b7b6e9b177d6887ecebd6a0f146357824f3 1c98699dfd3fc3a3e2ce6b55150c4ef917de96e9 M      Command-    :100644 100644 b9c22bdfb403b0bdb1999411ccfd34e934f45f5c adf07e5b3e6260b296c982a01a73116b8a9a023c M      GitAnnex.hs-    :100644 100644 76dd156f83f3d757e1c20c80d689d24d0c533e16 d201cc73edb31f833b6d00edcbe4cf3f48eaecb0 M      Upgrade.hs-    :100644 100644 5f414e93b84589473af5b093381694090c278e50 d4a58d77a29a6a02daf13cec0df08b5aab74f65e M      Version.hs-    :100644 100644 f5c2956488a7afafd20374873d79579fb09b1677 f8cd577e992d38c7ec1438ce5c141eb0eb410243 M      configure.hs-    :040000 040000 f9b7295e997c0a5b1dda352f151417564458bd6e a30008475c1889f4fd8d60d4d9c982563380a692 M      debian-    :040000 040000 9d87a5d8b9b9fe7b722df303252ffd5760d66f75 08834f61a10d36651b3cdcc38389f45991acdf5e M      doc--contents of final refs/bisect:--    bad (828a84ba3341d4b7a84292d8b9002a8095dd2382)-    good-33cb114be5135ce02671d8ce80440d40e97ca824-    good-942480c47f69e13cf053b8f50c98c2ce4eaa256e-    good-ca48255495e1b8ef4bda5f7f019c482d2a59b431--\"roughly\" because second bisect gave two commits as a result, failing to build one of them (missing .o file on link, guess it's because of -j4 and bad deps in that version's build system):--    There are only 'skip'ped commits left to test.-    The first bad commit could be any of:-    828a84ba3341d4b7a84292d8b9002a8095dd2382-    5022a69e45a073046a2b14b6a4e798910c920ee9-    We cannot bisect more!--Also noticed that \"git-annex-shell ...\" command succeeds if ran as root user, while failing from unprivileged one.-There are no permission/access errors in \"strace -f git-annex-shell ...\", so I guess it could be some bug in the GHC indeed.--JIC, logged a whole second bisect operation.-Resulting log: [http://fraggod.net/static/share/git-annex-bisect.log](http://fraggod.net/static/share/git-annex-bisect.log)--Bisect script I've used (git-annex-shell dies with error code 134 - SIGABRT on GHC error):--    res=-    while true; do-      if [[ -n \"$res\" ]]; then-        cd /var/tmp/paludis/build/dev-scm-git-annex-scm.bak/work/git-annex-scm-        echo \"---=== BISECT ($res) ===---\"; git bisect \"$res\" 2>&1; echo '---=== /BISECT ===---'-        cd-        rm -Rf /var/tmp/paludis/build/dev-scm-git-annex-scm-        cp -a --reflink=auto /var/tmp/paludis/build/dev-scm-git-annex-scm{.bak,}-        chown -R paludisbuild: /var/tmp/paludis/build/dev-scm-git-annex-scm-      fi-      res=-      cave resolve -zx1 git-annex --skip-until-phase configure || res=skip-      if [[ -z \"$res\" ]]; then-        cd /remote/path-        sudo -u user git-annex-shell 'sendkey' '/remote/path' 'SHA1-s6654080--abd8edec20648ade69351d68ae1c64c8074a6f0b' '--' rsync --server --sender -vpe.Lsf --inplace . ''-        if [[ $? -eq 134 ]]; then res=bad; else res=good; fi-        cd-      fi-    done 2>&1 | tee ~/git-annex-bisect.log--"""]]
− doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_3_f5f1081eb18143383b2fb1f57d8640f5._comment
@@ -1,38 +0,0 @@-[[!comment format=mdwn- username="http://fraggod.pip.verisignlabs.com.pip.verisignlabs.com/"- subject="comment 3"- date="2011-04-03T06:57:02Z"- content="""-Repeated bisect with -j1, just to be sure it's not a random error, and it gave me 828a84ba3341d4b7a84292d8b9002a8095dd2382 again.-Guess I'll look through the changes there a bit later and try to revert these until it works.--Not sure if it's repeatable by anyone but me  (and hence worth fixing), but here's a bit more of info about the system:--    Exherbo linux-    Linux sacrilege 2.6.38.2-fg.roam #4 SMP PREEMPT Mon Mar 28 21:08:47 YEKST 2011 i686 GNU/Linux--    dev-lang/ghc-7.0.2:7.0.2::installed-    dev-haskell/HUnit-1.2.2.3:1.2.2.3::installed-    dev-haskell/MissingH-1.1.0.3:1.1.0.3::installed-    dev-haskell/QuickCheck-2.4.0.1:2.4.0.1::installed-    dev-haskell/array-0.3.0.2:0.3.0.2::installed-    dev-haskell/bytestring-0.9.1.7:0.9.1.7::installed-    dev-haskell/containers-0.4.0.0:0.4.0.0::installed-    dev-haskell/extensible-exceptions-0.1.1.2:0.1.1.2::installed-    dev-haskell/filepath-1.2.0.0:1.2.0.0::installed-    dev-haskell/hslogger-1.1.3:0::installed-    dev-haskell/mtl-2.0.1.0:2.0.1.0::installed-    dev-haskell/network-2.3.0.1:2.3.0.1::installed-    dev-haskell/old-locale-1.0.0.2:1.0.0.2::installed-    dev-haskell/parsec-3.1.0:3.1.0::installed-    dev-haskell/pcre-light-0.4:0::installed-    dev-haskell/regex-base-0.93.2:0.93.2::installed-    dev-haskell/regex-compat-0.93.1:0.93.1::installed-    dev-haskell/regex-posix-0.94.4:0.94.4::installed-    dev-haskell/syb-0.3:0.3::installed-    dev-haskell/transformers-0.2.2.0:0.2.2.0::installed-    dev-haskell/utf8-string-0.3.6:0.3.6::installed--(some stuff listed here as ::installed, but contains no files, since these packages detect whether ghc-7.0.2 already comes with the same/newer package version)--"""]]
− doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_4_b1f818b85c3540591c48e7ba8560d070._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 4"- date="2011-04-03T16:06:34Z"- content="""-Nice work on the bisection. It's obviously a compiler bug. Having two test cases that differ in only as trivial and innocous a commit as 828a84ba3341d4b7a84292d8b9002a8095dd2382 might help a GHC developer track it down.--We should probably forward this as a GHC bug. I hope you can find a different version or build of GHC to build git-annex with.-"""]]
− doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_5_67406dd8d9bd4944202353508468c907._comment
@@ -1,13 +0,0 @@-[[!comment format=mdwn- username="http://fraggod.pip.verisignlabs.com.pip.verisignlabs.com/"- subject="Reported the issue to GHC"- date="2011-04-07T13:44:36Z"- content="""-Finally got around to [report the issue to GHC tracker](http://hackage.haskell.org/trac/ghc/ticket/5085#comment:7).--Looks quite alike (at least to the haskell-illiterate person like me) to a highest-priority issue that's hanging right at the top of the list.-There are other similar reports, but they seem to be either related to PowerPC Macs, closed as invalid or due to needinfo inactivity.--Guess any further discussion belongs there, unless ghc developers will bounce it back.-Thanks a lot for your help, Joey, and for sharing a great thing that git-annex is.-"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_10_f3594de3ba2ab17771a4b116031511bb._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 10"- date="2011-04-01T16:11:52Z"- content="""-No, I don't need a copy of your repo now.-"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_11_97de7252bf5d2a4f1381f4b2b4e24ef8._comment
@@ -1,13 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 11"- date="2011-04-02T17:53:58Z"- content="""-I have pushed out a preliminary fix. The old mixed-case directories will be left where they are, and still read from by git-annex. New data will be written to new, lower-case directories. I think that once git stops seeing changes being made-to mixed-case, colliding directories, the bugs you ran into won't manifest any more.--You will need to find a way to get your git repository out of the state where it complains about uncommitted files (and won't let you commit them). I have not found a reliable way to do that; git reset --hard worked in one case but not in another. May need to clone a fresh git repository.--Let me know how it works out.-"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_12_f1c53c3058a587185e7a78d84987539d._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 12"- date="2011-04-02T17:58:24Z"- content="""-Also, you can delete `.git-annex/??` if you want to, then running `git annex fsck --fast` in each of your clones would regenerate the data using only the lower-case hash directories.-"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_13_4f56aea35effe5c10ef37d7ad7adb48c._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 13"- date="2011-04-03T07:43:37Z"- content="""-Ok, thanks for the fix. It seems the fix isn't too reliable with my repos, I get different numbers of  \"** No known copies of...\" in the various cloned repos that I have. After all the \"messing\" that I have done to my repos I think git-annex has gotten very confused. I will just leave things as they are and let git-annex slowly migrate over to the new format or re-clone from a linux source and see how things go. I will report back on this issue in abit after I use it more to see.-"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_14_cc2a53c31332fe4b828ef1e72c2a4d49._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 14"- date="2011-04-03T08:24:17Z"- content="""-I meant to say in it wasn't reliable when I was following the instructions for \"Comment 12\". I did find that just doing a  \"git annex copy -t externalusb .\"  then a \"git annex drop .\" from the root of my cloned and \"none trusted\" annexed repos to be more reliable, it just means I temporarily need a load of space to get myself out of my earlier mess.--On testing this bug fix, I found a minor behavioural issue with [[git annex copy -f REMOTE . doesn't work as expected]]-"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_15_37f1d669c1fa53ee371f781c7bb820ae._comment
@@ -1,17 +0,0 @@-[[!comment format=mdwn- username="gernot"- ip="213.168.117.192"- subject="comment 15"- date="2011-04-03T15:41:00Z"- content="""-I also ran into problems on a case-insensitive HFS+ file system, it seems.  I-tried following the instructions in comment 12:--	1. Remove everything in .git-annex besides uuid.log and trust.log-	2. git annex fsck --fast-	3. Commit--However, I still see upper and lower case directories in .git-annex.  Did I-misunderstand that they should all be lower case now?--"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_16_8a4ab1af59098f4950726cf53636c2b3._comment
@@ -1,22 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 16"- date="2011-04-03T16:02:33Z"- content="""-I think the correct steps should be, make a backup first :) then ...--1. git pull  # update your clone, and commit everything so you don't lose anything-2. git annex fsck --fast # check the repo first, just in case-3. rm -rf .git-annex/?? # remove the old metadata-4. git annex fsck --fast # get git annex to regenerate it all-5. push your changes out to your other repos, you will need to make sure git-annex is updated everywhere if there are remotes in your setup.--I eventually migrated all of my own annex'd repos and I no longer have the old hashed directories but the new ones in the form--    .git/annex/aaa/bbb/foo.log--I did lose some tracking information but not data (as far as I can see for now), but that was quickly fixed by pushing and pulling to my bare repo which tracks most of my data.--I also found that it worked a bit more reliably for me on the copies of repos that were located on case sensitive filesystems, but I guess that was expected.-"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_17_515d5c5fbf5bd0c188a4f1e936d913e2._comment
@@ -1,9 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 17"- date="2011-04-03T16:53:51Z"- content="""-@gernot step 0 is to upgrade git-annex to current git, on all systems where you use it, in case that wasn't clear.--"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_18_db64c91dd1322a0ab168190686db494f._comment
@@ -1,14 +0,0 @@-[[!comment format=mdwn- username="gernot"- ip="213.168.117.192"- subject="comment 18"- date="2011-04-03T19:46:16Z"- content="""-Joey, sorry, I got it wrong.  I thought upgrading git didn't help and you-adjusted things in git-annex instead.--Anyway, can I get around upgrading on all hosts by reformatting the drive to-case-sensitive HFS+? Or will I have to upgrade git (currently version 1.7.2.5)-eventually anyway?--"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_19_ff555c271637af065203ca99c9eeaf89._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 19"- date="2011-04-03T19:53:44Z"- content="""-Git does not need to be upgraded. Git-annex needs to be upgraded to git rev 616e6f8a840ef4d99632d12a2e7ea15c3cfb1805 or newer, on all machines.-"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_1_9a7b09de132097100c1a68ea7b846727._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 1"- date="2011-03-28T07:23:41Z"- content="""-One possible work around is to just create a loopback file system with a case sensitive filesystem. I think I might do that for anything that I really care about for now.-"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_20_7e328b970169fffb8bce373d1522743b._comment
@@ -1,19 +0,0 @@-[[!comment format=mdwn- username="ssqq"- ip="208.70.196.4"- subject="Still a problem on 0.20110523"- date="2011-06-02T20:31:55Z"- content="""-Hi,--(I'm new to git and git annex, so please forgive any mistakes I make...)--My repo is messed up right now.  The fact that I copied the repo with rsync -a back and forth from a case insensitive filesystem to a case sensitive one, probably didn't help.--I believe the annexed files in .git/annex/objects/ are still using a mixed case directory hashing scheme.  That's the problem I'm having.  The symlinks point to the wrong case and are now broken.  I don't think the latest versions of git-annex changed that (it only changed the hashing under .git-annex, right?).--Even if I clean up my repo, I think I'm still going to have a problem because I have one repo on an OS X case insensitive filesystem and my other repos on case sensitive Linux filesystems.  Potentially the directory name under .git/annex/objects will have a different case.  Then the symlink might have a different case than my Linux FS.  Does git-annex track changes in git by the contents of the symlink?  In which case the case difference would show up as a change even though there is no change?--Is it possible to change the directory hashing scheme under .git/annex/objects to use lowercase names?--"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_21_98f632652b0db9131b0173d3572f4d62._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 21"- date="2011-06-10T16:46:03Z"- content="""-@seqq git-annex always uses the same case when creating and accessing the files pointed to by the symlinks. So it will not matter if it's used on a case-insensative, or case-insensative but preserving system like OSX.--You need to fix up the cases of the files in .git/annex/objects to what it expects. I'm not sure what would be the best way to do that. The method described in [[walkthrough/recover_data_from_lost+found]] might work well.-"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_2_174952fc3e3be12912e5fcfe78f2dd13._comment
@@ -1,185 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 2"- date="2011-03-28T15:09:45Z"- content="""-I think I know how I got myself into this mess... I was on my mac workstation and I had just pulled in a change set from another repo on a linux workstation after I had a made a bunch of moves. here's a bit of a log of what happened...---<pre>-jtang@x00:~/sources $ git pull cports-devel master-Warning: untrusted X11 forwarding setup failed: xauth key data not generated-Warning: No xauth data; using fake authentication data for X11 forwarding.-remote: Counting objects: 4195, done.-remote: Compressing objects: 100% (1135/1135), done.-remote: Total 2582 (delta 866), reused 2576 (delta 860)-Receiving objects: 100% (2582/2582), 229.42 KiB | 111 KiB/s, done.-Resolving deltas: 100% (866/866), completed with 9 local objects.-From cports-devel:/home/people/jtang/sources- * branch            master     -> FETCH_HEAD-Updating 319df99..ab0a98c-error: Your local changes to the following files would be overwritten by merge:-	.git-annex/09/5X/WORM-s361516678-m1301310614--l_fcompxe_intel64_2011.2.137.tgz.log-	.git-annex/43/2g/WORM-s19509673-m1301310496--l_fcompxe_2011.2.137_redist.tgz.log-	.git-annex/4J/qF/WORM-s18891115-m1301310934--w_flm_p_1.0.011_ia64.zip.log-	.git-annex/87/w1/WORM-s12212473-m1301310909--w_flm_p_1.0.011_ia32.zip.log-	.git-annex/99/Jq/WORM-s194345957-m1301310926--l_mkl_10.3.2.137_ia32.log-	.git-annex/99/kf/WORM-s9784531-m1301311680--l_ccompxe_2011.2.137_redist.log-	.git-annex/FF/f3/WORM-s93033394-m1301311706--l_gen_ipp_7.0.2.137.log-	.git-annex/MF/xZ/WORM-s515140733-m1301310936--l_cprof_p_11.1.075.log-	.git-annex/XW/X8/WORM-s355559731-m1301310797--l_mkl_10.3.2.137.log-	.git-annex/fJ/mZ/WORM-s1372886477-m1301313368--l_cproc_p_11.1.075.log-	.git-annex/j7/Q9/WORM-s44423202-m1301310622--l_cprof_p_11.1.075_redist.log-	.git-annex/k4/K7/WORM-s239539070-m1301310760--l_mkl_10.3.2.137_intel64.log-	.git-annex/kz/01/WORM-s279573314-m1301310783--l_cprof_p_11.1.075_ia32.log-	.git-annex/p6/Kq/WORM-s31199343-m1301311829--l_cproc_p_11.1.075_redist.log-	.git-annex/pz/J5/WORM-s626995277-m1301312301--l_ccompxe_ia32_2011.2.137.log-	.git-annex/v3/kX/WORM-s339693045-m1301310851--l_cprof_p_11.1.075_intel64.log-Please, commit your changes or stash them before you can merge.-error: Your local changes to the following files would be overwritten by merge:-	.git-annex/12/3W/WORM-s3058814-m1276699694--Botan-1.8.9.tgz.log-	.git-annex/1G/qV/WORM-s9122-m1251558854--Array-Compare-2.01.tar.gz.log-	.git-annex/3W/W5/WORM-s231523-m1270740744--DBD-Pg-2.17.1.tar.gz.log-	.git-annex/3x/PX/WORM-s380310-m1293025187--HTSeq-0.4.7.tar.gz.log-	.git-annex/45/gk/WORM-s67337-m1248732018--ExtUtils-Install-1.54.tar.gz.log-	.git-annex/4J/7Q/WORM-s8608-m1224694862--Algorithm-Munkres-0.08.tar.gz.log-	.git-annex/4g/XQ/WORM-s89208-m1278682033--HTML-Parser-3.66.tar.gz.log-	.git-annex/54/jw/WORM-s300163-m1226422051--AcePerl-1.92.tar.gz.log-	.git-annex/63/kj/WORM-s1213460-m1262942058--DBD-SQLite-1.29.tar.gz.log-	.git-annex/6Z/42/WORM-s4074-m943766010--File-Sync-0.09.tar.gz.log-	.git-annex/8F/M5/WORM-s6989-m1263161127--Digest-HMAC-1.02.tar.gz.log-	.git-annex/G2/FK/WORM-s3309-m1163872981--Bundle-BioPerl-2.1.8.tar.gz.log-	.git-annex/Gk/XF/WORM-s23572243-m1279546902--EMBOSS-6.3.1.tar.gz.log-	.git-annex/Jk/X6/WORM-s566429-m1279309002--DBI-1.612.tar.gz.log-	.git-annex/K6/fV/WORM-s1561451-m1240055295--Convert-Binary-C-0.74.tar.gz.log-	.git-annex/KM/4q/WORM-s146959-m1268515086--Graph-0.94.tar.gz.log-	.git-annex/MF/m2/WORM-s425766-m1212514609--Data-Stag-0.11.tar.gz.log-	.git-annex/QJ/P6/WORM-s1045868-m1282215033--9base-6.tar.gz.log-	.git-annex/Qm/WG/WORM-s39078-m1278163547--Digest-SHA1-2.13.tar.gz.log-	.git-annex/Wq/Fj/WORM-s45680640-m1297862101--BclConverter-1.7.1.tar.log-	.git-annex/Wq/Wm/WORM-s263536640-m1295025537--CASAVA_v1.7.0.tar.log-	.git-annex/XW/qm/WORM-s36609-m1276050470--Bio-ASN1-EntrezGene-1.10-withoutworldwriteables.tar.gz.log-	.git-annex/f7/g0/WORM-s40872-m1278273227--ExtUtils-ParseXS-2.2206.tar.gz.log-	.git-annex/j3/JF/WORM-s11753-m1232427595--Clone-0.31.tar.gz.log-	.git-annex/kX/9g/WORM-s84690-m1229117599--GraphViz-2.04.tar.gz.log-	.git-annex/km/z5/WORM-s44634-m1275505134--Authen-SASL-2.15.tar.gz.log-	.git-annex/kw/J3/WORM-s132396-m1278780649--DBD-mysql-4.016.tar.gz.log-	.git-annex/p5/1P/WORM-s53736-m1278673485--Archive-Tar-1.64.tar.gz.log-	.git-annex/wv/zG/WORM-s30584-m1268774021--ExtUtils-CBuilder-0.2703.tar.gz.log-	.git-annex/x5/7v/WORM-s10462526-m1254242591--BioPerl-1.6.1.tar.gz.log-Please, commit your changes or stash them before you can merge.-error: The following untracked working tree files would be overwritten by merge:-	.git-annex/1g/X3/WORM-s309910751-m1301311322--l_fcompxe_ia32_2011.2.137.tgz.log-	.git-annex/3w/Xf/WORM-s805764902-m1301312756--l_cproc_p_11.1.075_intel64.log-	.git-annex/9Q/Wz/WORM-s1234430253-m1301311891--l_ccompxe_2011.2.137.log-	.git-annex/FQ/4z/WORM-s318168323-m1301310848--l_cprof_p_11.1.075_ia64.log-	.git-annex/FV/0P/WORM-s710135470-m1301311835--l_ccompxe_intel64_2011.2.137.log-	.git-annex/Jx/qM/WORM-s599386592-m1301310731--l_fcompxe_2011.2.137.tgz.log-	.git-annex/KX/w1/WORM-s35976002-m1301312193--l_tbb_3.0.6.174.log-	.git-annex/Vw/jK/WORM-s15795178-m1301310913--w_flm_p_1.0.011_intel64.zip.log-	.git-annex/jK/zK/WORM-s374617670-m1301312705--l_ipp_7.0.2.137_intel64.log-	.git-annex/vK/kv/WORM-s584342291-m1301312669--l_cproc_p_11.1.075_ia64.log-	.git-annex/vw/v1/WORM-s736986678-m1301312794--l_cproc_p_11.1.075_ia32.log-	.git-annex/zq/7X/WORM-s343075585-m1301312233--l_ipp_7.0.2.137_ia32.log-Please move or remove them before you can merge.-Aborting-1|jtang@x00:~/sources $ git status-# On branch master-# Your branch is ahead of 'origin/master' by 2 commits.-#-# Changes to be committed:-#   (use \"git reset HEAD <file>...\" to unstage)-#-#	modified:   .git-annex/09/5X/WORM-s361516678-m1301310614--l_fcompxe_intel64_2011.2.137.tgz.log-#	modified:   .git-annex/43/2g/WORM-s19509673-m1301310496--l_fcompxe_2011.2.137_redist.tgz.log-#	modified:   .git-annex/4J/qF/WORM-s18891115-m1301310934--w_flm_p_1.0.011_ia64.zip.log-#	modified:   .git-annex/87/w1/WORM-s12212473-m1301310909--w_flm_p_1.0.011_ia32.zip.log-#	modified:   .git-annex/99/Jq/WORM-s194345957-m1301310926--l_mkl_10.3.2.137_ia32.log-#	modified:   .git-annex/99/kf/WORM-s9784531-m1301311680--l_ccompxe_2011.2.137_redist.log-#	modified:   .git-annex/FF/f3/WORM-s93033394-m1301311706--l_gen_ipp_7.0.2.137.log-#	modified:   .git-annex/MF/xZ/WORM-s515140733-m1301310936--l_cprof_p_11.1.075.log-#	modified:   .git-annex/XW/X8/WORM-s355559731-m1301310797--l_mkl_10.3.2.137.log-#	modified:   .git-annex/fJ/mZ/WORM-s1372886477-m1301313368--l_cproc_p_11.1.075.log-#	modified:   .git-annex/j7/Q9/WORM-s44423202-m1301310622--l_cprof_p_11.1.075_redist.log-#	modified:   .git-annex/k4/K7/WORM-s239539070-m1301310760--l_mkl_10.3.2.137_intel64.log-#	modified:   .git-annex/kz/01/WORM-s279573314-m1301310783--l_cprof_p_11.1.075_ia32.log-#	modified:   .git-annex/p6/Kq/WORM-s31199343-m1301311829--l_cproc_p_11.1.075_redist.log-#	modified:   .git-annex/pz/J5/WORM-s626995277-m1301312301--l_ccompxe_ia32_2011.2.137.log-#	modified:   .git-annex/v3/kX/WORM-s339693045-m1301310851--l_cprof_p_11.1.075_intel64.log-#-# Changes not staged for commit:-#   (use \"git add <file>...\" to update what will be committed)-#   (use \"git checkout -- <file>...\" to discard changes in working directory)-#-#	modified:   .git-annex/12/3W/WORM-s3058814-m1276699694--Botan-1.8.9.tgz.log-#	modified:   .git-annex/1G/qV/WORM-s9122-m1251558854--Array-Compare-2.01.tar.gz.log-#	modified:   .git-annex/3W/W5/WORM-s231523-m1270740744--DBD-Pg-2.17.1.tar.gz.log-#	modified:   .git-annex/3x/PX/WORM-s380310-m1293025187--HTSeq-0.4.7.tar.gz.log-#	modified:   .git-annex/45/gk/WORM-s67337-m1248732018--ExtUtils-Install-1.54.tar.gz.log-#	modified:   .git-annex/4J/7Q/WORM-s8608-m1224694862--Algorithm-Munkres-0.08.tar.gz.log-#	modified:   .git-annex/4g/XQ/WORM-s89208-m1278682033--HTML-Parser-3.66.tar.gz.log-#	modified:   .git-annex/54/jw/WORM-s300163-m1226422051--AcePerl-1.92.tar.gz.log-#	modified:   .git-annex/63/kj/WORM-s1213460-m1262942058--DBD-SQLite-1.29.tar.gz.log-#	modified:   .git-annex/6Z/42/WORM-s4074-m943766010--File-Sync-0.09.tar.gz.log-#	modified:   .git-annex/8F/M5/WORM-s6989-m1263161127--Digest-HMAC-1.02.tar.gz.log-#	modified:   .git-annex/G2/FK/WORM-s3309-m1163872981--Bundle-BioPerl-2.1.8.tar.gz.log-#	modified:   .git-annex/Gk/XF/WORM-s23572243-m1279546902--EMBOSS-6.3.1.tar.gz.log-#	modified:   .git-annex/Jk/X6/WORM-s566429-m1279309002--DBI-1.612.tar.gz.log-#	modified:   .git-annex/K6/fV/WORM-s1561451-m1240055295--Convert-Binary-C-0.74.tar.gz.log-#	modified:   .git-annex/KM/4q/WORM-s146959-m1268515086--Graph-0.94.tar.gz.log-#	modified:   .git-annex/MF/m2/WORM-s425766-m1212514609--Data-Stag-0.11.tar.gz.log-#	modified:   .git-annex/QJ/P6/WORM-s1045868-m1282215033--9base-6.tar.gz.log-#	modified:   .git-annex/Qm/WG/WORM-s39078-m1278163547--Digest-SHA1-2.13.tar.gz.log-#	modified:   .git-annex/Wq/Fj/WORM-s45680640-m1297862101--BclConverter-1.7.1.tar.log-#	modified:   .git-annex/Wq/Wm/WORM-s263536640-m1295025537--CASAVA_v1.7.0.tar.log-#	modified:   .git-annex/XW/qm/WORM-s36609-m1276050470--Bio-ASN1-EntrezGene-1.10-withoutworldwriteables.tar.gz.log-#	modified:   .git-annex/Zq/7X/WORM-s343075585-m1301312233--l_ipp_7.0.2.137_ia32.log-#	modified:   .git-annex/f7/g0/WORM-s40872-m1278273227--ExtUtils-ParseXS-2.2206.tar.gz.log-#	modified:   .git-annex/j3/JF/WORM-s11753-m1232427595--Clone-0.31.tar.gz.log-#	modified:   .git-annex/kX/9g/WORM-s84690-m1229117599--GraphViz-2.04.tar.gz.log-#	modified:   .git-annex/km/z5/WORM-s44634-m1275505134--Authen-SASL-2.15.tar.gz.log-#	modified:   .git-annex/kw/J3/WORM-s132396-m1278780649--DBD-mysql-4.016.tar.gz.log-#	modified:   .git-annex/p5/1P/WORM-s53736-m1278673485--Archive-Tar-1.64.tar.gz.log-#	modified:   .git-annex/wv/zG/WORM-s30584-m1268774021--ExtUtils-CBuilder-0.2703.tar.gz.log-#	modified:   .git-annex/x5/7v/WORM-s10462526-m1254242591--BioPerl-1.6.1.tar.gz.log-#-# Untracked files:-#   (use \"git add <file>...\" to include in what will be committed)-#-#	.git-annex/1G/X3/-#	.git-annex/3W/Xf/-#	.git-annex/9q/Wz/-#	.git-annex/Fq/4z/-#	.git-annex/Jk/zK/-#	.git-annex/Kx/w1/-#	.git-annex/VK/kv/-#	.git-annex/fv/0P/-#	.git-annex/jX/qM/-#	.git-annex/vW/jK/-#	.git-annex/vW/v1/-jtang@x00:~/sources $ git commit -a -m \"snap\"-[master 45f254a] snap- 47 files changed, 64 insertions(+), 30 deletions(-)-jtang@x00:~/sources $ git status-# On branch master-# Your branch is ahead of 'origin/master' by 3 commits.-#-# Untracked files:-#   (use \"git add <file>...\" to include in what will be committed)-#-#	.git-annex/1G/X3/-#	.git-annex/3W/Xf/-#	.git-annex/9q/Wz/-#	.git-annex/Fq/4z/-#	.git-annex/Jk/zK/-#	.git-annex/Kx/w1/-#	.git-annex/VK/kv/-#	.git-annex/fv/0P/-#	.git-annex/jX/qM/-#	.git-annex/vW/jK/-#	.git-annex/vW/v1/-nothing added to commit but untracked files present (use \"git add\" to track)-jtang@x00:~/sources $ git pull-</pre>-"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_3_a18ada7ac74c63be5753fdb2fe68dae5._comment
@@ -1,18 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 3"- date="2011-03-28T15:25:18Z"- content="""-So, there is evidence here of a circumstance caused by the [[other_bug|git-annex_has_issues_with_git_when_staging__47__commiting_logs]], as I suspected.--I don't think that manual `git commit -a` caused the problem. I suspect it was a subsequent `git add` that caused git to follow the wrong case paths and add the files in the wrong place. Ie, when you run \"git add .git-annex\", it recurses into `.git-annex/Gm/`, and adds files using that case, that were previously added from `.git-annex/GM/`.--For completeness, can you verify this repo's core.ignorecase setting?-------I hate that you are stuck using loop filesystems to work around this bug. If my guess is correct, you don't need to, as long as you avoid manually running \"git add .git-annex\". I take this bug seriously. While I'm currently very involved in adding Amazon S3 support to git-annex (which will take days more of solid work), I do plan to make a loop filesystem of my own, probably vfat, so I can try and reproduce this on a case-insensative filesystem. If you could confirm my above hypothesis, that would speed things up for me.--It's possible I will have to tweak the hash directories. Hopefully if so, I will only tweak them for *new* keys; if I had to do a v3 backend just to fix this stupid thing, I'd be sad -- upgrading all my offline disks from v1 to v2 took me many days.-"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_4_039e945617a6c1852c96974a402db29c._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 4"- date="2011-03-28T15:41:56Z"- content="""-In my \"sources\" repo on x00, the current setting is this \"ignorecase = true\" it was the first repo that I created before I clone it elsewhere and pull my changes back, it is on a HFS+ partition which is case insensitive and it is replicated on a portable hdd with a bare repo on a exfat partition. I wonder if my portable disk has a partially borked repo :P-"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_5_eacd0b18475c05ab9feed8cf7290b79a._comment
@@ -1,37 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 5"- date="2011-03-28T15:51:11Z"- content="""-I also failed to mention, that in the case when i have stray log files after what has happened in comment 2, I get this left over after a commit when git is confused...---<pre>-jtang@x00:~/sources $ git status-# On branch master-# Your branch is ahead of 'origin/master' by 1 commit.-#-# Changes not staged for commit:-#   (use \"git add <file>...\" to update what will be committed)-#   (use \"git checkout -- <file>...\" to discard changes in working directory)-#-#	modified:   .git-annex/1G/X3/WORM-s309910751-m1301311322--l_fcompxe_ia32_2011.2.137.tgz.log-#	modified:   .git-annex/3W/Xf/WORM-s805764902-m1301312756--l_cproc_p_11.1.075_intel64.log-#	modified:   .git-annex/9Q/Wz/WORM-s1234430253-m1301311891--l_ccompxe_2011.2.137.log-#	modified:   .git-annex/FQ/4z/WORM-s318168323-m1301310848--l_cprof_p_11.1.075_ia64.log-#	modified:   .git-annex/FV/0P/WORM-s710135470-m1301311835--l_ccompxe_intel64_2011.2.137.log-#	modified:   .git-annex/Jk/zK/WORM-s374617670-m1301312705--l_ipp_7.0.2.137_intel64.log-#	modified:   .git-annex/Jx/qM/WORM-s599386592-m1301310731--l_fcompxe_2011.2.137.tgz.log-#	modified:   .git-annex/KX/w1/WORM-s35976002-m1301312193--l_tbb_3.0.6.174.log-#	modified:   .git-annex/VK/kv/WORM-s584342291-m1301312669--l_cproc_p_11.1.075_ia64.log-#	modified:   .git-annex/Vw/jK/WORM-s15795178-m1301310913--w_flm_p_1.0.011_intel64.zip.log-#	modified:   .git-annex/Zq/7X/WORM-s343075585-m1301312233--l_ipp_7.0.2.137_ia32.log-#	modified:   .git-annex/vW/v1/WORM-s736986678-m1301312794--l_cproc_p_11.1.075_ia32.log-#-no changes added to commit (use \"git add\" and/or \"git commit -a\")-</pre>---Up until now I have just been updating the status of the staged files by hand and commiting it on my mac x00, this probably isn't helping. I'd rather not lose the tracking information.-"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_6_e55117cb628dc532e468519252571474._comment
@@ -1,14 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 6"- date="2011-03-31T18:02:42Z"- content="""-Alright, I have created a case-insensative HFS+ filesystem here on my linux laptop. --I have not been able to trick git into staging the same file with 2 different capitalizations yet.--It might be helpful if you can send me a copy of a git repository where 'git add -i' shows the same file staged with two capitalizations. Leaving out .git/annex of course. (joey@kitenet.net; a tarball would probably work)--It seems that `git add` only started properly working on case insensative filesystems quite recently. The commit in question is 5e738ae820ec53c45895b029baa3a1f63e654b1b, \"Support case folding for git add when core.ignorecase=true\", which was first released in git 1.7.4, January 30, 2011. If you don't yet have that version, that could explain the problem entirely. In about half an hour (dialup!) I will have downloaded an older git and will see if I can reproduce the problem with it.-"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_7_0f4f471102e394ebb01da40e4d0fd9f6._comment
@@ -1,68 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 7"- date="2011-03-31T19:08:01Z"- content="""-git 1.7.4 does not make things better. With it, if I add first \"X/foo\" and then \"x/bar\", it commits \"X/bar\".--That will *certianly* cause problems when interoperating with a repo clone on a case-sensative filesystem, since-git-annex there will not see the location log that git committed to the wrong case directory.--It's possible there is some interoperability problem when pulling from linux like you did, onto HFS+, too. I am not quite sure. Ah, I did find one.. if I clone the repo with \"X/foo\" in it to a case-sensative filesystem, and add a \"x/foo\" there,-and pull that commit back to HFS+, git says:--<pre>- * branch            master     -> FETCH_HEAD-Updating 8754149..e3d4640-Fast-forward- x/foo |    1 +- 1 files changed, 1 insertions(+), 0 deletions(-)- create mode 100644 x/foo-joey@gnu:/mnt/r4>ls-X/-joey@gnu:/mnt/r4>git st-# On branch master-# Changes not staged for commit:-#   (use \"git add <file>...\" to update what will be committed)-#   (use \"git checkout -- <file>...\" to discard changes in working directory--#	modified:   X/foo-</pre>--Aha -- that lets me reproduce your problem with the same file being staged twice with different capitalizations, too:--<pre>-joey@gnu:/mnt/r4>echo haaai >| x/foo-joey@gnu:/mnt/r4>git st-# On branch master-# Changes not staged for commit:-#   (use \"git add <file>...\" to update what will be committed)-#   (use \"git checkout -- <file>...\" to discard changes in working directory)-#-#	modified:   X/bar-#	modified:   X/foo-#	modified:   x/foo-#-joey@gnu:/mnt/r4>git commit -a-fatal: Will not add file alias 'X/Bar' ('x/Bar' already exists in index)-</pre>--And modified files that git refuses to commit, which entirely explains [[git-annex_has_issues_with_git_when_staging__47__commiting_logs]].--<pre>-joey@gnu:/mnt/r4>git add X/foo-joey@gnu:/mnt/r4>git commit X/foo-# On branch master-# Changes not staged for commit:-#   (use \"git add <file>...\" to update what will be committed)-#   (use \"git checkout -- <file>...\" to discard changes in working directory)-#-#	modified:   X/bar-#	modified:   X/foo-#-no changes added to commit (use \"git add\" and/or \"git commit -a\")-</pre>--I think git is frankly, buggy. It seems I will need to work around this by stopping using mixed case hashing for location logs.-"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_8_68e2d6ccdb9622b879e4bc7005804623._comment
@@ -1,12 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 8"- date="2011-03-31T19:28:02Z"- content="""-I've posted about this on the git mailing list. It's possible that these bugs, which can be shown to affect things other than just git-annex, will be fixed in git.--I will wait a while to see. But am considering making git-annex use all-lowercase hash dirs for the log files. Maybe it could first look for .git-annex/aaaa/bbbb/foo.log, but also look for, read, and merge in any info from -.git-annex/Aa/Bb/foo.log. And always write to the new style filenames. This would avoid confusing git with changes to-mixed-case files, and avoid another massive transition.-"""]]
− doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_9_45b11ddd200261115b653c7a14d28aa9._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 9"- date="2011-03-31T21:32:10Z"- content="""-I'm was running git 1.7.4.1 at the time when I came across it, I have just upgraded to 1.7.4.2. I've also just moved to using a loopback fs for the stuff i care about. Do you still want a repo that exhibits the problem (excluding the .git/annex data) ??? I'm also not sure if 1.7.4.2 has corrected the problem yet as I haven't done much with my repos since. I suspect just making all the .git-annex hashed directories seems to be lower case might be better in the long run. -"""]]
+ doc/bugs/git_annex_add_eats_files_when_filename_is_too_long.mdwn view
@@ -0,0 +1,14 @@+Recently I ran into the following situation under Ubuntu with an encrypted home directory (which shortens the length that filenames can be):++    $ git annex add 687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966.gif+    add 687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966.gif failed+    git-annex: /home/lhuhn/annex/.git/annex/tmp/155_518_WORM-s426663-m1310064100--687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966.gif.log: openBinaryFile: invalid argument (File name too long)+    git-annex: 1 failed++The file seems to be completely gone.  It no longer exists in the current directory, or under .git/annex.++I don't mind horribly that git-annex failed due to the name length limit, but it shouldn't have deleted my file in the process (fortunately the file wasn't very important, or hard to recover).++> [[done]], as noted it did not delete content and now it makes the symlink+> before trying to write to the location log, avoiding that gotcha.+> --[[Joey]] 
− doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos/comment_1_fc59fbd1cdf8ca97b0a4471d9914aaa1._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 1"- date="2011-06-13T16:58:52Z"- content="""-And, maybe, a way to start a fsck from remote? At least when the other side is a ssh or git annex shell, this would work.-"""]]
− doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos/comment_2_273a45e6977d40d39e0d9ab924a83240._comment
@@ -1,9 +0,0 @@-[[!comment format=mdwn- username="http://ertai.myopenid.com/"- nickname="npouillard"- subject="git annex fsck --from remote"- date="2011-06-25T16:20:44Z"- content="""-Currently fsck silently ignores --to/--from.-It should at least complain if it is not supported.-"""]]
− doc/bugs/git_annex_should_use___39__git_add_-f__39___internally/comment_1_7683bf02cf9e97830fb4690314501568._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w"- nickname="Rafaël"- subject="comment 1"- date="2011-07-03T11:56:45Z"- content="""-And what about emitting a warning, as git does, that some files were not annex-added (when not using --force)?-"""]]
+ doc/bugs/making_annex-merge_try_a_fast-forward.mdwn view
@@ -0,0 +1,3 @@+While merging the git-annex branch, annex-merge does not end up in a fast-forward even when it would be possible.+But as sometimes annex-merge takes time, it would probably be worth it+(but maybe I miss something with my workflow...).
+ doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_6_f360f0006bc9115bc5a3e2eb9fe58abd._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://lithitux.org/openidserver/users/pavel"+ nickname="pavel"+ subject="comment 6"+ date="2011-07-06T08:14:26Z"+ content="""+Ah, great, thanks very much for the quick fix!++Yes, when I mentioned three defunct git processes, there were three processes shown as \"git [defunct]\", plus the three git processes I listed, plus two \"git-annex\" processes. Upon cancel/resume, there were no defunct git processes when I checked, but by the time I found the bug report on the forum and commented I'd already successfully upgraded by annex (by repeatedly attaching strace) and couldn't really easily get at either additional 'ps' info or a fuller strace than what I posted (that was just the log from one of the attach/detach cycles), so it's a relief you managed to pinpoint the problem.+"""]]
− doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_1_1d38283c9ea87174f3bbef9a58f5cb88._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-03-16T16:07:26Z"- content="""-Hmm.. is utimensat available at all?--I've committed an update that may convince at least some compilers to expose this newer POSIX stuff. I don't know if it will help, please let me know.-"""]]
− doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_2_bf112edd075fbebe4fc959a387946eb9._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 2"- date="2011-03-16T16:49:18Z"- content="""-Just pulled the changes, it still fails to build. utimensat doesn't seem to exist on OSX 10.6.6.-"""]]
− doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_3_a46080fbe82adf0986c5dc045e382501._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 3"- date="2011-03-16T17:46:40Z"- content="""-Alright, I've added #idefs and the symlink timestamp mirroring feature will be unavailable on OSX until I get a version that works there.-"""]]
− doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_4_760437bf3ba972a775bb190fb4b38202._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 4"- date="2011-03-16T20:32:01Z"- content="""-Just tried it out on my mac and it's working again. I guess this issue could be closed for now.-"""]]
− doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_5_060ba5ea88dcab2f4a0c199f13ef4f67._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 5"- date="2011-03-20T18:12:59Z"- content="""-I'm leaving this bug open because this feature, however minor is not available on OSX and BSD. --I have added a partial implementation using lutimes(3), which should be available on the BSDs. However, it's ifdefed out due to a casting problem: The TimeSpec uses a CTime, while lutimes uses a CLong. These data types may be internally the same on some or all platforms, so if you want this feature you can try changing the \"ifdef 0\" in Touch.hsc to 1 and try it, see if \"git annex add\" mirrors file modification time in created symlinks, and let me know.-"""]]
− doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_6_548303d6ffb21a9370b6904f41ff49c1._comment
@@ -1,42 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 6"- date="2011-03-20T20:48:41Z"- content="""-ok, pulling the latest master and building on OSX now does this...--<pre>-ghc -O2 -Wall -ignore-package monads-fd --make git-annex-[ 1 of 63] Compiling Touch            ( Touch.hs, Touch.o )--Touch.hsc:24:0:-    The type signature for `touchBoth' lacks an accompanying binding--Touch.hsc:27:26: Not in scope: `touchBoth'-make: *** [git-annex] Error 1-</pre>--changing the #if 0 to 1 gives this...--<pre>-ghc -O2 -Wall -ignore-package monads-fd --make git-annex-[ 1 of 63] Compiling Touch            ( Touch.hs, Touch.o )--Touch.hsc:95:43:-    Couldn't match expected type `CLong' against inferred type `CTime'-    In the second argument of `(\ hsc_ptr-                                    -> pokeByteOff hsc_ptr 0)', namely-        `(sec :: CLong)'-    In a stmt of a 'do' expression:-        (\ hsc_ptr -> pokeByteOff hsc_ptr 0) ptr (sec :: CLong)-    In the expression:-        do { (\ hsc_ptr -> pokeByteOff hsc_ptr 0) ptr (sec :: CLong);-             (\ hsc_ptr -> pokeByteOff hsc_ptr 4) ptr (0 :: CLong) }-make: *** [git-annex] Error 1-</pre>---it seems that commit 6634b6a6b84a924f6f6059b5bea61f449d056eee has broken support for OSX.--"""]]
− doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_7_7ca00527ab5db058aadec4fe813e51fd._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 7"- date="2011-03-20T22:06:25Z"- content="""-Fixed that, and removed the impossible cast so it can be built with #if 1-"""]]
− doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_8_881aecb9ae671689453f6d5d780d844b._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 8"- date="2011-03-21T08:52:18Z"- content="""-Just tried building both of the code paths, and they seem to build and somewhat function on OSX. I have yet to confirm the functionality is working correctly, but so far it's looking good. (I somewhat care less about the utimes/mtimes of my files since I care more about the content :) )-"""]]
− doc/bugs/unannex_and_uninit_do_not_work_when_git_index_is_broken/comment_1_1931e733f0698af5603a8b92267203d4._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-04-03T01:40:50Z"- content="""-They rely on git-ls-files to get a list of files that are checked into git, in order to tell what to unannex.-"""]]
− doc/bugs/unannex_and_uninit_do_not_work_when_git_index_is_broken/comment_2_40920b88537b7715395808d8aa94bf03._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 2"- date="2011-04-03T08:55:18Z"- content="""-Given that the softlinks contain all needed information (if the object exists, locally), an emergency way to get files \"out\" of git-annex would be nice. I am aware that one can script it, but a canonical way is always better, especially when things go south.-"""]]
− doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_1_9ca2da52f3c8add0276b72d6099516a6._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-04-03T02:26:20Z"- content="""-I'm not sure how this happened, as far as I can see, and based on my testing, `git annex upgrade` does stage the location log files. OTOH, I vaguely rememeber needing to stage some of them when I was doing my own upgrades, but that was a while ago, and I don't remember the details.--Your upgrade seems to have gone ok from the file lists you sent, so you can just: `git add .git-annex; git commit`-"""]]
− doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_2_e14e84b770305893f2fc6e4938359f47._comment
@@ -1,18 +0,0 @@-[[!comment format=mdwn- username="gernot"- ip="213.168.117.192"- subject="comment 2"- date="2011-04-03T15:35:52Z"- content="""-'git add .git-annex' didn't do anything.  That's when I noticed that this-repository is on a case-insensitive HFS+ file system.--So, if I get this right it's not a new bug, but similar to this situation:-[[git-annex_directory_hashing_problems_on_osx]]--Assuming that it was the file system's fault, I went ahead and upgraded yet-another clone.  That one (on an ext3 file system) had neither staged changes-nor left-over untracked files.  Everything seems to just have fallen right into-place.  Is that possible or still weird?--"""]]
− doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_3_ec04e306c96fd20ab912aea54a8340aa._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 3"- date="2011-04-03T16:05:39Z"- content="""-Yes you seem to have come across the same bug that I had initially reported :P-"""]]
− doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__/comment_1_c25900b9d2d62cc0b8c77150bcfebadf._comment
@@ -1,13 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-03-18T00:38:51Z"- content="""-These are good examples; I think you've convinced me at least for upgrades going forward after v2. I'm not sure we have enough users and outdated git-annex installations to worry about it for v1.--(Hoping such upgrades are rare anyway.. Part of the point of changes made in v2 was to allow lots of changes to be made later w/o needing a v3.)--Update: Upgrades from v1 to v2 will no longer be handled automatically-now.-"""]]
− doc/forum/Need_new_build_instructions_for_Debian_stable/comment_1_8c1eea6dfec8b7e1c7a371b6e9c26118._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-04-26T15:27:49Z"- content="""-I have updated the instructions.-"""]]
− doc/forum/Need_new_build_instructions_for_Debian_stable/comment_2_f6ff8306c946219dbe39bb8938a349ab._comment
@@ -1,21 +0,0 @@-[[!comment format=mdwn- username="gernot"- ip="213.196.216.21"- subject="comment 2"- date="2011-04-26T18:56:44Z"- content="""-Thanks for the update, Joey. I think you forgot to change libghc-missingh-dev to libghc6-missingh-dev for the copy & paste instructions though.--Also, after having checked that I have everything installed I'm still getting this error:--	...-	[15 of 77] Compiling Annex            ( Annex.hs, Annex.o )--	Annex.hs:19:35:-		Module `Control.Monad.State' does not export `state'-	make[1]: *** [git-annex] Error 1-	make[1]: Leaving directory `/home/gernot/dev/git-annex'-	dh_auto_build: make -j1 returned exit code 2-	make: *** [binary] Error 2--"""]]
− doc/forum/Need_new_build_instructions_for_Debian_stable/comment_3_bcda70cbfc7c1a14fa82da70f9f876e2._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 3"- date="2011-04-26T23:40:33Z"- content="""-Both problems fixed.-"""]]
− doc/forum/Problems_with_large_numbers_of_files/comment_1_08791cb78b982087c2a07316fe3ed46c._comment
@@ -1,22 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 1"- date="2011-04-05T07:27:46Z"- content="""-Heh, cool, I was thinking throwing about 28million files at git-annex. Let me know how it goes, I suspect you have just run into a default limits OSX problem.--You probably just need to up some system limits (you will need to read the error messages that first appear) then do something like--<pre>-# this is really for the run time, you can set these settings in /etc/sysctl.conf-sudo sysctl -w kern.maxproc=2048-sudo sysctl -w kern.maxprocperuid=1024--# tell launchd about having higher limits-sudo echo \"limit maxfiles 1024 unlimited\" >> /etc/launchd.conf-sudo echo \"limit maxproc 1024 2048\" >> /etc/launchd.conf-</pre>--There are other system limits which you can check by doing a \"ulimit -a\", once you make the above changes, you will need to reboot to make the changes take affect. I am unsure if the above will help as it is an example of what I did on 10.6.6 a few months ago to fix some forking issues. From the error you got you will probably need to increase the stacksize to something bigger or even make it unlimited if you feel lucky, the default stacksize on OSX is 8192, try making it say 10times that size first and see what happens.-"""]]
− doc/forum/Problems_with_large_numbers_of_files/comment_2_0392a11219463e40c53bae73c8188b69._comment
@@ -1,25 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 2"- date="2011-04-05T17:46:03Z"- content="""-This message comes from ghc's runtime memory manager. Apparently your ghc defaults to limiting the stack to 80 mb.-Mine seems to limit it slightly higher -- I have seen haskell programs successfully grow as large as 350 mb, although generally not intentionally. :)--Here's how to adjust the limit at runtime, obviously you'd want a larger number:--<pre>-# git-annex +RTS -K100 -RTS find-Stack space overflow: current size 100 bytes.-Use `+RTS -Ksize -RTS' to increase it.-</pre>--I've tried to avoid git-annex using quantities of memory that scale with the number of files in the repo, and I think in general successfully -- I run it on 32 mb and 128 mb machines, FWIW. There are some tricky cases, and haskell makes it easy to accidentally write code that uses much more memory than would be expected.--One well known case is `git annex unused`, which *has* to build a structure of every annexed file. I have been considering using a bloom filter or something to avoid that.--Another possible case is when running a command like `git annex add`, and passing it a lot of files/directories. Some code tries to preserve the order of your input after passing it through `git ls-files` (which destroys ordering), and to do so it needs to buffer both the input and the result in ram.--It's possible to build git-annex with memory profiling and generate some quite helpful profiling data. Edit the Makefile and add this to GHCFLAGS: `-prof -auto-all -caf-all -fforce-recomp` then when running git-annex, add the parameters: `+RTS -p -RTS` , and look for the git-annex.prof file.-"""]]
− doc/forum/Problems_with_large_numbers_of_files/comment_3_537e9884c1488a7a4bcf131ea63b71f7._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 3"- date="2011-04-05T18:02:05Z"- content="""-Oh, you'll need profiling builds of various haskell libraries to build with profiling support. If that's not easily accomplished, if you could show me the form of the command you're running, and also how git annex unannex fails, that would be helpful for investigating.-"""]]
− doc/forum/Problems_with_large_numbers_of_files/comment_4_7cb65d013e72bd2b7e90452079d42ac9._comment
@@ -1,29 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkhdKAhe3l_UyGt5SdfRBPYVwe-9f8P2dM"- nickname="Justin"- subject="comment 4"- date="2011-04-05T21:14:12Z"- content="""-@joey--OK, I'll try increasing the stack size and see if that helps.--For reference, I was running:--git annex add .--on a directory containing about 100k files spread over many nested subdirectories. I actually have more than a dozen projects like this that I plan to keep in git annex, possibly in separate repositories if necessary. I could probably tar the data and then archive that, but I like the idea of being able to see the structure of my data even though the contents of the files are on a different machine.--After the crash, running:--git annex unannex--does nothing and returns instantly. What exactly is 'git annex add' doing? I know that it's moving files into the key-value store and adding symlinks, but I don't know what else it does.----Justin----If --"""]]
− doc/forum/Problems_with_large_numbers_of_files/comment_5_86a42ee3173a5d38f803e64b79496ab3._comment
@@ -1,14 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 5"- date="2011-04-07T16:41:00Z"- content="""-I think what is happening with \"git annex unannex\" is that \"git annex add\" crashes before it can \"git add\" the symlinks. unannex only looks at files that \"git ls-files\" shows, and so files that are not added to git are not seen. So, this can be recovered from by looking at git status and manually adding the symlinks to git, and then unannex.--That also suggests that \"git annex add .\" has done something before crashing. That's consistent with you passing it < 2 parameters; it's not just running out of memory trying to expand and preserve order of its parameters (like it might if you ran \"git annex add experiment-1/ experiment-2/\")--I'm pretty sure I know where the space leak is now. git-annex builds up a queue of git commands, so that it can run git a minimum number of times. Currently, this queue is only flushed at the end. I had been meaning to work on having it flush the queue periodically to avoid it growing without bounds, and I will prioritize doing that.--(The only other thing that \"git annex add\" does is record location log information.)-"""]]
− doc/forum/Problems_with_large_numbers_of_files/comment_6_4551274288383c9cc27cbf85b122d307._comment
@@ -1,11 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 6"- date="2011-04-07T18:09:13Z"- content="""-I've committed the queue flush improvements, so it will buffer up to 10240 git actions, and then flush the queue.--There may be other memory leaks at scale (besides the two I mentioned earlier), but this seems promising. I'm well into running `git annex add` on a half million files and it's using 18 mb ram and has flushed the queue several times. This run-will fail due to running out of inodes for the log files, not due to memory. :)-"""]]
− doc/forum/Problems_with_large_numbers_of_files/comment_7_d18cf944352f8303799c86f2c0354e8e._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 7"- date="2011-04-08T21:55:36Z"- content="""-http://xfs.org/index.php/XFS_FAQ#Q:_Performance:_mkfs.xfs_-n_size.3D64k_option-"""]]
− doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__/comment_1_426482e6eb3a27687a48f24f6ef2332f._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-03-07T19:13:14Z"- content="""-See [[bugs/fat_support]]. A bare git repo will have to be used to avoid symlink problems, at least for now. The other problem is that git-annex key files have colons in their filenames.-"""]]
− doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__/comment_2_af4f8b52526d8bea2904c95406fd2796._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 2"- date="2011-03-19T15:37:22Z"- content="""-Now it's fully supported, so long as you put a bare git repo on your key.-"""]]
− doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information/comment_1_818f38aa988177d3a9415055e084f0fb._comment
@@ -1,15 +0,0 @@-[[!comment format=mdwn- username="http://christian.amsuess.com/chrysn"- nickname="chrysn"- subject="filtering based on git-commits"- date="2011-06-23T13:56:35Z"- content="""-additional filter criteria could come from the git history:--* `git annex get --touched-in HEAD~5..` to fetch what has recently been worked on-* `git annex get --touched-by chrysn --touched-in version-1.0..HEAD` to fetch what i've been workin on recently (based on regexp or substring match in author; git experts could probably craft much more meaningful expressions)--these options could also apply to `git annex find` -- actually, looking at the normal file system tools for such tasks, that might even be sufficient (think `git annex find --numcopies-gt 3 --present-on lanserver1 --drop` like `find -iname '*foo*' -delete`--(i was about to open a new forum discussion for commit-based getting, but this is close enough to be usefully joint in a discussion)-"""]]
− doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_1_044f1c5e5f7a939315c28087495a8ba8._comment
@@ -1,16 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="fixed"- date="2011-05-31T18:51:13Z"- content="""-Running `git checkout` by hand is fine, of course.--Underlying problem is that git has some O(N) scalability of operations on the index with regards to the number of files in the repo. So a repo with a whole lot of files will have a big index, and any operation that changes the index, like the `git reset` this needs to do, has to read in the entire index, and write out a new, modified version. It seems that git could be much smarter about its index data structures here, but I confess I don't understand the index's data structures at all. I hope someone takes it on, as git's scalability to number of files in the repo is becoming a new pain point, now that scalability to large files is \"solved\". ;)--Still, it is possible to speed this up at git-annex's level. Rather than doing a `git reset` followed by a git checkout, it can just `git checkout HEAD -- file`, and since that's one command, it can then be fed into the queueing machinery in git-annex (that exists mostly to work around this git malfescence), and so only a single git command will need to be run to lock multiple files.--I've just implemented the above. In my music repo, this changed an lock of a CD's worth of files from taking ctrl-c long to 1.75 seconds. Enjoy!--(Hey, this even speeds up the one file case greatly, since `git reset -- file` is slooooow -- it seems to scan the *entire* repository tree. Yipes.)-"""]]
− doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_2_e854b93415d5ab80eda8e3be3b145ec2._comment
@@ -1,13 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w"- nickname="Rafaël"- subject="comment 2"- date="2011-05-31T21:43:22Z"- content="""-Nice!-So if I understand correctly, 'git reset -- file' was there to discard staged (but not commited) changes made to 'file', before checking out, so that it is equivalent to directly 'git checkout HEAD -- file' ?-I'm curious about the \"queueing machinery in git-annex\": does it end up calling the one git command with multiple files as arguments? does it correspond to the message \"(Recording state in git...)\" ?-Thanks!---"""]]
− doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_3_95c110500bc54013bc1969c1a9c8f842._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 3"- date="2011-05-31T21:54:23Z"- content="""-@Rafaël , you're correct on all counts.-"""]]
− doc/forum/bainstorming:_git_annex_push___38___pull/comment_1_3a0bf74b51586354b7a91f8b43472376._comment
@@ -1,11 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-04-05T18:05:00Z"- content="""-Maybe, otoh, part of the point of git-annex is that the data may be too large to pull down all of it.--I find mr useful as a policy layer over top of git-annex, so \"mr update\" can pull down appropriate quantities of data from-appropriate locations.-"""]]
− doc/forum/bainstorming:_git_annex_push___38___pull/comment_2_b02ca09914e788393c01196686f95831._comment
@@ -1,14 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 2"- date="2011-04-05T20:52:52Z"- content="""-No-so-subtle sarcasm taken and acknowledged :)--Arguably, git-annex should know about any local limits and not have them implemented via mr from the outside. I guess my concern boils down to having git-annex do the right thing all by itself with minimal user interaction. And while I really do appreciate the flexibility of chaining commands, I am a firm believer in exposing the common use cases as easily as possible.--And yes, I am fully aware that not all annexes are created equal. Point in case, I would never use git annex pull on my laptop, but I would git annex push extensively.---"""]]
− doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_1_3deb2c31cad37a49896f00d600253ee3._comment
@@ -1,14 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-04-03T16:49:01Z"- content="""-How remote is REMOTE? If it's a directory on the same computer, then git-annex copy --to is actually quickly checking that each file is present on the remote, and when it is, skipping copying it again.--If the remote is ssh, git-annex copy talks to the remote to see if it has the file. This makes copy --to slow, as Rich [[complained_before|forum/batch_check_on_remote_when_using_copy]]. :)--So, copy --to does not trust location tracking information (unless --fast is specified), which means that it should be doing exactly what you want it to do in your situation -- transferring every file that is really not present in the destination repository already.--Neither does copy --from, by the way. It always checks if each file is present in the current repository's annex before trying to download it.-"""]]
− doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_2_627f54d158d3ca4b72e45b4da70ff5cd._comment
@@ -1,12 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 2"- date="2011-04-03T16:59:47Z"- content="""-Remote as in \"another physical machine\". I assumed that--    git annex copy --force --to REMOTE .--would have not trusted the contents in the current directory (or the remote that is being copied to) and then just go off and re-download/upload all the files and overwrite what is already there. I expected the combination of *--force* and copy *--to* that it would not bother to check if the files are there or not and just copy it regardless of the outcome.-"""]]
− doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_3_3f49dab11aae5df0c4eb5e4b8d741379._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 3"- date="2011-04-03T17:12:35Z"- content="""-On second thought maybe the current behaviour is better than what I am suggesting that the force command should do. I guess it's better to be safe than sorry.-"""]]
− doc/forum/migrate_existing_git_repository_to_git-annex/comment_1_4181bf34c71e2e8845e6e5fb55d53381._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-02-25T05:16:48Z"- content="""-I don't know how to approach this yet, but I support the idea -- it would be great if there was a tool that could punch files out of git history and put them in the annex. (Of course with typical git history rewriting caveats.)--Sounds like it might be enough to add a switch to git-annex that overrides where it considers the top of the git repository to be? -"""]]
− doc/forum/migrate_existing_git_repository_to_git-annex/comment_2_5f08da5e21c0b3b5a8d1e4408c0d6405._comment
@@ -1,60 +0,0 @@-[[!comment format=mdwn- username="tyger"- ip="80.66.20.180"- subject="comment 2"- date="2011-03-01T14:07:50Z"- content="""-My current workflow looks like this (I'm still experimenting):--### Create backup clone for migration--    git clone original migrate-    cd migrate-    for branch in $(git branch -a | grep remotes/origin | grep -v HEAD); do git checkout --track $branch; done--### Inject git annex initialization at repository base--    git symbolic-ref HEAD refs/heads/newroot-    git rm --cached *.rpm-    git clean -f -d-    git annex init master-    git cherry-pick $(git rev-list --reverse master | head -1)-    git rebase --onto newroot newroot master-    git rebase master mybranch # how to automate this for all branches?-    git branch -d newroot--### Start migration with tree filter--    echo \*.rpm annex.backend=SHA1 > .git/info/attributes-    MYWORKDIR=$(pwd) git filter-branch --tree-filter ' \-        if [ ! -d .git-annex ]; then \-            mkdir .git-annex; \-            cp ${MYWORKDIR}/.git-annex/uuid.log .git-annex/; \-            cp ${MYWORKDIR}/.gitattributes .; \-        fi-        for rpm in $(git ls-files | grep \"\.rpm$\"); do \-            echo; \-            git annex add $rpm; \-            annexdest=$(readlink $rpm); \-            if [ -e .git-annex/$(basename $annexdest).log ]; then \-                echo \"FOUND $(basename $annexdest).log\"; \-            else \-                echo \"COPY $(basename $annexdest).log\"; \-                cp ${MYWORKDIR}/.git-annex/$(basename $annexdest).log .git-annex/; \-            fi; \-            ln -sf ${annexdest#../../} $rpm; \-        done; \-        git reset HEAD .git-rewrite; \-        : \-        ' -- $(git branch | cut -c 3-)-    rm -rf .temp-    git reset --hard---There are still some drawbacks:--* git history shows that git annex log files are modified with each checkin-* branches have to be rebased manually before starting migration---"""]]
− doc/forum/migrate_existing_git_repository_to_git-annex/comment_3_f483038c006cf7dcccf1014fa771744f._comment
@@ -1,12 +0,0 @@-[[!comment format=mdwn- username="tyger"- ip="80.66.20.180"- subject="comment 3"- date="2011-03-02T08:15:37Z"- content="""-> Sounds like it might be enough to add a switch to git-annex that overrides where it considers the top of the git repository to be?--It should sufficient to honor GIT_DIR/GIT_WORK_TREE/GIT_INDEX_FILE environment variables. git filter-branch sets GIT_WORK_TREE to ., but this can be mitigated by starting the filter script with 'GIT_WORK_TREE=$(pwd $GIT_WORK_TREE)'. E.g. GIT_DIR=/home/tyger/repo/.git, GIT_WORK_TREE=/home/tyger/repo/.git-rewrite/t, then git annex should be able to compute the correct relative path or maybe use absolute pathes in symlinks.--Another problem I observed is that git annex add automatically commits the symlink; this behaviour doesn't work well with filter-tree. git annex commits the wrong path (.git-rewrite/t/LINK instead of LINK). Also filter-tree doesn't expect that the filter script commmits anything; new files in the temporary work tree will be committed by filter-tree on each iteration of the filter script (missing files will be removed).-"""]]
− doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_1_b3f22f9be02bc4f2d5a121db3d753ff5._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-04-02T17:48:29Z"- content="""-Either option should work fine, but git gc --aggressive will probably avoid most of git's seeking.-"""]]
− doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_2_f94abce32ef818176b42a3cc860691ae._comment
@@ -1,20 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 2"- date="2011-04-02T21:34:24Z"- content="""-I'll give it a try as soon as I get rid of this:--    % git annex fsck-fatal: index file smaller than expected-fatal: index file smaller than expected-    % git status-fatal: index file smaller than expected-    %    --And no, I am not sure where that is coming from all of a sudden... (it might have to do with a hard lockup of the whole system due to a faulty hdd I tested, but I didn't do anything to it for ages before that lock-up. So meh. Also, this is prolly off topic in here)---Richard-"""]]
− doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_3_0c8e77fe248e00bd990d568623e5a5c9._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 3"- date="2011-04-03T01:48:57Z"- content="""-For future reference, git can recover from a corrupted index file with `rm .git/index; git reset --mixed`.--Of course, you lose any staged changes that were in the old index file, and may need to re-stage some files.-"""]]
− doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_4_4b7e8f9521d61900d9ad418e74808ffb._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 4"- date="2011-04-03T09:03:22Z"- content="""-Thanks a lot. I tried various howtos around the net, but none of them worked; yours did. (I tried it in one of the copies of the broken repo which I keep around for obvious reasons).-"""]]
− doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_1_76bb33ce45ce6a91b86454147463193b._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo"- nickname="Justin"- subject="whereis labels"- date="2011-04-29T13:08:35Z"- content="""-You should be able to fix the missing label by editing .git-annex/uuid.log and adding--    1d1bc312-7243-11e0-a9ce-5f10c0ce9b0a tahoe-"""]]
− doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_2_4d9b9d47d01d606a475678f630797bf9._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 2"- date="2011-04-29T15:24:56Z"- content="""-If `tahoe ls` outputs only the key, on its own line, and exits nonzero if it's not present, then I think you did the right thing.--To remove a file, use `git annex move file --from tahoe` and then you can drop it locally.-"""]]
− doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_3_8a812b11fcc2dc3b6fcf01cdbbb8459d._comment
@@ -1,12 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 3"- date="2011-04-29T15:33:24Z"- content="""-@justin, I discovered that \"git annex describe\" did what I wanted--@joey, yep that is the behaviour of \"tahoe ls\", thanks for the tip on removing the file from the remote.--It seems to be working okay for now, the only concern is that on the remote everything is dumped into the same directory, but I can live with that, since I want to track biggish blobs and not lots of small little files.-"""]]
− doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_4_fc98c819bc5eb4d7c9e74d87fb4f6f3b._comment
@@ -1,39 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 4"- date="2011-04-29T16:17:11Z"- content="""-I've just tried to use the ANNEX_HASH_ variables, example of my configuration--<pre>-    git config annex.tahoe-store-hook 'tahoe mkdir $ANNEX_HASH_1 && tahoe put $ANNEX_FILE tahoe:$ANNEX_HASH_1/$ANNEX_KEY'-    git config annex.tahoe-retrieve-hook 'tahoe get tahoe:$ANNEX_HASH_1/$ANNEX_KEY $ANNEX_FILE'-    git config annex.tahoe-remove-hook 'tahoe rm tahoe:$ANNEX_HASH_1/$ANNEX_KEY'-    git config annex.tahoe-checkpresent-hook 'tahoe ls tahoe:$ANNEX_HASH_1/$ANNEX_KEY 2>&1 || echo FAIL'-    git annex initremote library type=hook hooktype=tahoe encryption=none-    git annex describe 1d1bc312-7243-11e0-a9ce-5f10c0ce9b0a library-</pre>--It's seems to work quite well for me now, I did run across this when I tried to drop a file locally, leaving the file on my remote--<pre>-jtang@x00:/tmp/annex3 $ git annex drop .-drop frink.sh (checking library...) (unsafe) -  Could only verify the existence of 0 out of 1 necessary copies-  Try making some of these repositories available:-  	1d1bc312-7243-11e0-a9ce-5f10c0ce9b0a  -- library-  (Use --force to override this check, or adjust annex.numcopies.)-failed-drop t/frink.jar (checking library...) (unsafe) -  Could only verify the existence of 0 out of 1 necessary copies-  Try making some of these repositories available:-  	1d1bc312-7243-11e0-a9ce-5f10c0ce9b0a  -- library-  (Use --force to override this check, or adjust annex.numcopies.)-failed-git-annex: 2 failed-1|jtang@x00:/tmp/annex3 $ -</pre>--I do know that the files exist in my library as I have just inserted them, it seemed to work when I didnt have the hashing, it appears that the checkpresent doesn't seem to pass the ANNEX_HASH_* variables (from the limited debugging I did)-"""]]
− doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_5_c459fb479fe7b13eaea2377cfc1923a6._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 5"- date="2011-04-29T18:01:04Z"- content="""-I've corrected the missing `ANNEX_HASH_*` oversight. (It also affected removal, btw.)-"""]]
− doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_6_2e9da5a919bbbc27b32de3b243867d4f._comment
@@ -1,23 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 6"- date="2011-04-29T20:11:08Z"- content="""-Cool, that seems to make things work as expected, here's an updated recipe---<pre>-git config annex.tahoe-store-hook 'tahoe mkdir tahoe:$ANNEX_HASH_1/$ANNEX_HASH_2 && tahoe put $ANNEX_FILE tahoe:$ANNEX_HASH_1/$ANNEX_HASH_2/$ANNEX_KEY'-git config annex.tahoe-retrieve-hook 'tahoe get tahoe:$ANNEX_HASH_1/$ANNEX_HASH_2/$ANNEX_KEY $ANNEX_FILE'-git config annex.tahoe-remove-hook 'tahoe rm tahoe:$ANNEX_HASH_1/$ANNEX_HASH_2/$ANNEX_KEY'-git config annex.tahoe-checkpresent-hook 'tahoe ls tahoe:$ANNEX_HASH_1/$ANNEX_HASH_2/$ANNEX_KEY 2>&1 || echo FAIL'-git annex initremote library type=hook hooktype=tahoe encryption=none-git annex describe 1d1bc312-7243-11e0-a9ce-5f10c0ce9b0a library-</pre>---I just needs some of the output redirected to /dev/null.--(I updated this comment to fix a bug. --[[Joey]])-"""]]
− doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_7_d636c868524b2055ee85832527437f90._comment
@@ -1,20 +0,0 @@-[[!comment format=mdwn- username="zooko"- ip="97.118.97.117"- subject="request for information, plus some ideas"- date="2011-05-14T05:07:17Z"- content="""-Hey Jimmy: how's this working for you now? I would expect it to go slower and slower since Tahoe-LAFS has an O(N) algorithm for reading or updating directories.--Of course, if it is still fast enough for your uses then that's okay. :-)--(We're working on optimizations of this for future releases of Tahoe-LAFS.)--I'd like to understand the desired behavior of store-hook and retrieve-hook better, in order to see if there is a more efficient way to use Tahoe-LAFS for this.--Off to look for docs.--Regards,--Zooko-"""]]
− doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_8_39dc449cc60a787c3bfbfaaac6f9be0c._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 8"- date="2011-05-14T10:02:26Z"- content="""-@joey thanks for the update in the previous comment, I had forgotten about updating it.--@zooko it's working okay for me right now, since I'm only putting fairly big blogs on stuff on to it and only things that I *really* care about. On the performance side, if it ran faster then it would be nicer :)-"""]]
− doc/forum/wishlist:_define_remotes_that_must_have_all_files/comment_1_cceccc1a1730ac688d712b81a44e31c3._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-04-23T16:27:13Z"- content="""-Seems to have a scalability problem, what happens when such a repository becomes full?--Another way to accomplish I think the same thing is to pick the repositories that you would include in such a set, and make all other repositories untrusted. And set numcopies as desired. Then git-annex will never remove files from the set of non-untrusted repositories, and fsck will warn if a file is present on only an untrusted repository.-"""]]
− doc/forum/wishlist:_define_remotes_that_must_have_all_files/comment_2_eec848fcf3979c03cbff2b7407c75a7a._comment
@@ -1,16 +0,0 @@-[[!comment format=mdwn- username="gernot"- ip="87.79.209.169"- subject="comment 2"- date="2011-04-24T11:20:05Z"- content="""-Right, I have thought about untrusting all but a few remotes to achieve-something similar before and I'm sure it would kind of work. It would be more-of an ugly workaround, however, because I would have to untrust remotes that-are, in reality, at least semi-trusted. That's why an extra option/attribute-for that kind of purpose/remote would be nice.--Obviously I didn't see the scalability problem though. Good Point. Maybe I can-achieve the same thing by writing a log parsing script for myself?--"""]]
− doc/forum/wishlist:_do_round_robin_downloading_of_data/comment_1_460335b0e59ad03871c524f1fe812357._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-04-03T16:39:35Z"- content="""-I dunno about parrallel downloads -- eek! -- but there is at least room for improvement of what \"git annex get\" does when there are multiple remotes that have a file, and the one it decides to use is not available, or very slow, or whatever.-"""]]
− doc/forum/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_1_d5413c8acce308505e4e2bec82fb1261._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-04-04T18:13:46Z"- content="""-This begs the question: What is the default remote? It's probably *not* the same repository that git's master branch is tracking (ie, origin/master). It seems there would have to be an annex.defaultremote setting.--BTW, mr can easily be configured on a per-repo basis so that \"mr push\" copies to somewhere: `push = git push; git annex push wherever`-"""]]
− doc/forum/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_2_0aa227c85d34dfff4e94febca44abea8._comment
@@ -1,12 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 2"- date="2011-04-04T20:45:30Z"- content="""-In my case, the remotes are the same, but adding a new option could make sense.--And while I can tell mr what to do explicitly, I would prefer if it did the right thing all by itself. Having to change configs in two separate places is less than ideal.--I am not sure what you mean by `git annex push` as that does not exist. Did you mean copy?-"""]]
− doc/forum/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_3_2082f4d708a584a1403cc1d4d005fb56._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 1"- date="2011-04-04T10:28:01Z"- content="""-Going one step further, a --min-copy could put all files so that numcopies is satisfied. --all could push to all available ones.--To take everything another step further, if it was possible to group remotes, one could act on the groups. \"all\" would be an obvious choice for a group that always exists, everything else would be set up by the user.-"""]]
− doc/forum/wishlist:_git_backend_for_git-annex/comment_1_04319051fedc583e6c326bb21fcce5a5._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-03-28T16:01:30Z"- content="""-Indeed, see [[todo/add_a_git_backend]], where you and I have already discussed this idea. :)--With the new support for special remotes, which will be used by S3, it would be possible to make such a git repo, using bup, be a special remote. I think it would be pretty easy to implement now. Not a priority for me though.-"""]]
− doc/forum/wishlist:_git_backend_for_git-annex/comment_2_7f529f19a47e10b571f65ab382e97fd5._comment
@@ -1,14 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 2"- date="2011-03-28T17:47:38Z"- content="""-On the plus side, the past me wanted exactly what I had in mind.--On the meh side, I really forgot about this conversation :/--When you say this todo is not a priority, does that mean there's no ETA at all and that it will most likely sleep for a long time? Or the almost usual \"what the heck, I will just wizard it up in two lines of haskell\"?---- RichiH-"""]]
− doc/forum/wishlist:_git_backend_for_git-annex/comment_3_a077bbad3e4b07cce019eb55a45330e7._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 3"- date="2011-03-28T20:05:13Z"- content="""-Probably more like 150 lines of haskell. Maybe just 50 lines if the bup repository is required to be on the same computer as the git-annex repository.--Since I do have some repositories where I'd appreciate this level of assurance that data not be lost, it's mostly a matter of me finding a free day.-"""]]
− doc/forum/wishlist:_git_backend_for_git-annex/comment_4_ecca429e12d734b509c671166a676c9d._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 4"- date="2011-03-28T20:45:35Z"- content="""-Personally, I would not mind a requirement to keep a local bup repo. I wouldn't want my data to to unncessarily complex setups, anyway. -- RichiH-"""]]
− doc/forum/wishlist:_git_backend_for_git-annex/comment_5_3459f0b41d818c23c8fb33edb89df634._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 5"- date="2011-04-08T20:59:37Z"- content="""-My estimates were pretty close -- the new bup special remote type took 133 lines of code, and 2 hours to write. A testament to the flexibility of the special remote infrastructure. :)-"""]]
− doc/forum/wishlist:_special_remote_for_sftp_or_rsync/comment_1_6f07d9cc92cf8b4927b3a7d1820c9140._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 1"- date="2011-04-28T07:47:38Z"- content="""-+1 for a generic user configurable backend that a user can put shell commands in, which has a disclaimer such that if a user hangs themselves with misconfiguration then its their own fault :P--I would love to be able to quickly plugin an irods/sector set of put/get/delete/stat(get info) commands into git-annex to access my private clouds which aren't s3 compatible.-"""]]
− doc/forum/wishlist:_special_remote_for_sftp_or_rsync/comment_2_84e4414c88ae91c048564a2cdc2d3250._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 2"- date="2011-04-28T21:22:03Z"- content="""-Ask and ye shalle receive with an Abbot on top: [[special_remotes/hook]]-"""]]
− doc/forum/wishlist:_special_remote_for_sftp_or_rsync/comment_3_79de7ac44e3c0f0f5691a56d3fb88897._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"- nickname="Jimmy"- subject="comment 3"- date="2011-04-29T10:43:31Z"- content="""-Cool!, I just tried adding tahoe-lafs as a remote, and it wasn't too hard.-"""]]
− doc/news/version_0.20110601.mdwn
@@ -1,9 +0,0 @@-git-annex 0.20110601 released with [[!toggle text="these changes"]]-[[!toggleable text="""-   * Minor bugfixes and error message improvements.-   * Massively sped up `git annex lock` by avoiding use of the uber-slow-     `git reset`, and only running `git checkout` once, even when many files-     are being locked.-   * Fix locking of files with staged changes.-   * Somewhat sped up `git commit` of modifications to unlocked files.-   * Build fix for older ghc."""]]
+ doc/news/version_3.20110707.mdwn view
@@ -0,0 +1,8 @@+git-annex 3.20110707 released with [[!toggle text="these changes"]]+[[!toggleable text="""+   * Fix sign bug in disk free space checking.+   * Bugfix: Forgot to de-escape keys when upgrading. Could result in+     bad location log data for keys that contain [&amp;:%] in their names.+     (A workaround for this problem is to run git annex fsck.)+   * add: Avoid a failure mode that resulted in the file seemingly being+     deleted (content put in the annex but no symlink present)."""]]
− doc/todo/wishlist:_Prevent_repeated_password_prompts_for_one_command/comment_1_3f9c0d08932c2ede61c802a91261a1f7._comment
@@ -1,14 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 1"- date="2011-05-06T18:30:02Z"- content="""-Unless you are forced to use a password, you should really be using a ssh key.--    ssh-keygen-    #put local .ssh/id_?sa.pub into remote .ssh/authorized_keys (which needs to be chmod 600)-    ssh-add-    git annex whatever--"""]]
− doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_1_fd213310ee548d8726791d2b02237fde._comment
@@ -1,29 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-01-27T18:29:44Z"- content="""-Hey Asheesh, I'm happy you're finding git-annex useful.--So, there are two forms of duplication going on here. There's duplication of the content, and duplication of the filenames -pointing at that content.--Duplication of the filenames is probably not a concern, although it's what I thought you were talking about at first. It's probably info worth recording that backup-2010/some_dir/foo and backup-2009/other_dir/foo are two names you've used for the same content in the past. If you really wanted to remove backup-2009/foo, you could do it by writing a script that looks at the basenames of the symlink targets and removes files that point to the same content as other files.--Using SHA1 ensures that the same key is used for identical files, so generally avoids duplication of content. But if you have 2 disks with an identical file on each, and make them both into annexes, then git-annex will happily retain both-copies of the content, one per disk. It generally considers keeping copies of content a good thing. :)--So, what if you want to remove the unnecessary copies? Well, there's a really simple way:--<pre>-cd /media/usb-1-git remote add other-disk /media/usb-0-git annex add-git annex drop-</pre>--This asks git-annex to add everything to the annex, but then remove any file contents that it can safely remove. What can it safely remove? Well, anything that it can verify is on another repository such as \"other-disk\"! So, this will happily drop any duplicated file contents, while leaving all the rest alone.--In practice, you might not want to have all your old backup disks mounted at the same time and configured as remotes. Look into configuring [[trust]] to avoid needing do to that. If usb-0 is already a trusted disk, all you need is a simple \"git annex drop\" on usb-1.-"""]]
− doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_2_4394bde1c6fd44acae649baffe802775._comment
@@ -1,18 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkjvjLHW9Omza7x1VEzIFQ8Z5honhRB90I"- nickname="Asheesh"- subject="I actually *do* want to avoid duplication of filenames"- date="2011-01-28T07:30:05Z"- content="""-I really do want just one filename per file, at least for some cases.--For my photos, there's no benefit to having a few filenames point to the same file. As I'm putting them all into the git-annex, that is a good time to remove the pure duplicates so that I don't e.g. see them twice when browsing the directory as a gallery. Also, I am uploading my photos to the web, and I want to avoid uploading the same photo (by content) twice.--I hope that makes things clearer!--For now I'm just doing this:--* paulproteus@renaissance:/mnt/backups-terabyte/paulproteus/sd-card-from-2011-01-06/sd-cards/DCIM/100CANON $ for file in *; do hash=$(sha1sum \"$file\"); if ls /home/paulproteus/Photos/in-flickr/.git-annex | grep -q \"$hash\"; then echo already annexed ; else flickr_upload \"$file\" && mv \"$file\" \"/home/paulproteus/Photos/in-flickr/2011-01-28/from-some-nested-sd-card-bk\" && (cd /home/paulproteus/Photos/in-flickr/2011-01-28/from-some-nested-sd-card-bk && git annex add . && git commit -m ...) ; fi; done--(Yeah, Flickr for my photos for now. I feel sad about betraying the principle of autonomo.us-ness.)-"""]]
− doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_3_076cb22057583957d5179d8ba9004605._comment
@@ -1,18 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawkjvjLHW9Omza7x1VEzIFQ8Z5honhRB90I"- nickname="Asheesh"- subject="Duplication of the filenames is what I am concerned about"- date="2011-04-29T11:48:22Z"- content="""-For what it's worth, yes, I want to actually forget I ever had the same file in the filesystem with a duplicated name. I'm not just aiming to clean up the disk's space usage; I'm also aiming to clean things up so that navigating the filesystem is easier.--I can write my own script to do that based on the symlinks' target (and I wrote something along those lines), but I still think it'd be nicer if git-annex supported this use case.--Perhaps:--<pre>git annex drop --by-contents</pre>--could let me remove a file from git-annex if the contents are available through a different name. (Right now, \"git annex drop\" requires the name *and* contents match.)---- Asheesh.-"""]]
− doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_1_85b14478411a33e6186a64bd41f0910d._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 1"- date="2011-02-25T19:12:42Z"- content="""-I'd expect the checksumming to be disk bound, not CPU bound, on most systems.--I suggest you start off on the WORM backend, and then you can run a job later to [[migrate|walkthrough#index14h2]] to the SHA1 backend.-"""]]
− doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_2_82e857f463cfdf73c70f6c0a9f9a31d6._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 2"- date="2011-02-25T19:54:28Z"- content="""-But, see [[todo/parallel_possibilities]]-"""]]
− doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_3_8af85eba7472d9025c6fae4f03e3ad75._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="jbd"- ip="89.158.228.148"- subject="comment 3"- date="2011-02-26T10:26:12Z"- content="""-Thank your for your answer and the link !-"""]]
− doc/walkthrough/moving_file_content_between_repositories/comment_1_4c30ade91fc7113a95960aa3bd1d5427._comment
@@ -1,19 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 1"- date="2011-03-22T23:41:51Z"- content="""-I may be missing something obvious, but when I copy to a remote repository, the object files are created, but no softlinks are created. When I pull everything from the remote, it pulls only files the local repo knows about already.--        A-       / \-      B   C--Moving from B to A creates no symlinks in A but the object files are moved to A. Copying back from A to B restores the object files in B and keeps them in A.--Copying from A to an empty C does not create any object files nor symlinks. Copying from C to A creates no symlinks in A but the object files are copied to A.---- RichiH--"""]]
− doc/walkthrough/moving_file_content_between_repositories/comment_2_7d90e1e150e7524ba31687108fcc38d6._comment
@@ -1,10 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 2"- date="2011-03-23T00:38:10Z"- content="""-`git annex move` only moves content. All symlink management is handled by git, so you have to keep repositories in sync using git as you would any other repo. When you `git pull B` in A, it will get whatever symlinks were added to B.--(It can be useful to use a central bare repo and avoid needing to git pull from one repo to another, then you can just always push commits to the central repo, and pull down all changes from other repos.)-"""]]
− doc/walkthrough/moving_file_content_between_repositories/comment_3_558d80384434207b9cfc033763863de3._comment
@@ -1,12 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"- nickname="Richard"- subject="comment 3"- date="2011-03-23T02:07:49Z"- content="""-Ah yes, I feel kinda stupid in hindsight.--As the central server is most likely a common use case, would you object if I added that to the walkthrough? If you have any best practices on how to automate a push with every copy to a bare remote? AFAIK, git does not store information about bare/non-bare remotes, but this could easily be put into .git/config by git annex.---- RichiH-"""]]
− doc/walkthrough/moving_file_content_between_repositories/comment_4_a2f343eceed9e9fba1670f21e0fc6af4._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joey.kitenet.net/"- nickname="joey"- subject="comment 4"- date="2011-03-23T15:28:00Z"- content="""-I would not mind if the walkthrough documented the central git repo case. But I don't want to complicate it unduely (it's long enough), and it's important that the fully distributed case be shown to work, and I assume that people already have basic git knowledge, so documenting the details of set up of a bare git repo is sorta out of scope. (There are also a lot of way to do it, using github, or gitosis, or raw git, etc.)-"""]]
git-annex.cabal view
@@ -1,5 +1,5 @@ Name: git-annex-Version: 3.20110705+Version: 3.20110707 Cabal-Version: >= 1.6 License: GPL Maintainer: Joey Hess <joey@kitenet.net>@@ -7,7 +7,7 @@ Stability: Stable Copyright: 2010-2011 Joey Hess License-File: GPL-Extra-Source-Files: ./debian/NEWS ./debian/control ./debian/rules ./debian/manpages ./debian/changelog ./debian/doc-base ./debian/copyright ./debian/compat ./AnnexQueue.hs ./configure.hs ./df.hs ./Annex.hs ./PresenceLog.hs ./Version.hs ./Crypto.hs ./README ./Command/Merge.hs ./Command/AddUrl.hs ./Command/Whereis.hs ./Command/Unlock.hs ./Command/Version.hs ./Command/FromKey.hs ./Command/PreCommit.hs ./Command/Map.hs ./Command/Unused.hs ./Command/Uninit.hs ./Command/Migrate.hs ./Command/Init.hs ./Command/ConfigList.hs ./Command/Trust.hs ./Command/Lock.hs ./Command/SendKey.hs ./Command/RecvKey.hs ./Command/Add.hs ./Command/Fix.hs ./Command/Untrust.hs ./Command/InitRemote.hs ./Command/Semitrust.hs ./Command/Fsck.hs ./Command/Move.hs ./Command/DropUnused.hs ./Command/Get.hs ./Command/Upgrade.hs ./Command/Describe.hs ./Command/Drop.hs ./Command/DropKey.hs ./Command/InAnnex.hs ./Command/Find.hs ./Command/Unannex.hs ./Command/Status.hs ./Command/Copy.hs ./Command/SetKey.hs ./DataUnits.hs ./Types.hs ./Trust.hs ./StatFS.hsc ./Makefile ./Ssh.hs ./git-annex.cabal ./Upgrade/V1.hs ./Upgrade/V2.hs ./Upgrade/V0.hs ./LocationLog.hs ./CHANGELOG ./Git/LsFiles.hs ./Git/UnionMerge.hs ./Git/Queue.hs ./Branch.hs ./doc/upgrades.mdwn ./doc/forum/wishlist:_define_remotes_that_must_have_all_files.mdwn ./doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information/comment_1_818f38aa988177d3a9415055e084f0fb._comment ./doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__.mdwn ./doc/forum/wishlist:_command_options_changes/comment_2_f6a637c78c989382e3c22d41b7fb4cc2._comment ./doc/forum/wishlist:_command_options_changes/comment_3_bf1114533d2895804e531e76eb6b8095._comment ./doc/forum/wishlist:_command_options_changes/comment_1_bfba72a696789bf21b2435dea15f967a._comment ./doc/forum/wishlist:_git-annex_replicate/comment_3_c13f4f9c3d5884fc6255fd04feadc2b1._comment ./doc/forum/wishlist:_git-annex_replicate/comment_1_9926132ec6052760cdf28518a24e2358._comment ./doc/forum/wishlist:_git-annex_replicate/comment_2_c43932f4194aba8fb2470b18e0817599._comment ./doc/forum/wishlist:_define_remotes_that_must_have_all_files/comment_1_cceccc1a1730ac688d712b81a44e31c3._comment ./doc/forum/wishlist:_define_remotes_that_must_have_all_files/comment_2_eec848fcf3979c03cbff2b7407c75a7a._comment ./doc/forum/wishlist:_special_remote_for_sftp_or_rsync/comment_3_79de7ac44e3c0f0f5691a56d3fb88897._comment ./doc/forum/wishlist:_special_remote_for_sftp_or_rsync/comment_1_6f07d9cc92cf8b4927b3a7d1820c9140._comment ./doc/forum/wishlist:_special_remote_for_sftp_or_rsync/comment_2_84e4414c88ae91c048564a2cdc2d3250._comment ./doc/forum/Behaviour_of_fsck/comment_4_e4911dc6793f98fb81151daacbe49968._comment ./doc/forum/Behaviour_of_fsck/comment_3_97848f9a3db89c0427cfb671ba13300e._comment ./doc/forum/Behaviour_of_fsck/comment_2_ead36a23c3e6efa1c41e4555f93e014e._comment ./doc/forum/Behaviour_of_fsck/comment_1_0e40f158b3f4ccdcaab1408d858b68b8._comment ./doc/forum/Problems_with_large_numbers_of_files/comment_4_7cb65d013e72bd2b7e90452079d42ac9._comment ./doc/forum/Problems_with_large_numbers_of_files/comment_1_08791cb78b982087c2a07316fe3ed46c._comment ./doc/forum/Problems_with_large_numbers_of_files/comment_7_d18cf944352f8303799c86f2c0354e8e._comment ./doc/forum/Problems_with_large_numbers_of_files/comment_2_0392a11219463e40c53bae73c8188b69._comment ./doc/forum/Problems_with_large_numbers_of_files/comment_3_537e9884c1488a7a4bcf131ea63b71f7._comment ./doc/forum/Problems_with_large_numbers_of_files/comment_6_4551274288383c9cc27cbf85b122d307._comment ./doc/forum/Problems_with_large_numbers_of_files/comment_5_86a42ee3173a5d38f803e64b79496ab3._comment ./doc/forum/incompatible_versions__63__/comment_1_629f28258746d413e452cbd42a1a43f4._comment ./doc/forum/migration_to_git-annex_and_rsync.mdwn ./doc/forum/hashing_objects_directories.mdwn ./doc/forum/Need_new_build_instructions_for_Debian_stable/comment_1_8c1eea6dfec8b7e1c7a371b6e9c26118._comment ./doc/forum/Need_new_build_instructions_for_Debian_stable/comment_3_bcda70cbfc7c1a14fa82da70f9f876e2._comment ./doc/forum/Need_new_build_instructions_for_Debian_stable/comment_2_f6ff8306c946219dbe39bb8938a349ab._comment ./doc/forum/wishlist:_git_backend_for_git-annex/comment_1_04319051fedc583e6c326bb21fcce5a5._comment ./doc/forum/wishlist:_git_backend_for_git-annex/comment_3_a077bbad3e4b07cce019eb55a45330e7._comment ./doc/forum/wishlist:_git_backend_for_git-annex/comment_2_7f529f19a47e10b571f65ab382e97fd5._comment ./doc/forum/wishlist:_git_backend_for_git-annex/comment_4_ecca429e12d734b509c671166a676c9d._comment ./doc/forum/wishlist:_git_backend_for_git-annex/comment_5_3459f0b41d818c23c8fb33edb89df634._comment ./doc/forum/hashing_objects_directories/comment_5_ef6cfd49d24c180c2d0a062e5bd3a0be._comment ./doc/forum/hashing_objects_directories/comment_1_c55c56076be4f54251b0b7f79f28a607._comment ./doc/forum/hashing_objects_directories/comment_2_504c96959c779176f991f4125ea22009._comment ./doc/forum/hashing_objects_directories/comment_3_9134bde0a13aac0b6a4e5ebabd7f22e8._comment ./doc/forum/hashing_objects_directories/comment_4_0de9170e429cbfea66f5afa8980d45ac._comment ./doc/forum/wishlist:_support_for_more_ssh_urls_.mdwn ./doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information.mdwn ./doc/forum/git-annex_on_OSX.mdwn ./doc/forum/git-annex_communication_channels/comment_2_c7aeefa6ef9a2e75d8667b479ade1b7f._comment ./doc/forum/git-annex_communication_channels/comment_5_404b723a681eb93fee015cea8024b6bc._comment ./doc/forum/git-annex_communication_channels/comment_1_198325d2e9337c90f026396de89eec0e._comment ./doc/forum/git-annex_communication_channels/comment_4_1ba6ddf54843c17c7d19a9996f2ab712._comment ./doc/forum/git-annex_communication_channels/comment_6_0d87d0e26461494b1d7f8a701a924729._comment ./doc/forum/git-annex_communication_channels/comment_3_1ff08a3e0e63fa0e560cbc9602245caa._comment ./doc/forum/git-annex_communication_channels/comment_7_2c87c7a0648fe87c2bf6b4391f1cc468._comment ./doc/forum/wishlist:_git-annex_replicate.mdwn ./doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk.mdwn ./doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__/comment_2_af4f8b52526d8bea2904c95406fd2796._comment ./doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__/comment_1_426482e6eb3a27687a48f24f6ef2332f._comment ./doc/forum/Behaviour_of_fsck.mdwn ./doc/forum/working_without_git-annex_commits.mdwn ./doc/forum/migrate_existing_git_repository_to_git-annex.mdwn ./doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo.mdwn ./doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_4_4b7e8f9521d61900d9ad418e74808ffb._comment ./doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_1_b3f22f9be02bc4f2d5a121db3d753ff5._comment ./doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_2_f94abce32ef818176b42a3cc860691ae._comment ./doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_3_0c8e77fe248e00bd990d568623e5a5c9._comment ./doc/forum/wishlist:_traffic_accounting_for_git-annex.mdwn ./doc/forum/rsync_over_ssh__63__.mdwn ./doc/forum/unannex_alternatives/comment_3_b1687fc8f9e7744327bbeb6f0635d1cd._comment ./doc/forum/unannex_alternatives/comment_1_dcd4cd41280b41512bbdffafaf307993._comment ./doc/forum/unannex_alternatives/comment_2_58a72a9fe0f58c7af0b4d7927a2dd21d._comment ./doc/forum/wishlist:_git_annex_status/comment_4_9aeeb83d202dc8fb33ff364b0705ad94._comment ./doc/forum/wishlist:_git_annex_status/comment_3_d1fd70c67243971c96d59e1ffb7ef6e7._comment ./doc/forum/wishlist:_git_annex_status/comment_2_c2b0ce025805b774dc77ce264a222824._comment ./doc/forum/wishlist:_git_annex_status/comment_1_994bfd12c5d82e08040d6116915c5090._comment ./doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_3_95c110500bc54013bc1969c1a9c8f842._comment ./doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_2_e854b93415d5ab80eda8e3be3b145ec2._comment ./doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_1_044f1c5e5f7a939315c28087495a8ba8._comment ./doc/forum/wishlist:_command_options_changes.mdwn ./doc/forum/new_microfeatures/comment_2_41ad904c68e89c85e1fc49c9e9106969._comment ./doc/forum/new_microfeatures/comment_1_058bd517c6fffaf3446b1f5d5be63623._comment ./doc/forum/new_microfeatures/comment_3_a1a9347b5bc517f2a89a8b292c3f8517._comment ./doc/forum/new_microfeatures/comment_7_94045b9078b1fff877933b012d1b49e2._comment ./doc/forum/new_microfeatures/comment_5_3c627d275586ff499d928a8f8136babf._comment ./doc/forum/new_microfeatures/comment_4_5a6786dc52382fff5cc42fdb05770196._comment ./doc/forum/new_microfeatures/comment_6_31ea08c008500560c0b96c6601bc6362._comment ./doc/forum/Error_while_adding_a_file___34__createSymbolicLink:_already_exists__34__.mdwn ./doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_2_627f54d158d3ca4b72e45b4da70ff5cd._comment ./doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_1_3deb2c31cad37a49896f00d600253ee3._comment ./doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_3_3f49dab11aae5df0c4eb5e4b8d741379._comment ./doc/forum/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults.mdwn ./doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set.mdwn ./doc/forum/bainstorming:_git_annex_push___38___pull.mdwn ./doc/forum/sparse_git_checkouts_with_annex.mdwn ./doc/forum/Need_new_build_instructions_for_Debian_stable.mdwn ./doc/forum/batch_check_on_remote_when_using_copy.mdwn ./doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs.mdwn ./doc/forum/wishlist:alias_system.mdwn ./doc/forum/incompatible_versions__63__.mdwn ./doc/forum/wishlist:_git_backend_for_git-annex.mdwn ./doc/forum/seems_to_build_fine_on_haskell_platform_2011.mdwn ./doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__/comment_1_c25900b9d2d62cc0b8c77150bcfebadf._comment ./doc/forum/rsync_over_ssh__63__/comment_1_ee21f32e90303e20339e0a568321bbbe._comment ./doc/forum/rsync_over_ssh__63__/comment_2_aa690da6ecfb2b30fc5080ad76dc77b1._comment ./doc/forum/wishlist:_special_remote_for_sftp_or_rsync.mdwn ./doc/forum/wishlist:_do_round_robin_downloading_of_data/comment_1_460335b0e59ad03871c524f1fe812357._comment ./doc/forum/OSX__39__s_haskell-platform_statically_links_things.mdwn ./doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_8_39dc449cc60a787c3bfbfaaac6f9be0c._comment ./doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_3_8a812b11fcc2dc3b6fcf01cdbbb8459d._comment ./doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_1_76bb33ce45ce6a91b86454147463193b._comment ./doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_5_c459fb479fe7b13eaea2377cfc1923a6._comment ./doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_4_fc98c819bc5eb4d7c9e74d87fb4f6f3b._comment ./doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_6_2e9da5a919bbbc27b32de3b243867d4f._comment ./doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_2_4d9b9d47d01d606a475678f630797bf9._comment ./doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_7_d636c868524b2055ee85832527437f90._comment ./doc/forum/unannex_alternatives.mdwn ./doc/forum/can_git-annex_replace_ddm__63__.mdwn ./doc/forum/sparse_git_checkouts_with_annex/comment_2_e357db3ccc4079f07a291843975535eb._comment ./doc/forum/sparse_git_checkouts_with_annex/comment_1_c7dc199c5740a0e7ba606dfb5e3e579a._comment ./doc/forum/sparse_git_checkouts_with_annex/comment_3_fcfafca994194d57dccf5319c7c9e646._comment ./doc/forum/sparse_git_checkouts_with_annex/comment_4_04dc14880f31eee2b6d767d4d4258c5a._comment ./doc/forum/git-annex_communication_channels.mdwn ./doc/forum/migrate_existing_git_repository_to_git-annex/comment_1_4181bf34c71e2e8845e6e5fb55d53381._comment ./doc/forum/migrate_existing_git_repository_to_git-annex/comment_3_f483038c006cf7dcccf1014fa771744f._comment ./doc/forum/migrate_existing_git_repository_to_git-annex/comment_2_5f08da5e21c0b3b5a8d1e4408c0d6405._comment ./doc/forum/can_git-annex_replace_ddm__63__/comment_3_4c69097fe2ee81359655e59a03a9bb8d._comment ./doc/forum/can_git-annex_replace_ddm__63__/comment_2_008554306dd082d7f543baf283510e92._comment ./doc/forum/can_git-annex_replace_ddm__63__/comment_1_aa05008dfe800474ff76678a400099e1._comment ./doc/forum/relying_on_git_for_numcopies/comment_3_43d8e1513eb9947f8a503f094c03f307._comment ./doc/forum/relying_on_git_for_numcopies/comment_2_be6acbc26008a9cb54e7b8f498f2c2a2._comment ./doc/forum/relying_on_git_for_numcopies/comment_1_8ad3cccd7f66f6423341d71241ba89fc._comment ./doc/forum/relying_on_git_for_numcopies.mdwn ./doc/forum/wishlist:_do_round_robin_downloading_of_data.mdwn ./doc/forum/bainstorming:_git_annex_push___38___pull/comment_2_b02ca09914e788393c01196686f95831._comment ./doc/forum/bainstorming:_git_annex_push___38___pull/comment_1_3a0bf74b51586354b7a91f8b43472376._comment ./doc/forum/wishlist:_git_annex_status.mdwn ./doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote.mdwn ./doc/forum/Problems_with_large_numbers_of_files.mdwn ./doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__.mdwn ./doc/forum/wishlist:_push_to_cia.vc_from_the_website__39__s_repo__44___not_your_personal_one.mdwn ./doc/forum/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_1_d5413c8acce308505e4e2bec82fb1261._comment ./doc/forum/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_2_0aa227c85d34dfff4e94febca44abea8._comment ./doc/forum/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_3_2082f4d708a584a1403cc1d4d005fb56._comment ./doc/forum/new_microfeatures.mdwn ./doc/backends.mdwn ./doc/bugs/softlink_mtime.mdwn ./doc/bugs/ordering.mdwn ./doc/bugs/dropping_files_with_a_URL_backend_fails.mdwn ./doc/bugs/fsck__47__fix_should_check__47__fix_the_permissions_of_.git__47__annex.mdwn ./doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_1_9ca2da52f3c8add0276b72d6099516a6._comment ./doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_3_ec04e306c96fd20ab912aea54a8340aa._comment ./doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_2_e14e84b770305893f2fc6e4938359f47._comment ./doc/bugs/git_annex_get_choke_when_remote_is_an_ssh_url_with_a_port.mdwn ./doc/bugs/unannex_and_uninit_do_not_work_when_git_index_is_broken.mdwn ./doc/bugs/git_annex_migrate_leaves_old_backend_versions_around.mdwn ./doc/bugs/git_annex_unused_failes_on_empty_repository.mdwn ./doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799.mdwn ./doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing.mdwn ./doc/bugs/problem_with_upgrade_v2_-__62___v3.mdwn ./doc/bugs/git_annex_copy_--fast_does_not_copy_files.mdwn ./doc/bugs/dotdot_problem.mdwn ./doc/bugs/Problems_running_make_on_osx.mdwn ./doc/bugs/free_space_checking/comment_2_8a65f6d3dcf5baa3f7f2dbe1346e2615._comment ./doc/bugs/free_space_checking/comment_3_0fc6ff79a357b1619d13018ccacc7c10._comment ./doc/bugs/free_space_checking/comment_1_a868e805be43c5a7c19c41f1af8e41e6._comment ./doc/bugs/unannex_and_uninit_do_not_work_when_git_index_is_broken/comment_1_1931e733f0698af5603a8b92267203d4._comment ./doc/bugs/unannex_and_uninit_do_not_work_when_git_index_is_broken/comment_2_40920b88537b7715395808d8aa94bf03._comment ./doc/bugs/done.mdwn ./doc/bugs/git_annex_copy_-f_REMOTE_._doesn__39__t_work_as_expected.mdwn ./doc/bugs/Displayed_copy_speed_is_wrong/comment_2_8b240de1d5ae9229fa2d77d1cc15a552._comment ./doc/bugs/Displayed_copy_speed_is_wrong/comment_1_74de3091e8bfd7acd6795e61f39f07c6._comment ./doc/bugs/bare_git_repos.mdwn ./doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_12_26d60661196f63fd01ee4fbb6e2340e7._comment ./doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_13_ead55b915d3b92a62549b2957ad211c8._comment ./doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_10_435f87d54052f264096a8f23e99eae06._comment ./doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_15_b3e3b338ccfa0a32510c78ba1b1bb617._comment ./doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_7_d38d5bee6d360b0ea852f39e3a7b1bc6._comment ./doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_11_9be0aef403a002c1706d17deee45763c._comment ./doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_1_6a41bf7e2db83db3a01722b516fb6886._comment ./doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_16_04a9f4468c3246c8eff3dbe21dd90101._comment ./doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_6_0d85f114a103bd6532a3b3b24466012e._comment ./doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_3_b596b5cfd3377e58dbbb5d509d026b90._comment ./doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_2_9f5f1dbffb2dd24f4fcf8c2027bf0384._comment ./doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_9_2cee4f6bd6db7518fd61453c595162c6._comment ./doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_14_191de89d3988083d9cf001799818ff4a._comment ./doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_5_4ea29a6f8152eddf806c536de33ef162._comment ./doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_8_29c3de4bf5fbd990b230c443c0303cbe._comment ./doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_4_d7112c315fb016a8a399e24e9b6461d8._comment ./doc/bugs/fat_support.mdwn ./doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos/comment_2_273a45e6977d40d39e0d9ab924a83240._comment ./doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos/comment_1_fc59fbd1cdf8ca97b0a4471d9914aaa1._comment ./doc/bugs/problems_with_utf8_names.mdwn ./doc/bugs/error_with_file_names_starting_with_dash.mdwn ./doc/bugs/Unfortunate_interaction_with_Calibre/comment_2_b8ae4bc589c787dacc08ab2ee5491d6e._comment ./doc/bugs/Unfortunate_interaction_with_Calibre/comment_1_7cb5561f11dfc7726a537ddde2477489._comment ./doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_3_e1f39c4af5bdb0daabf000da80858cd9._comment ./doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_4_bb6b814ab961818d514f6553455d2bf3._comment ./doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_1_dc5ae7af499203cfd903e866595b8fea._comment ./doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_6_63fb74da342751fc35e1850409c506f6._comment ./doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_2_c62daf5b3bfcd2f684262c96ef6628c1._comment ./doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_5_5bb128f6d2ca4b5e4d881fae297fa1f8._comment ./doc/bugs/unhappy_without_UTF8_locale.mdwn ./doc/bugs/S3_memory_leaks.mdwn ./doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories.mdwn ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_2_174952fc3e3be12912e5fcfe78f2dd13._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_16_8a4ab1af59098f4950726cf53636c2b3._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_20_7e328b970169fffb8bce373d1522743b._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_19_ff555c271637af065203ca99c9eeaf89._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_6_e55117cb628dc532e468519252571474._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_12_f1c53c3058a587185e7a78d84987539d._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_4_039e945617a6c1852c96974a402db29c._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_14_cc2a53c31332fe4b828ef1e72c2a4d49._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_3_a18ada7ac74c63be5753fdb2fe68dae5._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_8_68e2d6ccdb9622b879e4bc7005804623._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_15_37f1d669c1fa53ee371f781c7bb820ae._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_5_eacd0b18475c05ab9feed8cf7290b79a._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_18_db64c91dd1322a0ab168190686db494f._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_13_4f56aea35effe5c10ef37d7ad7adb48c._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_21_98f632652b0db9131b0173d3572f4d62._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_11_97de7252bf5d2a4f1381f4b2b4e24ef8._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_7_0f4f471102e394ebb01da40e4d0fd9f6._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_9_45b11ddd200261115b653c7a14d28aa9._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_1_9a7b09de132097100c1a68ea7b846727._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_10_f3594de3ba2ab17771a4b116031511bb._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_17_515d5c5fbf5bd0c188a4f1e936d913e2._comment ./doc/bugs/Problems_running_make_on_osx/comment_9_cc283b485b3c95ba7eebc8f0c96969b3._comment ./doc/bugs/Problems_running_make_on_osx/comment_4_c52be386f79f14c8570a8f1397c68581._comment ./doc/bugs/Problems_running_make_on_osx/comment_18_64fab50d95de619eb2e8f08f90237de1._comment ./doc/bugs/Problems_running_make_on_osx/comment_16_5c2dd6002aadaab30841b77a5f5aed34._comment ./doc/bugs/Problems_running_make_on_osx/comment_10_94e4ac430140042a2d0fb5a16d86b4e5._comment ./doc/bugs/Problems_running_make_on_osx/comment_15_6b8867b8e48bf807c955779c9f8f0909._comment ./doc/bugs/Problems_running_make_on_osx/comment_11_56f1143fa191361d63b441741699e17f._comment ./doc/bugs/Problems_running_make_on_osx/comment_20_7db27d1a22666c831848bc6c06d66a84._comment ./doc/bugs/Problems_running_make_on_osx/comment_12_ec5131624d0d2285d3b6880e47033f97._comment ./doc/bugs/Problems_running_make_on_osx/comment_3_68f0f8ae953589ae26d57310b40c878d._comment ./doc/bugs/Problems_running_make_on_osx/comment_14_89a960b6706ed703b390a81a8bc4e311._comment ./doc/bugs/Problems_running_make_on_osx/comment_17_62fccb04b0e4b695312f7a3f32fb96ee._comment ./doc/bugs/Problems_running_make_on_osx/comment_19_4253988ed178054c8b6400beeed68a29._comment ./doc/bugs/Problems_running_make_on_osx/comment_6_0c46f5165ceb5a7b9ea9689c33b3a4f8._comment ./doc/bugs/Problems_running_make_on_osx/comment_1_34120e82331ace01a6a4960862d38f2d._comment ./doc/bugs/Problems_running_make_on_osx/comment_7_237a137cce58a28abcc736cbf2c420b0._comment ./doc/bugs/Problems_running_make_on_osx/comment_5_7f1330a1e541b0f3e2192e596d7f7bee._comment ./doc/bugs/Problems_running_make_on_osx/comment_2_cc53d1681d576186dbc868dd9801d551._comment ./doc/bugs/Problems_running_make_on_osx/comment_13_88ed095a448096bf8a69015a04e64df1._comment ./doc/bugs/Problems_running_make_on_osx/comment_8_efafa203addf8fa79e33e21a87fb5a2b._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx.mdwn ./doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex.mdwn ./doc/bugs/git_annex_unlock_is_not_atomic.mdwn ./doc/bugs/free_space_checking.mdwn ./doc/bugs/Displayed_copy_speed_is_wrong.mdwn ./doc/bugs/git_annex_should_use___39__git_add_-f__39___internally.mdwn ./doc/bugs/minor_bug:_errors_are_not_verbose_enough.mdwn ./doc/bugs/No_version_information_from_cli.mdwn ./doc/bugs/Error_while_adding_a_file___34__createSymbolicLink:_already_exists__34__.mdwn ./doc/bugs/tests_fail_when_there_is_no_global_.gitconfig_for_the_user.mdwn ./doc/bugs/git_annex_initremote_walks_.git-annex.mdwn ./doc/bugs/git-annex_incorrectly_parses_bare_IPv6_addresses.mdwn ./doc/bugs/conflicting_haskell_packages/comment_1_e552a6cc6d7d1882e14130edfc2d6b3b._comment ./doc/bugs/tmp_file_handling.mdwn ./doc/bugs/annex_add_in_annex.mdwn ./doc/bugs/Makefile_is_missing_dependancies.mdwn ./doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_2_9249609f83f8e9c7521cd2f007c1a39e._comment ./doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_1_c896ff6589f62178b60e606771e4f2bf._comment ./doc/bugs/git_annex_should_use___39__git_add_-f__39___internally/comment_1_7683bf02cf9e97830fb4690314501568._comment ./doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_4_91439d4dbbf1461e281b276eb0003691._comment ./doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_3_86d9e7244ae492bcbe62720b8c4fc4a9._comment ./doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_2_cd0123392b16d89db41b45464165c247._comment ./doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_1_5f60006c9bb095167d817f234a14d20b._comment ./doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_5_ca33a9ca0df33f7c1b58353d7ffb943d._comment ./doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_8_881aecb9ae671689453f6d5d780d844b._comment ./doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_4_760437bf3ba972a775bb190fb4b38202._comment ./doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_5_060ba5ea88dcab2f4a0c199f13ef4f67._comment ./doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_2_bf112edd075fbebe4fc959a387946eb9._comment ./doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_6_548303d6ffb21a9370b6904f41ff49c1._comment ./doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_1_1d38283c9ea87174f3bbef9a58f5cb88._comment ./doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_3_a46080fbe82adf0986c5dc045e382501._comment ./doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_7_7ca00527ab5db058aadec4fe813e51fd._comment ./doc/bugs/git_rename_detection_on_file_move/comment_3_57010bcaca42089b451ad8659a1e018e._comment ./doc/bugs/git_rename_detection_on_file_move/comment_4_79d96599f757757f34d7b784e6c0e81c._comment ./doc/bugs/git_rename_detection_on_file_move/comment_5_d61f5693d947b9736b29fca1dbc7ad76._comment ./doc/bugs/git_rename_detection_on_file_move/comment_2_7101d07400ad5935f880dc00d89bf90e._comment ./doc/bugs/git_rename_detection_on_file_move/comment_1_0531dcfa833b0321a7009526efe3df33._comment ./doc/bugs/add_range_argument_to___34__git_annex_dropunused__34___.mdwn ./doc/bugs/git_rename_detection_on_file_move.mdwn ./doc/bugs/problem_commit_normal_links.mdwn ./doc/bugs/git_annex_unused_seems_to_check_for_current_path.mdwn ./doc/bugs/Makefile_is_missing_dependancies/comment_6_24119fc5d5963ce9dd669f7dcf006859._comment ./doc/bugs/Makefile_is_missing_dependancies/comment_3_c38b6f4abc9b9ad413c3b83ca04386c3._comment ./doc/bugs/Makefile_is_missing_dependancies/comment_8_a3555e3286cdc2bfeb9cde0ff727ba74._comment ./doc/bugs/Makefile_is_missing_dependancies/comment_2_416f12dbd0c2b841fac8164645b81df5._comment ./doc/bugs/Makefile_is_missing_dependancies/comment_5_0a1c52e2c96d19b9c3eb7e99b8c2434f._comment ./doc/bugs/Makefile_is_missing_dependancies/comment_7_96fd4725df4b54e670077a18d3ac4943._comment ./doc/bugs/Makefile_is_missing_dependancies/comment_1_5a3da5f79c8563c7a450aa29728abe7c._comment ./doc/bugs/Makefile_is_missing_dependancies/comment_4_cc13873175edf191047282700315beee._comment ./doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems.mdwn ./doc/bugs/build_issue_with_latest_release_0.20110522-1-gde817ba.mdwn ./doc/bugs/weird_local_clone_confuses.mdwn ./doc/bugs/fsck_output.mdwn ./doc/bugs/git-annex_has_issues_with_git_when_staging__47__commiting_logs.mdwn ./doc/bugs/git_annex_gets_confused_about_remotes_with_dots_in_their_names.mdwn ./doc/bugs/unannex_vs_unlock_hook_confusion.mdwn ./doc/bugs/conflicting_haskell_packages.mdwn ./doc/bugs/backend_version_upgrade_leaves_repo_unusable.mdwn ./doc/bugs/fat_support/comment_3_df3b943bc1081a8f3f7434ae0c8e061e._comment ./doc/bugs/fat_support/comment_4_90a8a15bedd94480945a374f9d706b86._comment ./doc/bugs/fat_support/comment_5_64bbf89de0836673224b83fdefa0407b._comment ./doc/bugs/fat_support/comment_1_04bcc4795d431e8cb32293aab29bbfe2._comment ./doc/bugs/fat_support/comment_2_bb4a97ebadb5c53809fc78431eabd7c8._comment ./doc/bugs/annex_unannex__47__uninit_should_handle_copies.mdwn ./doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos.mdwn ./doc/bugs/WORM:_Handle_long_filenames_correctly/comment_1_77aa9cafbe20367a41377f3edccc9ddb._comment ./doc/bugs/WORM:_Handle_long_filenames_correctly/comment_3_2bf0f02d27190578e8f4a32ddb195a0a._comment ./doc/bugs/WORM:_Handle_long_filenames_correctly/comment_4_8f7ba9372463863dda5aae13205861bf._comment ./doc/bugs/WORM:_Handle_long_filenames_correctly/comment_2_fe735d728878d889ccd34ec12b3a7dea._comment ./doc/bugs/Unfortunate_interaction_with_Calibre.mdwn ./doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_4_480a4f72445a636eab1b1c0f816d365c._comment ./doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_3_be62be5fe819acc0cb8b878802decd46._comment ./doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_2_e6f1e9eee8b8dfb60ca10c8cfd807ac9._comment ./doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_1_c871605e187f539f3bfe7478433e7fb5._comment ./doc/bugs/error_propigation.mdwn ./doc/bugs/scp_interrupt_to_background.mdwn ./doc/bugs/copy_fast_confusing_with_broken_locationlog.mdwn ./doc/bugs/configure_script_should_detect_uuidgen_instead_of_just_uuid.mdwn ./doc/bugs/check_for_curl_in_configure.hs.mdwn ./doc/bugs/Name_scheme_does_not_follow_git__39__s_rules.mdwn ./doc/bugs/building_on_lenny.mdwn ./doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_2_a4d66f29d257044e548313e014ca3dc3._comment ./doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_4_b1f818b85c3540591c48e7ba8560d070._comment ./doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_1_1c19e716069911f17bbebd196d9e4b61._comment ./doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_5_67406dd8d9bd4944202353508468c907._comment ./doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_3_f5f1081eb18143383b2fb1f57d8640f5._comment ./doc/bugs/encrypted_S3_stalls.mdwn ./doc/bugs/WORM:_Handle_long_filenames_correctly.mdwn ./doc/logo_small.png ./doc/cheatsheet.mdwn ./doc/use_case/Bob.mdwn ./doc/use_case/Alice.mdwn ./doc/upgrades/SHA_size.mdwn ./doc/news/sharebox_a_FUSE_filesystem_for_git-annex.mdwn ./doc/news/version_3.20110624.mdwn ./doc/news/version_0.20110610.mdwn ./doc/news/version_3.20110702.mdwn ./doc/news/version_0.20110601.mdwn ./doc/news/version_3.20110705.mdwn ./doc/news/LWN_article.mdwn ./doc/git-union-merge.mdwn ./doc/special_remotes/S3.mdwn ./doc/special_remotes/web.mdwn ./doc/special_remotes/bup.mdwn ./doc/special_remotes/directory.mdwn ./doc/special_remotes/hook.mdwn ./doc/special_remotes/rsync.mdwn ./doc/users/joey.mdwn ./doc/users/fmarier.mdwn ./doc/users/chrysn.mdwn ./doc/templates/walkthrough.tmpl ./doc/templates/bare.tmpl ./doc/index.mdwn ./doc/summary.mdwn ./doc/forum.mdwn ./doc/encryption/comment_1_1afca8d7182075d46db41f6ad3dd5911._comment ./doc/transferring_data.mdwn ./doc/download.mdwn ./doc/future_proofing.mdwn ./doc/todo/auto_remotes/discussion.mdwn ./doc/todo/file_copy_progress_bar.mdwn ./doc/todo/use_cp_reflink.mdwn ./doc/todo/gitrm.mdwn ./doc/todo/git-annex_unused_eats_memory.mdwn ./doc/todo/add_--exclude_option_to_git_annex_find.mdwn ./doc/todo/tahoe_lfs_for_reals/comment_2_80b9e848edfdc7be21baab7d0cef0e3a._comment ./doc/todo/tahoe_lfs_for_reals/comment_1_0a4793ce6a867638f6e510e71dd4bb44._comment ./doc/todo/object_dir_reorg_v2.mdwn ./doc/todo/S3.mdwn ./doc/todo/auto_remotes.mdwn ./doc/todo/wishlist:_support_for_more_ssh_urls_.mdwn ./doc/todo/support-non-utf8-locales.mdwn ./doc/todo/done.mdwn ./doc/todo/fsck.mdwn ./doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_1_fd213310ee548d8726791d2b02237fde._comment ./doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_3_076cb22057583957d5179d8ba9004605._comment ./doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_2_4394bde1c6fd44acae649baffe802775._comment ./doc/todo/support_S3_multipart_uploads.mdwn ./doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates.mdwn ./doc/todo/pushpull.mdwn ./doc/todo/smudge.mdwn ./doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment ./doc/todo/object_dir_reorg_v2/comment_3_79bdf9c51dec9f52372ce95b53233bb2._comment ./doc/todo/object_dir_reorg_v2/comment_7_42501404c82ca07147e2cce0cff59474._comment ./doc/todo/object_dir_reorg_v2/comment_5_821c382987f105da72a50e0a5ce61fdc._comment ./doc/todo/object_dir_reorg_v2/comment_1_ba03333dc76ff49eccaba375e68cb525._comment ./doc/todo/object_dir_reorg_v2/comment_2_81276ac309959dc741bc90101c213ab7._comment ./doc/todo/object_dir_reorg_v2/comment_6_8834c3a3f1258c4349d23aff8549bf35._comment ./doc/todo/object_dir_reorg_v2/comment_4_93aada9b1680fed56cc6f0f7c3aca5e5._comment ./doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_3_8af85eba7472d9025c6fae4f03e3ad75._comment ./doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_2_82e857f463cfdf73c70f6c0a9f9a31d6._comment ./doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_1_85b14478411a33e6186a64bd41f0910d._comment ./doc/todo/union_mounting.mdwn ./doc/todo/wishlist:_swift_backend.mdwn ./doc/todo/wishlist:_swift_backend/comment_1_e6efbb35f61ee521b473a92674036788._comment ./doc/todo/wishlist:_swift_backend/comment_2_5d8c83b0485112e98367b7abaab3f4e3._comment ./doc/todo/git_annex_init_:_include_repo_description_and__47__or_UUID_in_commit_message.mdwn ./doc/todo/wishlist:___34__git_annex_add__34___multiple_processes.mdwn ./doc/todo/hidden_files.mdwn ./doc/todo/smudge/comment_1_4ea616bcdbc9e9a6fae9f2e2795c31c9._comment ./doc/todo/smudge/comment_2_e04b32caa0d2b4c577cdaf382a3ff7f6._comment ./doc/todo/network_remotes.mdwn ./doc/todo/add_a_git_backend.mdwn ./doc/todo/parallel_possibilities/comment_1_d8e34fc2bc4e5cf761574608f970d496._comment ./doc/todo/parallel_possibilities/comment_2_adb76f06a7997abe4559d3169a3181c3._comment ./doc/todo/checkout.mdwn ./doc/todo/immutable_annexed_files.mdwn ./doc/todo/wishlist:_Prevent_repeated_password_prompts_for_one_command/comment_1_3f9c0d08932c2ede61c802a91261a1f7._comment ./doc/todo/wishlist:_Prevent_repeated_password_prompts_for_one_command.mdwn ./doc/todo/git-annex-shell.mdwn ./doc/todo/speed_up_fsck.mdwn ./doc/todo/tahoe_lfs_for_reals.mdwn ./doc/todo/using_url_backend.mdwn ./doc/todo/branching.mdwn ./doc/todo/rsync.mdwn ./doc/todo/backendSHA1.mdwn ./doc/todo/cache_key_info.mdwn ./doc/todo/parallel_possibilities.mdwn ./doc/todo/symlink_farming_commit_hook.mdwn ./doc/feeds.mdwn ./doc/copies.mdwn ./doc/repomap.png ./doc/special_remotes.mdwn ./doc/todo.mdwn ./doc/walkthrough/using_ssh_remotes.mdwn ./doc/walkthrough/untrusted_repositories.mdwn ./doc/walkthrough/moving_file_content_between_repositories.mdwn ./doc/walkthrough/modifying_annexed_files.mdwn ./doc/walkthrough/Internet_Archive_via_S3.mdwn ./doc/walkthrough/more.mdwn ./doc/walkthrough/removing_files.mdwn ./doc/walkthrough/creating_a_repository.mdwn ./doc/walkthrough/what_to_do_when_you_lose_a_repository.mdwn ./doc/walkthrough/using_Amazon_S3.mdwn ./doc/walkthrough/adding_a_remote.mdwn ./doc/walkthrough/adding_a_remote/comment_1_0a59355bd33a796aec97173607e6adc9._comment ./doc/walkthrough/adding_a_remote/comment_2_f8cd79ef1593a8181a7f1086a87713e8._comment ./doc/walkthrough/adding_a_remote/comment_3_60691af4400521b5a8c8d75efe3b44cb._comment ./doc/walkthrough/adding_a_remote/comment_4_6f7cf5c330272c96b3abeb6612075c9d._comment ./doc/walkthrough/removing_files:_When_things_go_wrong.mdwn ./doc/walkthrough/moving_file_content_between_repositories/comment_1_4c30ade91fc7113a95960aa3bd1d5427._comment ./doc/walkthrough/moving_file_content_between_repositories/comment_3_558d80384434207b9cfc033763863de3._comment ./doc/walkthrough/moving_file_content_between_repositories/comment_4_a2f343eceed9e9fba1670f21e0fc6af4._comment ./doc/walkthrough/moving_file_content_between_repositories/comment_2_7d90e1e150e7524ba31687108fcc38d6._comment ./doc/walkthrough/renaming_files.mdwn ./doc/walkthrough/using_bup.mdwn ./doc/walkthrough/fsck:_when_things_go_wrong.mdwn ./doc/walkthrough/adding_files.mdwn ./doc/walkthrough/unused_data.mdwn ./doc/walkthrough/fsck:_verifying_your_data.mdwn ./doc/walkthrough/getting_file_content.mdwn ./doc/walkthrough/using_the_web.mdwn ./doc/walkthrough/recover_data_from_lost+found.mdwn ./doc/walkthrough/backups.mdwn ./doc/walkthrough/transferring_files:_When_things_go_wrong.mdwn ./doc/walkthrough/using_the_SHA1_backend.mdwn ./doc/walkthrough/migrating_data_to_a_new_backend.mdwn ./doc/GPL ./doc/logo.png ./doc/location_tracking.mdwn ./doc/design.mdwn ./doc/news.mdwn ./doc/encryption.mdwn ./doc/not.mdwn ./doc/download/comment_7_a5eebd214b135f34b18274a682211943._comment ./doc/download/comment_3_cf6044ebe99f71158034e21197228abd._comment ./doc/download/comment_5_c6b1bc40226fc2c8ba3e558150856992._comment ./doc/download/comment_6_3a52993d3553deb9a413debec9a5f92d._comment ./doc/download/comment_2_f85f72b33aedc3425f0c0c47867d02f3._comment ./doc/download/comment_8_59a976de6c7d333709b92f7cd5830850._comment ./doc/download/comment_4_10fc013865c7542c2ed9d6c0963bb391._comment ./doc/download/comment_1_fbd8b6d39e9d3c71791551358c863966._comment ./doc/contact.mdwn ./doc/trust.mdwn ./doc/bare_repositories.mdwn ./doc/distributed_version_control.mdwn ./doc/install.mdwn ./doc/git-annex-shell.mdwn ./doc/bugs.mdwn ./doc/design/encryption/comment_2_a610b3d056a059899178859a3a821ea5._comment ./doc/design/encryption/comment_3_cca186a9536cd3f6e86994631b14231c._comment ./doc/design/encryption/comment_1_4715ffafb3c4a9915bc33f2b26aaa9c1._comment ./doc/design/encryption/comment_4_8f3ba3e504b058791fc6e6f9c38154cf._comment ./doc/design/encryption.mdwn ./doc/comments.mdwn ./doc/git-annex.mdwn ./doc/internals.mdwn ./doc/users.mdwn ./doc/install/Ubuntu.mdwn ./doc/install/Debian.mdwn ./doc/install/OSX.mdwn ./doc/install/FreeBSD.mdwn ./doc/install/comment_3_cff163ea3e7cad926f4ed9e78b896598._comment ./doc/install/Fedora.mdwn ./doc/install/comment_4_82a17eee4a076c6c79fddeda347e0c9a._comment ./doc/walkthrough.mdwn ./CmdLine.hs ./RsyncFile.hs ./CopyFile.hs ./UUID.hs ./Messages.hs ./Setup.hs ./TestConfig.hs ./GPL ./mdwn2man ./Remote.hs ./git-annex.hs ./Locations.hs ./Backend/WORM.hs ./Backend/File.hs ./Backend/SHA.hs ./Options.hs ./git-annex-shell.hs ./test.hs ./INSTALL ./Remote/Encryptable.hs ./Remote/Web.hs ./Remote/S3stub.hs ./Remote/Special.hs ./Remote/Directory.hs ./Remote/S3real.hs ./Remote/Bup.hs ./Remote/Hook.hs ./Remote/Rsync.hs ./Remote/Git.hs ./Utility.hs ./Upgrade.hs ./git-union-merge.hs ./Types/Crypto.hs ./Types/UUID.hs ./Types/TrustLevel.hs ./Types/Remote.hs ./Types/BranchState.hs ./Types/Backend.hs ./Types/Key.hs ./Dot.hs ./Config.hs ./Command.hs ./.gitignore ./Backend.hs ./Touch.hsc ./Base64.hs ./Content.hs ./.gitattributes ./Git.hs ./GitAnnex.hs ./BackendList.hs+Extra-Source-Files: ./debian/NEWS ./debian/control ./debian/rules ./debian/manpages ./debian/changelog ./debian/doc-base ./debian/copyright ./debian/compat ./AnnexQueue.hs ./configure.hs ./Annex.hs ./PresenceLog.hs ./Version.hs ./Crypto.hs ./RemoteLog.hs ./README ./Command/Merge.hs ./Command/AddUrl.hs ./Command/Whereis.hs ./Command/Unlock.hs ./Command/Version.hs ./Command/FromKey.hs ./Command/PreCommit.hs ./Command/Map.hs ./Command/Unused.hs ./Command/Uninit.hs ./Command/Migrate.hs ./Command/Init.hs ./Command/ConfigList.hs ./Command/Trust.hs ./Command/Lock.hs ./Command/SendKey.hs ./Command/RecvKey.hs ./Command/Add.hs ./Command/Fix.hs ./Command/Untrust.hs ./Command/InitRemote.hs ./Command/Semitrust.hs ./Command/Fsck.hs ./Command/Move.hs ./Command/DropUnused.hs ./Command/Get.hs ./Command/Upgrade.hs ./Command/Describe.hs ./Command/Drop.hs ./Command/DropKey.hs ./Command/InAnnex.hs ./Command/Find.hs ./Command/Unannex.hs ./Command/Status.hs ./Command/Copy.hs ./Command/SetKey.hs ./Types.hs ./Trust.hs ./StatFS.hsc ./Makefile ./git-annex.cabal ./Upgrade/V1.hs ./Upgrade/V2.hs ./Upgrade/V0.hs ./LocationLog.hs ./CHANGELOG ./Git/LsFiles.hs ./Git/UnionMerge.hs ./Git/Queue.hs ./Branch.hs ./doc/upgrades.mdwn ./doc/forum/wishlist:_define_remotes_that_must_have_all_files.mdwn ./doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__.mdwn ./doc/forum/wishlist:_command_options_changes/comment_2_f6a637c78c989382e3c22d41b7fb4cc2._comment ./doc/forum/wishlist:_command_options_changes/comment_3_bf1114533d2895804e531e76eb6b8095._comment ./doc/forum/wishlist:_command_options_changes/comment_1_bfba72a696789bf21b2435dea15f967a._comment ./doc/forum/wishlist:_git-annex_replicate/comment_3_c13f4f9c3d5884fc6255fd04feadc2b1._comment ./doc/forum/wishlist:_git-annex_replicate/comment_1_9926132ec6052760cdf28518a24e2358._comment ./doc/forum/wishlist:_git-annex_replicate/comment_2_c43932f4194aba8fb2470b18e0817599._comment ./doc/forum/Behaviour_of_fsck/comment_4_e4911dc6793f98fb81151daacbe49968._comment ./doc/forum/Behaviour_of_fsck/comment_3_97848f9a3db89c0427cfb671ba13300e._comment ./doc/forum/Behaviour_of_fsck/comment_2_ead36a23c3e6efa1c41e4555f93e014e._comment ./doc/forum/Behaviour_of_fsck/comment_1_0e40f158b3f4ccdcaab1408d858b68b8._comment ./doc/forum/incompatible_versions__63__/comment_1_629f28258746d413e452cbd42a1a43f4._comment ./doc/forum/migration_to_git-annex_and_rsync.mdwn ./doc/forum/hashing_objects_directories.mdwn ./doc/forum/hashing_objects_directories/comment_5_ef6cfd49d24c180c2d0a062e5bd3a0be._comment ./doc/forum/hashing_objects_directories/comment_1_c55c56076be4f54251b0b7f79f28a607._comment ./doc/forum/hashing_objects_directories/comment_2_504c96959c779176f991f4125ea22009._comment ./doc/forum/hashing_objects_directories/comment_3_9134bde0a13aac0b6a4e5ebabd7f22e8._comment ./doc/forum/hashing_objects_directories/comment_4_0de9170e429cbfea66f5afa8980d45ac._comment ./doc/forum/wishlist:_support_for_more_ssh_urls_.mdwn ./doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information.mdwn ./doc/forum/git-annex_on_OSX.mdwn ./doc/forum/git-annex_communication_channels/comment_2_c7aeefa6ef9a2e75d8667b479ade1b7f._comment ./doc/forum/git-annex_communication_channels/comment_5_404b723a681eb93fee015cea8024b6bc._comment ./doc/forum/git-annex_communication_channels/comment_1_198325d2e9337c90f026396de89eec0e._comment ./doc/forum/git-annex_communication_channels/comment_4_1ba6ddf54843c17c7d19a9996f2ab712._comment ./doc/forum/git-annex_communication_channels/comment_6_0d87d0e26461494b1d7f8a701a924729._comment ./doc/forum/git-annex_communication_channels/comment_3_1ff08a3e0e63fa0e560cbc9602245caa._comment ./doc/forum/git-annex_communication_channels/comment_7_2c87c7a0648fe87c2bf6b4391f1cc468._comment ./doc/forum/wishlist:_git-annex_replicate.mdwn ./doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk.mdwn ./doc/forum/Behaviour_of_fsck.mdwn ./doc/forum/working_without_git-annex_commits.mdwn ./doc/forum/migrate_existing_git_repository_to_git-annex.mdwn ./doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo.mdwn ./doc/forum/wishlist:_traffic_accounting_for_git-annex.mdwn ./doc/forum/rsync_over_ssh__63__.mdwn ./doc/forum/unannex_alternatives/comment_3_b1687fc8f9e7744327bbeb6f0635d1cd._comment ./doc/forum/unannex_alternatives/comment_1_dcd4cd41280b41512bbdffafaf307993._comment ./doc/forum/unannex_alternatives/comment_2_58a72a9fe0f58c7af0b4d7927a2dd21d._comment ./doc/forum/wishlist:_git_annex_status/comment_4_9aeeb83d202dc8fb33ff364b0705ad94._comment ./doc/forum/wishlist:_git_annex_status/comment_3_d1fd70c67243971c96d59e1ffb7ef6e7._comment ./doc/forum/wishlist:_git_annex_status/comment_2_c2b0ce025805b774dc77ce264a222824._comment ./doc/forum/wishlist:_git_annex_status/comment_1_994bfd12c5d82e08040d6116915c5090._comment ./doc/forum/wishlist:_command_options_changes.mdwn ./doc/forum/new_microfeatures/comment_2_41ad904c68e89c85e1fc49c9e9106969._comment ./doc/forum/new_microfeatures/comment_1_058bd517c6fffaf3446b1f5d5be63623._comment ./doc/forum/new_microfeatures/comment_3_a1a9347b5bc517f2a89a8b292c3f8517._comment ./doc/forum/new_microfeatures/comment_7_94045b9078b1fff877933b012d1b49e2._comment ./doc/forum/new_microfeatures/comment_5_3c627d275586ff499d928a8f8136babf._comment ./doc/forum/new_microfeatures/comment_4_5a6786dc52382fff5cc42fdb05770196._comment ./doc/forum/new_microfeatures/comment_6_31ea08c008500560c0b96c6601bc6362._comment ./doc/forum/Error_while_adding_a_file___34__createSymbolicLink:_already_exists__34__.mdwn ./doc/forum/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults.mdwn ./doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set.mdwn ./doc/forum/bainstorming:_git_annex_push___38___pull.mdwn ./doc/forum/sparse_git_checkouts_with_annex.mdwn ./doc/forum/Need_new_build_instructions_for_Debian_stable.mdwn ./doc/forum/batch_check_on_remote_when_using_copy.mdwn ./doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs.mdwn ./doc/forum/wishlist:alias_system.mdwn ./doc/forum/incompatible_versions__63__.mdwn ./doc/forum/wishlist:_git_backend_for_git-annex.mdwn ./doc/forum/seems_to_build_fine_on_haskell_platform_2011.mdwn ./doc/forum/rsync_over_ssh__63__/comment_1_ee21f32e90303e20339e0a568321bbbe._comment ./doc/forum/rsync_over_ssh__63__/comment_2_aa690da6ecfb2b30fc5080ad76dc77b1._comment ./doc/forum/wishlist:_special_remote_for_sftp_or_rsync.mdwn ./doc/forum/OSX__39__s_haskell-platform_statically_links_things.mdwn ./doc/forum/unannex_alternatives.mdwn ./doc/forum/can_git-annex_replace_ddm__63__.mdwn ./doc/forum/sparse_git_checkouts_with_annex/comment_2_e357db3ccc4079f07a291843975535eb._comment ./doc/forum/sparse_git_checkouts_with_annex/comment_1_c7dc199c5740a0e7ba606dfb5e3e579a._comment ./doc/forum/sparse_git_checkouts_with_annex/comment_3_fcfafca994194d57dccf5319c7c9e646._comment ./doc/forum/sparse_git_checkouts_with_annex/comment_4_04dc14880f31eee2b6d767d4d4258c5a._comment ./doc/forum/git-annex_communication_channels.mdwn ./doc/forum/can_git-annex_replace_ddm__63__/comment_3_4c69097fe2ee81359655e59a03a9bb8d._comment ./doc/forum/can_git-annex_replace_ddm__63__/comment_2_008554306dd082d7f543baf283510e92._comment ./doc/forum/can_git-annex_replace_ddm__63__/comment_1_aa05008dfe800474ff76678a400099e1._comment ./doc/forum/relying_on_git_for_numcopies/comment_3_43d8e1513eb9947f8a503f094c03f307._comment ./doc/forum/relying_on_git_for_numcopies/comment_2_be6acbc26008a9cb54e7b8f498f2c2a2._comment ./doc/forum/relying_on_git_for_numcopies/comment_1_8ad3cccd7f66f6423341d71241ba89fc._comment ./doc/forum/relying_on_git_for_numcopies.mdwn ./doc/forum/wishlist:_do_round_robin_downloading_of_data.mdwn ./doc/forum/wishlist:_git_annex_status.mdwn ./doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote.mdwn ./doc/forum/Problems_with_large_numbers_of_files.mdwn ./doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__.mdwn ./doc/forum/wishlist:_push_to_cia.vc_from_the_website__39__s_repo__44___not_your_personal_one.mdwn ./doc/forum/new_microfeatures.mdwn ./doc/backends.mdwn ./doc/bugs/softlink_mtime.mdwn ./doc/bugs/ordering.mdwn ./doc/bugs/dropping_files_with_a_URL_backend_fails.mdwn ./doc/bugs/fsck__47__fix_should_check__47__fix_the_permissions_of_.git__47__annex.mdwn ./doc/bugs/git_annex_get_choke_when_remote_is_an_ssh_url_with_a_port.mdwn ./doc/bugs/unannex_and_uninit_do_not_work_when_git_index_is_broken.mdwn ./doc/bugs/git_annex_migrate_leaves_old_backend_versions_around.mdwn ./doc/bugs/git_annex_unused_failes_on_empty_repository.mdwn ./doc/bugs/git_annex_add_eats_files_when_filename_is_too_long.mdwn ./doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing.mdwn ./doc/bugs/problem_with_upgrade_v2_-__62___v3.mdwn ./doc/bugs/git_annex_copy_--fast_does_not_copy_files.mdwn ./doc/bugs/dotdot_problem.mdwn ./doc/bugs/Problems_running_make_on_osx.mdwn ./doc/bugs/free_space_checking/comment_2_8a65f6d3dcf5baa3f7f2dbe1346e2615._comment ./doc/bugs/free_space_checking/comment_3_0fc6ff79a357b1619d13018ccacc7c10._comment ./doc/bugs/free_space_checking/comment_1_a868e805be43c5a7c19c41f1af8e41e6._comment ./doc/bugs/done.mdwn ./doc/bugs/git_annex_copy_-f_REMOTE_._doesn__39__t_work_as_expected.mdwn ./doc/bugs/Displayed_copy_speed_is_wrong/comment_2_8b240de1d5ae9229fa2d77d1cc15a552._comment ./doc/bugs/Displayed_copy_speed_is_wrong/comment_1_74de3091e8bfd7acd6795e61f39f07c6._comment ./doc/bugs/bare_git_repos.mdwn ./doc/bugs/fat_support.mdwn ./doc/bugs/problems_with_utf8_names.mdwn ./doc/bugs/error_with_file_names_starting_with_dash.mdwn ./doc/bugs/unhappy_without_UTF8_locale.mdwn ./doc/bugs/S3_memory_leaks.mdwn ./doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories.mdwn ./doc/bugs/Problems_running_make_on_osx/comment_9_cc283b485b3c95ba7eebc8f0c96969b3._comment ./doc/bugs/Problems_running_make_on_osx/comment_4_c52be386f79f14c8570a8f1397c68581._comment ./doc/bugs/Problems_running_make_on_osx/comment_18_64fab50d95de619eb2e8f08f90237de1._comment ./doc/bugs/Problems_running_make_on_osx/comment_16_5c2dd6002aadaab30841b77a5f5aed34._comment ./doc/bugs/Problems_running_make_on_osx/comment_10_94e4ac430140042a2d0fb5a16d86b4e5._comment ./doc/bugs/Problems_running_make_on_osx/comment_15_6b8867b8e48bf807c955779c9f8f0909._comment ./doc/bugs/Problems_running_make_on_osx/comment_11_56f1143fa191361d63b441741699e17f._comment ./doc/bugs/Problems_running_make_on_osx/comment_20_7db27d1a22666c831848bc6c06d66a84._comment ./doc/bugs/Problems_running_make_on_osx/comment_12_ec5131624d0d2285d3b6880e47033f97._comment ./doc/bugs/Problems_running_make_on_osx/comment_3_68f0f8ae953589ae26d57310b40c878d._comment ./doc/bugs/Problems_running_make_on_osx/comment_14_89a960b6706ed703b390a81a8bc4e311._comment ./doc/bugs/Problems_running_make_on_osx/comment_17_62fccb04b0e4b695312f7a3f32fb96ee._comment ./doc/bugs/Problems_running_make_on_osx/comment_19_4253988ed178054c8b6400beeed68a29._comment ./doc/bugs/Problems_running_make_on_osx/comment_6_0c46f5165ceb5a7b9ea9689c33b3a4f8._comment ./doc/bugs/Problems_running_make_on_osx/comment_1_34120e82331ace01a6a4960862d38f2d._comment ./doc/bugs/Problems_running_make_on_osx/comment_7_237a137cce58a28abcc736cbf2c420b0._comment ./doc/bugs/Problems_running_make_on_osx/comment_5_7f1330a1e541b0f3e2192e596d7f7bee._comment ./doc/bugs/Problems_running_make_on_osx/comment_2_cc53d1681d576186dbc868dd9801d551._comment ./doc/bugs/Problems_running_make_on_osx/comment_13_88ed095a448096bf8a69015a04e64df1._comment ./doc/bugs/Problems_running_make_on_osx/comment_8_efafa203addf8fa79e33e21a87fb5a2b._comment ./doc/bugs/git-annex_directory_hashing_problems_on_osx.mdwn ./doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex.mdwn ./doc/bugs/git_annex_unlock_is_not_atomic.mdwn ./doc/bugs/free_space_checking.mdwn ./doc/bugs/Displayed_copy_speed_is_wrong.mdwn ./doc/bugs/git_annex_should_use___39__git_add_-f__39___internally.mdwn ./doc/bugs/minor_bug:_errors_are_not_verbose_enough.mdwn ./doc/bugs/No_version_information_from_cli.mdwn ./doc/bugs/Error_while_adding_a_file___34__createSymbolicLink:_already_exists__34__.mdwn ./doc/bugs/tests_fail_when_there_is_no_global_.gitconfig_for_the_user.mdwn ./doc/bugs/git_annex_initremote_walks_.git-annex.mdwn ./doc/bugs/git-annex_incorrectly_parses_bare_IPv6_addresses.mdwn ./doc/bugs/conflicting_haskell_packages/comment_1_e552a6cc6d7d1882e14130edfc2d6b3b._comment ./doc/bugs/tmp_file_handling.mdwn ./doc/bugs/annex_add_in_annex.mdwn ./doc/bugs/making_annex-merge_try_a_fast-forward.mdwn ./doc/bugs/Makefile_is_missing_dependancies.mdwn ./doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_4_91439d4dbbf1461e281b276eb0003691._comment ./doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_6_f360f0006bc9115bc5a3e2eb9fe58abd._comment ./doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_3_86d9e7244ae492bcbe62720b8c4fc4a9._comment ./doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_2_cd0123392b16d89db41b45464165c247._comment ./doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_1_5f60006c9bb095167d817f234a14d20b._comment ./doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_5_ca33a9ca0df33f7c1b58353d7ffb943d._comment ./doc/bugs/git_rename_detection_on_file_move/comment_3_57010bcaca42089b451ad8659a1e018e._comment ./doc/bugs/git_rename_detection_on_file_move/comment_4_79d96599f757757f34d7b784e6c0e81c._comment ./doc/bugs/git_rename_detection_on_file_move/comment_5_d61f5693d947b9736b29fca1dbc7ad76._comment ./doc/bugs/git_rename_detection_on_file_move/comment_2_7101d07400ad5935f880dc00d89bf90e._comment ./doc/bugs/git_rename_detection_on_file_move/comment_1_0531dcfa833b0321a7009526efe3df33._comment ./doc/bugs/add_range_argument_to___34__git_annex_dropunused__34___.mdwn ./doc/bugs/git_rename_detection_on_file_move.mdwn ./doc/bugs/problem_commit_normal_links.mdwn ./doc/bugs/git_annex_unused_seems_to_check_for_current_path.mdwn ./doc/bugs/Makefile_is_missing_dependancies/comment_6_24119fc5d5963ce9dd669f7dcf006859._comment ./doc/bugs/Makefile_is_missing_dependancies/comment_3_c38b6f4abc9b9ad413c3b83ca04386c3._comment ./doc/bugs/Makefile_is_missing_dependancies/comment_8_a3555e3286cdc2bfeb9cde0ff727ba74._comment ./doc/bugs/Makefile_is_missing_dependancies/comment_2_416f12dbd0c2b841fac8164645b81df5._comment ./doc/bugs/Makefile_is_missing_dependancies/comment_5_0a1c52e2c96d19b9c3eb7e99b8c2434f._comment ./doc/bugs/Makefile_is_missing_dependancies/comment_7_96fd4725df4b54e670077a18d3ac4943._comment ./doc/bugs/Makefile_is_missing_dependancies/comment_1_5a3da5f79c8563c7a450aa29728abe7c._comment ./doc/bugs/Makefile_is_missing_dependancies/comment_4_cc13873175edf191047282700315beee._comment ./doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems.mdwn ./doc/bugs/build_issue_with_latest_release_0.20110522-1-gde817ba.mdwn ./doc/bugs/weird_local_clone_confuses.mdwn ./doc/bugs/fsck_output.mdwn ./doc/bugs/git-annex_has_issues_with_git_when_staging__47__commiting_logs.mdwn ./doc/bugs/git_annex_gets_confused_about_remotes_with_dots_in_their_names.mdwn ./doc/bugs/unannex_vs_unlock_hook_confusion.mdwn ./doc/bugs/conflicting_haskell_packages.mdwn ./doc/bugs/backend_version_upgrade_leaves_repo_unusable.mdwn ./doc/bugs/fat_support/comment_3_df3b943bc1081a8f3f7434ae0c8e061e._comment ./doc/bugs/fat_support/comment_4_90a8a15bedd94480945a374f9d706b86._comment ./doc/bugs/fat_support/comment_5_64bbf89de0836673224b83fdefa0407b._comment ./doc/bugs/fat_support/comment_1_04bcc4795d431e8cb32293aab29bbfe2._comment ./doc/bugs/fat_support/comment_2_bb4a97ebadb5c53809fc78431eabd7c8._comment ./doc/bugs/annex_unannex__47__uninit_should_handle_copies.mdwn ./doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos.mdwn ./doc/bugs/Unfortunate_interaction_with_Calibre.mdwn ./doc/bugs/error_propigation.mdwn ./doc/bugs/scp_interrupt_to_background.mdwn ./doc/bugs/copy_fast_confusing_with_broken_locationlog.mdwn ./doc/bugs/configure_script_should_detect_uuidgen_instead_of_just_uuid.mdwn ./doc/bugs/check_for_curl_in_configure.hs.mdwn ./doc/bugs/Name_scheme_does_not_follow_git__39__s_rules.mdwn ./doc/bugs/building_on_lenny.mdwn ./doc/bugs/encrypted_S3_stalls.mdwn ./doc/bugs/WORM:_Handle_long_filenames_correctly.mdwn ./doc/logo_small.png ./doc/cheatsheet.mdwn ./doc/use_case/Bob.mdwn ./doc/use_case/Alice.mdwn ./doc/upgrades/SHA_size.mdwn ./doc/news/sharebox_a_FUSE_filesystem_for_git-annex.mdwn ./doc/news/version_3.20110624.mdwn ./doc/news/version_3.20110707.mdwn ./doc/news/version_0.20110610.mdwn ./doc/news/version_3.20110702.mdwn ./doc/news/version_3.20110705.mdwn ./doc/news/LWN_article.mdwn ./doc/git-union-merge.mdwn ./doc/special_remotes/S3.mdwn ./doc/special_remotes/web.mdwn ./doc/special_remotes/bup.mdwn ./doc/special_remotes/directory.mdwn ./doc/special_remotes/hook.mdwn ./doc/special_remotes/rsync.mdwn ./doc/users/joey.mdwn ./doc/users/fmarier.mdwn ./doc/users/chrysn.mdwn ./doc/templates/walkthrough.tmpl ./doc/templates/bare.tmpl ./doc/index.mdwn ./doc/summary.mdwn ./doc/forum.mdwn ./doc/encryption/comment_1_1afca8d7182075d46db41f6ad3dd5911._comment ./doc/transferring_data.mdwn ./doc/download.mdwn ./doc/future_proofing.mdwn ./doc/todo/auto_remotes/discussion.mdwn ./doc/todo/file_copy_progress_bar.mdwn ./doc/todo/use_cp_reflink.mdwn ./doc/todo/gitrm.mdwn ./doc/todo/git-annex_unused_eats_memory.mdwn ./doc/todo/add_--exclude_option_to_git_annex_find.mdwn ./doc/todo/tahoe_lfs_for_reals/comment_2_80b9e848edfdc7be21baab7d0cef0e3a._comment ./doc/todo/tahoe_lfs_for_reals/comment_1_0a4793ce6a867638f6e510e71dd4bb44._comment ./doc/todo/object_dir_reorg_v2.mdwn ./doc/todo/S3.mdwn ./doc/todo/auto_remotes.mdwn ./doc/todo/wishlist:_support_for_more_ssh_urls_.mdwn ./doc/todo/support-non-utf8-locales.mdwn ./doc/todo/done.mdwn ./doc/todo/fsck.mdwn ./doc/todo/support_S3_multipart_uploads.mdwn ./doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates.mdwn ./doc/todo/pushpull.mdwn ./doc/todo/smudge.mdwn ./doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment ./doc/todo/object_dir_reorg_v2/comment_3_79bdf9c51dec9f52372ce95b53233bb2._comment ./doc/todo/object_dir_reorg_v2/comment_7_42501404c82ca07147e2cce0cff59474._comment ./doc/todo/object_dir_reorg_v2/comment_5_821c382987f105da72a50e0a5ce61fdc._comment ./doc/todo/object_dir_reorg_v2/comment_1_ba03333dc76ff49eccaba375e68cb525._comment ./doc/todo/object_dir_reorg_v2/comment_2_81276ac309959dc741bc90101c213ab7._comment ./doc/todo/object_dir_reorg_v2/comment_6_8834c3a3f1258c4349d23aff8549bf35._comment ./doc/todo/object_dir_reorg_v2/comment_4_93aada9b1680fed56cc6f0f7c3aca5e5._comment ./doc/todo/union_mounting.mdwn ./doc/todo/wishlist:_swift_backend.mdwn ./doc/todo/wishlist:_swift_backend/comment_1_e6efbb35f61ee521b473a92674036788._comment ./doc/todo/wishlist:_swift_backend/comment_2_5d8c83b0485112e98367b7abaab3f4e3._comment ./doc/todo/git_annex_init_:_include_repo_description_and__47__or_UUID_in_commit_message.mdwn ./doc/todo/wishlist:___34__git_annex_add__34___multiple_processes.mdwn ./doc/todo/hidden_files.mdwn ./doc/todo/smudge/comment_1_4ea616bcdbc9e9a6fae9f2e2795c31c9._comment ./doc/todo/smudge/comment_2_e04b32caa0d2b4c577cdaf382a3ff7f6._comment ./doc/todo/network_remotes.mdwn ./doc/todo/add_a_git_backend.mdwn ./doc/todo/parallel_possibilities/comment_1_d8e34fc2bc4e5cf761574608f970d496._comment ./doc/todo/parallel_possibilities/comment_2_adb76f06a7997abe4559d3169a3181c3._comment ./doc/todo/checkout.mdwn ./doc/todo/immutable_annexed_files.mdwn ./doc/todo/wishlist:_Prevent_repeated_password_prompts_for_one_command.mdwn ./doc/todo/git-annex-shell.mdwn ./doc/todo/speed_up_fsck.mdwn ./doc/todo/tahoe_lfs_for_reals.mdwn ./doc/todo/using_url_backend.mdwn ./doc/todo/branching.mdwn ./doc/todo/rsync.mdwn ./doc/todo/backendSHA1.mdwn ./doc/todo/cache_key_info.mdwn ./doc/todo/parallel_possibilities.mdwn ./doc/todo/symlink_farming_commit_hook.mdwn ./doc/feeds.mdwn ./doc/copies.mdwn ./doc/repomap.png ./doc/special_remotes.mdwn ./doc/todo.mdwn ./doc/walkthrough/using_ssh_remotes.mdwn ./doc/walkthrough/untrusted_repositories.mdwn ./doc/walkthrough/moving_file_content_between_repositories.mdwn ./doc/walkthrough/modifying_annexed_files.mdwn ./doc/walkthrough/Internet_Archive_via_S3.mdwn ./doc/walkthrough/more.mdwn ./doc/walkthrough/removing_files.mdwn ./doc/walkthrough/creating_a_repository.mdwn ./doc/walkthrough/what_to_do_when_you_lose_a_repository.mdwn ./doc/walkthrough/using_Amazon_S3.mdwn ./doc/walkthrough/adding_a_remote.mdwn ./doc/walkthrough/adding_a_remote/comment_1_0a59355bd33a796aec97173607e6adc9._comment ./doc/walkthrough/adding_a_remote/comment_2_f8cd79ef1593a8181a7f1086a87713e8._comment ./doc/walkthrough/adding_a_remote/comment_3_60691af4400521b5a8c8d75efe3b44cb._comment ./doc/walkthrough/adding_a_remote/comment_4_6f7cf5c330272c96b3abeb6612075c9d._comment ./doc/walkthrough/removing_files:_When_things_go_wrong.mdwn ./doc/walkthrough/renaming_files.mdwn ./doc/walkthrough/using_bup.mdwn ./doc/walkthrough/fsck:_when_things_go_wrong.mdwn ./doc/walkthrough/adding_files.mdwn ./doc/walkthrough/unused_data.mdwn ./doc/walkthrough/fsck:_verifying_your_data.mdwn ./doc/walkthrough/getting_file_content.mdwn ./doc/walkthrough/using_the_web.mdwn ./doc/walkthrough/recover_data_from_lost+found.mdwn ./doc/walkthrough/backups.mdwn ./doc/walkthrough/transferring_files:_When_things_go_wrong.mdwn ./doc/walkthrough/using_the_SHA1_backend.mdwn ./doc/walkthrough/migrating_data_to_a_new_backend.mdwn ./doc/GPL ./doc/logo.png ./doc/location_tracking.mdwn ./doc/design.mdwn ./doc/news.mdwn ./doc/encryption.mdwn ./doc/not.mdwn ./doc/download/comment_7_a5eebd214b135f34b18274a682211943._comment ./doc/download/comment_3_cf6044ebe99f71158034e21197228abd._comment ./doc/download/comment_5_c6b1bc40226fc2c8ba3e558150856992._comment ./doc/download/comment_6_3a52993d3553deb9a413debec9a5f92d._comment ./doc/download/comment_2_f85f72b33aedc3425f0c0c47867d02f3._comment ./doc/download/comment_8_59a976de6c7d333709b92f7cd5830850._comment ./doc/download/comment_4_10fc013865c7542c2ed9d6c0963bb391._comment ./doc/download/comment_1_fbd8b6d39e9d3c71791551358c863966._comment ./doc/contact.mdwn ./doc/trust.mdwn ./doc/bare_repositories.mdwn ./doc/distributed_version_control.mdwn ./doc/install.mdwn ./doc/git-annex-shell.mdwn ./doc/bugs.mdwn ./doc/design/encryption/comment_2_a610b3d056a059899178859a3a821ea5._comment ./doc/design/encryption/comment_3_cca186a9536cd3f6e86994631b14231c._comment ./doc/design/encryption/comment_1_4715ffafb3c4a9915bc33f2b26aaa9c1._comment ./doc/design/encryption/comment_4_8f3ba3e504b058791fc6e6f9c38154cf._comment ./doc/design/encryption.mdwn ./doc/comments.mdwn ./doc/git-annex.mdwn ./doc/internals.mdwn ./doc/users.mdwn ./doc/install/Ubuntu.mdwn ./doc/install/Debian.mdwn ./doc/install/OSX.mdwn ./doc/install/FreeBSD.mdwn ./doc/install/comment_3_cff163ea3e7cad926f4ed9e78b896598._comment ./doc/install/Fedora.mdwn ./doc/install/comment_4_82a17eee4a076c6c79fddeda347e0c9a._comment ./doc/walkthrough.mdwn ./CmdLine.hs ./UUID.hs ./Messages.hs ./Setup.hs ./TestConfig.hs ./GPL ./mdwn2man ./Remote.hs ./git-annex.hs ./Locations.hs ./Backend/WORM.hs ./Backend/SHA.hs ./Options.hs ./git-annex-shell.hs ./test.hs ./INSTALL ./Remote/Encryptable.hs ./Remote/Web.hs ./Remote/S3stub.hs ./Remote/Ssh.hs ./Remote/Special.hs ./Remote/Directory.hs ./Remote/S3real.hs ./Remote/Bup.hs ./Remote/Hook.hs ./Remote/Rsync.hs ./Remote/Git.hs ./Utility.hs ./Upgrade.hs ./git-union-merge.hs ./Utility/DataUnits.hs ./Utility/RsyncFile.hs ./Utility/CopyFile.hs ./Utility/Dot.hs ./Utility/Base64.hs ./Types/Crypto.hs ./Types/UUID.hs ./Types/TrustLevel.hs ./Types/Remote.hs ./Types/BranchState.hs ./Types/Backend.hs ./Types/Key.hs ./Config.hs ./Command.hs ./.gitignore ./Backend.hs ./Touch.hsc ./Content.hs ./.gitattributes ./Git.hs ./GitAnnex.hs Homepage: http://git-annex.branchable.com/ Build-type: Custom Category: Utility
test.hs view
@@ -25,7 +25,6 @@ import System.IO.HVFS (SystemFS(..))  import qualified Annex-import qualified BackendList import qualified Backend import qualified Git import qualified Locations@@ -37,6 +36,7 @@ import qualified UUID import qualified Trust import qualified Remote+import qualified RemoteLog import qualified Content import qualified Command.DropUnused import qualified Types.Key@@ -74,7 +74,7 @@ 	, qctest "prop_idempotent_key_read_show" Types.Key.prop_idempotent_key_read_show 	, qctest "prop_idempotent_shellEscape" Utility.prop_idempotent_shellEscape 	, qctest "prop_idempotent_shellEscape_multiword" Utility.prop_idempotent_shellEscape_multiword-	, qctest "prop_idempotent_configEscape" Remote.prop_idempotent_configEscape+	, qctest "prop_idempotent_configEscape" RemoteLog.prop_idempotent_configEscape 	, qctest "prop_parentDir_basics" Utility.prop_parentDir_basics 	, qctest "prop_relPathDirToFile_basics" Utility.prop_relPathDirToFile_basics 	, qctest "prop_cost_sane" Config.prop_cost_sane@@ -483,7 +483,7 @@ annexeval a = do 	g <- Git.repoFromCwd 	g' <- Git.configRead g-	s <- Annex.new g' BackendList.allBackends+	s <- Annex.new g' 	Annex.eval s a  innewrepo :: Assertion -> Assertion@@ -684,4 +684,4 @@ backendWORM = backend_ "WORM"  backend_ :: String -> Types.Backend Types.Annex-backend_ name = Backend.lookupBackendName BackendList.allBackends name+backend_ name = Backend.lookupBackendName name