packages feed

git-annex 3.20120418 → 3.20120430

raw patch · 146 files changed

+914/−369 lines, 146 filesdep ~base

Dependency ranges changed: base

Files

.gitignore view
@@ -1,12 +1,8 @@ tmp-*.hi-*.o test configure Build/SysConfig.hs git-annex-git-annex-shell-git-union-merge git-annex.1 git-annex-shell.1 git-union-merge.1@@ -15,5 +11,5 @@ *.tix .hpc Utility/Touch.hs-Utility/StatFS.hs+Utility/libdiskfree.o dist
Annex.hs view
@@ -10,7 +10,6 @@ module Annex ( 	Annex, 	AnnexState(..),-	OutputType(..), 	new, 	newState, 	run,@@ -19,6 +18,7 @@ 	changeState, 	setFlag, 	setField,+	setOutput, 	getFlag, 	getField, 	addCleanup,@@ -37,12 +37,14 @@ import qualified Git.Config import Git.CatFile import Git.CheckAttr+import Git.SharedRepository import qualified Git.Queue import Types.Backend import qualified Types.Remote import Types.Crypto import Types.BranchState import Types.TrustLevel+import Types.Messages import Utility.State import qualified Utility.Matcher import qualified Data.Map as M@@ -68,8 +70,6 @@ 		where 			unStAnnex (StAnnex st) = st -data OutputType = NormalOutput | QuietOutput | JSONOutput- type Matcher a = Either [Utility.Matcher.Token a] (Utility.Matcher.Matcher a)  -- internal state storage@@ -77,7 +77,7 @@ 	{ repo :: Git.Repo 	, backends :: [BackendA Annex] 	, remotes :: [Types.Remote.RemoteA Annex]-	, output :: OutputType+	, output :: MessageState 	, force :: Bool 	, fast :: Bool 	, auto :: Bool@@ -88,9 +88,10 @@ 	, forcebackend :: Maybe String 	, forcenumcopies :: Maybe Int 	, limit :: Matcher (FilePath -> Annex Bool)+	, shared :: Maybe SharedRepository 	, forcetrust :: TrustMap 	, trustmap :: Maybe TrustMap-	, ciphers :: M.Map EncryptedCipher Cipher+	, ciphers :: M.Map StorableCipher Cipher 	, lockpool :: M.Map FilePath Fd 	, flags :: M.Map String Bool 	, fields :: M.Map String String@@ -102,7 +103,7 @@ 	{ repo = gitrepo 	, backends = [] 	, remotes = []-	, output = NormalOutput+	, output = defaultMessageState 	, force = False 	, fast = False 	, auto = False@@ -113,6 +114,7 @@ 	, forcebackend = Nothing 	, forcenumcopies = Nothing 	, limit = Left []+	, shared = Nothing 	, forcetrust = M.empty 	, trustmap = Nothing 	, ciphers = M.empty@@ -146,6 +148,11 @@ addCleanup :: String -> Annex () -> Annex () addCleanup uid a = changeState $ \s -> 	s { cleanup = M.insertWith' const uid a $ cleanup s }++{- Sets the type of output to emit. -}+setOutput :: OutputType -> Annex ()+setOutput o = changeState $ \s ->+	s { output = (output s) { outputType = o } }  {- Checks if a flag was set. -} getFlag :: String -> Annex Bool
Annex/Branch.hs view
@@ -36,6 +36,7 @@ import Git.HashObject import qualified Git.Index import Annex.CatFile+import Annex.Perms  {- Name of the branch that is used to store git-annex's information. -} name :: Git.Ref@@ -64,9 +65,7 @@  {- Creates the branch, if it does not already exist. -} create :: Annex ()-create = do-	_ <- getBranch-	return ()+create = void $ getBranch  {- Returns the ref of the branch, creating it first if necessary. -} getBranch :: Annex Git.Ref@@ -308,6 +307,7 @@ setIndexSha ref = do         lock <- fromRepo gitAnnexIndexLock 	liftIO $ writeFile lock $ show ref ++ "\n"+	setAnnexPerm lock  {- Checks if there are uncommitted changes in the branch's index or journal. -} unCommitted :: Annex Bool@@ -323,14 +323,14 @@ 	liftIO $ writeFile file "1"  setCommitted :: Annex ()-setCommitted = do+setCommitted = void $ do 	file <- fromRepo gitAnnexIndexDirty-	_ <- liftIO $ tryIO $ removeFile file-	return ()+	liftIO $ tryIO $ removeFile file  {- Stages the journal into the index. -} stageJournal :: Annex () stageJournal = do+	showStoringStateAction 	fs <- getJournalFiles 	g <- gitRepo 	withIndex $ liftIO $ do
Annex/Content.hs view
@@ -23,10 +23,11 @@ 	saveState, 	downloadUrl, 	preseedTmp,+	freezeContent,+	thawContent,+	freezeContentDir, ) where -import Control.Exception (bracket_)-import System.Posix.Types import System.IO.Unsafe (unsafeInterleaveIO)  import Common.Annex@@ -44,6 +45,8 @@ import Utility.CopyFile import Config import Annex.Exception+import Git.SharedRepository+import Annex.Perms  {- Checks if a given key's content is currently present. -} inAnnex :: Key -> Annex Bool@@ -57,8 +60,10 @@ {- A safer check; the key's content must not only be present, but  - is not in the process of being removed. -} inAnnexSafe :: Key -> Annex (Maybe Bool)-inAnnexSafe = inAnnex' $ \f -> openForLock f False >>= check+inAnnexSafe = inAnnex' $ \f -> openforlock f >>= check 	where+		openforlock f = catchMaybeIO $+			openFd f ReadOnly Nothing defaultFileFlags 		check Nothing = return is_missing 		check (Just h) = do 			v <- getLock h (ReadLock, AbsoluteSeek, 0, 0)@@ -75,30 +80,27 @@ lockContent :: Key -> Annex a -> Annex a lockContent key a = do 	file <- inRepo $ gitAnnexLocation key-	bracketIO (openForLock file True >>= lock) unlock a+	bracketIO (openforlock file >>= lock) unlock a 	where+		{- Since files are stored with the write bit disabled, have+		 - to fiddle with permissions to open for an exclusive lock. -}+		openforlock f = catchMaybeIO $ ifM (doesFileExist f)+			( withModifiedFileMode f+				(\cur -> cur `unionFileModes` ownerWriteMode)+				open+			, open+			)+			where+				open = openFd f ReadWrite Nothing defaultFileFlags 		lock Nothing = return Nothing-		lock (Just l) = do-			v <- tryIO $ setLock l (WriteLock, AbsoluteSeek, 0, 0)+		lock (Just fd) = do+			v <- tryIO $ setLock fd (WriteLock, AbsoluteSeek, 0, 0) 			case v of 				Left _ -> error "content is locked"-				Right _ -> return $ Just l-		unlock Nothing = return ()+				Right _ -> return $ Just fd+		unlock Nothing = noop 		unlock (Just l) = closeFd l -openForLock :: FilePath -> Bool -> IO (Maybe Fd)-openForLock file writelock = bracket_ prep cleanup go-	where-		go = catchMaybeIO $ openFd file mode Nothing defaultFileFlags-		mode = if writelock then ReadWrite else ReadOnly-		{- Since files are stored with the write bit disabled,-		 - have to fiddle with permissions to open for an-		 - exclusive lock. -}-		forwritelock a = -			when writelock $ whenM (doesFileExist file) a-		prep = forwritelock $ allowWrite file-		cleanup = forwritelock $ preventWrite file- {- Calculates the relative path to use to link a file to a key. -} calcGitLink :: FilePath -> Key -> Annex FilePath calcGitLink file key = do@@ -127,20 +129,20 @@ 	-- When the temp file already exists, count the space 	-- it is using as free. 	e <- liftIO $ doesFileExist tmp-	if e-		then do-			stat <- liftIO $ getFileStatus tmp-			checkDiskSpace' (fromIntegral $ fileSize stat) key-		else checkDiskSpace key--	when e $ liftIO $ allowWrite tmp--	getViaTmpUnchecked key action+	alreadythere <- if e+		then fromIntegral . fileSize <$> liftIO (getFileStatus tmp)+		else return 0+	ifM (checkDiskSpace Nothing key alreadythere)+		( do+			when e $ thawContent tmp+			getViaTmpUnchecked key action+		, return False+		)  prepTmp :: Key -> Annex FilePath prepTmp key = do 	tmp <- fromRepo $ gitAnnexTmpLocation key-	liftIO $ createDirectoryIfMissing True (parentDir tmp)+	createAnnexDirectory (parentDir tmp) 	return tmp  {- Like getViaTmp, but does not check that there is enough disk space@@ -169,22 +171,24 @@ 	return res  {- Checks that there is disk space available to store a given key,- - throwing an error if not. -}-checkDiskSpace :: Key -> Annex ()-checkDiskSpace = checkDiskSpace' 0--checkDiskSpace' :: Integer -> Key -> Annex ()-checkDiskSpace' adjustment key = do+ - in a destination (or the annex) printing a warning if not. -}+checkDiskSpace :: Maybe FilePath -> Key -> Integer -> Annex Bool+checkDiskSpace destination key alreadythere = do 	reserve <- getDiskReserve-	free <- inRepo $ getDiskFree . gitAnnexDir+	free <- liftIO . getDiskFree =<< dir+	force <- Annex.getState Annex.force 	case (free, keySize key) of-		(Just have, Just need) ->-			when (need + reserve > have + adjustment) $-				needmorespace (need + reserve - have - adjustment)-		_ -> return ()+		(Just have, Just need) -> do+			let ok = (need + reserve <= have + alreadythere) || force+			unless ok $ do+				liftIO $ print (need, reserve, have, alreadythere)+				needmorespace (need + reserve - have - alreadythere)+			return ok+		_ -> return True 	where-		needmorespace n = unlessM (Annex.getState Annex.force) $-			error $ "not enough free space, need " ++ +		dir = maybe (fromRepo gitAnnexDir) return destination+		needmorespace n =+			warning $ "not enough free space, need " ++  				roughSize storageUnits True n ++ 				" more" ++ forcemsg 		forcemsg = " (use --force to override this check or adjust annex.diskreserve)"@@ -213,15 +217,13 @@ moveAnnex :: Key -> FilePath -> Annex () moveAnnex key src = do 	dest <- inRepo $ gitAnnexLocation key-	let dir = parentDir dest-	liftIO $ ifM (doesFileExist dest)-		( removeFile src+	ifM (liftIO $ doesFileExist dest)+		( liftIO $ removeFile src 		, do-			createDirectoryIfMissing True dir-			allowWrite dir -- in case the directory already exists-			moveFile src dest-			preventWrite dest-			preventWrite dir+			createContentDir dest+			liftIO $ moveFile src dest+			freezeContent dest+			freezeContentDir dest 		)  withObjectLoc :: Key -> ((FilePath, FilePath) -> Annex a) -> Annex a@@ -235,10 +237,10 @@ 	file <- inRepo $ gitAnnexLocation key 	liftIO $ removeparents file (3 :: Int) 	where-		removeparents _ 0 = return ()+		removeparents _ 0 = noop 		removeparents file n = do 			let dir = parentDir file-			maybe (return ()) (const $ removeparents dir (n-1))+			maybe noop (const $ removeparents dir (n-1)) 				=<< catchMaybeIO (removeDirectory dir)  {- Removes a key's file from .git/annex/objects/ -}@@ -252,10 +254,9 @@ {- Moves a key's file out of .git/annex/objects/ -} fromAnnex :: Key -> FilePath -> Annex () fromAnnex key dest = withObjectLoc key $ \(dir, file) -> do-	liftIO $ do-		allowWrite dir-		allowWrite file-		moveFile file dest+	liftIO $ allowWrite dir+	thawContent file+	liftIO $ moveFile file dest 	cleanObjectLoc key  {- Moves a key out of .git/annex/objects/ into .git/annex/bad, and@@ -265,8 +266,8 @@ 	src <- inRepo $ gitAnnexLocation key 	bad <- fromRepo gitAnnexBadDir 	let dest = bad </> takeFileName src+	createAnnexDirectory (parentDir dest) 	liftIO $ do-		createDirectoryIfMissing True (parentDir dest) 		allowWrite (parentDir src) 		moveFile src dest 	cleanObjectLoc key@@ -296,8 +297,8 @@  - especially if performing a short-lived action.  -} saveState :: Bool -> Annex ()-saveState oneshot = do-	Annex.Queue.flush False+saveState oneshot = doSideAction $ do+	Annex.Queue.flush 	unless oneshot $ 		ifM alwayscommit 			( Annex.Branch.commit "update" , Annex.Branch.stage)@@ -309,7 +310,8 @@ downloadUrl :: [Url.URLString] -> FilePath -> Annex Bool downloadUrl urls file = do 	o <- map Param . words <$> getConfig "annex.web-options" ""-	liftIO $ anyM (\u -> Url.download u o file) urls+	headers <- getHttpHeaders+	liftIO $ anyM (\u -> Url.download u headers o file) urls  {- Copies a key's content, when present, to a temp file.  - This is used to speed up some rsyncs. -}@@ -319,7 +321,7 @@ 		go False = return False 		go True = do 			ok <- copy-			when ok $ liftIO $ allowWrite file+			when ok $ thawContent file 			return ok 		copy = ifM (liftIO $ doesFileExist file) 				( return True@@ -327,3 +329,50 @@ 					s <- inRepo $ gitAnnexLocation key 					liftIO $ copyFileExternal s file 				)++{- Blocks writing to an annexed file. The file is made unwritable+ - to avoid accidental edits. core.sharedRepository may change+ - who can read it. -}+freezeContent :: FilePath -> Annex ()+freezeContent file = liftIO . go =<< fromRepo getSharedRepository+	where+		go GroupShared = modifyFileMode file $+			removeModes writeModes .+			addModes [ownerReadMode, groupReadMode]+		go AllShared = modifyFileMode file $+			removeModes writeModes .+			addModes readModes+		go _ = preventWrite file++{- Allows writing to an annexed file that freezeContent was called on+ - before. -}+thawContent :: FilePath -> Annex ()+thawContent file = liftIO . go =<< fromRepo getSharedRepository+	where+		go GroupShared = groupWriteRead file+		go AllShared = groupWriteRead file+		go _ = allowWrite file++{- Blocks writing to the directory an annexed file is in, to prevent the+ - file accidentially being deleted. However, if core.sharedRepository+ - is set, this is not done, since the group must be allowed to delete the+ - file.+ -}+freezeContentDir :: FilePath -> Annex ()+freezeContentDir file = liftIO . go =<< fromRepo getSharedRepository+	where+		dir = parentDir file+		go GroupShared = groupWriteRead dir+		go AllShared = groupWriteRead dir+		go _ = preventWrite dir++{- Makes the directory tree to store an annexed file's content,+ - with appropriate permissions on each level. -}+createContentDir :: FilePath -> Annex ()+createContentDir dest = do+	unlessM (liftIO $ doesDirectoryExist dir) $+		createAnnexDirectory dir +	-- might have already existed with restricted perms+	liftIO $ allowWrite dir+	where+		dir = parentDir dest
Annex/Journal.hs view
@@ -16,6 +16,7 @@ import Common.Annex import Annex.Exception import qualified Git+import Annex.Perms  {- Records content for a file in the branch to the journal.  -@@ -23,22 +24,20 @@  - avoids git needing to rewrite the index after every change. -} setJournalFile :: FilePath -> String -> Annex () setJournalFile file content = do-	g <- gitRepo-	liftIO $ doRedo (write g) $ do-		createDirectoryIfMissing True $ gitAnnexJournalDir g-		createDirectoryIfMissing True $ gitAnnexTmpDir g-	where-		-- journal file is written atomically-		write g = do-			let jfile = journalFile g file-			let tmpfile = gitAnnexTmpDir g </> takeFileName jfile-			writeBinaryFile tmpfile content-			moveFile tmpfile jfile+	createAnnexDirectory =<< fromRepo gitAnnexJournalDir+	createAnnexDirectory =<< fromRepo gitAnnexTmpDir+	-- journal file is written atomically+	jfile <- fromRepo $ journalFile file+	tmp <- fromRepo gitAnnexTmpDir+	let tmpfile = tmp </> takeFileName jfile+	liftIO $ do+		writeBinaryFile tmpfile content+		moveFile tmpfile jfile  {- Gets any journalled content for a file in the branch. -} getJournalFile :: FilePath -> Annex (Maybe String) getJournalFile file = inRepo $ \g -> catchMaybeIO $-	readFileStrict $ journalFile g file+	readFileStrict $ journalFile file g  {- List of files that have updated content in the journal. -} getJournalledFiles :: Annex [FilePath]@@ -62,8 +61,8 @@  - used in the branch is not necessary, and all the files are put directly  - in the journal directory.  -}-journalFile :: Git.Repo -> FilePath -> FilePath-journalFile repo file = gitAnnexJournalDir repo </> concatMap mangle file+journalFile :: FilePath -> Git.Repo -> FilePath+journalFile file repo = gitAnnexJournalDir repo </> concatMap mangle file 	where 		mangle '/' = "_" 		mangle '_' = "__"@@ -79,16 +78,12 @@ lockJournal :: Annex a -> Annex a lockJournal a = do 	file <- fromRepo gitAnnexJournalLock-	bracketIO (lock file) unlock a+	createAnnexDirectory $ takeDirectory file+	mode <- annexFileMode+	bracketIO (lock file mode) unlock a 	where-		lock file = do-			l <- doRedo (createFile file stdFileMode) $-				createDirectoryIfMissing True $ takeDirectory file+		lock file mode = do+			l <- noUmask mode $ createFile file mode 			waitToSetLock l (WriteLock, AbsoluteSeek, 0, 0) 			return l 		unlock = closeFd--{- Runs an action, catching failure and running something to fix it up, and- - retrying if necessary. -}-doRedo :: IO a -> IO b -> IO a-doRedo a b = catchIO a $ const $ b >> a
Annex/LockPool.hs view
@@ -12,22 +12,24 @@  import Common.Annex import Annex+import Annex.Perms  {- Create a specified lock file, and takes a shared lock. -} lockFile :: FilePath -> Annex () lockFile file = go =<< fromPool file 	where-		go (Just _) = return () -- already locked+		go (Just _) = noop -- already locked 		go Nothing = do-			fd <- liftIO $ openFd file ReadOnly (Just stdFileMode) defaultFileFlags+			mode <- annexFileMode+			fd <- liftIO $ noUmask mode $+				openFd file ReadOnly (Just mode) defaultFileFlags 			liftIO $ waitToSetLock fd (ReadLock, AbsoluteSeek, 0, 0) 			changePool $ M.insert file fd  unlockFile :: FilePath -> Annex ()-unlockFile file = go =<< fromPool file+unlockFile file = maybe noop go =<< fromPool file 	where-		go Nothing = return ()-		go (Just fd) = do+		go fd = do 			liftIO $ closeFd fd 			changePool $ M.delete file 
+ Annex/Perms.hs view
@@ -0,0 +1,70 @@+{- git-annex file permissions+ -+ - Copyright 2012 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Annex.Perms (+	setAnnexPerm,+	annexFileMode,+	createAnnexDirectory,+	noUmask,+) where++import Common.Annex+import Utility.FileMode+import Git.SharedRepository+import qualified Annex++import System.Posix.Types++withShared :: (SharedRepository -> Annex a) -> Annex a+withShared a = maybe startup a =<< Annex.getState Annex.shared+	where+		startup = do+			shared <- fromRepo getSharedRepository+			Annex.changeState $ \s -> s { Annex.shared = Just shared }+			a shared++{- Sets appropriate file mode for a file or directory in the annex,+ - other than the content files and content directory. Normally,+ - use the default mode, but with core.sharedRepository set,+ - allow the group to write, etc. -}+setAnnexPerm :: FilePath -> Annex ()+setAnnexPerm file = withShared $ liftIO . go+	where+		go GroupShared = groupWriteRead file+		go AllShared = modifyFileMode file $ addModes $+			[ ownerWriteMode, groupWriteMode ] ++ readModes+		go _ = noop++{- Gets the appropriate mode to use for creating a file in the annex+ - (other than content files, which are locked down more). -}+annexFileMode :: Annex FileMode+annexFileMode = withShared $ return . go+	where+		go GroupShared = sharedmode+		go AllShared = combineModes (sharedmode:readModes)+		go _ = stdFileMode+		sharedmode = combineModes+			[ ownerWriteMode, groupWriteMode+			, ownerReadMode, groupReadMode+			]++{- Creates a directory inside the gitAnnexDir, including any parent+ - directories. Makes directories with appropriate permissions. -}+createAnnexDirectory :: FilePath -> Annex ()+createAnnexDirectory dir = traverse dir [] =<< top+	where+		top = parentDir <$> fromRepo gitAnnexDir+		traverse d below stop+			| d `equalFilePath` stop = done+			| otherwise = ifM (liftIO $ doesDirectoryExist d)+				( done+				, traverse (parentDir d) (d:below) stop+				)+			where+				done = forM_ below $ \p -> do+					liftIO $ createDirectory p+					setAnnexPerm p
Annex/Queue.hs view
@@ -26,15 +26,14 @@ flushWhenFull :: Annex () flushWhenFull = do 	q <- get-	when (Git.Queue.full q) $ flush False+	when (Git.Queue.full q) flush  {- Runs (and empties) the queue. -}-flush :: Bool -> Annex ()-flush silent = do+flush :: Annex ()+flush = do 	q <- get 	unless (0 == Git.Queue.size q) $ do-		unless silent $-			showSideAction "Recording state in git"+		showStoringStateAction 		q' <- inRepo $ Git.Queue.flush q 		store q' 
Annex/Ssh.hs view
@@ -17,6 +17,7 @@ import qualified Git import Config import qualified Build.SysConfig as SysConfig+import Annex.Perms  {- Generates parameters to ssh to a given host (or user@host) on a given  - port, with connection caching. -}@@ -74,30 +75,29 @@ 			-- be stopped. 			let lockfile = socket2lock socketfile 			unlockFile lockfile-			fd <- liftIO $ openFd lockfile ReadWrite (Just stdFileMode) defaultFileFlags+			mode <- annexFileMode+			fd <- liftIO $ noUmask mode $+				openFd lockfile ReadWrite (Just mode) defaultFileFlags 			v <- liftIO $ tryIO $ 				setLock fd (WriteLock, AbsoluteSeek, 0, 0) 			case v of-				Left _ -> return ()+				Left _ -> noop 				Right _ -> stopssh socketfile 			liftIO $ closeFd fd 		stopssh socketfile = do 			let (host, port) = socket2hostport socketfile 			(_, params) <- sshInfo (host, port)-			_ <- liftIO $ do+			void $ liftIO $ do 				-- "ssh -O stop" is noisy on stderr even with -q 				let cmd = unwords $ toCommand $ 					[ Params "-O stop" 					] ++ params ++ [Param host]-				_ <- boolSystem "sh"+				boolSystem "sh" 					[ Param "-c" 					, Param $ "ssh " ++ cmd ++ " >/dev/null 2>/dev/null" 					]-				--try $ removeFile socketfile-				return ()-			-- Cannot remove the lock file; other processes may-			-- be waiting on our exclusive lock to use it.-			return ()+				-- Cannot remove the lock file; other processes may+				-- be waiting on our exclusive lock to use it.  hostport2socket :: String -> Maybe Integer -> FilePath hostport2socket host Nothing = host
Annex/UUID.hs view
@@ -16,12 +16,14 @@ 	getRepoUUID, 	getUncachedUUID, 	prepUUID,-	genUUID+	genUUID,+	removeRepoUUID, ) where  import Common.Annex import qualified Git import qualified Git.Config+import qualified Git.Command import qualified Build.SysConfig as SysConfig import Config @@ -60,6 +62,10 @@ 			g <- gitRepo 			when (g /= r) $ storeUUID cachekey u 		cachekey = remoteConfig r "uuid"++removeRepoUUID :: Annex ()+removeRepoUUID = inRepo $ Git.Command.run "config"+	[Param "--unset", Param configkey]  getUncachedUUID :: Git.Repo -> UUID getUncachedUUID = toUUID . Git.Config.get configkey ""
Annex/Version.hs view
@@ -35,7 +35,7 @@  checkVersion :: Version -> Annex () checkVersion v-	| v `elem` supportedVersions = return ()+	| v `elem` supportedVersions = noop 	| v `elem` upgradableVersions = err "Upgrade this repository: git-annex upgrade" 	| otherwise = err "Upgrade git-annex." 	where
− Build/SysConfig.hi

binary file changed (2557 → absent bytes)

− Build/SysConfig.o

binary file changed (4400 → absent bytes)

− Build/TestConfig.hi

binary file changed (2894 → absent bytes)

− Build/TestConfig.o

binary file changed (25876 → absent bytes)

CHANGELOG view
@@ -1,3 +1,18 @@+git-annex (3.20120430) unstable; urgency=low++  * Fix use of annex.diskreserve config setting.+  * Directory special remotes now check annex.diskreserve.+  * Support git's core.sharedRepository configuration.+  * Add annex.http-headers and annex.http-headers-command config+    settings, to allow custom headers to be sent with all HTTP requests.+    (Requested by the Internet Archive)+  * uninit: Clear annex.uuid from .git/config. Closes: #670639+  * Added shared cipher mode to encryptable special remotes. This option+    avoids gpg key distribution, at the expense of flexability, and with+    the requirement that all clones of the git repository be equally trusted.++ -- Joey Hess <joeyh@debian.org>  Mon, 30 Apr 2012 13:16:10 -0400+ git-annex (3.20120418) unstable; urgency=low    * bugfix: Adding a dotfile also caused all non-dotfiles to be added.
CmdLine.hs view
@@ -88,7 +88,7 @@ tryRun' :: Integer -> Annex.AnnexState -> Command -> [CommandCleanup] -> IO () tryRun' errnum _ cmd [] 	| errnum > 0 = error $ cmdname cmd ++ ": " ++ show errnum ++ " failed"-	| otherwise = return ()+	| otherwise = noop tryRun' errnum state cmd (a:as) = do 	r <- run 	handle $! r
Command/AddUrl.hs view
@@ -20,6 +20,7 @@ import Logs.Web import qualified Option import Types.Key+import Config  def :: [Command] def = [withOptions [fileOption, pathdepthOption] $@@ -53,8 +54,9 @@ 			liftIO $ createDirectoryIfMissing True (parentDir file) 			ifM (Annex.getState Annex.fast) 				( nodownload url file , download url file )-		addurl (key, _backend) =-			ifM (liftIO $ Url.check url $ keySize key)+		addurl (key, _backend) = do+			headers <- getHttpHeaders+			ifM (liftIO $ Url.check url headers $ keySize key) 				( do 					setUrlPresent key url 					next $ return True@@ -81,7 +83,8 @@  nodownload :: String -> FilePath -> CommandPerform nodownload url file = do-	(exists, size) <- liftIO $ Url.exists url+	headers <- getHttpHeaders+	(exists, size) <- liftIO $ Url.exists url headers 	if exists 		then do 			let key = Backend.URL.fromUrl url size
Command/Fsck.hs view
@@ -85,7 +85,7 @@ 			t <- fromRepo gitAnnexTmpDir 			let tmp = t </> "fsck" ++ show pid ++ "." ++ keyFile key 			liftIO $ createDirectoryIfMissing True t-			let cleanup = liftIO $ catchIO (removeFile tmp) (const $ return ())+			let cleanup = liftIO $ catchIO (removeFile tmp) (const noop) 			cleanup 			cleanup `after` a tmp 		getfile tmp =@@ -166,10 +166,9 @@ 	-- Since we're checking that a key's file is present, throw 	-- in a permission fixup here too. 	when present $ do-		f <- inRepo $ gitAnnexLocation key-		liftIO $ do-			preventWrite f-			preventWrite (parentDir f)+		file <- inRepo $ gitAnnexLocation key+		freezeContent file+		freezeContentDir file  	u <- getUUID 	verifyLocationLog' key desc present u (logChange key u)
Command/Status.hs view
@@ -30,6 +30,7 @@ import Logs.Trust import Remote import Config+import Utility.Percentage  -- a named computation that produces a statistic type Stat = StatState (Maybe (String, StatState String))@@ -69,6 +70,7 @@ 	, remote_list SemiTrusted "semitrusted" 	, remote_list UnTrusted "untrusted" 	, remote_list DeadTrusted "dead"+	, disk_size 	] slow_stats :: [Stat] slow_stats = @@ -78,7 +80,6 @@ 	, local_annex_size 	, known_annex_keys 	, known_annex_size-	, disk_size 	, bloom_info 	, backend_usage 	]@@ -108,12 +109,11 @@ nojson a _ = a  showStat :: Stat -> StatState ()-showStat s = calc =<< s+showStat s = maybe noop calc =<< s 	where-		calc (Just (desc, a)) = do+		calc (desc, a) = do 			(lift . showHeader) desc 			lift . showRaw =<< a-		calc Nothing = return ()  supported_backends :: Stat supported_backends = stat "supported backends" $ json unwords $@@ -161,7 +161,7 @@ 	let note = aside $ 		if localkeys >= capacity 		then "appears too small for this repository; adjust annex.bloomcapacity"-		else "has room for " ++ show (capacity - localkeys) ++ " more local annex keys"+		else showPercentage 1 (percentage capacity localkeys) ++ " full"  	-- Two bloom filters are used at the same time, so double the size 	-- of one.@@ -176,8 +176,12 @@ 		<$> getDiskReserve 		<*> inRepo (getDiskFree . gitAnnexDir) 	where-		calcfree reserve (Just have) =-			roughSize storageUnits False $ nonneg $ have - reserve+		calcfree reserve (Just have) = unwords+			[ roughSize storageUnits False $ nonneg $ have - reserve+			, "(+" ++ roughSize storageUnits False reserve+			, "reserved)"+			]+			 		calcfree _ _ = "unknown" 		nonneg x 			| x >= 0 = x
Command/Unannex.hs view
@@ -10,7 +10,6 @@ import Common.Annex import Command import qualified Annex-import Utility.FileMode import Logs.Location import Annex.Content import qualified Git.Command@@ -51,9 +50,8 @@ 		( do 			-- fast mode: hard link to content in annex 			src <- inRepo $ gitAnnexLocation key-			liftIO $ do-				createLink src file-				allowWrite file+			liftIO $ createLink src file+			thawContent file 		, do 			fromAnnex key file 			logStatus key InfoMissing
Command/Unlock.hs view
@@ -11,7 +11,6 @@ import Command import Annex.Content import Utility.CopyFile-import Utility.FileMode  def :: [Command] def =@@ -34,8 +33,7 @@ perform :: FilePath -> Key -> CommandPerform perform dest key = do 	unlessM (inAnnex key) $ error "content not present"-	-	checkDiskSpace key+	unlessM (checkDiskSpace Nothing key 0) $ error "cannot unlock"  	src <- inRepo $ gitAnnexLocation key 	tmpdest <- fromRepo $ gitAnnexTmpLocation key@@ -47,6 +45,6 @@ 			liftIO $ do 				removeFile dest 				moveFile tmpdest dest-				allowWrite dest+			thawContent dest 			next $ return True                 else error "copy failed!"
Command/Unused.hs view
@@ -268,7 +268,7 @@ 	showAction $ "checking " ++ Git.Ref.describe ref 	go =<< inRepo (LsTree.lsTree ref) 	where-		go [] = return ()+		go [] = noop 		go (l:ls) 			| isSymLink (LsTree.mode l) = do 				content <- L.decodeUtf8 <$> catFile ref (LsTree.file l)
Command/Whereis.hs view
@@ -46,9 +46,9 @@ 		untrustedheader = "The following untrusted locations may also have copies:\n"  performRemote :: Key -> Remote -> Annex () -performRemote key remote = case whereisKey remote of-	Nothing -> return ()-	Just a -> do-		ls <- a key-		unless (null ls) $ showLongNote $-			unlines $ map (\l -> name remote ++ ": " ++ l) ls+performRemote key remote = maybe noop go $ whereisKey remote+	where+		go a = do+			ls <- a key+			unless (null ls) $ showLongNote $ unlines $+				map (\l -> name remote ++ ": " ++ l) ls
− Common.hi

binary file changed (28935 → absent bytes)

− Common.o

binary file changed (622 → absent bytes)

Config.hs view
@@ -93,6 +93,15 @@ {- Gets annex.diskreserve setting. -} getDiskReserve :: Annex Integer getDiskReserve = fromMaybe megabyte . readSize dataUnits-	<$> getConfig "diskreserve" ""+	<$> getConfig "annex.diskreserve" "" 	where 		megabyte = 1000000++{- Gets annex.httpheaders or annex.httpheaders-command setting,+ - splitting it into lines. -}+getHttpHeaders :: Annex [String]+getHttpHeaders = do+	cmd <- getConfig "annex.http-headers-command" ""+	if (null cmd)+		then fromRepo $ Git.Config.getList "annex.http-headers"+		else lines . snd <$> liftIO (pipeFrom "sh" ["-c", cmd])
Crypto.hs view
@@ -3,19 +3,19 @@  - Currently using gpg; could later be modified to support different  - crypto backends if neccessary.  -- - Copyright 2011 Joey Hess <joey@kitenet.net>+ - Copyright 2011-2012 Joey Hess <joey@kitenet.net>  -  - Licensed under the GNU GPL version 3 or higher.  -}  module Crypto ( 	Cipher,-	EncryptedCipher,-	genCipher,-	updateCipher,+	KeyIds(..),+	StorableCipher(..),+	genEncryptedCipher,+	genSharedCipher,+	updateEncryptedCipher, 	describeCipher,-	storeCipher,-	extractCipher, 	decryptCipher,		 	encryptKey, 	withEncryptedHandle,@@ -27,7 +27,6 @@ ) where  import qualified Data.ByteString.Lazy.Char8 as L-import qualified Data.Map as M import Data.ByteString.Lazy.UTF8 (fromString) import Data.Digest.Pure.SHA import Control.Applicative@@ -35,8 +34,6 @@ import Common.Annex import qualified Utility.Gpg as Gpg import Types.Key-import Types.Remote-import Utility.Base64 import Types.Crypto  {- The first half of a Cipher is used for HMAC; the remainder@@ -60,59 +57,37 @@ cipherHmac :: Cipher -> String cipherHmac (Cipher c) = take cipherHalf c -{- Creates a new Cipher, encrypted as specified in the remote's configuration -}-genCipher :: RemoteConfig -> IO EncryptedCipher-genCipher c = do-	ks <- configKeyIds c-	random <- genrandom+{- Creates a new Cipher, encrypted to the specificed key id. -}+genEncryptedCipher :: String -> IO StorableCipher+genEncryptedCipher keyid = do+	ks <- Gpg.findPubKeys keyid+	random <- Gpg.genRandom cipherSize 	encryptCipher (Cipher random) ks-	where-		genrandom = Gpg.readStrict-			-- Armor the random data, to avoid newlines,-			-- since gpg only reads ciphers up to the first-			-- newline.-			[ Params "--gen-random --armor"-			, Param $ show randomquality-			, Param $ show cipherSize-			]-		-- 1 is /dev/urandom; 2 is /dev/random-		randomquality = 1 :: Int -{- Updates an existing Cipher, re-encrypting it to add KeyIds specified in- - the remote's configuration. -}-updateCipher :: RemoteConfig -> EncryptedCipher -> IO EncryptedCipher-updateCipher c encipher@(EncryptedCipher _ ks) = do-	ks' <- configKeyIds c-	cipher <- decryptCipher c encipher+{- Creates a new, shared Cipher. -}+genSharedCipher :: IO StorableCipher+genSharedCipher = SharedCipher <$> Gpg.genRandom cipherSize++{- Updates an existing Cipher, re-encrypting it to add a keyid. -}+updateEncryptedCipher :: String -> StorableCipher -> IO StorableCipher+updateEncryptedCipher _ (SharedCipher _) = undefined+updateEncryptedCipher keyid encipher@(EncryptedCipher _ ks) = do+	ks' <- Gpg.findPubKeys keyid+	cipher <- decryptCipher encipher 	encryptCipher cipher (merge ks ks') 	where 		merge (KeyIds a) (KeyIds b) = KeyIds $ a ++ b -describeCipher :: EncryptedCipher -> String+describeCipher :: StorableCipher -> String+describeCipher (SharedCipher _) = "shared cipher" describeCipher (EncryptedCipher _ (KeyIds ks)) = 	"with gpg " ++ keys ks ++ " " ++ unwords ks 	where 		keys [_] = "key" 		keys _ = "keys" -{- Stores an EncryptedCipher in a remote's configuration. -}-storeCipher :: RemoteConfig -> EncryptedCipher -> RemoteConfig-storeCipher c (EncryptedCipher t ks) = -	M.insert "cipher" (toB64 t) $ M.insert "cipherkeys" (showkeys ks) c-	where-		showkeys (KeyIds l) = join "," l--{- Extracts an EncryptedCipher from a remote's configuration. -}-extractCipher :: RemoteConfig -> Maybe EncryptedCipher-extractCipher c = -	case (M.lookup "cipher" c, M.lookup "cipherkeys" c) of-		(Just t, Just ks) -> Just $ EncryptedCipher (fromB64 t) (readkeys ks)-		_ -> Nothing-	where-		readkeys = KeyIds . split ","- {- Encrypts a Cipher to the specified KeyIds. -}-encryptCipher :: Cipher -> KeyIds -> IO EncryptedCipher+encryptCipher :: Cipher -> KeyIds -> IO StorableCipher encryptCipher (Cipher c) (KeyIds ks) = do 	let ks' = nub $ sort ks -- gpg complains about duplicate recipient keyids 	encipher <- Gpg.pipeStrict (encrypt++recipients ks') c@@ -126,9 +101,9 @@ 		force_recipients = Params "--no-encrypt-to --no-default-recipient"  {- Decrypting an EncryptedCipher is expensive; the Cipher should be cached. -}-decryptCipher :: RemoteConfig -> EncryptedCipher -> IO Cipher-decryptCipher _ (EncryptedCipher encipher _) = -	Cipher <$> Gpg.pipeStrict decrypt encipher+decryptCipher :: StorableCipher -> IO Cipher+decryptCipher (SharedCipher t) = return $ Cipher t+decryptCipher (EncryptedCipher t _) = Cipher <$> Gpg.pipeStrict decrypt t 	where 		decrypt = [ Param "--decrypt" ] @@ -163,15 +138,7 @@  pass :: (Cipher -> IO L.ByteString -> (Handle -> IO a) -> IO a)        -> Cipher -> IO L.ByteString -> (L.ByteString -> IO a) -> IO a-pass to c i a = to c i $ \h -> a =<< L.hGetContents h--configKeyIds :: RemoteConfig -> IO KeyIds-configKeyIds c = Gpg.findPubKeys $ configGet c "encryption"--configGet :: RemoteConfig -> String -> String-configGet c key = fromMaybe missing $ M.lookup key c-	where-		missing = error $ "missing " ++ key ++ " in remote config"+pass to n s a = to n s $ \h -> a =<< L.hGetContents h  hmacWithCipher :: Cipher -> String -> String hmacWithCipher c = hmacWithCipher' (cipherHmac c) 
− Git.hi

binary file changed (4033 → absent bytes)

− Git.o

binary file changed (14816 → absent bytes)

− Git/Command.hi

binary file changed (4413 → absent bytes)

Git/Command.hs view
@@ -79,5 +79,5 @@ reap :: IO () reap = do 	-- throws an exception when there are no child processes-	r <- catchDefaultIO (getAnyProcessStatus False True) Nothing-	maybe (return ()) (const reap) r+	catchDefaultIO (getAnyProcessStatus False True) Nothing+		>>= maybe noop (const reap)
− Git/Command.o

binary file changed (19256 → absent bytes)

Git/Config.hs view
@@ -20,6 +20,10 @@ get :: String -> String -> Repo -> String get key defaultValue repo = M.findWithDefault defaultValue key (config repo) +{- Returns a list with each line of a multiline config setting. -}+getList :: String -> Repo -> [String]+getList key repo = M.findWithDefault [] key (fullconfig repo)+ {- Returns a single git config setting, if set. -} getMaybe :: String -> Repo -> Maybe String getMaybe key repo = M.lookup key (config repo)
Git/Construct.hs view
@@ -48,7 +48,7 @@ fromCurrent :: IO Repo fromCurrent = do 	r <- maybe fromCwd fromPath =<< getEnv "GIT_DIR"-	maybe (return ()) changeWorkingDirectory =<< getEnv "GIT_WORK_TREE"+	maybe noop changeWorkingDirectory =<< getEnv "GIT_WORK_TREE" 	unsetEnv "GIT_DIR" 	unsetEnv "GIT_WORK_TREE" 	return r
− Git/Index.hi

binary file changed (786 → absent bytes)

− Git/Index.o

binary file changed (3032 → absent bytes)

− Git/Queue.hi

binary file changed (16957 → absent bytes)

− Git/Queue.o

binary file changed (36544 → absent bytes)

+ Git/SharedRepository.hs view
@@ -0,0 +1,27 @@+{- git core.sharedRepository handling+ -+ - Copyright 2012 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Git.SharedRepository where++import Data.Char++import Common+import Git+import qualified Git.Config++data SharedRepository = UnShared | GroupShared | AllShared | UmaskShared Int++getSharedRepository :: Repo -> SharedRepository+getSharedRepository r =+	case map toLower $ Git.Config.get "core.sharedrepository" "" r of+		"1" -> GroupShared+		"group" -> GroupShared+		"true" -> GroupShared+		"all" -> AllShared+		"world" -> AllShared+		"everybody" -> AllShared+		v -> maybe UnShared UmaskShared (readish v)
− Git/Types.hi

binary file changed (2797 → absent bytes)

− Git/Types.o

binary file changed (25896 → absent bytes)

Git/UnionMerge.hs view
@@ -97,7 +97,7 @@ calc_merge ch differ repo streamer = gendiff >>= go 	where 		gendiff = pipeNullSplit (map Param differ) repo-		go [] = return ()+		go [] = noop 		go (info:file:rest) = mergeFile info file ch repo >>= 			maybe (go rest) (\l -> streamer l >> go rest) 		go (_:[]) = error "calc_merge parse error"
GitAnnexShell.hs view
@@ -52,7 +52,7 @@ 	where 		checkuuid expected = getUUID >>= check 			where-				check u | u == toUUID expected = return ()+				check u | u == toUUID expected = noop 				check NoUUID = unexpected "uninitialized repository" 				check u = unexpected $ "UUID " ++ fromUUID u 				unexpected s = error $@@ -107,7 +107,7 @@  checkNotReadOnly :: String -> IO () checkNotReadOnly cmd-	| cmd `elem` map cmdname cmds_readonly = return ()+	| cmd `elem` map cmdname cmds_readonly = noop 	| otherwise = checkEnv "GIT_ANNEX_SHELL_READONLY"  checkEnv :: String -> IO ()
Init.hs view
@@ -29,7 +29,9 @@ 	maybe (recordUUID u) (describeUUID u) mdescription  uninitialize :: Annex ()-uninitialize = gitPreCommitHookUnWrite+uninitialize = do+	gitPreCommitHookUnWrite+	removeRepoUUID  {- Will automatically initialize if there is already a git-annex    branch from somewhere. Otherwise, require a manual init
Logs/Location.hs view
@@ -30,7 +30,7 @@ {- Log a change in the presence of a key's value in a repository. -} logChange :: Key -> UUID -> LogStatus -> Annex () logChange key (UUID u) s = addLog (logFile key) =<< logNow s u-logChange _ NoUUID _ = return ()+logChange _ NoUUID _ = noop  {- Returns a list of repository UUIDs that, according to the log, have  - the value of a key.
Logs/UUID.hs view
@@ -73,7 +73,7 @@ 	where 		go (Just "") = set 		go Nothing = set-		go _ = return ()+		go _ = noop 		set = describeUUID u ""  {- Read the uuidLog into a simple Map.
Messages.hs view
@@ -13,6 +13,8 @@ 	metered, 	MeterUpdate, 	showSideAction,+	doSideAction,+	showStoringStateAction, 	showOutput, 	showLongNote, 	showEndOk,@@ -37,6 +39,7 @@  import Common import Types+import Types.Messages import Types.Key import qualified Annex import qualified Messages.JSON as JSON@@ -61,9 +64,9 @@  - The action is passed a callback to use to update the meter. -} type MeterUpdate = Integer -> IO () metered :: Key -> (MeterUpdate -> Annex a) -> Annex a-metered key a = Annex.getState Annex.output >>= go (keySize key)+metered key a = withOutputType $ go (keySize key) 	where-		go (Just size) Annex.NormalOutput = do+		go (Just size) NormalOutput = do 			progress <- liftIO $ newProgress "" size 			meter <- liftIO $ newMeter progress "B" 25 (renderNums binaryOpts 1) 			showOutput@@ -72,13 +75,32 @@ 				incrP progress n 				displayMeter stdout meter 			liftIO $ clearMeter stdout meter-			return r	-                go _ _ = a (const $ return ())+			return r+                go _ _ = a (const noop)  showSideAction :: String -> Annex ()-showSideAction s = handle q $-	putStrLn $ "(" ++ s ++ "...)"+showSideAction m = Annex.getState Annex.output >>= go+	where+		go (MessageState v StartBlock) = do+			p+	 		Annex.changeState $ \s -> s { Annex.output = MessageState v InBlock }+		go (MessageState _ InBlock) = return ()+		go _ = p+		p = handle q $ putStrLn $ "(" ++ m ++ "...)"+			+showStoringStateAction :: Annex ()+showStoringStateAction = showSideAction "Recording state in git" +{- Performs an action, that may call showSideAction multiple times.+ - Only the first will be displayed. -}+doSideAction :: Annex a -> Annex a+doSideAction a = do+	o <- Annex.getState Annex.output+	set $ o { sideActionBlock = StartBlock }+	set o `after` a+	where+		set o = Annex.changeState $ \s -> s {  Annex.output = o }+ showOutput :: Annex () showOutput = handle q $ 	putStr "\n"@@ -122,9 +144,9 @@  {- Shows a complete JSON value, only when in json mode. -} showFullJSON :: JSON a => [(String, a)] -> Annex Bool-showFullJSON v = Annex.getState Annex.output >>= liftIO . go+showFullJSON v = withOutputType $ liftIO . go 	where-		go Annex.JSONOutput = JSON.complete v >> return True+		go JSONOutput = JSON.complete v >> return True 		go _ = return False  {- Performs an action that outputs nonstandard/customized output, and@@ -153,14 +175,17 @@ 	fileEncoding stderr  handle :: IO () -> IO () -> Annex ()-handle json normal = Annex.getState Annex.output >>= go+handle json normal = withOutputType $ go 	where-		go Annex.NormalOutput = liftIO normal-		go Annex.QuietOutput = q-		go Annex.JSONOutput = liftIO $ flushed json+		go NormalOutput = liftIO normal+		go QuietOutput = q+		go JSONOutput = liftIO $ flushed json  q :: Monad m => m ()-q = return ()+q = noop  flushed :: IO () -> IO () flushed a = a >> hFlush stdout++withOutputType :: (OutputType -> Annex a) -> Annex a+withOutputType a = outputType <$> Annex.getState Annex.output >>= a
− Messages/JSON.hi

binary file changed (1609 → absent bytes)

− Messages/JSON.o

binary file changed (6016 → absent bytes)

Option.hs view
@@ -20,6 +20,7 @@  import Common.Annex import qualified Annex+import Types.Messages import Limit import Usage @@ -31,11 +32,11 @@ 		"avoid slow operations" 	, Option ['a'] ["auto"] (NoArg (setauto True)) 		"automatic mode"-	, Option ['q'] ["quiet"] (NoArg (setoutput Annex.QuietOutput))+	, Option ['q'] ["quiet"] (NoArg (Annex.setOutput QuietOutput)) 		"avoid verbose output"-	, Option ['v'] ["verbose"] (NoArg (setoutput Annex.NormalOutput))+	, Option ['v'] ["verbose"] (NoArg (Annex.setOutput NormalOutput)) 		"allow verbose output (default)"-	, Option ['j'] ["json"] (NoArg (setoutput Annex.JSONOutput))+	, Option ['j'] ["json"] (NoArg (Annex.setOutput JSONOutput)) 		"enable JSON output" 	, Option ['d'] ["debug"] (NoArg setdebug) 		"show debug messages"@@ -46,7 +47,6 @@ 		setforce v = Annex.changeState $ \s -> s { Annex.force = v } 		setfast v = Annex.changeState $ \s -> s { Annex.fast = v } 		setauto v = Annex.changeState $ \s -> s { Annex.auto = v }-		setoutput v = Annex.changeState $ \s -> s { Annex.output = v } 		setforcebackend v = Annex.changeState $ \s -> s { Annex.forcebackend = Just v } 		setdebug = liftIO $ updateGlobalLogger rootLoggerName $ 			setLevel DEBUG
Remote.hs view
@@ -194,7 +194,7 @@ 		message rs us = message rs [] ++ message [] us  showTriedRemotes :: [Remote] -> Annex ()-showTriedRemotes [] = return ()	+showTriedRemotes [] = noop showTriedRemotes remotes = 	showLongNote $ "Unable to access these remotes: " ++ 		join ", " (map name remotes)
Remote/Directory.hs view
@@ -10,7 +10,7 @@ import qualified Data.ByteString.Lazy.Char8 as L import qualified Data.ByteString.Char8 as S import qualified Data.Map as M-import Control.Exception (bracket)+import qualified Control.Exception as E  import Common.Annex import Types.Remote@@ -22,6 +22,7 @@ import Crypto import Utility.DataUnits import Data.Int+import Annex.Content  remote :: RemoteType remote = RemoteType {@@ -125,7 +126,7 @@ store d chunksize k = do 	src <- inRepo $ gitAnnexLocation k 	metered k $ \meterupdate -> -		liftIO $ catchBoolIO $ storeHelper d chunksize k $ \dests ->+		storeHelper d chunksize k $ \dests -> 			case chunksize of 				Nothing -> do 					let dest = Prelude.head dests@@ -140,7 +141,7 @@ storeEncrypted d chunksize (cipher, enck) k = do 	src <- inRepo $ gitAnnexLocation k 	metered k $ \meterupdate ->-		liftIO $ catchBoolIO $ storeHelper d chunksize enck $ \dests ->+		storeHelper d chunksize enck $ \dests -> 			withEncryptedContent cipher (L.readFile src) $ \s -> 				case chunksize of 					Nothing -> do@@ -165,7 +166,7 @@ storeSplit' _ _ [] _ _ = error "ran out of dests" storeSplit' _ _  _ [] c = return $ reverse c storeSplit' meterupdate chunksize (d:dests) bs c = do-	bs' <- bracket (openFile d WriteMode) hClose (feed chunksize bs)+	bs' <- E.bracket (openFile d WriteMode) hClose (feed chunksize bs) 	storeSplit' meterupdate chunksize dests bs' (d:c) 	where 		feed _ [] _ = return []@@ -190,11 +191,12 @@  - meter after each chunk. The feeder is called to get more chunks. -} meteredWriteFile' :: MeterUpdate -> FilePath -> s -> (s -> IO (s, [S.ByteString])) -> IO () meteredWriteFile' meterupdate dest startstate feeder =-	bracket (openFile dest WriteMode) hClose (feed startstate [])+	E.bracket (openFile dest WriteMode) hClose (feed startstate []) 	where 		feed state [] h = do 			(state', cs) <- feeder state-			if null cs then return () else feed state' cs h+			unless (null cs) $+				feed state' cs h 		feed state (c:cs) h = do 			S.hPut h c 			meterupdate $ toInteger $ S.length c@@ -207,31 +209,38 @@  - The stored files are only put into their final place once storage is  - complete.  -}-storeHelper :: FilePath -> ChunkSize -> Key -> ([FilePath] -> IO [FilePath]) -> IO Bool-storeHelper d chunksize key a = do-	let dir = parentDir desttemplate-	createDirectoryIfMissing True dir-	allowWrite dir-	stored <- a tmpdests-	forM_ stored $ \f -> do-		let dest = detmpprefix f-		renameFile f dest-		preventWrite dest-	when (chunksize /= Nothing) $ do-		let chunkcount = chunkCount desttemplate-		_ <- tryIO $ allowWrite chunkcount-		writeFile chunkcount (show $ length stored)-		preventWrite chunkcount-	preventWrite dir-	return (not $ null stored)+storeHelper :: FilePath -> ChunkSize -> Key -> ([FilePath] -> IO [FilePath]) -> Annex Bool+storeHelper d chunksize key a = prep <&&> check <&&> go 	where 		desttemplate = Prelude.head $ locations d key+		dir = parentDir desttemplate 		tmpdests = case chunksize of 			Nothing -> [desttemplate ++ tmpprefix] 			Just _ -> map (++ tmpprefix) (chunkStream desttemplate) 		tmpprefix = ".tmp" 		detmpprefix f = take (length f - tmpprefixlen) f 		tmpprefixlen = length tmpprefix+		prep = liftIO $ catchBoolIO $ do+			createDirectoryIfMissing True dir+			allowWrite dir+			return True+		{- The size is not exactly known when encrypting the key;+		 - this assumes that at least the size of the key is+		 - needed as free space. -}+		check = checkDiskSpace (Just dir) key 0+		go = liftIO $ catchBoolIO $ do+			stored <- a tmpdests+			forM_ stored $ \f -> do+				let dest = detmpprefix f+				renameFile f dest+				preventWrite dest+			when (chunksize /= Nothing) $ do+				let chunkcount = chunkCount desttemplate+				_ <- tryIO $ allowWrite chunkcount+				writeFile chunkcount (show $ length stored)+				preventWrite chunkcount+			preventWrite dir+			return (not $ null stored)  retrieve :: FilePath -> ChunkSize -> Key -> FilePath -> Annex Bool retrieve d chunksize k f = metered k $ \meterupdate ->
Remote/Git.hs view
@@ -94,7 +94,9 @@ tryGitConfigRead r  	| not $ M.null $ Git.config r = return r -- already read 	| Git.repoIsSsh r = store $ onRemote r (pipedconfig, r) "configlist" []-	| Git.repoIsHttp r = store $ safely geturlconfig+	| Git.repoIsHttp r = do+		headers <- getHttpHeaders+		store $ safely $ geturlconfig headers 	| Git.repoIsUrl r = return r 	| otherwise = store $ safely $ onLocal r $ do  		ensureInitialized@@ -109,8 +111,8 @@ 			pOpen ReadFromPipe cmd (toCommand params) $ 				Git.Config.hRead r -		geturlconfig = do-			s <- Url.get (Git.repoLocation r ++ "/config")+		geturlconfig headers = do+			s <- Url.get (Git.repoLocation r ++ "/config") headers 			withTempFile "git-annex.tmp" $ \tmpfile h -> do 				hPutStr h s 				hClose h@@ -136,16 +138,16 @@  -} inAnnex :: Git.Repo -> Key -> Annex (Either String Bool) inAnnex r key-	| Git.repoIsHttp r = checkhttp+	| Git.repoIsHttp r = checkhttp =<< getHttpHeaders 	| Git.repoIsUrl r = checkremote 	| otherwise = checklocal 	where-		checkhttp = liftIO $ go undefined $ keyUrls r key+		checkhttp headers = liftIO $ go undefined $ keyUrls r key 			where 				go e [] = return $ Left e 				go _ (u:us) = do 					res <- catchMsgIO $-						Url.check u (keySize key)+						Url.check u headers (keySize key) 					case res of 						Left e -> go e us 						v -> return v@@ -313,7 +315,7 @@ 		cleanup 			| not $ Git.repoIsUrl r = liftIO $ onLocal r $ 				Annex.Branch.commit "update"-			| otherwise = do+			| otherwise = void $ do 				Just (shellcmd, shellparams) <- 					git_annex_shell r "commit" [] 				-- Throw away stderr, since the remote may not@@ -322,6 +324,4 @@ 				let cmd = shellcmd ++ " " 					++ unwords (map shellEscape $ toCommand shellparams) 					++ ">/dev/null 2>/dev/null"-				_ <- liftIO $-					boolSystem "sh" [Param "-c", Param cmd]-				return ()+				liftIO $ boolSystem "sh" [Param "-c", Param cmd]
Remote/Helper/Encryptable.hs view
@@ -14,20 +14,26 @@ import Crypto import qualified Annex import Config+import Utility.Base64  {- Encryption setup for a remote. The user must specify whether to use  - an encryption key, or not encrypt. An encrypted cipher is created, or is- - updated to be accessible to an additional encryption key. -}+ - updated to be accessible to an additional encryption key. Or the user+ - could opt to use a shared cipher, which is stored unencrypted. -} encryptionSetup :: RemoteConfig -> Annex RemoteConfig-encryptionSetup c =-	case (M.lookup "encryption" c, extractCipher c) of-		(Nothing, Nothing) -> error "Specify encryption=key or encryption=none"-		(Just "none", Nothing) -> return c-		(Just "none", Just _) -> error "Cannot change encryption type of existing remote."-		(Nothing, Just _) -> return c-		(Just _, Nothing) -> use "encryption setup" $ genCipher c-		(Just _, Just v) -> use "encryption updated" $ updateCipher c v+encryptionSetup c = case (M.lookup "encryption" c, extractCipher c) of+	(Nothing, Nothing) -> error "Specify encryption=key or encryption=none or encryption=shared"+	(Just "none", Nothing) -> return c+	(Nothing, Just _) -> return c+	(Just "shared", Just (SharedCipher _)) -> return c+	(Just "none", Just _) -> cannotchange+	(Just "shared", Just (EncryptedCipher _ _)) -> cannotchange+	(Just _, Just (SharedCipher _)) -> cannotchange+	(Just "shared", Nothing) -> use "encryption setup" $ genSharedCipher+	(Just keyid, Nothing) -> use "encryption setup" $ genEncryptedCipher keyid+	(Just keyid, Just v) -> use "encryption updated" $ updateEncryptedCipher keyid v 	where+		cannotchange = error "Cannot change encryption type of existing remote." 		use m a = do 			cipher <- liftIO a 			showNote $ m ++ " " ++ describeCipher cipher@@ -78,7 +84,7 @@ 				Nothing -> decrypt encipher cache 		decrypt encipher cache = do 			showNote "gpg"-			cipher <- liftIO $ decryptCipher c encipher+			cipher <- liftIO $ decryptCipher encipher 			Annex.changeState (\s -> s { Annex.ciphers = M.insert encipher cipher cache }) 			return $ Just cipher @@ -88,3 +94,21 @@ cipherKey (Just c) k = maybe Nothing encrypt <$> remoteCipher c 	where 		encrypt ciphertext = Just (ciphertext, encryptKey ciphertext k)++{- Stores an StorableCipher in a remote's configuration. -}+storeCipher :: RemoteConfig -> StorableCipher -> RemoteConfig+storeCipher c (SharedCipher t) = M.insert "cipher" (toB64 t) c+storeCipher c (EncryptedCipher t ks) = +	M.insert "cipher" (toB64 t) $ M.insert "cipherkeys" (showkeys ks) c+	where+		showkeys (KeyIds l) = join "," l++{- Extracts an StorableCipher from a remote's configuration. -}+extractCipher :: RemoteConfig -> Maybe StorableCipher+extractCipher c = +	case (M.lookup "cipher" c, M.lookup "cipherkeys" c) of+		(Just t, Just ks) -> Just $ EncryptedCipher (fromB64 t) (readkeys ks)+		(Just t, Nothing) -> Just $ SharedCipher (fromB64 t)+		_ -> Nothing+	where+		readkeys = KeyIds . split ","
Remote/Helper/Hooks.hs view
@@ -14,6 +14,7 @@ import qualified Annex import Annex.LockPool import Config+import Annex.Perms  {- Modifies a remote's access functions to first run the  - annex-start-command hook, and trigger annex-stop-command on shutdown.@@ -45,10 +46,9 @@ 	a 	where 		remoteid = show (uuid r)-		run Nothing = return ()-		run (Just command) = liftIO $ do-			_ <- boolSystem "sh" [Param "-c", Param command]-			return ()+		run Nothing = noop+		run (Just command) = void $ liftIO $+			boolSystem "sh" [Param "-c", Param command] 		firstrun lck = do 			-- Take a shared lock; This indicates that git-annex 			-- is using the remote, and prevents other instances@@ -75,11 +75,13 @@ 			-- succeeds, we're the only process using this remote, 			-- so can stop it. 			unlockFile lck-			fd <- liftIO $ openFd lck ReadWrite (Just stdFileMode) defaultFileFlags+			mode <- annexFileMode+			fd <- liftIO $ noUmask mode $+				openFd lck ReadWrite (Just mode) defaultFileFlags 			v <- liftIO $ tryIO $ 				setLock fd (WriteLock, AbsoluteSeek, 0, 0) 			case v of-				Left _ -> return ()+				Left _ -> noop 				Right _ -> run stophook 			liftIO $ closeFd fd 
Remote/S3.hs view
@@ -93,7 +93,7 @@  		archiveorg = do 			showNote "Internet Archive mode"-			maybe (error "specify bucket=") (const $ return ()) $+			maybe (error "specify bucket=") (const noop) $ 				M.lookup "bucket" archiveconfig 			use archiveconfig 			where@@ -237,13 +237,13 @@ 	showAction "checking bucket" 	loc <- liftIO $ getBucketLocation conn bucket  	case loc of-		Right _ -> return ()+		Right _ -> noop 		Left err@(NetworkError _) -> s3Error err 		Left (AWSError _ _) -> do 			showAction $ "creating bucket in " ++ datacenter 			res <- liftIO $ createBucketIn conn bucket datacenter 			case res of-				Right _ -> return ()+				Right _ -> noop 				Left err -> s3Error err 	where 		bucket = fromJust $ M.lookup "bucket" c
Remote/Web.hs view
@@ -83,4 +83,5 @@ checkKey' :: Key -> [URLString] -> Annex Bool checkKey' key us = untilTrue us $ \u -> do 	showAction $ "checking " ++ u-	liftIO $ Url.check u (keySize key)+	headers <- getHttpHeaders+	liftIO $ Url.check u headers (keySize key)
− Types/BranchState.hi

binary file changed (1153 → absent bytes)

− Types/BranchState.o

binary file changed (2400 → absent bytes)

Types/Crypto.hs view
@@ -1,13 +1,13 @@ {- git-annex crypto types  -- - Copyright 2011 Joey Hess <joey@kitenet.net>+ - Copyright 2011-2012 Joey Hess <joey@kitenet.net>  -  - Licensed under the GNU GPL version 3 or higher.  -}  module Types.Crypto ( 	Cipher(..),-	EncryptedCipher(..),+	StorableCipher(..), 	KeyIds(..), ) where @@ -16,5 +16,5 @@ -- XXX ideally, this would be a locked memory region newtype Cipher = Cipher String -data EncryptedCipher = EncryptedCipher String KeyIds+data StorableCipher = EncryptedCipher String KeyIds | SharedCipher String 	deriving (Ord, Eq)
+ Types/Messages.hs view
@@ -0,0 +1,20 @@+{- git-annex Messages data types+ - + - Copyright 2012 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Types.Messages where++data OutputType = NormalOutput | QuietOutput | JSONOutput++data SideActionBlock = NoBlock | StartBlock | InBlock++data MessageState = MessageState+	{ outputType :: OutputType+	, sideActionBlock :: SideActionBlock+	}++defaultMessageState :: MessageState+defaultMessageState = MessageState NormalOutput NoBlock
− Types/TrustLevel.hi

binary file changed (1259 → absent bytes)

− Types/TrustLevel.o

binary file changed (3240 → absent bytes)

− Types/UUID.hi

binary file changed (1175 → absent bytes)

− Types/UUID.o

binary file changed (11540 → absent bytes)

Upgrade/V1.hs view
@@ -59,7 +59,7 @@ 			updateSymlinks 			moveLocationLogs 	-			Annex.Queue.flush True+			Annex.Queue.flush 			setVersion 		) 	@@ -89,7 +89,7 @@ 		fixlink f = do 			r <- lookupFile1 f 			case r of-				Nothing -> return ()+				Nothing -> noop 				Just (k, _) -> do 					link <- calcGitLink f k 					liftIO $ removeFile f
− Utility/Base64.hi

binary file changed (980 → absent bytes)

− Utility/Base64.o

binary file changed (2820 → absent bytes)

− Utility/CopyFile.hi

binary file changed (3358 → absent bytes)

− Utility/CopyFile.o

binary file changed (3364 → absent bytes)

− Utility/DataUnits.hi

binary file changed (2140 → absent bytes)

− Utility/DataUnits.o

binary file changed (49224 → absent bytes)

− Utility/Directory.hi

binary file changed (2970 → absent bytes)

Utility/Directory.hs view
@@ -19,6 +19,7 @@ import Utility.SafeCommand import Utility.TempFile import Utility.Exception+import Utility.Monad  {- Lists the contents of a directory.  - Unlike getDirectoryContents, paths are not relative to the directory. -}@@ -34,7 +35,7 @@ moveFile :: FilePath -> FilePath -> IO () moveFile src dest = tryIO (rename src dest) >>= onrename 	where-		onrename (Right _) = return ()+		onrename (Right _) = noop 		onrename (Left e) 			| isPermissionError e = rethrow 			| isDoesNotExistError e = rethrow
− Utility/Directory.o

binary file changed (9644 → absent bytes)

Utility/DiskFree.hs view
@@ -18,7 +18,7 @@ foreign import ccall unsafe "libdiskfree.h diskfree" c_diskfree 	:: CString -> IO CULLong -getDiskFree :: String -> IO (Maybe Integer)+getDiskFree :: FilePath -> IO (Maybe Integer) getDiskFree path = withFilePath path $ \c_path -> do 	free <- c_diskfree c_path 	ifM (safeErrno <$> getErrno)
− Utility/Dot.hi

binary file changed (1375 → absent bytes)

− Utility/Dot.o

binary file changed (13280 → absent bytes)

− Utility/Exception.hi

binary file changed (1571 → absent bytes)

− Utility/Exception.o

binary file changed (5624 → absent bytes)

− Utility/FileMode.hi

binary file changed (1300 → absent bytes)

Utility/FileMode.hs view
@@ -1,43 +1,90 @@ {- File mode utilities.  -- - Copyright 2010 Joey Hess <joey@kitenet.net>+ - Copyright 2010-2012 Joey Hess <joey@kitenet.net>  -  - Licensed under the GNU GPL version 3 or higher.  -}  module Utility.FileMode where -import System.Posix.Files+import Common++import Control.Exception (bracket) import System.Posix.Types import Foreign (complement) -{- Removes a FileMode from a file.- - For example, call with otherWriteMode to chmod o-w -}-unsetFileMode :: FilePath -> FileMode -> IO ()-unsetFileMode f m = do+{- Applies a conversion function to a file's mode. -}+modifyFileMode :: FilePath -> (FileMode -> FileMode) -> IO ()+modifyFileMode f convert = void $ modifyFileMode' f convert+modifyFileMode' :: FilePath -> (FileMode -> FileMode) -> IO FileMode+modifyFileMode' f convert = do 	s <- getFileStatus f-	setFileMode f $ fileMode s `intersectFileModes` complement m+	let old = fileMode s+	let new = convert old+	when (new /= old) $+		setFileMode f new+	return old +{- Adds the specified FileModes to the input mode, leaving the rest+ - unchanged. -}+addModes :: [FileMode] -> FileMode -> FileMode+addModes ms m = combineModes (m:ms)++{- Removes the specified FileModes from the input mode. -}+removeModes :: [FileMode] -> FileMode -> FileMode+removeModes ms m = m `intersectFileModes` complement (combineModes ms)++{- Runs an action after changing a file's mode, then restores the old mode. -}+withModifiedFileMode :: FilePath -> (FileMode -> FileMode) -> IO a -> IO a+withModifiedFileMode file convert a = bracket setup cleanup go+	where+		setup = modifyFileMode' file convert+		cleanup oldmode = modifyFileMode file (const oldmode)+		go _ = a++writeModes :: [FileMode]+writeModes = [ownerWriteMode, groupWriteMode, otherWriteMode]++readModes :: [FileMode]+readModes = [ownerReadMode, groupReadMode, otherReadMode]+ {- Removes the write bits from a file. -} preventWrite :: FilePath -> IO ()-preventWrite f = unsetFileMode f writebits-	where-		writebits = foldl unionFileModes ownerWriteMode-					[groupWriteMode, otherWriteMode]+preventWrite f = modifyFileMode f $ removeModes writeModes -{- Turns a file's write bit back on. -}+{- Turns a file's owner write bit back on. -} allowWrite :: FilePath -> IO ()-allowWrite f = do-	s <- getFileStatus f-	setFileMode f $ fileMode s `unionFileModes` ownerWriteMode+allowWrite f = modifyFileMode f $ addModes [ownerWriteMode] +{- Allows owner and group to read and write to a file. -}+groupWriteRead :: FilePath -> IO ()+groupWriteRead f = modifyFileMode f $ addModes+	[ ownerWriteMode, groupWriteMode+	, ownerReadMode, groupReadMode+	]+ {- Checks if a file mode indicates it's a symlink. -} isSymLink :: FileMode -> Bool isSymLink mode = symbolicLinkMode `intersectFileModes` mode == symbolicLinkMode  {- Checks if a file has any executable bits set. -} isExecutable :: FileMode -> Bool-isExecutable mode = ebits `intersectFileModes` mode /= 0+isExecutable mode = combineModes ebits `intersectFileModes` mode /= 0 	where-		ebits = ownerExecuteMode `unionFileModes`-			groupExecuteMode `unionFileModes` otherExecuteMode+		ebits = [ownerExecuteMode, groupExecuteMode, otherExecuteMode]++{- Runs an action without that pesky umask influencing it, unless the+ - passed FileMode is the standard one. -}+noUmask :: FileMode -> IO a -> IO a+noUmask mode a+	| mode == stdFileMode = a+	| otherwise = bracket setup cleanup go+	where+		setup = setFileCreationMask nullFileMode+		cleanup = setFileCreationMask+		go _ = a++combineModes :: [FileMode] -> FileMode+combineModes [] = undefined+combineModes [m] = m+combineModes (m:ms) = foldl unionFileModes m ms
− Utility/FileMode.o

binary file changed (5524 → absent bytes)

− Utility/FileSystemEncoding.hi

binary file changed (1471 → absent bytes)

− Utility/FileSystemEncoding.o

binary file changed (3656 → absent bytes)

− Utility/Format.hi

binary file changed (2338 → absent bytes)

− Utility/Format.o

binary file changed (39364 → absent bytes)

Utility/Gpg.hs view
@@ -94,7 +94,18 @@ 		pubKey = isPrefixOf "pub:" 		keyIdField s = split ":" s !! 4 -+{- Creates a block of high-quality random data suitable to use as a cipher.+ - It is armored, to avoid newlines, since gpg only reads ciphers up to the+ - first newline. -}+genRandom :: Int -> IO String+genRandom size = readStrict+	[ Params "--gen-random --armor"+	, Param $ show randomquality+	, Param $ show size+	]+	where+		-- 1 is /dev/urandom; 2 is /dev/random+		randomquality = 1 :: Int  {- A test key. This is provided pre-generated since generating a new gpg  - key is too much work (requires too much entropy) for a test suite to
− Utility/Inotify.hi

binary file changed (2921 → absent bytes)

Utility/Inotify.hs view
@@ -53,11 +53,10 @@ watchDir' :: Bool -> INotify -> (FilePath -> Bool) -> Maybe (FilePath -> IO ()) -> Maybe (FilePath -> IO ()) -> FilePath -> IO () watchDir' scan i test add del dir = do 	if test dir-		then do+		then void $ do 			_ <- addWatch i watchevents dir go-			_ <- mapM walk =<< dirContents dir-			return ()-		else return ()+			mapM walk =<< dirContents dir+		else noop 	where 		watchevents 			| isJust add && isJust del =@@ -69,19 +68,19 @@ 		recurse = watchDir' scan i test add del 		walk f = ifM (catchBoolIO $ Files.isDirectory <$> getFileStatus f) 			( recurse f-			, if scan && isJust add then fromJust add f else return ()+			, when (scan && isJust add) $ fromJust add f 			) -		go (Created { isDirectory = False }) = return ()+		go (Created { isDirectory = False }) = noop 		go (Created { filePath = subdir }) = Just recurse <@> subdir 		go (Closed { maybeFilePath = Just f }) = add <@> f 		go (MovedIn { isDirectory = False, filePath = f }) = add <@> f 		go (MovedOut { isDirectory = False, filePath = f }) = del <@> f 		go (Deleted { isDirectory = False, filePath = f }) = del <@> f-		go _ = return ()+		go _ = noop 		 		Just a <@> f = a $ dir </> f-		Nothing <@> _ = return ()+		Nothing <@> _ = noop  {- Pauses the main thread, letting children run until program termination. -} waitForTermination :: IO ()@@ -92,6 +91,5 @@ 		check keyboardSignal mv 	takeMVar mv 	where-		check sig mv = do-			_ <- installHandler sig (CatchOnce $ putMVar mv ()) Nothing-			return ()+		check sig mv = void $+			installHandler sig (CatchOnce $ putMVar mv ()) Nothing
− Utility/Inotify.o

binary file changed (10548 → absent bytes)

− Utility/JSONStream.hi

binary file changed (1280 → absent bytes)

− Utility/JSONStream.o

binary file changed (5020 → absent bytes)

− Utility/Matcher.hi

binary file changed (2061 → absent bytes)

− Utility/Matcher.o

binary file changed (30548 → absent bytes)

− Utility/Misc.hi

binary file changed (1259 → absent bytes)

− Utility/Misc.o

binary file changed (4752 → absent bytes)

− Utility/Monad.hi

binary file changed (1527 → absent bytes)

Utility/Monad.hs view
@@ -49,3 +49,7 @@ {- b `after` a runs first a, then b, and returns the value of a -} after :: Monad m => m b -> m a -> m a after = observe . const++{- do nothing -}+noop :: Monad m => m ()+noop = return ()
− Utility/Monad.o

binary file changed (5928 → absent bytes)

− Utility/PartialPrelude.hi

binary file changed (1470 → absent bytes)

− Utility/PartialPrelude.o

binary file changed (5456 → absent bytes)

− Utility/Path.hi

binary file changed (3367 → absent bytes)

− Utility/Path.o

binary file changed (21888 → absent bytes)

+ Utility/Percentage.hs view
@@ -0,0 +1,38 @@+{- percentages+ -+ - Copyright 2012 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Utility.Percentage (+	Percentage,+	percentage,+	showPercentage+) where++import Data.Ratio++newtype Percentage = Percentage (Ratio Integer)++instance Show Percentage where+	show = showPercentage 0++{- Normally the big number comes first. But 110% is allowed if desired. :) -}+percentage :: Integer -> Integer -> Percentage+percentage 0 _ = Percentage 0+percentage full have = Percentage $ have * 100 % full++{- Pretty-print a Percentage, with a specified level of precision. -}+showPercentage :: Int -> Percentage -> String+showPercentage precision (Percentage p)+	| precision == 0 || remainder == 0 = go $ show int+	| otherwise = go $ show int ++ "." ++ strip0s (show remainder)+	where+		go v = v ++ "%"+		int :: Integer+		(int, frac) = properFraction (fromRational p)+		remainder = floor (frac * multiplier) :: Integer+		strip0s = reverse . dropWhile (== '0') . reverse+		multiplier :: Float+		multiplier = 10 ** (fromIntegral precision)
− Utility/RsyncFile.hi

binary file changed (2611 → absent bytes)

− Utility/RsyncFile.o

binary file changed (10856 → absent bytes)

− Utility/SafeCommand.hi

binary file changed (3740 → absent bytes)

− Utility/SafeCommand.o

binary file changed (33320 → absent bytes)

− Utility/State.hi

binary file changed (1015 → absent bytes)

− Utility/State.o

binary file changed (2420 → absent bytes)

− Utility/TempFile.hi

binary file changed (2467 → absent bytes)

− Utility/TempFile.o

binary file changed (6216 → absent bytes)

− Utility/Touch.hi

binary file changed (8689 → absent bytes)

Utility/Touch.hsc view
@@ -106,9 +106,8 @@ 	withFilePath file $ \f -> do 		pokeArray ptr [atime, mtime] 		r <- syscall f ptr-		if (r /= 0)-			then throwErrno "touchBoth"-			else return ()+		when (r /= 0) $+			throwErrno "touchBoth" 	where 		syscall = if follow 			then c_lutimes
− Utility/Touch.o

binary file changed (8356 → absent bytes)

− Utility/Url.hi

binary file changed (3389 → absent bytes)

Utility/Url.hs view
@@ -17,13 +17,16 @@ import qualified Network.Browser as Browser import Network.HTTP import Network.URI+import Data.Either  type URLString = String +type Headers = [String]+ {- Checks that an url exists and could be successfully downloaded,  - also checking that its size, if available, matches a specified size. -}-check :: URLString -> Maybe Integer -> IO Bool-check url expected_size = handle <$> exists url+check :: URLString -> Headers -> Maybe Integer -> IO Bool+check url headers expected_size = handle <$> exists url headers 	where 		handle (False, _) = False 		handle (True, Nothing) = True@@ -31,12 +34,12 @@  {- Checks that an url exists and could be successfully downloaded,  - also returning its size if available. -}-exists :: URLString -> IO (Bool, Maybe Integer)-exists url =+exists :: URLString -> Headers -> IO (Bool, Maybe Integer)+exists url headers = 	case parseURI url of 		Nothing -> return (False, Nothing) 		Just u -> do-			r <- request u HEAD+			r <- request u headers HEAD 			case rspCode r of 				(2,_,_) -> return (True, size r) 				_ -> return (False, Nothing)@@ -50,26 +53,27 @@  - would not be appropriate to test at configure time and build support  - for only one in.  -}-download :: URLString -> [CommandParam] -> FilePath -> IO Bool-download url options file = ifM (inPath "wget") (wget , curl)+download :: URLString -> Headers -> [CommandParam] -> FilePath -> IO Bool+download url headers options file = ifM (inPath "wget") (wget , curl) 	where-		wget = go "wget" [Params "-c -O"]+		headerparams = map (\h -> Param $ "--header=" ++ h) headers+		wget = go "wget" $ headerparams ++ [Params "-c -O"] 		{- Uses the -# progress display, because the normal 		 - one is very confusing when resuming, showing 		 - the remainder to download as the whole file, 		 - and not indicating how much percent was 		 - downloaded before the resume. -}-		curl = go "curl" [Params "-L -C - -# -o"]+		curl = go "curl" $ headerparams ++ [Params "-L -C - -# -o"] 		go cmd opts = boolSystem cmd $ 			options++opts++[File file, File url]  {- Downloads a small file. -}-get :: URLString -> IO String-get url =+get :: URLString -> Headers -> IO String+get url headers = 	case parseURI url of 		Nothing -> error "url parse error" 		Just u -> do-			r <- request u GET+			r <- request u headers GET 			case rspCode r of 				(2,_,_) -> return $ rspBody r 				_ -> error $ rspReason r@@ -81,8 +85,8 @@  - This does its own redirect following because Browser's is buggy for HEAD  - requests.  -}-request :: URI -> RequestMethod -> IO (Response String)-request url requesttype = go 5 url+request :: URI -> Headers -> RequestMethod -> IO (Response String)+request url headers requesttype = go 5 url 	where 		go :: Int -> URI -> IO (Response String) 		go 0 _ = error "Too many redirects "@@ -91,11 +95,12 @@ 				Browser.setErrHandler ignore 				Browser.setOutHandler ignore 				Browser.setAllowRedirects False-				snd <$> Browser.request (mkRequest requesttype u :: Request_String)+				let req = mkRequest requesttype u :: Request_String+				snd <$> Browser.request (addheaders req) 			case rspCode rsp of 				(3,0,x) | x /= 5 -> redir (n - 1) u rsp 				_ -> return rsp-		ignore = const $ return ()+		ignore = const noop 		redir n u rsp = case retrieveHeaders HdrLocation rsp of 			[] -> return rsp 			(Header _ newu:_) ->@@ -104,3 +109,5 @@ 					Just newURI -> go n newURI_abs 						where 							newURI_abs = fromMaybe newURI (newURI `relativeTo` u)+		addheaders req = setHeaders req (rqHeaders req ++ userheaders)+		userheaders = rights $ map parseHeader headers
− Utility/Url.o

binary file changed (18436 → absent bytes)

− Utility/diskfree.o

binary file changed (1064 → absent bytes)

Utility/libdiskfree.c view
@@ -58,9 +58,10 @@ 	unsigned long long int available, blocksize; 	struct STATSTRUCT buf; -	errno = 0; 	if (STATCALL(path, &buf) != 0) 		return 0; /* errno is set */+	else+		errno = 0;  	available = buf.f_bavail; 	blocksize = buf.f_bsize;
− configure.hi

binary file changed (2502 → absent bytes)

− configure.o

binary file changed (37808 → absent bytes)

debian/changelog view
@@ -1,3 +1,18 @@+git-annex (3.20120430) unstable; urgency=low++  * Fix use of annex.diskreserve config setting.+  * Directory special remotes now check annex.diskreserve.+  * Support git's core.sharedRepository configuration.+  * Add annex.http-headers and annex.http-headers-command config+    settings, to allow custom headers to be sent with all HTTP requests.+    (Requested by the Internet Archive)+  * uninit: Clear annex.uuid from .git/config. Closes: #670639+  * Added shared cipher mode to encryptable special remotes. This option+    avoids gpg key distribution, at the expense of flexability, and with+    the requirement that all clones of the git repository be equally trusted.++ -- Joey Hess <joeyh@debian.org>  Mon, 30 Apr 2012 13:16:10 -0400+ git-annex (3.20120418) unstable; urgency=low    * bugfix: Adding a dotfile also caused all non-dotfiles to be added.
doc/encryption.mdwn view
@@ -33,3 +33,16 @@ possible to revoke that access, short of deleting the remote. See [[encryption_design|design/encryption]] for other security risks associated with encryption.++## shared cipher mode++Alternatively, you can configure git-annex to use a shared cipher to+encrypt data stored in a remote. This shared cipher is stored,+**unencrypted** in the git repository. So it's shared amoung every+clone of the git repository. The advantage is you don't need to set up gpg+keys. The disadvantage is that this is **insecure** unless you+trust every clone of the git repository with access to the encrypted data+stored in the special remote.++To use shared encryption, specify "encryption=shared" when first setting+up a special remote.
+ doc/forum/What_can_be_done_in_case_of_conflict.mdwn view
@@ -0,0 +1,7 @@+Hi,++How can I resolve the conflict when it occurs?++Suppose I have 2 branches (master, current), When I merge these branches or while doing cherry-pick, if I get conflict how can I resolve it?++Thank You
+ doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo.mdwn view
@@ -0,0 +1,17 @@+i'm getting errors in ``git annex fsck`` on a shared bare git repo with git-annex 3.20120418 local repo version 3:++``git-annex: ${PATH}/${MYREPO}.git/annex/objects/${HA}/${SH}/SHA1-${HASH}/SHA1-${HASH}: setFileMode: permission denied (Operation not permitted)``++the repository is shared among several users in a common group, and the repo is set up with sticky group, and with appropriate umasks, everything should work.++however, even with the file having permissions -rw-rw-r-- in the directory with permissions drwxrwsr-x, owned by someone else but by a group i'm currently in (as verified by issuing `groups`), i get said error message.++a strace reveals that the failing syscall is:++``[pid 17626] chmod("${FILENAME}", 0100555) = -1 EPERM (Operation not permitted)``++(maybe related: git annex looks for the file in another ${HA}/${SH} combination (of three digits instead of two digits each) before, i take it this is just a new feature not used by the data in my repo? also, i should add that the repository dates back to git-annex 0.13.)++as a workaround, i'm currently ``sudo chown``ing all files to me before the check.++why does fsck try to set permissions even if they are ok? is this a bug in my setup, and if yes, how is a shared repository set up correctly?
+ doc/forum/error_in_installation_of_base-4.5.0.0.mdwn view
@@ -0,0 +1,14 @@+Hi,++I was trying to install git-annex, but then, I got a warning saying that I need to install base-4.5.0.0 first.++So, I did "sudo cabal install base-4.5.0.0". Everything was going well, until I got this error:++config.status: error: cannot find input file: `base.buildinfo.in'+cabal: Error: some packages failed to install:+base-4.5.0.0 failed during the configure step. The exception was:+ExitFailure 1++I tried to look for information on the internet, but I did not find anything useful.++I know that this is not totally related to git-annex, but anyone has any thoughts on this?
+ doc/forum/retrieving_previous_versions.mdwn view
@@ -0,0 +1,7 @@+Hi,++This might be a stupid question, but I did not find any information about it.+Can I retrieve previous versions of a file?+Let's say, I wanna do a "git annex get file", but considering a specific commit id. Is it possible? Are all the versions of the files kept inside .git/annex/objects?++Thanks!
+ doc/forum/retrieving_previous_versions/comment_1_a4e83f688d4ec9177e7bf520f12ed26d._comment view
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="http://joey.kitenet.net/"+ nickname="joey"+ subject="comment 1"+ date="2012-04-24T21:14:15Z"+ content="""+To get to a specific version of a file, you need to have a tag or a branch that includes that version of the file. Check out the branch and `git annex get $file`. ++(Of course, even without a tag or branch, old file versions are retained, unless dropped with `unused`/`dropunused`.+So you could even `git checkout $COMMITID`.)+"""]]
+ doc/forum/wishlist:_simpler_gpg_usage.mdwn view
@@ -0,0 +1,10 @@+This is my current understanding on how one must use gpg with git-annex:++ * Generate(or copy around) a gpg key on every machine that needs to access the encrypted remote.+ * git annex initremote myremote encryption=KEY for each key that you generated++What I'm trying to figure out is if I can generate a no-passphrase gpg key and commit it to the repository, and have git-annex use that. That way any new clones of the annex automatically have access to any encrypted remotes, without having to do any key management.++I think I can generate a no-passphrase key, but then I still have to manually copy it around to each machine.++I'm not a huge gpg user so part of this is me wanting to avoid having to manage and keeping track of the keys.  This would probably be a non-issue if I used gpg on more machines and was more comfortable with it.
+ doc/forum/wishlist:_simpler_gpg_usage/comment_1_6923fa6ebc0bbe7d93edb1d01d7c46c5._comment view
@@ -0,0 +1,19 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo"+ nickname="Justin"+ subject="comment 1"+ date="2012-04-29T01:41:57Z"+ content="""+Thinking about this more, I think minimally git-annex could support a++    remote.<name>.gpg-options++or++    remote.<name>.gpg-keyring++for options to be passed to gpg.  I'm not sure how automatically setting it to $ANNEX_ROOT/.gnupg/.. would work.+++I need to read the encryption code to fully understand it, but I also wonder if there is not also a way to just bypass gpg entirely and store the remote-encryption keys locally in plain text.+"""]]
+ doc/forum/wishlist:_simpler_gpg_usage/comment_2_6fc874b6c391df242bd2592c4a65eae8._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joey.kitenet.net/"+ nickname="joey"+ subject="comment 2"+ date="2012-04-29T02:39:20Z"+ content="""+The encryption uses a symmetric cipher that is stored in the git repository already. It's just stored encrypted to the various gpg keys that have been configured to use it. It would certianly be possible to store the symmetric cipher unencrypted in the git repo. ++I don't see your idea of gpg-options saving any work. It would still require you to do key distribution and run commands in each repo to set it up.+"""]]
+ doc/forum/wishlist:_simpler_gpg_usage/comment_3_012f340c8c572fe598fc860c1046dabd._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joey.kitenet.net/"+ nickname="joey"+ subject="comment 3"+ date="2012-04-29T02:41:38Z"+ content="""+BTW re your Tweet.. I was so happy to be able to use 'c i a' in Crypto.hs. :)+"""]]
+ doc/forum/wishlist:_simpler_gpg_usage/comment_4_e0c2a13217b795964f3b630c001661ef._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo"+ nickname="Justin"+ subject="comment 4"+ date="2012-04-29T03:09:03Z"+ content="""+I got a good laugh out of it :-)++Storing the key unencrypted would make things easier..  I think at least for my use-cases I don't require another layer of protection on top of the ssh keys that provide access to the encrypted remotes themselves.+"""]]
+ doc/forum/wishlist:_simpler_gpg_usage/comment_5_9668b58eb71901e1db8da7db38e068ca._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joey.kitenet.net/"+ nickname="joey"+ subject="comment 5"+ date="2012-04-29T18:04:13Z"+ content="""+encryption=shared is now supported+"""]]
doc/git-annex.mdwn view
@@ -713,6 +713,16 @@   (wget is always used in preference to curl if available).   For example, to force ipv4 only, set it to "-4" +* `annex.http-headers`++  HTTP headers to send when downloading from the web. Multiple lines of+  this option can be set, one per header.++* `annex.http-headers-command`++  If set, the command is run and each line of its output is used as a HTTP+  header. This overrides annex.http-headers.+ * `remote.<name>.rsyncurl`    Used by rsync special remotes, this configures
doc/install/Fedora.mdwn view
@@ -4,7 +4,7 @@ sudo yum install ghc cabal-install git clone git://git-annex.branchable.com/ git-annex cd git-annex-git checkout ghc 7.0+git checkout ghc7.0 cabal update cabal install --only-dependencies cabal configure
+ doc/install/OSX/comment_4_e6109a964064a2a799768a370e57801d._comment view
@@ -0,0 +1,30 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkO9tsPZkAxEulq2pGCdwz4md-LqB0RcMw"+ nickname="Reimund"+ subject="Problems with Base & Crypto"+ date="2012-04-25T22:56:18Z"+ content="""+I got the following error message trying to install git-annex:++    cabal: cannot configure git-annex-3.20120418. It requires base >=4.5 && <5+    For the dependency on base >=4.5 && <5 there are these packages: base-4.5.0.0.+    However none of them are available.+    base-4.5.0.0 was excluded because of the top level dependency base -any++These are the steps I performed to make it work++1. Download [Ghc 7.4](http://www.haskell.org/ghc/download).+2. Run `sudo cabal install git-annex --bindir=$HOME/bin`.+3. Compilation of the Crypto-4.2.4 dependency failed since it's not updated to work with Ghc 7.4. You need to patch SHA2.hs (steps below).+4. Run `sudo cabal install git-annex --bindir=$HOME/bin` a second time.++The steps I did to patch the SHA2.hs file in Crypto-4.2.4:++1. `cabal unpack crypto-4.2.4`+2. `cd Crypto-4.2.4`+3. `patch -p1 < crypto-4.2.4-ghc-7.4.patch`+4. `sudo cabal install`.++PS: I used [this patchfile](http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/dev-haskell/crypto/files/crypto-4.2.4-ghc-7.4.patch?revision=1.1).+Then I did the last step a third time.+"""]]
doc/internals.mdwn view
@@ -39,6 +39,9 @@ 	e605dca6-446a-11e0-8b2a-002170d25c55 laptop timestamp=1317929189.157237s 	26339d22-446b-11e0-9101-002170d25c55 usb disk timestamp=1317929330.769997s +If there are multiple lines for the same uuid, the one with the most recent+timestamp wins. git-annex union merges this and other files.+ ## `remotes.log`  Holds persistent configuration settings for [[special_remotes]] such as@@ -80,7 +83,7 @@ These files are designed to be auto-merged using git's [[union merge driver|git-union-merge]]. The timestamps allow the most recent information to be identified. -## `remote/web/aaa/bbb/*.log`+## `aaa/bbb/*.log.web`  These log files record urls used by the [[web_special_remote|special_remotes/web]]. Their format is similar
− doc/news/version_3.20120309.mdwn
@@ -1,5 +0,0 @@-git-annex 3.20120309 released with [[!toggle text="these changes"]]-[[!toggleable text="""-   * Fix key directory hash calculation code to behave as it did before-     version 3.20120227 when a key contains non-ascii characters (only-     WORM backend is likely to have been affected)."""]]
+ doc/news/version_3.20120430.mdwn view
@@ -0,0 +1,12 @@+git-annex 3.20120430 released with [[!toggle text="these changes"]]+[[!toggleable text="""+   * Fix use of annex.diskreserve config setting.+   * Directory special remotes now check annex.diskreserve.+   * Support git's core.sharedRepository configuration.+   * Add annex.http-headers and annex.http-headers-command config+     settings, to allow custom headers to be sent with all HTTP requests.+     (Requested by the Internet Archive)+   * uninit: Clear annex.uuid from .git/config. Closes: #[670639](http://bugs.debian.org/670639)+   * Added shared cipher mode to encryptable special remotes. This option+     avoids gpg key distribution, at the expense of flexability, and with+     the requirement that all clones of the git repository be equally trusted."""]]
+ doc/todo/http_headers.mdwn view
@@ -0,0 +1,8 @@+The IA would find it useful to be able to control the http headers+git-annex get, addurl, etc uses. This will allow setting cookies, for+example.++* annex-web-headers=blah +* Perhaps also annex-web-headers-command=blah++[[done]]
git-annex.cabal view
@@ -1,5 +1,5 @@ Name: git-annex-Version: 3.20120418+Version: 3.20120430 Cabal-Version: >= 1.8 License: GPL Maintainer: Joey Hess <joey@kitenet.net>@@ -7,7 +7,7 @@ Stability: Stable Copyright: 2010-2012 Joey Hess License-File: GPL-Extra-Source-Files: ./debian/NEWS ./debian/control ./debian/rules ./debian/changelog ./debian/doc-base ./debian/copyright ./debian/compat ./Messages/JSON.hs ./Messages/JSON.o ./Messages/JSON.hi ./Git.o ./NEWS ./Option.hs ./Common.hi ./.ghci ./configure.hs ./Annex.hs ./Seek.hs ./Crypto.hs ./Common.hs ./README ./Command/Merge.hs ./Command/AddUrl.hs ./Command/Whereis.hs ./Command/Unlock.hs ./Command/Commit.hs ./Command/Version.hs ./Command/FromKey.hs ./Command/PreCommit.hs ./Command/Sync.hs ./Command/Map.hs ./Command/Unused.hs ./Command/Uninit.hs ./Command/ReKey.hs ./Command/Migrate.hs ./Command/Init.hs ./Command/ConfigList.hs ./Command/Trust.hs ./Command/Lock.hs ./Command/SendKey.hs ./Command/RecvKey.hs ./Command/Reinject.hs ./Command/Add.hs ./Command/Fix.hs ./Command/Untrust.hs ./Command/Dead.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/Log.hs ./Command/Unannex.hs ./Command/Status.hs ./Command/Copy.hs ./Init.hs ./Types.hs ./Common/Annex.hs ./Makefile ./configure.o ./Common.o ./git-annex.cabal ./Upgrade/V1.hs ./Upgrade/V2.hs ./Upgrade/V0.hs ./configure.hi ./GitAnnexShell.hs ./CHANGELOG ./Git/LsFiles.hs ./Git/Version.hs ./Git/Index.hi ./Git/UnionMerge.hs ./Git/Url.hs ./Git/HashObject.hs ./Git/Types.hs ./Git/CatFile.hs ./Git/Command.o ./Git/Command.hi ./Git/Queue.hs ./Git/Ref.hs ./Git/Filename.hs ./Git/Types.hi ./Git/Branch.hs ./Git/Sha.hs ./Git/Types.o ./Git/AutoCorrect.hs ./Git/LsTree.hs ./Git/Config.hs ./Git/CheckAttr.hs ./Git/Command.hs ./Git/Queue.o ./Git/Queue.hi ./Git/Construct.hs ./Git/Index.hs ./Git/Index.o ./doc/upgrades.mdwn ./doc/forum/Recommended_number_of_repositories.mdwn ./doc/forum/unlock__47__lock_always_gets_me.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/pure_git-annex_only_workflow/comment_4_dc8a3f75533906ad3756fcc47f7e96bb._comment ./doc/forum/pure_git-annex_only_workflow/comment_15_cb7c856d8141b2de3cc95874753f1ee5._comment ./doc/forum/pure_git-annex_only_workflow/comment_7_33db51096f568c65b22b4be0b5538c0d._comment ./doc/forum/pure_git-annex_only_workflow/comment_9_ace319652f9c7546883b5152ddc82591._comment ./doc/forum/pure_git-annex_only_workflow/comment_12_ca8ca35d6cd4a9f94568536736c12adc._comment ./doc/forum/pure_git-annex_only_workflow/comment_10_683768c9826b0bf0f267e8734b9eb872._comment ./doc/forum/pure_git-annex_only_workflow/comment_11_6b541ed834ef45606f3b98779a25a148._comment ./doc/forum/pure_git-annex_only_workflow/comment_14_b63568b327215ef8f646a39d760fdfc0._comment ./doc/forum/pure_git-annex_only_workflow/comment_8_6e5b42fdb7801daadc0b3046cbc3d51e._comment ./doc/forum/pure_git-annex_only_workflow/comment_1_a32f7efd18d174845099a4ed59e6feae._comment ./doc/forum/pure_git-annex_only_workflow/comment_13_00c82d320c7b4bb51078beba17e14dc8._comment ./doc/forum/pure_git-annex_only_workflow/comment_3_9b7d89da52f7ebb7801f9ec8545c3aba._comment ./doc/forum/pure_git-annex_only_workflow/comment_6_3660d45c5656f68924acbd23790024ee._comment ./doc/forum/pure_git-annex_only_workflow/comment_2_66dc9b65523a9912411db03c039ba848._comment ./doc/forum/pure_git-annex_only_workflow/comment_5_afe5035a6b35ed2c7e193fb69cc182e2._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:_git-annex_replicate/comment_4_63f24abf086d644dced8b01e1a9948c9._comment ./doc/forum/Podcast_syncing_use-case/comment_1_ace6f9d3a950348a3ac0ff592b62e786._comment ./doc/forum/Podcast_syncing_use-case/comment_2_930a6620b4d516e69ed952f9da5371bb._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/vlc_and_git-annex/comment_1_9c9ab8ce463cf74418aa2f385955f165._comment ./doc/forum/vlc_and_git-annex/comment_2_037f94c1deeac873dbdb36cd4c927e45._comment ./doc/forum/Recommended_number_of_repositories/comment_1_3ef256230756be8a9679b107cdbfd018._comment ./doc/forum/migration_to_git-annex_and_rsync.mdwn ./doc/forum/hashing_objects_directories.mdwn ./doc/forum/Sharing_annex_with_local_clones.mdwn ./doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis.mdwn ./doc/forum/unlock__47__lock_always_gets_me/comment_1_dee73a7ea3e1a5154601adb59782831f._comment ./doc/forum/git-subtree_support__63__.mdwn ./doc/forum/Podcast_syncing_use-case.mdwn ./doc/forum/Problem_with_bup:_cannot_lock_refs.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/location_tracking_cleanup.mdwn ./doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information.mdwn ./doc/forum/confusion_with_remotes__44___map.mdwn ./doc/forum/git-annex_on_OSX.mdwn ./doc/forum/A_really_stupid_question.mdwn ./doc/forum/post-copy__47__sync_hook.mdwn ./doc/forum/git_tag_missing_for_3.20111011/comment_1_7a53bf273f3078ab3351369ef2b5f2a6._comment ./doc/forum/version_3_upgrade/comment_1_05fc9c9cad26c520bebb98c852c71e35._comment ./doc/forum/example_of_massively_disconnected_operation.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/advantages_of_SHA__42___over_WORM/comment_1_96c354cac4b5ce5cf6664943bc84db1d._comment ./doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk.mdwn ./doc/forum/Behaviour_of_fsck.mdwn ./doc/forum/git_annex_add_crash_and_subsequent_recovery.mdwn ./doc/forum/Handling_web_special_remote_when_content_changes__63__.mdwn ./doc/forum/nfs_mounted_repo_results_in_errors_on_drop__47__move.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/git_pull_remote_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/git_pull_remote_git-annex/comment_7_24c45ee981b18bc78325c768242e635d._comment ./doc/forum/git_pull_remote_git-annex/comment_2_0f7f4a311b0ec1d89613e80847e69b42._comment ./doc/forum/git_pull_remote_git-annex/comment_1_9c245db3518d8b889ecdf5115ad9e053._comment ./doc/forum/git_pull_remote_git-annex/comment_5_4f2a05ef6551806dd0ec65372f183ca4._comment ./doc/forum/git_pull_remote_git-annex/comment_4_646f2077edcabc000a7d9cb75a93cf55._comment ./doc/forum/git_pull_remote_git-annex/comment_8_7e76ee9b6520cbffaf484c9299a63ad3._comment ./doc/forum/git_pull_remote_git-annex/comment_3_1aa89725b5196e40a16edeeb5ccfa371._comment ./doc/forum/git_pull_remote_git-annex/comment_6_3925d1aa56bce9380f712e238d63080f._comment ./doc/forum/Please_fix_compatibility_with_ghc_7.0.mdwn ./doc/forum/wishlist:_command_options_changes.mdwn ./doc/forum/location_tracking_cleanup/comment_3_c15428cec90e969284a5e690fb4b2fde._comment ./doc/forum/location_tracking_cleanup/comment_2_e7395cb6e01f42da72adf71ea3ebcde4._comment ./doc/forum/location_tracking_cleanup/comment_1_7d6319e8c94dfe998af9cfcbf170efb2._comment ./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/tell_us_how_you__39__re_using_git-annex.mdwn ./doc/forum/How_to_expire_old_versions_of_files_that_have_been_edited__63__.mdwn ./doc/forum/advantages_of_SHA__42___over_WORM.mdwn ./doc/forum/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults.mdwn ./doc/forum/cloud_services_to_support.mdwn ./doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set.mdwn ./doc/forum/Auto_archiving.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/How_to_handle_the_git-annex_branch__63__.mdwn ./doc/forum/Automatic_commit_messages_for_git_annex_sync.mdwn ./doc/forum/fsck_gives_false_positives.mdwn ./doc/forum/Preserving_file_access_rights_in_directory_tree_below_objects__47__.mdwn ./doc/forum/A_really_stupid_question/comment_1_40e02556de0b00b94f245a0196b5a89f._comment ./doc/forum/wishlist:_git_backend_for_git-annex.mdwn ./doc/forum/vlc_and_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/using_git_annex_to_merge_and_synchronize_2_directories___40__like_unison__41__.mdwn ./doc/forum/git_tag_missing_for_3.20111011.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/syncing_non-git_trees_with_git-annex.mdwn ./doc/forum/git-annex_communication_channels.mdwn ./doc/forum/fsck_gives_false_positives/comment_4_7ceb395bf8a2e6a041ccd8de63b1b6eb._comment ./doc/forum/fsck_gives_false_positives/comment_3_692d6d4cd2f75a497e7d314041a768d2._comment ./doc/forum/fsck_gives_false_positives/comment_5_86484a504c3bbcecd5876982b9c95688._comment ./doc/forum/fsck_gives_false_positives/comment_2_f51c53f3f6e6ee1ad463992657db5828._comment ./doc/forum/fsck_gives_false_positives/comment_1_b91070218b9d5fb687eeee1f244237ad._comment ./doc/forum/Sharing_annex_with_local_clones/comment_3_5359b8eada24d27be83214ac0ae62f23._comment ./doc/forum/Sharing_annex_with_local_clones/comment_1_2b60e13e5f7b8cee56cf2ddc6c47f64d._comment ./doc/forum/Sharing_annex_with_local_clones/comment_2_24ff2c1eb643077daa37c01644cebcd2._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/version_3_upgrade.mdwn ./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/confusion_with_remotes__44___map/comment_1_a38ded23b7f288292a843abcb1a56f38._comment ./doc/forum/confusion_with_remotes__44___map/comment_2_cd1c98b1276444e859a22c3dbd6f2a79._comment ./doc/forum/confusion_with_remotes__44___map/comment_6_496b0d9b86869bbac3a1356d53a3dda4._comment ./doc/forum/confusion_with_remotes__44___map/comment_5_27801584325d259fa490f67273f2ff71._comment ./doc/forum/confusion_with_remotes__44___map/comment_4_3b89b6d1518267fcbc050c9de038b9ca._comment ./doc/forum/confusion_with_remotes__44___map/comment_3_18531754089c991b6caefc57a5c17fe9._comment ./doc/forum/confusion_with_remotes__44___map/comment_7_9a456f61f956a3d5e81e723d5a90794c._comment ./doc/forum/--print0_option_as_in___34__find__34__.mdwn ./doc/forum/relying_on_git_for_numcopies.mdwn ./doc/forum/wishlist:_do_round_robin_downloading_of_data.mdwn ./doc/forum/pure_git-annex_only_workflow.mdwn ./doc/forum/post-copy__47__sync_hook/comment_1_c8322d4b9bbf5eac80b48c312a42fbcf._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/Can_I_store_normal_files_in_the_git-annex_git_repository__63__.mdwn ./doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__.mdwn ./doc/forum/windows_port__63__.mdwn ./doc/forum/windows_port__63__/comment_1_23fa9aa3b00940a1c1b3876c35eef019._comment ./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/forum/git-subtree_support__63__/comment_2_73d2a015b1ac79ec99e071a8b1e29034._comment ./doc/forum/git-subtree_support__63__/comment_1_4f333cb71ed1ff259bbfd86704806aa6._comment ./doc/forum/git-subtree_support__63__/comment_4_75b0e072e668aa46ff0a8d62a6620306._comment ./doc/forum/git-subtree_support__63__/comment_3_c533400e22c306c033fcd56e64761b0b._comment ./doc/forum/git-subtree_support__63__/comment_6_85df530f7b6d76b74ac8017c6034f95e._comment ./doc/forum/git-subtree_support__63__/comment_5_f5ec9649d9f1dc122e715de5533bc674._comment ./doc/backends.mdwn ./doc/bugs/__39__annex_add__39___fails_to___39__git_add__39___for_parent_relative_path.mdwn ./doc/bugs/uuid.log_trust.log_and_remote.log_merge_wackiness.mdwn ./doc/bugs/Remote_repo_and_set_operation_with_find.mdwn ./doc/bugs/softlink_mtime.mdwn ./doc/bugs/uninit_should_not_run_when_branch_git-annex_is_checked_out.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/dropunused_doesn__39__t_handle_double_spaces_in_filename.mdwn ./doc/bugs/add_script-friendly_output_options.mdwn ./doc/bugs/uninit_does_not_work_in_old_repos.mdwn ./doc/bugs/conq:_invalid_command_syntax.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/Cabal_dependency_monadIO_missing.mdwn ./doc/bugs/Problem_with_bup:_cannot_lock_refs.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/copy_doesn__39__t_scale.mdwn ./doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location.mdwn ./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/Build_error_on_Mac_OSX_10.6.mdwn ./doc/bugs/bare_git_repos.mdwn ./doc/bugs/nfs_mounted_repo_results_in_errors_on_drop_move.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/not_possible_to_have_annex_on_a_separate_filesystem.mdwn ./doc/bugs/Lost_S3_Remote.mdwn ./doc/bugs/unhappy_without_UTF8_locale.mdwn ./doc/bugs/S3_memory_leaks.mdwn ./doc/bugs/git_annex_map_has_problems_with_urls_containing___126__.mdwn ./doc/bugs/case-insensitive.mdwn ./doc/bugs/interrupting_migration_causes_problems.mdwn ./doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories.mdwn ./doc/bugs/cyclic_drop.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/wishlist:_more_descriptive_commit_messages_in_git-annex_branch.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/__34__make_test__34___fails_silently.mdwn ./doc/bugs/No_version_information_from_cli.mdwn ./doc/bugs/Error_while_adding_a_file___34__createSymbolicLink:_already_exists__34__.mdwn ./doc/bugs/conq:_invalid_command_syntax/comment_1_f33b83025ce974e496f83f248275a66a._comment ./doc/bugs/conq:_invalid_command_syntax/comment_2_195106ca8dedad5f4d755f625e38e8af._comment ./doc/bugs/conq:_invalid_command_syntax/comment_3_55af43e2f43a4c373f7a0a33678d0b1c._comment ./doc/bugs/old_data_isn__39__t_unused_after_migration.mdwn ./doc/bugs/fails_to_handle_lot_of_files.mdwn ./doc/bugs/tests_fail_when_there_is_no_global_.gitconfig_for_the_user.mdwn ./doc/bugs/configurable_path_to_git-annex-shell.mdwn ./doc/bugs/git_annex_initremote_walks_.git-annex.mdwn ./doc/bugs/copy_doesn__39__t_scale/comment_1_7c12499c9ac28a9883c029f8c659eb57._comment ./doc/bugs/copy_doesn__39__t_scale/comment_2_f85d8023cdbc203bb439644cf7245d4e._comment ./doc/bugs/copy_doesn__39__t_scale/comment_3_4592765c3d77bb5664b8d16867e9d79c._comment ./doc/bugs/signal_weirdness.mdwn ./doc/bugs/git-annex_incorrectly_parses_bare_IPv6_addresses.mdwn ./doc/bugs/git_annex_version_should_without_being_in_a_repo_.mdwn ./doc/bugs/Can__39__t___34__git-annex_get__34___with_3.20111203.mdwn ./doc/bugs/Prevent_accidental_merges/comment_1_4c46a193915eab8f308a04175cb2e40a._comment ./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/bad_behaviour_with_file_names_with_newline_in_them.mdwn ./doc/bugs/Lost_S3_Remote/comment_2_c99c65882a3924f4890e500f9492b442._comment ./doc/bugs/Lost_S3_Remote/comment_3_1e434d5a20a692cd9dc7f6f8f20f30dd._comment ./doc/bugs/Lost_S3_Remote/comment_1_6e80e6db6671581d471fc9a54181c04c._comment ./doc/bugs/on--git-dir_and_--work-tree_options.mdwn ./doc/bugs/Makefile_is_missing_dependancies.mdwn ./doc/bugs/test_suite_shouldn__39__t_fail_silently.mdwn ./doc/bugs/git_annex_upgrade_output_is_inconsistent_and_spammy.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/wishlist:_query_things_like_description__44___trust_level.mdwn ./doc/bugs/git_rename_detection_on_file_move/comment_9_75e0973f6d573df615e01005ebcea87d._comment ./doc/bugs/git_rename_detection_on_file_move/comment_7_7f20d0b2f6ed1c34021a135438037306._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_8_6a00500b24ba53248c78e1ffc8d1a591._comment ./doc/bugs/git_rename_detection_on_file_move/comment_2_7101d07400ad5935f880dc00d89bf90e._comment ./doc/bugs/git_rename_detection_on_file_move/comment_6_f63de6fe2f7189c8c2908cc41c4bc963._comment ./doc/bugs/git_rename_detection_on_file_move/comment_1_0531dcfa833b0321a7009526efe3df33._comment ./doc/bugs/fsck_claims_failed_checksum_when_less_copies_than_required_are_found.mdwn ./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/extraneous_shell_escaping_for_rsync_remotes.mdwn ./doc/bugs/problems_with_utf8_names/comment_1_3c7e3f021c2c94277eecf9c8af6cec5f._comment ./doc/bugs/problems_with_utf8_names/comment_7_0cc588f787d6eecfa19a8f6cee4b07b5._comment ./doc/bugs/problems_with_utf8_names/comment_8_ff5c6da9eadfee20c18c86b648a62c47._comment ./doc/bugs/problems_with_utf8_names/comment_4_93bee35f5fa7744834994bc7a253a6f9._comment ./doc/bugs/problems_with_utf8_names/comment_3_4f936a5d3f9c7df64c8a87e62b7fbfdc._comment ./doc/bugs/problems_with_utf8_names/comment_5_519cda534c7aea7f5ad5acd3f76e21fa._comment ./doc/bugs/problems_with_utf8_names/comment_6_52e0bfff2b177b6f92e226b25d2f3ff1._comment ./doc/bugs/problems_with_utf8_names/comment_2_bad4c4c5f54358d1bc0ab2adc713782a._comment ./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/Trouble_initializing_git_annex_on_NFS.mdwn ./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_add_memory_leak.mdwn ./doc/bugs/git-annex_branch_push_race.mdwn ./doc/bugs/wishlist:_allow_users_to_provide_UUID_when_running___96__git_annex_init__96__.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/Cabal_dependency_monadIO_missing/comment_2_4f4d8e1e00a2a4f7e8a8ab082e16adac._comment ./doc/bugs/Cabal_dependency_monadIO_missing/comment_1_14be660aa57fadec0d81b32a8b52c66f._comment ./doc/bugs/conflicting_haskell_packages.mdwn ./doc/bugs/git_command_line_constructed_by_unannex_command_has_tons_of_redundant_-a_paramters.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/unannex_command_doesn__39__t_all_files.mdwn ./doc/bugs/annex_unannex__47__uninit_should_handle_copies.mdwn ./doc/bugs/git-annex_branch_corruption.mdwn ./doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos.mdwn ./doc/bugs/show_version_without_having_to_be_in_a_git_repo.mdwn ./doc/bugs/Unfortunate_interaction_with_Calibre.mdwn ./doc/bugs/git_annex_add_..._adds_too_much.mdwn ./doc/bugs/error_propigation.mdwn ./doc/bugs/wishlist:_support_drop__44___find_on_special_remotes.mdwn ./doc/bugs/scp_interrupt_to_background.mdwn ./doc/bugs/copy_fast_confusing_with_broken_locationlog.mdwn ./doc/bugs/uninit_does_not_work_in_old_repos/comment_1_bc0619c6e17139df74639448aa6a0f72._comment ./doc/bugs/git-annex_losing_rsync_remotes_with_encryption_enabled.mdwn ./doc/bugs/configure_script_should_detect_uuidgen_instead_of_just_uuid.mdwn ./doc/bugs/check_for_curl_in_configure.hs.mdwn ./doc/bugs/fails_to_handle_lot_of_files/comment_1_09d8e4e66d8273fab611bd29e82dc7fc._comment ./doc/bugs/fails_to_handle_lot_of_files/comment_2_fd2ec05f4b5a7a6ae6bd9f5dbc3156de._comment ./doc/bugs/Name_scheme_does_not_follow_git__39__s_rules.mdwn ./doc/bugs/concurrent_git-annex_processes_can_lead_to_locking_issues.mdwn ./doc/bugs/Prevent_accidental_merges.mdwn ./doc/bugs/building_on_lenny.mdwn ./doc/bugs/case_sensitivity_on_FAT.mdwn ./doc/bugs/encrypted_S3_stalls.mdwn ./doc/bugs/support_bare_git_repo__44___with_the_annex_directory_exposed_to_http.mdwn ./doc/bugs/WORM:_Handle_long_filenames_correctly.mdwn ./doc/logo_small.png ./doc/tips.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.20120309.mdwn ./doc/news/version_3.20120405.mdwn ./doc/news/version_3.20120315.mdwn ./doc/news/version_3.20120406.mdwn ./doc/news/version_3.20120230/comment_2_899de1196cd1ba4a393e4ef574d7aa5e._comment ./doc/news/version_3.20120230/comment_1_b975cbd3a01ba5c2fa0f24fe739d3433._comment ./doc/news/Presentation_at_FOSDEM.mdwn ./doc/news/version_3.20120229/comment_5_7dbf131ff4611abbfc8fbf1ee0f66dbe._comment ./doc/news/version_3.20120229/comment_2_03436ddda42decf8cb1b4d5316d88a75._comment ./doc/news/version_3.20120229/comment_3_8f7f8d4758804f1b695925934219745a._comment ./doc/news/version_3.20120229/comment_4_cd90223f78571e5bdd3dfc07ab1369d7._comment ./doc/news/version_3.20120229/comment_1_18158b9be2313f49509d59295c7d3c90._comment ./doc/news/version_3.20120418.mdwn ./doc/news/LWN_article.mdwn ./doc/news/version_3.20120227/comment_2_ea5075cfecc50d5da2364931ef7a02d1._comment ./doc/news/version_3.20120227/comment_1_f8fc894680f2a2e5b5e757a677414b42._comment ./doc/news/version_3.20120106/comment_1_fb1a3135e2d9f39f2c372ccc2c50c85a._comment ./doc/news/version_3.20120106/comment_2_ae292ca7294b6790233e545086c3ac2f._comment ./doc/news/version_3.20120106/comment_3_29ccda9ac458fd5cc9ec5508c62df6ea._comment ./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/how_it_works.mdwn ./doc/sitemap.mdwn ./doc/users/joey.mdwn ./doc/users/fmarier.mdwn ./doc/users/chrysn.mdwn ./doc/users/gebi.mdwn ./doc/templates/walkthrough.tmpl ./doc/templates/bugtemplate.mdwn ./doc/templates/bare.tmpl ./doc/index.mdwn ./doc/sync/comment_1_59681be5568f568f5c54eb0445163dd2._comment ./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/redundancy_stats_in_status.mdwn ./doc/todo/auto_remotes/discussion.mdwn ./doc/todo/link_file_to_remote_repo_feature.mdwn ./doc/todo/file_copy_progress_bar.mdwn ./doc/todo/use_cp_reflink.mdwn ./doc/todo/gitrm.mdwn ./doc/todo/exclude_files_on_a_given_remote.mdwn ./doc/todo/git-annex_unused_eats_memory.mdwn ./doc/todo/Please_abort_build_if___34__make_test__34___fails.mdwn ./doc/todo/fsck_special_remotes.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/windows_support.mdwn ./doc/todo/optimise_git-annex_merge.mdwn ./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/Please_add_support_for_monad-control_0.3.x.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/gitolite_and_gitosis_support.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/avoid_unnecessary_union_merges.mdwn ./doc/todo/support_fsck_in_bare_repos.mdwn ./doc/todo/add_-all_option.mdwn ./doc/todo/using_url_backend.mdwn ./doc/todo/branching.mdwn ./doc/todo/automatic_bookkeeping_watch_command.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/sync.mdwn ./doc/copies.mdwn ./doc/repomap.png ./doc/scalability.mdwn ./doc/special_remotes.mdwn ./doc/todo.mdwn ./doc/walkthrough/using_ssh_remotes.mdwn ./doc/walkthrough/automatically_managing_content.mdwn ./doc/walkthrough/removing_files/comment_1_cb65e7c510b75be1c51f655b058667c6._comment ./doc/walkthrough/removing_files/comment_2_64709ea4558915edd5c8ca4486965b07._comment ./doc/walkthrough/moving_file_content_between_repositories.mdwn ./doc/walkthrough/modifying_annexed_files.mdwn ./doc/walkthrough/more.mdwn ./doc/walkthrough/removing_files.mdwn ./doc/walkthrough/creating_a_repository.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/syncing.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/backups.mdwn ./doc/walkthrough/transferring_files:_When_things_go_wrong.mdwn ./doc/GPL ./doc/logo.png ./doc/location_tracking.mdwn ./doc/design.mdwn ./doc/news.mdwn ./doc/tips/visualizing_repositories_with_gource/screenshot.jpg ./doc/tips/untrusted_repositories.mdwn ./doc/tips/using_box.com_as_a_special_remote.mdwn ./doc/tips/automatically_getting_files_on_checkout.mdwn ./doc/tips/what_to_do_when_a_repository_is_corrupted.mdwn ./doc/tips/Internet_Archive_via_S3.mdwn ./doc/tips/what_to_do_when_you_lose_a_repository.mdwn ./doc/tips/using_Amazon_S3.mdwn ./doc/tips/using_the_web_as_a_special_remote.mdwn ./doc/tips/assume-unstaged.mdwn ./doc/tips/powerful_file_matching.mdwn ./doc/tips/using_gitolite_with_git-annex.mdwn ./doc/tips/recover_data_from_lost+found.mdwn ./doc/tips/visualizing_repositories_with_gource.mdwn ./doc/tips/centralized_git_repository_tutorial.mdwn ./doc/tips/finding_duplicate_files/comment_1_ddb477ca242ffeb21e0df394d8fdf5d2._comment ./doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh.mdwn ./doc/tips/using_gitolite_with_git-annex/comment_4_eb81f824aadc97f098379c5f7e4fba4c._comment ./doc/tips/using_gitolite_with_git-annex/comment_6_3e203e010a4df5bf03899f867718adc5._comment ./doc/tips/using_gitolite_with_git-annex/comment_1_9a2a2a8eac9af97e0c984ad105763a73._comment ./doc/tips/using_gitolite_with_git-annex/comment_8_8249772c142117f88e37975d058aa936._comment ./doc/tips/using_gitolite_with_git-annex/comment_5_f688309532d2993630e9e72e87fb9c46._comment ./doc/tips/using_gitolite_with_git-annex/comment_7_f8fd08b6ab47378ad88c87348057220d._comment ./doc/tips/using_gitolite_with_git-annex/comment_3_807035f38509ccb9f93f1929ecd37417._comment ./doc/tips/using_gitolite_with_git-annex/comment_9_28418635a6ed7231b89e02211cd3c236._comment ./doc/tips/using_gitolite_with_git-annex/comment_2_d8efea4ab9576555fadbb47666ecefa9._comment ./doc/tips/finding_duplicate_files.mdwn ./doc/tips/centralised_repository:_starting_from_nothing.mdwn ./doc/tips/using_the_SHA1_backend.mdwn ./doc/tips/migrating_data_to_a_new_backend.mdwn ./doc/encryption.mdwn ./doc/not.mdwn ./doc/contact.mdwn ./doc/trust.mdwn ./doc/bare_repositories.mdwn ./doc/NixOS.mdwn ./doc/distributed_version_control.mdwn ./doc/install.mdwn ./doc/git-annex-shell.mdwn ./doc/bugs.mdwn ./doc/meta.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/testimonials.mdwn ./doc/users.mdwn ./doc/install/cabal.mdwn ./doc/install/Ubuntu.mdwn ./doc/install/Debian.mdwn ./doc/install/openSUSE.mdwn ./doc/install/OSX.mdwn ./doc/install/FreeBSD.mdwn ./doc/install/OSX/comment_1_0a1760bf0db1f1ba89bdb4c62032f631._comment ./doc/install/OSX/comment_3_47c682a779812dda77601c24a619923c._comment ./doc/install/OSX/comment_2_0327c64b15249596add635d26f4ce67f._comment ./doc/install/ArchLinux.mdwn ./doc/install/Debian/comment_2_648e3467e260cdf233acdb0b53313ce0._comment ./doc/install/Debian/comment_1_029486088d098c2d4f1099f2f0e701a9._comment ./doc/install/Fedora.mdwn ./doc/walkthrough.mdwn ./CmdLine.hs ./Messages.hs ./Setup.hs ./GPL ./mdwn2man ./Remote.hs ./git-annex.hs ./Locations.hs ./Usage.hs ./Backend/WORM.hs ./Backend/URL.hs ./Backend/SHA.hs ./Git.hi ./test.hs ./INSTALL ./Remote/Web.hs ./Remote/Helper/Encryptable.hs ./Remote/Helper/Ssh.hs ./Remote/Helper/Special.hs ./Remote/Helper/Hooks.hs ./Remote/Directory.hs ./Remote/List.hs ./Remote/Bup.hs ./Remote/Hook.hs ./Remote/S3.hs ./Remote/Rsync.hs ./Remote/Git.hs ./Build/SysConfig.o ./Build/TestConfig.hi ./Build/TestConfig.hs ./Build/SysConfig.hi ./Build/TestConfig.o ./Build/Configure.hs ./Upgrade.hs ./Annex/Version.hs ./Annex/Exception.hs ./Annex/Journal.hs ./Annex/CatFile.hs ./Annex/Ssh.hs ./Annex/Queue.hs ./Annex/Branch.hs ./Annex/UUID.hs ./Annex/LockPool.hs ./Annex/BranchState.hs ./Annex/CheckAttr.hs ./Annex/Content.hs ./git-union-merge.hs ./Utility/Path.hs ./Utility/Dot.hi ./Utility/Misc.o ./Utility/Matcher.hs ./Utility/Touch.hi ./Utility/Matcher.hi ./Utility/FileMode.o ./Utility/DataUnits.hi ./Utility/TempFile.hs ./Utility/JSONStream.hi ./Utility/JSONStream.o ./Utility/Touch.o ./Utility/State.hs ./Utility/Url.hs ./Utility/DataUnits.hs ./Utility/Exception.hi ./Utility/Dot.o ./Utility/TempFile.o ./Utility/Path.hi ./Utility/SafeCommand.hi ./Utility/FileSystemEncoding.o ./Utility/CoProcess.hs ./Utility/Exception.hs ./Utility/PartialPrelude.hi ./Utility/DataUnits.o ./Utility/Base64.o ./Utility/Monad.hs ./Utility/libdiskfree.c ./Utility/Format.o ./Utility/CopyFile.o ./Utility/Directory.o ./Utility/Inotify.hi ./Utility/TempFile.hi ./Utility/RsyncFile.hs ./Utility/CopyFile.hs ./Utility/State.hi ./Utility/Misc.hs ./Utility/Monad.hi ./Utility/Inotify.hs ./Utility/Exception.o ./Utility/SafeCommand.hs ./Utility/DiskFree.hs ./Utility/Directory.hi ./Utility/Gpg.hs ./Utility/diskfree.o ./Utility/CopyFile.hi ./Utility/Base64.hi ./Utility/RsyncFile.hi ./Utility/SafeCommand.o ./Utility/Directory.hs ./Utility/FileSystemEncoding.hs ./Utility/RsyncFile.o ./Utility/Misc.hi ./Utility/FileMode.hs ./Utility/PartialPrelude.o ./Utility/Format.hi ./Utility/Monad.o ./Utility/libdiskfree.h ./Utility/PartialPrelude.hs ./Utility/JSONStream.hs ./Utility/Dot.hs ./Utility/FileSystemEncoding.hi ./Utility/Url.hi ./Utility/State.o ./Utility/Url.o ./Utility/Touch.hsc ./Utility/Base64.hs ./Utility/FileMode.hi ./Utility/Format.hs ./Utility/Path.o ./Utility/Matcher.o ./Utility/Inotify.o ./Types/Option.hs ./Types/Crypto.hs ./Types/BranchState.o ./Types/BranchState.hi ./Types/UUID.o ./Types/UUID.hs ./Types/TrustLevel.o ./Types/TrustLevel.hs ./Types/Remote.hs ./Types/TrustLevel.hi ./Types/BranchState.hs ./Types/Command.hs ./Types/UUID.hi ./Types/Backend.hs ./Types/Key.hs ./Config.hs ./Checks.hs ./Command.hs ./.gitignore ./Backend.hs ./Logs/Web.hs ./Logs/UUIDBased.hs ./Logs/Trust.hs ./Logs/Location.hs ./Logs/UUID.hs ./Logs/Remote.hs ./Logs/Presence.hs ./.gitattributes ./Git.hs ./Limit.hs ./GitAnnex.hs+Extra-Source-Files: ./debian/NEWS ./debian/control ./debian/rules ./debian/changelog ./debian/doc-base ./debian/copyright ./debian/compat ./Messages/JSON.hs ./NEWS ./Option.hs ./.ghci ./configure.hs ./Annex.hs ./Seek.hs ./Crypto.hs ./Common.hs ./README ./Command/Merge.hs ./Command/AddUrl.hs ./Command/Whereis.hs ./Command/Unlock.hs ./Command/Commit.hs ./Command/Version.hs ./Command/FromKey.hs ./Command/PreCommit.hs ./Command/Sync.hs ./Command/Map.hs ./Command/Unused.hs ./Command/Uninit.hs ./Command/ReKey.hs ./Command/Migrate.hs ./Command/Init.hs ./Command/ConfigList.hs ./Command/Trust.hs ./Command/Lock.hs ./Command/SendKey.hs ./Command/RecvKey.hs ./Command/Reinject.hs ./Command/Add.hs ./Command/Fix.hs ./Command/Untrust.hs ./Command/Dead.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/Log.hs ./Command/Unannex.hs ./Command/Status.hs ./Command/Copy.hs ./Init.hs ./Types.hs ./Common/Annex.hs ./Makefile ./git-annex.cabal ./Upgrade/V1.hs ./Upgrade/V2.hs ./Upgrade/V0.hs ./GitAnnexShell.hs ./CHANGELOG ./Git/LsFiles.hs ./Git/Version.hs ./Git/UnionMerge.hs ./Git/Url.hs ./Git/HashObject.hs ./Git/Types.hs ./Git/SharedRepository.hs ./Git/CatFile.hs ./Git/Queue.hs ./Git/Ref.hs ./Git/Filename.hs ./Git/Branch.hs ./Git/Sha.hs ./Git/AutoCorrect.hs ./Git/LsTree.hs ./Git/Config.hs ./Git/CheckAttr.hs ./Git/Command.hs ./Git/Construct.hs ./Git/Index.hs ./doc/upgrades.mdwn ./doc/forum/Recommended_number_of_repositories.mdwn ./doc/forum/unlock__47__lock_always_gets_me.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/pure_git-annex_only_workflow/comment_4_dc8a3f75533906ad3756fcc47f7e96bb._comment ./doc/forum/pure_git-annex_only_workflow/comment_15_cb7c856d8141b2de3cc95874753f1ee5._comment ./doc/forum/pure_git-annex_only_workflow/comment_7_33db51096f568c65b22b4be0b5538c0d._comment ./doc/forum/pure_git-annex_only_workflow/comment_9_ace319652f9c7546883b5152ddc82591._comment ./doc/forum/pure_git-annex_only_workflow/comment_12_ca8ca35d6cd4a9f94568536736c12adc._comment ./doc/forum/pure_git-annex_only_workflow/comment_10_683768c9826b0bf0f267e8734b9eb872._comment ./doc/forum/pure_git-annex_only_workflow/comment_11_6b541ed834ef45606f3b98779a25a148._comment ./doc/forum/pure_git-annex_only_workflow/comment_14_b63568b327215ef8f646a39d760fdfc0._comment ./doc/forum/pure_git-annex_only_workflow/comment_8_6e5b42fdb7801daadc0b3046cbc3d51e._comment ./doc/forum/pure_git-annex_only_workflow/comment_1_a32f7efd18d174845099a4ed59e6feae._comment ./doc/forum/pure_git-annex_only_workflow/comment_13_00c82d320c7b4bb51078beba17e14dc8._comment ./doc/forum/pure_git-annex_only_workflow/comment_3_9b7d89da52f7ebb7801f9ec8545c3aba._comment ./doc/forum/pure_git-annex_only_workflow/comment_6_3660d45c5656f68924acbd23790024ee._comment ./doc/forum/pure_git-annex_only_workflow/comment_2_66dc9b65523a9912411db03c039ba848._comment ./doc/forum/pure_git-annex_only_workflow/comment_5_afe5035a6b35ed2c7e193fb69cc182e2._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:_git-annex_replicate/comment_4_63f24abf086d644dced8b01e1a9948c9._comment ./doc/forum/Podcast_syncing_use-case/comment_1_ace6f9d3a950348a3ac0ff592b62e786._comment ./doc/forum/Podcast_syncing_use-case/comment_2_930a6620b4d516e69ed952f9da5371bb._comment ./doc/forum/wishlist:_simpler_gpg_usage.mdwn ./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/vlc_and_git-annex/comment_1_9c9ab8ce463cf74418aa2f385955f165._comment ./doc/forum/vlc_and_git-annex/comment_2_037f94c1deeac873dbdb36cd4c927e45._comment ./doc/forum/Recommended_number_of_repositories/comment_1_3ef256230756be8a9679b107cdbfd018._comment ./doc/forum/migration_to_git-annex_and_rsync.mdwn ./doc/forum/hashing_objects_directories.mdwn ./doc/forum/Sharing_annex_with_local_clones.mdwn ./doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis.mdwn ./doc/forum/unlock__47__lock_always_gets_me/comment_1_dee73a7ea3e1a5154601adb59782831f._comment ./doc/forum/git-subtree_support__63__.mdwn ./doc/forum/Podcast_syncing_use-case.mdwn ./doc/forum/Problem_with_bup:_cannot_lock_refs.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/location_tracking_cleanup.mdwn ./doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information.mdwn ./doc/forum/confusion_with_remotes__44___map.mdwn ./doc/forum/git-annex_on_OSX.mdwn ./doc/forum/A_really_stupid_question.mdwn ./doc/forum/post-copy__47__sync_hook.mdwn ./doc/forum/wishlist:_simpler_gpg_usage/comment_4_e0c2a13217b795964f3b630c001661ef._comment ./doc/forum/wishlist:_simpler_gpg_usage/comment_2_6fc874b6c391df242bd2592c4a65eae8._comment ./doc/forum/wishlist:_simpler_gpg_usage/comment_5_9668b58eb71901e1db8da7db38e068ca._comment ./doc/forum/wishlist:_simpler_gpg_usage/comment_1_6923fa6ebc0bbe7d93edb1d01d7c46c5._comment ./doc/forum/wishlist:_simpler_gpg_usage/comment_3_012f340c8c572fe598fc860c1046dabd._comment ./doc/forum/git_tag_missing_for_3.20111011/comment_1_7a53bf273f3078ab3351369ef2b5f2a6._comment ./doc/forum/version_3_upgrade/comment_1_05fc9c9cad26c520bebb98c852c71e35._comment ./doc/forum/example_of_massively_disconnected_operation.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/advantages_of_SHA__42___over_WORM/comment_1_96c354cac4b5ce5cf6664943bc84db1d._comment ./doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk.mdwn ./doc/forum/error_in_installation_of_base-4.5.0.0.mdwn ./doc/forum/Behaviour_of_fsck.mdwn ./doc/forum/git_annex_add_crash_and_subsequent_recovery.mdwn ./doc/forum/Handling_web_special_remote_when_content_changes__63__.mdwn ./doc/forum/nfs_mounted_repo_results_in_errors_on_drop__47__move.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/git_pull_remote_git-annex.mdwn ./doc/forum/rsync_over_ssh__63__.mdwn ./doc/forum/retrieving_previous_versions.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/git_pull_remote_git-annex/comment_7_24c45ee981b18bc78325c768242e635d._comment ./doc/forum/git_pull_remote_git-annex/comment_2_0f7f4a311b0ec1d89613e80847e69b42._comment ./doc/forum/git_pull_remote_git-annex/comment_1_9c245db3518d8b889ecdf5115ad9e053._comment ./doc/forum/git_pull_remote_git-annex/comment_5_4f2a05ef6551806dd0ec65372f183ca4._comment ./doc/forum/git_pull_remote_git-annex/comment_4_646f2077edcabc000a7d9cb75a93cf55._comment ./doc/forum/git_pull_remote_git-annex/comment_8_7e76ee9b6520cbffaf484c9299a63ad3._comment ./doc/forum/git_pull_remote_git-annex/comment_3_1aa89725b5196e40a16edeeb5ccfa371._comment ./doc/forum/git_pull_remote_git-annex/comment_6_3925d1aa56bce9380f712e238d63080f._comment ./doc/forum/Please_fix_compatibility_with_ghc_7.0.mdwn ./doc/forum/wishlist:_command_options_changes.mdwn ./doc/forum/location_tracking_cleanup/comment_3_c15428cec90e969284a5e690fb4b2fde._comment ./doc/forum/location_tracking_cleanup/comment_2_e7395cb6e01f42da72adf71ea3ebcde4._comment ./doc/forum/location_tracking_cleanup/comment_1_7d6319e8c94dfe998af9cfcbf170efb2._comment ./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/tell_us_how_you__39__re_using_git-annex.mdwn ./doc/forum/How_to_expire_old_versions_of_files_that_have_been_edited__63__.mdwn ./doc/forum/advantages_of_SHA__42___over_WORM.mdwn ./doc/forum/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults.mdwn ./doc/forum/cloud_services_to_support.mdwn ./doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set.mdwn ./doc/forum/Auto_archiving.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/retrieving_previous_versions/comment_1_a4e83f688d4ec9177e7bf520f12ed26d._comment ./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/How_to_handle_the_git-annex_branch__63__.mdwn ./doc/forum/Automatic_commit_messages_for_git_annex_sync.mdwn ./doc/forum/fsck_gives_false_positives.mdwn ./doc/forum/Preserving_file_access_rights_in_directory_tree_below_objects__47__.mdwn ./doc/forum/A_really_stupid_question/comment_1_40e02556de0b00b94f245a0196b5a89f._comment ./doc/forum/wishlist:_git_backend_for_git-annex.mdwn ./doc/forum/vlc_and_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/using_git_annex_to_merge_and_synchronize_2_directories___40__like_unison__41__.mdwn ./doc/forum/git_tag_missing_for_3.20111011.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/syncing_non-git_trees_with_git-annex.mdwn ./doc/forum/git-annex_communication_channels.mdwn ./doc/forum/fsck_gives_false_positives/comment_4_7ceb395bf8a2e6a041ccd8de63b1b6eb._comment ./doc/forum/fsck_gives_false_positives/comment_3_692d6d4cd2f75a497e7d314041a768d2._comment ./doc/forum/fsck_gives_false_positives/comment_5_86484a504c3bbcecd5876982b9c95688._comment ./doc/forum/fsck_gives_false_positives/comment_2_f51c53f3f6e6ee1ad463992657db5828._comment ./doc/forum/fsck_gives_false_positives/comment_1_b91070218b9d5fb687eeee1f244237ad._comment ./doc/forum/Sharing_annex_with_local_clones/comment_3_5359b8eada24d27be83214ac0ae62f23._comment ./doc/forum/Sharing_annex_with_local_clones/comment_1_2b60e13e5f7b8cee56cf2ddc6c47f64d._comment ./doc/forum/Sharing_annex_with_local_clones/comment_2_24ff2c1eb643077daa37c01644cebcd2._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/version_3_upgrade.mdwn ./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/confusion_with_remotes__44___map/comment_1_a38ded23b7f288292a843abcb1a56f38._comment ./doc/forum/confusion_with_remotes__44___map/comment_2_cd1c98b1276444e859a22c3dbd6f2a79._comment ./doc/forum/confusion_with_remotes__44___map/comment_6_496b0d9b86869bbac3a1356d53a3dda4._comment ./doc/forum/confusion_with_remotes__44___map/comment_5_27801584325d259fa490f67273f2ff71._comment ./doc/forum/confusion_with_remotes__44___map/comment_4_3b89b6d1518267fcbc050c9de038b9ca._comment ./doc/forum/confusion_with_remotes__44___map/comment_3_18531754089c991b6caefc57a5c17fe9._comment ./doc/forum/confusion_with_remotes__44___map/comment_7_9a456f61f956a3d5e81e723d5a90794c._comment ./doc/forum/--print0_option_as_in___34__find__34__.mdwn ./doc/forum/What_can_be_done_in_case_of_conflict.mdwn ./doc/forum/relying_on_git_for_numcopies.mdwn ./doc/forum/wishlist:_do_round_robin_downloading_of_data.mdwn ./doc/forum/pure_git-annex_only_workflow.mdwn ./doc/forum/post-copy__47__sync_hook/comment_1_c8322d4b9bbf5eac80b48c312a42fbcf._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/__34__permission_denied__34___in_fsck_on_shared_repo.mdwn ./doc/forum/Can_I_store_normal_files_in_the_git-annex_git_repository__63__.mdwn ./doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__.mdwn ./doc/forum/windows_port__63__.mdwn ./doc/forum/windows_port__63__/comment_1_23fa9aa3b00940a1c1b3876c35eef019._comment ./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/forum/git-subtree_support__63__/comment_2_73d2a015b1ac79ec99e071a8b1e29034._comment ./doc/forum/git-subtree_support__63__/comment_1_4f333cb71ed1ff259bbfd86704806aa6._comment ./doc/forum/git-subtree_support__63__/comment_4_75b0e072e668aa46ff0a8d62a6620306._comment ./doc/forum/git-subtree_support__63__/comment_3_c533400e22c306c033fcd56e64761b0b._comment ./doc/forum/git-subtree_support__63__/comment_6_85df530f7b6d76b74ac8017c6034f95e._comment ./doc/forum/git-subtree_support__63__/comment_5_f5ec9649d9f1dc122e715de5533bc674._comment ./doc/backends.mdwn ./doc/bugs/__39__annex_add__39___fails_to___39__git_add__39___for_parent_relative_path.mdwn ./doc/bugs/uuid.log_trust.log_and_remote.log_merge_wackiness.mdwn ./doc/bugs/Remote_repo_and_set_operation_with_find.mdwn ./doc/bugs/softlink_mtime.mdwn ./doc/bugs/uninit_should_not_run_when_branch_git-annex_is_checked_out.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/dropunused_doesn__39__t_handle_double_spaces_in_filename.mdwn ./doc/bugs/add_script-friendly_output_options.mdwn ./doc/bugs/uninit_does_not_work_in_old_repos.mdwn ./doc/bugs/conq:_invalid_command_syntax.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/Cabal_dependency_monadIO_missing.mdwn ./doc/bugs/Problem_with_bup:_cannot_lock_refs.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/copy_doesn__39__t_scale.mdwn ./doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location.mdwn ./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/Build_error_on_Mac_OSX_10.6.mdwn ./doc/bugs/bare_git_repos.mdwn ./doc/bugs/nfs_mounted_repo_results_in_errors_on_drop_move.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/not_possible_to_have_annex_on_a_separate_filesystem.mdwn ./doc/bugs/Lost_S3_Remote.mdwn ./doc/bugs/unhappy_without_UTF8_locale.mdwn ./doc/bugs/S3_memory_leaks.mdwn ./doc/bugs/git_annex_map_has_problems_with_urls_containing___126__.mdwn ./doc/bugs/case-insensitive.mdwn ./doc/bugs/interrupting_migration_causes_problems.mdwn ./doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories.mdwn ./doc/bugs/cyclic_drop.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/wishlist:_more_descriptive_commit_messages_in_git-annex_branch.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/__34__make_test__34___fails_silently.mdwn ./doc/bugs/No_version_information_from_cli.mdwn ./doc/bugs/Error_while_adding_a_file___34__createSymbolicLink:_already_exists__34__.mdwn ./doc/bugs/conq:_invalid_command_syntax/comment_1_f33b83025ce974e496f83f248275a66a._comment ./doc/bugs/conq:_invalid_command_syntax/comment_2_195106ca8dedad5f4d755f625e38e8af._comment ./doc/bugs/conq:_invalid_command_syntax/comment_3_55af43e2f43a4c373f7a0a33678d0b1c._comment ./doc/bugs/old_data_isn__39__t_unused_after_migration.mdwn ./doc/bugs/fails_to_handle_lot_of_files.mdwn ./doc/bugs/tests_fail_when_there_is_no_global_.gitconfig_for_the_user.mdwn ./doc/bugs/configurable_path_to_git-annex-shell.mdwn ./doc/bugs/git_annex_initremote_walks_.git-annex.mdwn ./doc/bugs/copy_doesn__39__t_scale/comment_1_7c12499c9ac28a9883c029f8c659eb57._comment ./doc/bugs/copy_doesn__39__t_scale/comment_2_f85d8023cdbc203bb439644cf7245d4e._comment ./doc/bugs/copy_doesn__39__t_scale/comment_3_4592765c3d77bb5664b8d16867e9d79c._comment ./doc/bugs/signal_weirdness.mdwn ./doc/bugs/git-annex_incorrectly_parses_bare_IPv6_addresses.mdwn ./doc/bugs/git_annex_version_should_without_being_in_a_repo_.mdwn ./doc/bugs/Can__39__t___34__git-annex_get__34___with_3.20111203.mdwn ./doc/bugs/Prevent_accidental_merges/comment_1_4c46a193915eab8f308a04175cb2e40a._comment ./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/bad_behaviour_with_file_names_with_newline_in_them.mdwn ./doc/bugs/Lost_S3_Remote/comment_2_c99c65882a3924f4890e500f9492b442._comment ./doc/bugs/Lost_S3_Remote/comment_3_1e434d5a20a692cd9dc7f6f8f20f30dd._comment ./doc/bugs/Lost_S3_Remote/comment_1_6e80e6db6671581d471fc9a54181c04c._comment ./doc/bugs/on--git-dir_and_--work-tree_options.mdwn ./doc/bugs/Makefile_is_missing_dependancies.mdwn ./doc/bugs/test_suite_shouldn__39__t_fail_silently.mdwn ./doc/bugs/git_annex_upgrade_output_is_inconsistent_and_spammy.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/wishlist:_query_things_like_description__44___trust_level.mdwn ./doc/bugs/git_rename_detection_on_file_move/comment_9_75e0973f6d573df615e01005ebcea87d._comment ./doc/bugs/git_rename_detection_on_file_move/comment_7_7f20d0b2f6ed1c34021a135438037306._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_8_6a00500b24ba53248c78e1ffc8d1a591._comment ./doc/bugs/git_rename_detection_on_file_move/comment_2_7101d07400ad5935f880dc00d89bf90e._comment ./doc/bugs/git_rename_detection_on_file_move/comment_6_f63de6fe2f7189c8c2908cc41c4bc963._comment ./doc/bugs/git_rename_detection_on_file_move/comment_1_0531dcfa833b0321a7009526efe3df33._comment ./doc/bugs/fsck_claims_failed_checksum_when_less_copies_than_required_are_found.mdwn ./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/extraneous_shell_escaping_for_rsync_remotes.mdwn ./doc/bugs/problems_with_utf8_names/comment_1_3c7e3f021c2c94277eecf9c8af6cec5f._comment ./doc/bugs/problems_with_utf8_names/comment_7_0cc588f787d6eecfa19a8f6cee4b07b5._comment ./doc/bugs/problems_with_utf8_names/comment_8_ff5c6da9eadfee20c18c86b648a62c47._comment ./doc/bugs/problems_with_utf8_names/comment_4_93bee35f5fa7744834994bc7a253a6f9._comment ./doc/bugs/problems_with_utf8_names/comment_3_4f936a5d3f9c7df64c8a87e62b7fbfdc._comment ./doc/bugs/problems_with_utf8_names/comment_5_519cda534c7aea7f5ad5acd3f76e21fa._comment ./doc/bugs/problems_with_utf8_names/comment_6_52e0bfff2b177b6f92e226b25d2f3ff1._comment ./doc/bugs/problems_with_utf8_names/comment_2_bad4c4c5f54358d1bc0ab2adc713782a._comment ./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/Trouble_initializing_git_annex_on_NFS.mdwn ./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_add_memory_leak.mdwn ./doc/bugs/git-annex_branch_push_race.mdwn ./doc/bugs/wishlist:_allow_users_to_provide_UUID_when_running___96__git_annex_init__96__.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/Cabal_dependency_monadIO_missing/comment_2_4f4d8e1e00a2a4f7e8a8ab082e16adac._comment ./doc/bugs/Cabal_dependency_monadIO_missing/comment_1_14be660aa57fadec0d81b32a8b52c66f._comment ./doc/bugs/conflicting_haskell_packages.mdwn ./doc/bugs/git_command_line_constructed_by_unannex_command_has_tons_of_redundant_-a_paramters.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/unannex_command_doesn__39__t_all_files.mdwn ./doc/bugs/annex_unannex__47__uninit_should_handle_copies.mdwn ./doc/bugs/git-annex_branch_corruption.mdwn ./doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos.mdwn ./doc/bugs/show_version_without_having_to_be_in_a_git_repo.mdwn ./doc/bugs/Unfortunate_interaction_with_Calibre.mdwn ./doc/bugs/git_annex_add_..._adds_too_much.mdwn ./doc/bugs/error_propigation.mdwn ./doc/bugs/wishlist:_support_drop__44___find_on_special_remotes.mdwn ./doc/bugs/scp_interrupt_to_background.mdwn ./doc/bugs/copy_fast_confusing_with_broken_locationlog.mdwn ./doc/bugs/uninit_does_not_work_in_old_repos/comment_1_bc0619c6e17139df74639448aa6a0f72._comment ./doc/bugs/git-annex_losing_rsync_remotes_with_encryption_enabled.mdwn ./doc/bugs/configure_script_should_detect_uuidgen_instead_of_just_uuid.mdwn ./doc/bugs/check_for_curl_in_configure.hs.mdwn ./doc/bugs/fails_to_handle_lot_of_files/comment_1_09d8e4e66d8273fab611bd29e82dc7fc._comment ./doc/bugs/fails_to_handle_lot_of_files/comment_2_fd2ec05f4b5a7a6ae6bd9f5dbc3156de._comment ./doc/bugs/Name_scheme_does_not_follow_git__39__s_rules.mdwn ./doc/bugs/concurrent_git-annex_processes_can_lead_to_locking_issues.mdwn ./doc/bugs/Prevent_accidental_merges.mdwn ./doc/bugs/building_on_lenny.mdwn ./doc/bugs/case_sensitivity_on_FAT.mdwn ./doc/bugs/encrypted_S3_stalls.mdwn ./doc/bugs/support_bare_git_repo__44___with_the_annex_directory_exposed_to_http.mdwn ./doc/bugs/WORM:_Handle_long_filenames_correctly.mdwn ./doc/logo_small.png ./doc/tips.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.20120405.mdwn ./doc/news/version_3.20120315.mdwn ./doc/news/version_3.20120406.mdwn ./doc/news/version_3.20120230/comment_2_899de1196cd1ba4a393e4ef574d7aa5e._comment ./doc/news/version_3.20120230/comment_1_b975cbd3a01ba5c2fa0f24fe739d3433._comment ./doc/news/Presentation_at_FOSDEM.mdwn ./doc/news/version_3.20120229/comment_5_7dbf131ff4611abbfc8fbf1ee0f66dbe._comment ./doc/news/version_3.20120229/comment_2_03436ddda42decf8cb1b4d5316d88a75._comment ./doc/news/version_3.20120229/comment_3_8f7f8d4758804f1b695925934219745a._comment ./doc/news/version_3.20120229/comment_4_cd90223f78571e5bdd3dfc07ab1369d7._comment ./doc/news/version_3.20120229/comment_1_18158b9be2313f49509d59295c7d3c90._comment ./doc/news/version_3.20120418.mdwn ./doc/news/version_3.20120430.mdwn ./doc/news/LWN_article.mdwn ./doc/news/version_3.20120227/comment_2_ea5075cfecc50d5da2364931ef7a02d1._comment ./doc/news/version_3.20120227/comment_1_f8fc894680f2a2e5b5e757a677414b42._comment ./doc/news/version_3.20120106/comment_1_fb1a3135e2d9f39f2c372ccc2c50c85a._comment ./doc/news/version_3.20120106/comment_2_ae292ca7294b6790233e545086c3ac2f._comment ./doc/news/version_3.20120106/comment_3_29ccda9ac458fd5cc9ec5508c62df6ea._comment ./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/how_it_works.mdwn ./doc/sitemap.mdwn ./doc/users/joey.mdwn ./doc/users/fmarier.mdwn ./doc/users/chrysn.mdwn ./doc/users/gebi.mdwn ./doc/templates/walkthrough.tmpl ./doc/templates/bugtemplate.mdwn ./doc/templates/bare.tmpl ./doc/index.mdwn ./doc/sync/comment_1_59681be5568f568f5c54eb0445163dd2._comment ./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/redundancy_stats_in_status.mdwn ./doc/todo/auto_remotes/discussion.mdwn ./doc/todo/link_file_to_remote_repo_feature.mdwn ./doc/todo/file_copy_progress_bar.mdwn ./doc/todo/use_cp_reflink.mdwn ./doc/todo/gitrm.mdwn ./doc/todo/exclude_files_on_a_given_remote.mdwn ./doc/todo/git-annex_unused_eats_memory.mdwn ./doc/todo/Please_abort_build_if___34__make_test__34___fails.mdwn ./doc/todo/fsck_special_remotes.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/http_headers.mdwn ./doc/todo/smudge.mdwn ./doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment ./doc/todo/windows_support.mdwn ./doc/todo/optimise_git-annex_merge.mdwn ./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/Please_add_support_for_monad-control_0.3.x.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/gitolite_and_gitosis_support.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/avoid_unnecessary_union_merges.mdwn ./doc/todo/support_fsck_in_bare_repos.mdwn ./doc/todo/add_-all_option.mdwn ./doc/todo/using_url_backend.mdwn ./doc/todo/branching.mdwn ./doc/todo/automatic_bookkeeping_watch_command.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/sync.mdwn ./doc/copies.mdwn ./doc/repomap.png ./doc/scalability.mdwn ./doc/special_remotes.mdwn ./doc/todo.mdwn ./doc/walkthrough/using_ssh_remotes.mdwn ./doc/walkthrough/automatically_managing_content.mdwn ./doc/walkthrough/removing_files/comment_1_cb65e7c510b75be1c51f655b058667c6._comment ./doc/walkthrough/removing_files/comment_2_64709ea4558915edd5c8ca4486965b07._comment ./doc/walkthrough/moving_file_content_between_repositories.mdwn ./doc/walkthrough/modifying_annexed_files.mdwn ./doc/walkthrough/more.mdwn ./doc/walkthrough/removing_files.mdwn ./doc/walkthrough/creating_a_repository.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/syncing.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/backups.mdwn ./doc/walkthrough/transferring_files:_When_things_go_wrong.mdwn ./doc/GPL ./doc/logo.png ./doc/location_tracking.mdwn ./doc/design.mdwn ./doc/news.mdwn ./doc/tips/visualizing_repositories_with_gource/screenshot.jpg ./doc/tips/untrusted_repositories.mdwn ./doc/tips/using_box.com_as_a_special_remote.mdwn ./doc/tips/automatically_getting_files_on_checkout.mdwn ./doc/tips/what_to_do_when_a_repository_is_corrupted.mdwn ./doc/tips/Internet_Archive_via_S3.mdwn ./doc/tips/what_to_do_when_you_lose_a_repository.mdwn ./doc/tips/using_Amazon_S3.mdwn ./doc/tips/using_the_web_as_a_special_remote.mdwn ./doc/tips/assume-unstaged.mdwn ./doc/tips/powerful_file_matching.mdwn ./doc/tips/using_gitolite_with_git-annex.mdwn ./doc/tips/recover_data_from_lost+found.mdwn ./doc/tips/visualizing_repositories_with_gource.mdwn ./doc/tips/centralized_git_repository_tutorial.mdwn ./doc/tips/finding_duplicate_files/comment_1_ddb477ca242ffeb21e0df394d8fdf5d2._comment ./doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh.mdwn ./doc/tips/using_gitolite_with_git-annex/comment_4_eb81f824aadc97f098379c5f7e4fba4c._comment ./doc/tips/using_gitolite_with_git-annex/comment_6_3e203e010a4df5bf03899f867718adc5._comment ./doc/tips/using_gitolite_with_git-annex/comment_1_9a2a2a8eac9af97e0c984ad105763a73._comment ./doc/tips/using_gitolite_with_git-annex/comment_8_8249772c142117f88e37975d058aa936._comment ./doc/tips/using_gitolite_with_git-annex/comment_5_f688309532d2993630e9e72e87fb9c46._comment ./doc/tips/using_gitolite_with_git-annex/comment_7_f8fd08b6ab47378ad88c87348057220d._comment ./doc/tips/using_gitolite_with_git-annex/comment_3_807035f38509ccb9f93f1929ecd37417._comment ./doc/tips/using_gitolite_with_git-annex/comment_9_28418635a6ed7231b89e02211cd3c236._comment ./doc/tips/using_gitolite_with_git-annex/comment_2_d8efea4ab9576555fadbb47666ecefa9._comment ./doc/tips/finding_duplicate_files.mdwn ./doc/tips/centralised_repository:_starting_from_nothing.mdwn ./doc/tips/using_the_SHA1_backend.mdwn ./doc/tips/migrating_data_to_a_new_backend.mdwn ./doc/encryption.mdwn ./doc/not.mdwn ./doc/contact.mdwn ./doc/trust.mdwn ./doc/bare_repositories.mdwn ./doc/NixOS.mdwn ./doc/distributed_version_control.mdwn ./doc/install.mdwn ./doc/git-annex-shell.mdwn ./doc/bugs.mdwn ./doc/meta.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/testimonials.mdwn ./doc/users.mdwn ./doc/install/cabal.mdwn ./doc/install/Ubuntu.mdwn ./doc/install/Debian.mdwn ./doc/install/openSUSE.mdwn ./doc/install/OSX.mdwn ./doc/install/FreeBSD.mdwn ./doc/install/OSX/comment_4_e6109a964064a2a799768a370e57801d._comment ./doc/install/OSX/comment_1_0a1760bf0db1f1ba89bdb4c62032f631._comment ./doc/install/OSX/comment_3_47c682a779812dda77601c24a619923c._comment ./doc/install/OSX/comment_2_0327c64b15249596add635d26f4ce67f._comment ./doc/install/ArchLinux.mdwn ./doc/install/Debian/comment_2_648e3467e260cdf233acdb0b53313ce0._comment ./doc/install/Debian/comment_1_029486088d098c2d4f1099f2f0e701a9._comment ./doc/install/Fedora.mdwn ./doc/walkthrough.mdwn ./CmdLine.hs ./Messages.hs ./Setup.hs ./GPL ./mdwn2man ./Remote.hs ./git-annex.hs ./Locations.hs ./Usage.hs ./Backend/WORM.hs ./Backend/URL.hs ./Backend/SHA.hs ./test.hs ./INSTALL ./Remote/Web.hs ./Remote/Helper/Encryptable.hs ./Remote/Helper/Ssh.hs ./Remote/Helper/Special.hs ./Remote/Helper/Hooks.hs ./Remote/Directory.hs ./Remote/List.hs ./Remote/Bup.hs ./Remote/Hook.hs ./Remote/S3.hs ./Remote/Rsync.hs ./Remote/Git.hs ./Build/TestConfig.hs ./Build/Configure.hs ./Upgrade.hs ./Annex/Version.hs ./Annex/Exception.hs ./Annex/Journal.hs ./Annex/CatFile.hs ./Annex/Ssh.hs ./Annex/Queue.hs ./Annex/Branch.hs ./Annex/UUID.hs ./Annex/LockPool.hs ./Annex/BranchState.hs ./Annex/Perms.hs ./Annex/CheckAttr.hs ./Annex/Content.hs ./git-union-merge.hs ./Utility/Path.hs ./Utility/Matcher.hs ./Utility/TempFile.hs ./Utility/State.hs ./Utility/Url.hs ./Utility/DataUnits.hs ./Utility/CoProcess.hs ./Utility/Exception.hs ./Utility/Monad.hs ./Utility/libdiskfree.c ./Utility/RsyncFile.hs ./Utility/CopyFile.hs ./Utility/Misc.hs ./Utility/Inotify.hs ./Utility/SafeCommand.hs ./Utility/DiskFree.hs ./Utility/Gpg.hs ./Utility/Percentage.hs ./Utility/Directory.hs ./Utility/FileSystemEncoding.hs ./Utility/FileMode.hs ./Utility/libdiskfree.h ./Utility/PartialPrelude.hs ./Utility/JSONStream.hs ./Utility/Dot.hs ./Utility/Touch.hsc ./Utility/Base64.hs ./Utility/Format.hs ./Types/Option.hs ./Types/Crypto.hs ./Types/UUID.hs ./Types/Messages.hs ./Types/TrustLevel.hs ./Types/Remote.hs ./Types/BranchState.hs ./Types/Command.hs ./Types/Backend.hs ./Types/Key.hs ./Config.hs ./Checks.hs ./Command.hs ./.gitignore ./Backend.hs ./Logs/Web.hs ./Logs/UUIDBased.hs ./Logs/Trust.hs ./Logs/Location.hs ./Logs/UUID.hs ./Logs/Remote.hs ./Logs/Presence.hs ./.gitattributes ./Git.hs ./Limit.hs ./GitAnnex.hs Homepage: http://git-annex.branchable.com/ Build-type: Custom Category: Utility@@ -34,7 +34,7 @@   Build-Depends: MissingH, hslogger, directory, filepath,    unix, containers, utf8-string, network, mtl, bytestring, old-locale, time,    pcre-light, extensible-exceptions, dataenc, SHA, process, json, HTTP,-   base >= 4.5, base < 5, monad-control, transformers-base, lifted-base,+   base == 4.5.*, monad-control, transformers-base, lifted-base,    IfElse, text, QuickCheck >= 2.1, bloomfilter, edit-distance   Other-Modules: Utility.Touch   C-Sources: Utility/libdiskfree.c@@ -50,7 +50,7 @@   Build-Depends: testpack, HUnit, MissingH, hslogger, directory, filepath,    unix, containers, utf8-string, network, mtl, bytestring, old-locale, time,    pcre-light, extensible-exceptions, dataenc, SHA, process, json, HTTP,-   base >= 4.5, base < 5, monad-control, transformers-base, lifted-base,+   base == 4.5.*, monad-control, transformers-base, lifted-base,    IfElse, text, QuickCheck >= 2.1, bloomfilter, edit-distance   C-Sources: Utility/libdiskfree.c   Extensions: CPP
test.hs view
@@ -38,6 +38,7 @@ import qualified Remote import qualified Command.DropUnused import qualified Types.Key+import qualified Types.Messages import qualified Config import qualified Crypto import qualified Utility.Path@@ -720,10 +721,10 @@ -- are not run; this should only be used for actions that query state. annexeval :: Types.Annex a -> IO a annexeval a = do-	g <- Git.Construct.fromCurrent-	g' <- Git.Config.read g-	s <- Annex.new g'-	Annex.eval s { Annex.output = Annex.QuietOutput } a+	s <- Annex.new =<< Git.Config.read =<< Git.Construct.fromCurrent+	Annex.eval s $ do+		Annex.setOutput Types.Messages.QuietOutput+		a  innewrepo :: Assertion -> Assertion innewrepo a = withgitrepo $ \r -> indir r a