git-annex 3.20111122 → 3.20111203
raw patch · 54 files changed
+690/−225 lines, 54 filesdep −haskell98
Dependencies removed: haskell98
Files
- Annex/Branch.hs +4/−3
- Annex/Content.hs +12/−13
- Backend/SHA.hs +1/−1
- CHANGELOG +22/−0
- Command/Add.hs +2/−2
- Command/Dead.hs +32/−0
- Command/DropUnused.hs +2/−2
- Command/Fsck.hs +2/−2
- Command/Migrate.hs +1/−1
- Command/SendKey.hs +1/−1
- Command/Status.hs +1/−0
- Command/Unannex.hs +1/−1
- Command/Unlock.hs +2/−2
- Common.hs +2/−0
- Git.hs +5/−7
- GitAnnex.hs +4/−0
- Limit.hs +7/−0
- Locations.hs +63/−22
- Logs/Location.hs +10/−2
- Logs/Trust.hs +6/−3
- Messages.hs +1/−1
- Remote/Bup.hs +2/−2
- Remote/Directory.hs +32/−21
- Remote/Git.hs +19/−7
- Remote/Hook.hs +2/−2
- Remote/Rsync.hs +35/−31
- Remote/S3real.hs +2/−2
- Remote/Web.hs +2/−5
- Types/TrustLevel.hs +1/−1
- Utility/Directory.hs +51/−0
- Utility/Monad.hs +4/−0
- Utility/TempFile.hs +1/−1
- debian/changelog +22/−0
- doc/bugs/--git-dir_and_--work-tree_options.mdwn +0/−29
- doc/bugs/case_sensitivity_on_FAT.mdwn +49/−0
- doc/bugs/directory_remote_and_case_sensitivity_on_FAT.mdwn +0/−28
- doc/bugs/dropunused_doesn__39__t_handle_double_spaces_in_filename.mdwn +87/−0
- doc/bugs/not_possible_to_have_annex_on_a_separate_filesystem.mdwn +32/−0
- doc/bugs/on--git-dir_and_--work-tree_options.mdwn +29/−0
- doc/forum/Podcast_syncing_use-case.mdwn +34/−0
- doc/forum/Podcast_syncing_use-case/comment_1_ace6f9d3a950348a3ac0ff592b62e786._comment +10/−0
- doc/forum/Podcast_syncing_use-case/comment_2_930a6620b4d516e69ed952f9da5371bb._comment +8/−0
- doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk.mdwn +10/−1
- doc/git-annex.mdwn +14/−2
- doc/install/FreeBSD.mdwn +1/−1
- doc/internals.mdwn +2/−2
- doc/location_tracking.mdwn +2/−3
- doc/news/version_3.20111025.mdwn +0/−8
- doc/news/version_3.20111203.mdwn +19/−0
- doc/tips/what_to_do_when_you_lose_a_repository.mdwn +9/−9
- doc/todo/add_-all_option.mdwn +16/−0
- doc/trust.mdwn +9/−1
- git-annex.cabal +3/−3
- test.hs +2/−3
Annex/Branch.hs view
@@ -186,7 +186,7 @@ tryFastForwardTo [] = return True tryFastForwardTo (first:rest) = do -- First, check that the git-annex branch does not contain any- -- new commits that are in the first other branch. If it does,+ -- new commits that are not in the first other branch. If it does, -- cannot fast-forward. diverged <- changedBranch first fullname if diverged@@ -195,7 +195,8 @@ where no_ff = return False do_ff branch = do- inRepo $ Git.run "update-ref" [Param $ show fullname, Param $ show branch]+ inRepo $ Git.run "update-ref"+ [Param $ show fullname, Param $ show branch] return True findbest c [] = return $ Just c findbest c (r:rs)@@ -312,7 +313,7 @@ let jfile = journalFile g file let tmpfile = gitAnnexTmpDir g </> takeFileName jfile writeBinaryFile tmpfile content- renameFile tmpfile jfile+ moveFile tmpfile jfile {- Gets any journalled content for a file in the branch. -} getJournalFile :: FilePath -> Annex (Maybe String)
Annex/Content.hs view
@@ -43,12 +43,12 @@ {- Checks if a given key's content is currently present. -} inAnnex :: Key -> Annex Bool-inAnnex = inAnnex' doesFileExist+inAnnex = inAnnex' $ doesFileExist inAnnex' :: (FilePath -> IO a) -> Key -> Annex a inAnnex' a key = do whenM (fromRepo Git.repoIsUrl) $ error "inAnnex cannot check remote repo"- inRepo $ a . gitAnnexLocation key+ inRepo $ \g -> gitAnnexLocation key g >>= a {- A safer check; the key's content must not only be present, but - is not in the process of being removed. -}@@ -70,7 +70,7 @@ - it. (If the content is not present, no locking is done.) -} lockContent :: Key -> Annex a -> Annex a lockContent key a = do- file <- fromRepo $ gitAnnexLocation key+ file <- inRepo $ gitAnnexLocation key bracketIO (openForLock file True >>= lock) unlock a where lock Nothing = return Nothing@@ -100,9 +100,8 @@ calcGitLink file key = do cwd <- liftIO getCurrentDirectory let absfile = fromMaybe whoops $ absNormPath cwd file- top <- fromRepo Git.workTree- return $ relPathDirToFile (parentDir absfile) - top </> ".git" </> annexLocation key+ loc <- inRepo $ gitAnnexLocation key+ return $ relPathDirToFile (parentDir absfile) loc where whoops = error $ "unable to normalize " ++ file @@ -113,7 +112,7 @@ u <- getUUID logChange key u status -{- Runs an action, passing it a temporary filename to download,+{- Runs an action, passing it a temporary filename to get, - and if the action succeeds, moves the temp file into - the annex as a key's content. -} getViaTmp :: Key -> (FilePath -> Annex Bool) -> Annex Bool@@ -213,7 +212,7 @@ -} moveAnnex :: Key -> FilePath -> Annex () moveAnnex key src = do- dest <- fromRepo $ gitAnnexLocation key+ dest <- inRepo $ gitAnnexLocation key let dir = parentDir dest e <- liftIO $ doesFileExist dest if e@@ -221,13 +220,13 @@ else liftIO $ do createDirectoryIfMissing True dir allowWrite dir -- in case the directory already exists- renameFile src dest+ moveFile src dest preventWrite dest preventWrite dir withObjectLoc :: Key -> ((FilePath, FilePath) -> Annex a) -> Annex a withObjectLoc key a = do- file <- fromRepo $gitAnnexLocation key+ file <- inRepo $ gitAnnexLocation key let dir = parentDir file a (dir, file) @@ -243,20 +242,20 @@ fromAnnex key dest = withObjectLoc key $ \(dir, file) -> liftIO $ do allowWrite dir allowWrite file- renameFile file dest+ moveFile file dest removeDirectory dir {- Moves a key out of .git/annex/objects/ into .git/annex/bad, and - returns the file it was moved to. -} moveBad :: Key -> Annex FilePath moveBad key = do- src <- fromRepo $ gitAnnexLocation key+ src <- inRepo $ gitAnnexLocation key bad <- fromRepo gitAnnexBadDir let dest = bad </> takeFileName src liftIO $ do createDirectoryIfMissing True (parentDir dest) allowWrite (parentDir src)- renameFile src dest+ moveFile src dest removeDirectory (parentDir src) logStatus key InfoMissing return dest
Backend/SHA.hs view
@@ -99,7 +99,7 @@ checkKeyChecksum :: SHASize -> Key -> Annex Bool checkKeyChecksum size key = do fast <- Annex.getState Annex.fast- file <- fromRepo $ gitAnnexLocation key+ file <- inRepo $ gitAnnexLocation key present <- liftIO $ doesFileExist file if not present || fast then return True
CHANGELOG view
@@ -1,3 +1,25 @@+git-annex (3.20111203) unstable; urgency=low++ * The VFAT filesystem on recent versions of Linux, when mounted with+ shortname=mixed, does not get along well with git-annex's mixed case+ .git/annex/objects hash directories. To avoid this problem, new content+ is now stored in all-lowercase hash directories. Except for non-bare+ repositories which would be a pain to transition and cannot be put on FAT.+ (Old mixed-case hash directories are still tried for backwards+ compatibility.)+ * Flush json output, avoiding a buffering problem that could result in+ doubled output.+ * Avoid needing haskell98 and other fixes for new ghc. Thanks, Mark Wright.+ * Bugfix: dropunused did not drop keys with two spaces in their name.+ * Support for storing .git/annex on a different device than the rest of the+ git repository.+ * --inbackend can be used to make git-annex only operate on files+ whose content is stored using a specified key-value backend.+ * dead: A command which says that a repository is gone for good+ and you don't want git-annex to mention it again.++ -- Joey Hess <joeyh@debian.org> Sat, 03 Dec 2011 21:01:45 -0400+ git-annex (3.20111122) unstable; urgency=low * merge: Improve commit messages to mention what was merged.
Command/Add.hs view
@@ -60,8 +60,8 @@ -- fromAnnex could fail if the file ownership is weird tryharder :: IOException -> Annex () tryharder _ = do- src <- fromRepo $ gitAnnexLocation key- liftIO $ renameFile src file+ src <- inRepo $ gitAnnexLocation key+ liftIO $ moveFile src file cleanup :: FilePath -> Key -> Bool -> CommandCleanup cleanup file key hascontent = do
+ Command/Dead.hs view
@@ -0,0 +1,32 @@+{- git-annex command+ -+ - Copyright 2011 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Command.Dead where++import Common.Annex+import Command+import qualified Remote+import Logs.Trust++def :: [Command]+def = [command "dead" (paramRepeating paramRemote) seek+ "hide a lost repository"]++seek :: [CommandSeek]+seek = [withWords start]++start :: [String] -> CommandStart+start ws = do+ let name = unwords ws+ showStart "dead " name+ u <- Remote.nameToUUID name+ next $ perform u++perform :: UUID -> CommandPerform+perform uuid = do+ trustSet uuid DeadTrusted+ next $ return True
Command/DropUnused.hs view
@@ -73,6 +73,6 @@ then M.fromList . map parse . lines <$> liftIO (readFile f) else return M.empty where- parse line = (head ws, fromJust $ readKey $ unwords $ tail ws)+ parse line = (num, fromJust $ readKey $ tail rest) where- ws = words line+ (num, rest) = break (== ' ') line
Command/Fsck.hs view
@@ -87,7 +87,7 @@ -- Since we're checking that a key's file is present, throw -- in a permission fixup here too. when present $ do- f <- fromRepo $ gitAnnexLocation key+ f <- inRepo $ gitAnnexLocation key liftIO $ do preventWrite f preventWrite (parentDir f)@@ -118,7 +118,7 @@ - the key's metadata, if available. -} checkKeySize :: Key -> Annex Bool checkKeySize key = do- file <- fromRepo $ gitAnnexLocation key+ file <- inRepo $ gitAnnexLocation key present <- liftIO $ doesFileExist file case (present, Types.Key.keySize key) of (_, Nothing) -> return True
Command/Migrate.hs view
@@ -49,7 +49,7 @@ -} perform :: FilePath -> Key -> Backend Annex -> CommandPerform perform file oldkey newbackend = do- src <- fromRepo $ gitAnnexLocation oldkey+ src <- inRepo $ gitAnnexLocation oldkey tmp <- fromRepo gitAnnexTmpDir let tmpfile = tmp </> takeFileName file cleantmp tmpfile
Command/SendKey.hs view
@@ -21,7 +21,7 @@ start :: Key -> CommandStart start key = do- file <- fromRepo $ gitAnnexLocation key+ file <- inRepo $ gitAnnexLocation key whenM (inAnnex key) $ liftIO $ rsyncServerSend file -- does not return warning "requested key is not present"
Command/Status.hs view
@@ -58,6 +58,7 @@ , remote_list Trusted "trusted" , remote_list SemiTrusted "semitrusted" , remote_list UnTrusted "untrusted"+ , remote_list DeadTrusted "dead" ] slow_stats :: [Stat] slow_stats =
Command/Unannex.hs view
@@ -55,7 +55,7 @@ if fast then do -- fast mode: hard link to content in annex- src <- fromRepo $ gitAnnexLocation key+ src <- inRepo $ gitAnnexLocation key liftIO $ do createLink src file allowWrite file
Command/Unlock.hs view
@@ -37,7 +37,7 @@ checkDiskSpace key - src <- fromRepo $ gitAnnexLocation key+ src <- inRepo $ gitAnnexLocation key tmpdest <- fromRepo $ gitAnnexTmpLocation key liftIO $ createDirectoryIfMissing True (parentDir tmpdest) showAction "copying"@@ -46,7 +46,7 @@ then do liftIO $ do removeFile dest- renameFile tmpdest dest+ moveFile tmpdest dest allowWrite dest next $ return True else error "copy failed!"
Common.hs view
@@ -23,3 +23,5 @@ import Utility.Conditional as X import Utility.SafeCommand as X import Utility.Path as X+import Utility.Directory as X+import Utility.Monad as X
Git.hs view
@@ -72,7 +72,7 @@ import System.Posix.Directory import System.Posix.User-import IO (bracket_, try)+import Control.Exception (bracket_) import qualified Data.Map as M hiding (map, split) import Network.URI import Data.Char@@ -438,12 +438,12 @@ - index file. -} useIndex :: FilePath -> IO (IO ()) useIndex index = do- res <- try $ getEnv var+ res <- getEnv var setEnv var index True return $ reset res where var = "GIT_INDEX_FILE"- reset (Right (Just v)) = setEnv var v True+ reset (Just v) = setEnv var v True reset _ = unsetEnv var {- Runs an action that causes a git subcommand to emit a sha, and strips@@ -484,10 +484,8 @@ {- Cannot use pipeRead because it relies on the config having been already read. Instead, chdir to the repo. -} cwd <- getCurrentDirectory- bracket_ (changeWorkingDirectory d)- (\_ -> changeWorkingDirectory cwd) $- pOpen ReadFromPipe "git" ["config", "--list"] $- hConfigRead repo+ bracket_ (changeWorkingDirectory d) (changeWorkingDirectory cwd) $+ pOpen ReadFromPipe "git" ["config", "--list"] $ hConfigRead repo configRead r = assertLocal r $ error "internal" {- Reads git config from a handle and populates a repo with it. -}
GitAnnex.hs view
@@ -46,6 +46,7 @@ import qualified Command.Trust import qualified Command.Untrust import qualified Command.Semitrust+import qualified Command.Dead import qualified Command.AddUrl import qualified Command.Map import qualified Command.Upgrade@@ -70,6 +71,7 @@ , Command.Trust.def , Command.Untrust.def , Command.Semitrust.def+ , Command.Dead.def , Command.AddUrl.def , Command.FromKey.def , Command.DropKey.def@@ -111,6 +113,8 @@ "skip files not present in a remote" , Option ['C'] ["copies"] (ReqArg Limit.addCopies paramNumber) "skip files with fewer copies"+ , Option ['B'] ["inbackend"] (ReqArg Limit.addInBackend paramName)+ "skip files not using a key-value backend" ] ++ matcherOptions where setto v = Annex.changeState $ \s -> s { Annex.toremote = Just v }
Limit.hs view
@@ -88,3 +88,10 @@ handle n (Just (key, _)) = do us <- keyLocations key return $ length us >= n++{- Adds a limit to skip files not using a specified key-value backend. -}+addInBackend :: String -> Annex ()+addInBackend name = addLimit $ Backend.lookupFile >=> check+ where+ wanted = Backend.lookupBackendName name+ check = return . maybe False ((==) wanted . snd)
Locations.hs view
@@ -1,6 +1,6 @@ {- git-annex file locations -- - Copyright 2010 Joey Hess <joey@kitenet.net>+ - Copyright 2010-2011 Joey Hess <joey@kitenet.net> - - Licensed under the GNU GPL version 3 or higher. -}@@ -8,8 +8,9 @@ module Locations ( keyFile, fileKey,+ keyPaths, gitAnnexLocation,- annexLocation,+ annexLocations, gitAnnexDir, gitAnnexObjectDir, gitAnnexTmpDir,@@ -20,14 +21,15 @@ gitAnnexJournalDir, gitAnnexJournalLock, isLinkToAnnex,+ annexHashes, hashDirMixed, hashDirLower, prop_idempotent_fileKey ) where -import Bits-import Word+import Data.Bits+import Data.Word import Data.Hash.MD5 import Common@@ -58,17 +60,36 @@ objectDir :: FilePath objectDir = addTrailingPathSeparator $ annexDir </> "objects" -{- Annexed file's location relative to the .git directory. -}-annexLocation :: Key -> FilePath-annexLocation key = objectDir </> hashDirMixed key </> f </> f- where- f = keyFile key+{- Annexed file's possible locations relative to the .git directory.+ - There are two different possibilities, using different hashes. -}+annexLocations :: Key -> [FilePath]+annexLocations key = map (annexLocation key) annexHashes+annexLocation :: Key -> Hasher -> FilePath+annexLocation key hasher = objectDir </> keyPath key hasher -{- Annexed file's absolute location in a repository. -}-gitAnnexLocation :: Key -> Git.Repo -> FilePath+{- Annexed file's absolute location in a repository.+ -+ - When there are multiple possible locations, returns the one where the+ - file is actually present.+ -+ - When the file is not present, returns the location where the file should+ - be stored.+ -}+gitAnnexLocation :: Key -> Git.Repo -> IO FilePath gitAnnexLocation key r- | Git.repoIsLocalBare r = Git.workTree r </> annexLocation key- | otherwise = Git.workTree r </> ".git" </> annexLocation key+ | Git.repoIsLocalBare r =+ {- Bare repositories default to hashDirLower for new+ - content, as it's more portable. -}+ go (Git.workTree r) (annexLocations key)+ | otherwise =+ {- Non-bare repositories only use hashDirMixed, so+ - don't need to do any work to check if the file is+ - present. -}+ return $ Git.workTree r </> ".git" </>+ annexLocation key hashDirMixed+ where+ go dir locs = fromMaybe (dir </> head locs) <$> check dir locs+ check dir = firstM $ \f -> doesFileExist $ dir </> f {- The annex directory of a repository. -} gitAnnexDir :: Git.Repo -> FilePath@@ -76,8 +97,7 @@ | Git.repoIsLocalBare r = addTrailingPathSeparator $ Git.workTree r </> annexDir | otherwise = addTrailingPathSeparator $ Git.workTree r </> ".git" </> annexDir -{- The part of the annex directory where file contents are stored.- -}+{- The part of the annex directory where file contents are stored. -} gitAnnexObjectDir :: Git.Repo -> FilePath gitAnnexObjectDir r | Git.repoIsLocalBare r = addTrailingPathSeparator $ Git.workTree r </> objectDir@@ -116,7 +136,7 @@ isLinkToAnnex :: FilePath -> Bool isLinkToAnnex s = ("/.git/" ++ objectDir) `isInfixOf` s -{- Converts a key into a filename fragment.+{- Converts a key into a filename fragment without any directory. - - Escape "/" in the key name, to keep a flat tree of files and avoid - issues with keys containing "/../" or ending with "/" etc. @@ -132,6 +152,22 @@ keyFile key = replace "/" "%" $ replace ":" "&c" $ replace "%" "&s" $ replace "&" "&a" $ show key +{- A location to store a key on the filesystem. A directory hash is used,+ - to protect against filesystems that dislike having many items in a+ - single directory.+ -+ - The file is put in a directory with the same name, this allows+ - write-protecting the directory to avoid accidental deletion of the file.+ -}+keyPath :: Key -> Hasher -> FilePath+keyPath key hasher = hasher key </> f </> f+ where+ f = keyFile key++{- All possibile locations to store a key using different directory hashes. -}+keyPaths :: Key -> [FilePath]+keyPaths key = map (keyPath key) annexHashes+ {- Reverses keyFile, converting a filename fragment (ie, the basename of - the symlink target) into a key. -} fileKey :: FilePath -> Maybe Key@@ -144,17 +180,22 @@ prop_idempotent_fileKey s = Just k == fileKey (keyFile k) where k = stubKey { keyName = s, keyBackendName = "test" } -{- Given a key, generates a short directory name to put it in,- - to do hashing to protect against filesystems that dislike having- - many items in a single directory. -}-hashDirMixed :: Key -> FilePath+{- Two different directory hashes may be used. The mixed case hash+ - came first, and is fine, except for the problem of case-strict+ - filesystems such as Linux VFAT (mounted with shortname=mixed),+ - which do not allow using a directory "XX" when "xx" already exists.+ - To support that, most repositories use the lower case hash for new data. -}+type Hasher = Key -> FilePath+annexHashes :: [Hasher]+annexHashes = [hashDirLower, hashDirMixed]++hashDirMixed :: Hasher hashDirMixed k = addTrailingPathSeparator $ take 2 dir </> drop 2 dir where dir = take 4 $ display_32bits_as_dir =<< [a,b,c,d] ABCD (a,b,c,d) = md5 $ Str $ show k -{- Generates a hash directory that is all lower case. -}-hashDirLower :: Key -> FilePath+hashDirLower :: Hasher hashDirLower k = addTrailingPathSeparator $ take 3 dir </> drop 3 dir where dir = take 6 $ md5s $ Str $ show k
Logs/Location.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE BangPatterns #-}+ {- git-annex location log - - git-annex keeps track of which repositories have the contents of annexed@@ -25,6 +27,7 @@ import Common.Annex import qualified Annex.Branch import Logs.Presence+import Logs.Trust {- Log a change in the presence of a key's value in a repository. -} logChange :: Key -> UUID -> LogStatus -> Annex ()@@ -32,9 +35,14 @@ logChange _ NoUUID _ = return () {- Returns a list of repository UUIDs that, according to the log, have- - the value of a key. -}+ - the value of a key.+ -+ - Dead repositories are skipped.+ -} keyLocations :: Key -> Annex [UUID]-keyLocations key = map toUUID <$> (currentLog . logFile) key+keyLocations key = do+ l <- map toUUID <$> (currentLog . logFile) key+ snd <$> trustPartition DeadTrusted l {- Finds all keys that have location log information. - (There may be duplicate keys in the list.) -}
Logs/Trust.hs view
@@ -38,7 +38,8 @@ | level == SemiTrusted = do t <- trustGet Trusted u <- trustGet UnTrusted- let uncandidates = t ++ u+ d <- trustGet DeadTrusted+ let uncandidates = t ++ u ++ d return $ partition (`notElem` uncandidates) ls | otherwise = do candidates <- trustGet level@@ -67,12 +68,14 @@ w = words s parse "1" = Trusted parse "0" = UnTrusted+ parse "X" = DeadTrusted parse _ = SemiTrusted showTrust :: TrustLevel -> String-showTrust SemiTrusted = "?"-showTrust UnTrusted = "0" showTrust Trusted = "1"+showTrust UnTrusted = "0"+showTrust DeadTrusted = "X"+showTrust SemiTrusted = "?" {- Changes the trust level for a uuid in the trustLog. -} trustSet :: UUID -> TrustLevel -> Annex ()
Messages.hs view
@@ -129,7 +129,7 @@ where go Annex.NormalOutput = liftIO normal go Annex.QuietOutput = q- go Annex.JSONOutput = liftIO json+ go Annex.JSONOutput = liftIO $ flushed $ json q :: Monad m => m () q = return ()
Remote/Bup.hs view
@@ -102,13 +102,13 @@ store :: Git.Repo -> BupRepo -> Key -> Annex Bool store r buprepo k = do- src <- fromRepo $ gitAnnexLocation k+ src <- inRepo $ gitAnnexLocation k params <- bupSplitParams r buprepo k (File src) liftIO $ boolSystem "bup" params storeEncrypted :: Git.Repo -> BupRepo -> (Cipher, Key) -> Key -> Annex Bool storeEncrypted r buprepo (cipher, enck) k = do- src <- fromRepo $ gitAnnexLocation k+ src <- inRepo $ gitAnnexLocation k params <- bupSplitParams r buprepo enck (Param "-") liftIO $ catchBoolIO $ withEncryptedHandle cipher (L.readFile src) $ \h ->
Remote/Directory.hs view
@@ -62,56 +62,67 @@ gitConfigSpecialRemote u c' "directory" dir return $ M.delete "directory" c' -dirKey :: FilePath -> Key -> FilePath-dirKey d k = d </> hashDirMixed k </> f </> f+{- Locations to try to access a given Key in the Directory. -}+locations :: FilePath -> Key -> [FilePath]+locations d k = map (d </>) (keyPaths k)++withCheckedFile :: (FilePath -> IO Bool) -> FilePath -> Key -> (FilePath -> IO Bool) -> IO Bool+withCheckedFile _ [] _ _ = return False+withCheckedFile check d k a = go $ locations d k where- f = keyFile k+ go [] = return False+ go (f:fs) = do+ use <- check f+ if use+ then a f+ else go fs +withStoredFile :: FilePath -> Key -> (FilePath -> IO Bool) -> IO Bool+withStoredFile = withCheckedFile doesFileExist+ store :: FilePath -> Key -> Annex Bool store d k = do- src <- fromRepo $ gitAnnexLocation k- let dest = dirKey d k- liftIO $ catchBoolIO $ storeHelper dest $ copyFileExternal src dest+ src <- inRepo $ gitAnnexLocation k+ liftIO $ catchBoolIO $ storeHelper d k $ copyFileExternal src storeEncrypted :: FilePath -> (Cipher, Key) -> Key -> Annex Bool storeEncrypted d (cipher, enck) k = do- src <- fromRepo $ gitAnnexLocation k- let dest = dirKey d enck- liftIO $ catchBoolIO $ storeHelper dest $ encrypt src dest+ src <- inRepo $ gitAnnexLocation k+ liftIO $ catchBoolIO $ storeHelper d enck $ encrypt src where encrypt src dest = do withEncryptedContent cipher (L.readFile src) $ L.writeFile dest return True -storeHelper :: FilePath -> IO Bool -> IO Bool-storeHelper dest a = do+storeHelper :: FilePath -> Key -> (FilePath -> IO Bool) -> IO Bool+storeHelper d key a = do+ let dest = head $ locations d key let dir = parentDir dest createDirectoryIfMissing True dir- allowWrite dir - ok <- a+ allowWrite dir+ ok <- a dest when ok $ do preventWrite dest preventWrite dir return ok retrieve :: FilePath -> Key -> FilePath -> Annex Bool-retrieve d k f = liftIO $ copyFileExternal (dirKey d k) f+retrieve d k f = liftIO $ withStoredFile d k $ \file -> copyFileExternal file f retrieveEncrypted :: FilePath -> (Cipher, Key) -> FilePath -> Annex Bool retrieveEncrypted d (cipher, enck) f =- liftIO $ catchBoolIO $ do- withDecryptedContent cipher (L.readFile (dirKey d enck)) $ L.writeFile f+ liftIO $ withStoredFile d enck $ \file -> catchBoolIO $ do+ withDecryptedContent cipher (L.readFile file) $ L.writeFile f return True remove :: FilePath -> Key -> Annex Bool-remove d k = liftIO $ catchBoolIO $ do+remove d k = liftIO $ withStoredFile d k $ \file -> catchBoolIO $ do+ let dir = parentDir file allowWrite dir removeFile file removeDirectory dir return True- where- file = dirKey d k- dir = parentDir file checkPresent :: FilePath -> Key -> Annex (Either String Bool)-checkPresent d k = liftIO $ catchMsgIO $ doesFileExist (dirKey d k)+checkPresent d k = liftIO $ catchMsgIO $ withStoredFile d k $+ const $ return True -- withStoredFile checked that it exists
Remote/Git.hs view
@@ -134,7 +134,14 @@ | Git.repoIsUrl r = checkremote | otherwise = checklocal where- checkhttp = liftIO $ catchMsgIO $ Url.exists $ keyUrl r key+ checkhttp = liftIO $ go undefined $ keyUrls r key+ where+ go e [] = return $ Left e+ go _ (u:us) = do+ res <- catchMsgIO $ Url.exists u+ case res of+ Left e -> go e us+ v -> return v checkremote = do showAction $ "checking " ++ Git.repoDescribe r onRemote r (check, unknown) "inannex" [Param (show key)]@@ -169,8 +176,10 @@ liftIO Git.reap return ret -keyUrl :: Git.Repo -> Key -> String-keyUrl r key = Git.repoLocation r ++ "/" ++ annexLocation key+keyUrls :: Git.Repo -> Key -> [String]+keyUrls r key = map tourl (annexLocations key)+ where+ tourl l = Git.repoLocation r ++ "/" ++ l dropKey :: Git.Repo -> Key -> Annex Bool dropKey r key@@ -185,16 +194,19 @@ copyFromRemote r key file | not $ Git.repoIsUrl r = do params <- rsyncParams r- rsyncOrCopyFile params (gitAnnexLocation key r) file+ loc <- liftIO $ gitAnnexLocation key r+ rsyncOrCopyFile params loc file | Git.repoIsSsh r = rsyncHelper =<< rsyncParamsRemote r True key file- | Git.repoIsHttp r = liftIO $ Url.download (keyUrl r key) file+ | Git.repoIsHttp r = liftIO $ downloadurls $ keyUrls r key | otherwise = error "copying from non-ssh, non-http repo not supported"+ where+ downloadurls us = untilTrue us $ \u -> Url.download u file {- Tries to copy a key's content to a remote's annex. -} copyToRemote :: Git.Repo -> Key -> Annex Bool copyToRemote r key | not $ Git.repoIsUrl r = do- keysrc <- fromRepo $ gitAnnexLocation key+ keysrc <- inRepo $ gitAnnexLocation key params <- rsyncParams r -- run copy from perspective of remote liftIO $ onLocal r $ do@@ -203,7 +215,7 @@ Annex.Content.saveState return ok | Git.repoIsSsh r = do- keysrc <- fromRepo $ gitAnnexLocation key+ keysrc <- inRepo $ gitAnnexLocation key rsyncHelper =<< rsyncParamsRemote r False key keysrc | otherwise = error "copying to non-ssh repo not supported"
Remote/Hook.hs view
@@ -97,12 +97,12 @@ store :: String -> Key -> Annex Bool store h k = do- src <- fromRepo $ gitAnnexLocation k+ src <- inRepo $ gitAnnexLocation k runHook h "store" k (Just src) $ return True storeEncrypted :: String -> (Cipher, Key) -> Key -> Annex Bool storeEncrypted h (cipher, enck) k = withTmp enck $ \tmp -> do- src <- fromRepo $ gitAnnexLocation k+ src <- inRepo $ gitAnnexLocation k liftIO $ withEncryptedContent cipher (L.readFile src) $ L.writeFile tmp runHook h "store" enck (Just tmp) $ return True
Remote/Rsync.hs view
@@ -86,30 +86,34 @@ | rsyncUrlIsShell (rsyncUrl o) = shellEscape s | otherwise = s -rsyncKey :: RsyncOpts -> Key -> String-rsyncKey o k = rsyncUrl o </> hashDirMixed k </> rsyncEscape o (f </> f)- where+rsyncUrls :: RsyncOpts -> Key -> [String]+rsyncUrls o k = map use annexHashes+ where+ use h = rsyncUrl o </> h k </> rsyncEscape o (f </> f) f = keyFile k -rsyncKeyDir :: RsyncOpts -> Key -> String-rsyncKeyDir o k = rsyncUrl o </> hashDirMixed k </> rsyncEscape o (keyFile k)+rsyncUrlDirs :: RsyncOpts -> Key -> [String]+rsyncUrlDirs o k = map use annexHashes+ where+ use h = rsyncUrl o </> h k </> rsyncEscape o (keyFile k) store :: RsyncOpts -> Key -> Annex Bool-store o k = rsyncSend o k =<< fromRepo (gitAnnexLocation k)+store o k = rsyncSend o k =<< inRepo (gitAnnexLocation k) storeEncrypted :: RsyncOpts -> (Cipher, Key) -> Key -> Annex Bool storeEncrypted o (cipher, enck) k = withTmp enck $ \tmp -> do- src <- fromRepo $ gitAnnexLocation k+ src <- inRepo $ gitAnnexLocation k liftIO $ withEncryptedContent cipher (L.readFile src) $ L.writeFile tmp rsyncSend o enck tmp retrieve :: RsyncOpts -> Key -> FilePath -> Annex Bool-retrieve o k f = rsyncRemote o- -- use inplace when retrieving to support resuming- [ Param "--inplace"- , Param $ rsyncKey o k- , Param f- ]+retrieve o k f = untilTrue (rsyncUrls o k) $ \u ->+ rsyncRemote o+ -- use inplace when retrieving to support resuming+ [ Param "--inplace"+ , Param u+ , Param f+ ] retrieveEncrypted :: RsyncOpts -> (Cipher, Key) -> FilePath -> Annex Bool retrieveEncrypted o (cipher, enck) f = withTmp enck $ \tmp -> do@@ -121,27 +125,29 @@ else return res remove :: RsyncOpts -> Key -> Annex Bool-remove o k = withRsyncScratchDir $ \tmp -> do- {- Send an empty directory to rysnc as the parent directory- - of the file to remove. -}- let dummy = tmp </> keyFile k- liftIO $ createDirectoryIfMissing True dummy- liftIO $ rsync $ rsyncOptions o ++- [ Params "--delete --recursive"- , partialParams- , Param $ addTrailingPathSeparator dummy- , Param $ rsyncKeyDir o k- ]+remove o k = untilTrue (rsyncUrlDirs o k) $ \d ->+ withRsyncScratchDir $ \tmp -> liftIO $ do+ {- Send an empty directory to rysnc as the+ - parent directory of the file to remove. -}+ let dummy = tmp </> keyFile k+ createDirectoryIfMissing True dummy+ rsync $ rsyncOptions o +++ [ Params "--quiet --delete --recursive"+ , partialParams+ , Param $ addTrailingPathSeparator dummy+ , Param d+ ] checkPresent :: Git.Repo -> RsyncOpts -> Key -> Annex (Either String Bool) checkPresent r o k = do showAction $ "checking " ++ Git.repoDescribe r- -- note: Does not currently differnetiate between rsync failing+ -- note: Does not currently differentiate between rsync failing -- to connect, and the file not being present.- res <- liftIO $ boolSystem "sh" [Param "-c", Param cmd]- return $ Right res+ Right <$> check where- cmd = "rsync --quiet " ++ shellEscape (rsyncKey o k) ++ " 2>/dev/null"+ check = untilTrue (rsyncUrls o k) $ \u ->+ liftIO $ boolSystem "sh" [Param "-c", Param (cmd u)]+ cmd u = "rsync --quiet " ++ shellEscape u ++ " 2>/dev/null" {- Rsync params to enable resumes of sending files safely, - ensure that files are only moved into place once complete@@ -182,7 +188,7 @@ directories. -} rsyncSend :: RsyncOpts -> Key -> FilePath -> Annex Bool rsyncSend o k src = withRsyncScratchDir $ \tmp -> do- let dest = tmp </> hashDirMixed k </> f </> f+ let dest = tmp </> head (keyPaths k) liftIO $ createDirectoryIfMissing True $ parentDir dest liftIO $ createLink src dest rsyncRemote o@@ -192,5 +198,3 @@ , Param $ addTrailingPathSeparator tmp , Param $ rsyncUrl o ]- where- f = keyFile k
Remote/S3real.hs view
@@ -112,7 +112,7 @@ store :: Remote Annex -> Key -> Annex Bool store r k = s3Action r False $ \(conn, bucket) -> do- dest <- fromRepo $ gitAnnexLocation k+ dest <- inRepo $ gitAnnexLocation k res <- liftIO $ storeHelper (conn, bucket) r k dest s3Bool res @@ -121,7 +121,7 @@ -- To get file size of the encrypted content, have to use a temp file. -- (An alternative would be chunking to to a constant size.) withTmp enck $ \tmp -> do- f <- fromRepo $ gitAnnexLocation k+ f <- inRepo $ gitAnnexLocation k liftIO $ withEncryptedContent cipher (L.readFile f) $ \s -> L.writeFile tmp s res <- liftIO $ storeHelper (conn, bucket) r enck tmp s3Bool res
Remote/Web.hs view
@@ -13,7 +13,6 @@ import Config import Logs.Web import qualified Utility.Url as Url-import Utility.Monad remote :: RemoteType Annex remote = RemoteType {@@ -71,8 +70,6 @@ then return $ Right False else return . Right =<< checkKey' us checkKey' :: [URLString] -> Annex Bool-checkKey' [] = return False-checkKey' (u:us) = do+checkKey' us = untilTrue us $ \u -> do showAction $ "checking " ++ u- e <- liftIO $ Url.exists u- if e then return e else checkKey' us+ liftIO $ Url.exists u
Types/TrustLevel.hs view
@@ -14,7 +14,7 @@ import Types.UUID -data TrustLevel = SemiTrusted | UnTrusted | Trusted+data TrustLevel = Trusted | SemiTrusted | UnTrusted | DeadTrusted deriving Eq type TrustMap = M.Map UUID TrustLevel
+ Utility/Directory.hs view
@@ -0,0 +1,51 @@+{- directory manipulation+ -+ - Copyright 2011 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Utility.Directory where++import System.IO.Error+import System.Posix.Files+import System.Directory+import Control.Exception (throw)++import Utility.SafeCommand+import Utility.Conditional+import Utility.TempFile++{- Moves one filename to another.+ - First tries a rename, but falls back to moving across devices if needed. -}+moveFile :: FilePath -> FilePath -> IO ()+moveFile src dest = try (rename src dest) >>= onrename+ where+ onrename (Right _) = return ()+ onrename (Left e)+ | isPermissionError e = rethrow+ | isDoesNotExistError e = rethrow+ | otherwise = do+ -- copyFile is likely not as optimised as+ -- the mv command, so we'll use the latter.+ -- But, mv will move into a directory if+ -- dest is one, which is not desired.+ whenM (isdir dest) rethrow+ viaTmp mv dest undefined+ where+ rethrow = throw e+ mv tmp _ = do+ ok <- boolSystem "mv" [Param "-f",+ Param src, Param tmp]+ if ok+ then return ()+ else do+ -- delete any partial+ _ <- try $+ removeFile tmp+ rethrow+ isdir f = do+ r <- try (getFileStatus f)+ case r of+ (Left _) -> return False+ (Right s) -> return $ isDirectory s
Utility/Monad.hs view
@@ -24,3 +24,7 @@ - stopping once one is found. -} anyM :: (Monad m) => (a -> m Bool) -> [a] -> m Bool anyM p = liftM isJust . firstM p++{- Runs an action on values from a list until it succeeds. -}+untilTrue :: (Monad m) => [a] -> (a -> m Bool) -> m Bool+untilTrue = flip anyM
Utility/TempFile.hs view
@@ -7,7 +7,7 @@ module Utility.TempFile where -import IO (bracket)+import Control.Exception (bracket) import System.IO import System.Posix.Process hiding (executeFile) import System.Directory
debian/changelog view
@@ -1,3 +1,25 @@+git-annex (3.20111203) unstable; urgency=low++ * The VFAT filesystem on recent versions of Linux, when mounted with+ shortname=mixed, does not get along well with git-annex's mixed case+ .git/annex/objects hash directories. To avoid this problem, new content+ is now stored in all-lowercase hash directories. Except for non-bare+ repositories which would be a pain to transition and cannot be put on FAT.+ (Old mixed-case hash directories are still tried for backwards+ compatibility.)+ * Flush json output, avoiding a buffering problem that could result in+ doubled output.+ * Avoid needing haskell98 and other fixes for new ghc. Thanks, Mark Wright.+ * Bugfix: dropunused did not drop keys with two spaces in their name.+ * Support for storing .git/annex on a different device than the rest of the+ git repository.+ * --inbackend can be used to make git-annex only operate on files+ whose content is stored using a specified key-value backend.+ * dead: A command which says that a repository is gone for good+ and you don't want git-annex to mention it again.++ -- Joey Hess <joeyh@debian.org> Sat, 03 Dec 2011 21:01:45 -0400+ git-annex (3.20111122) unstable; urgency=low * merge: Improve commit messages to mention what was merged.
− doc/bugs/--git-dir_and_--work-tree_options.mdwn
@@ -1,29 +0,0 @@-git-annex does not take into account the --git-dir and --work-tree command line options (while they can be useful when scripting).-- > mkdir /tmp/test- > cd /tmp/test- > git init- Initialized empty Git repository in /tmp/test/.git/- > git annex init test- init test ok- > touch foo- > cd- > git --git-dir=/tmp/test/.git --work-tree=/tmp/test annex add foo- git-annex: Not in a git repository.--regular git add works:-- > git --git-dir=/tmp/test/.git --work-tree=/tmp/test add foo- > git --git-dir=/tmp/test/.git --work-tree=/tmp/test status - # On branch master- #- # Initial commit- #- # Changes to be committed:- # (use "git rm --cached <file>..." to unstage)- #- # new file: foo- #--git-annex version: 3.20110702-
+ doc/bugs/case_sensitivity_on_FAT.mdwn view
@@ -0,0 +1,49 @@+I was copying files to a directory remote with `git annex copy`. Out of 114 files, 9 of them failed with no message, just:++ copy data/foo.dat (to usbdrive...) failed+ copy data/bar.dat (to usbdrive...) failed++According to strace:++ 31338 mkdir("/media/annex/Zp/9v/SHA256-s1362999320--d650297c8cf8c2dc0575110a52d0c5cc0ff266f294a0599f85796a6b44b23492", 0777) = -1 ENOENT (No such file or directory)+ 31338 mkdir("/media/annex/Zp/9v", 0777) = -1 ENOENT (No such file or directory)+ 31338 mkdir("/media/annex/Zp", 0777) = -1 EEXIST (File exists)+ 31338 stat("/media/annex/Zp", 0x7f8449f170d0) = -1 ENOENT (No such file or directory)++The filesystem is FAT32 and has weird case semantics. This was mounted by udisks with its default options:++ /dev/sdb1 on /media/annex type vfat (rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec)++I wonder if the directory remote should use hashDirLower instead of hashDirMixed?++> git-annex intentionally uses the same layout for directory and rsync+> special remotes as it does for the .git/annex directory. As far+> as I know it works ok on (truely) case-insensative filesystems.+> +> Based on your strace, if you `ls /media/annex/Zp`, you will see+> "No such file or directory", but if you `mkdir /media/annex/Zp` it will+> fail with "File exists". Doesn't make much sense to me.+> +> The (default) VFAT mount option shortname=mixed causes this behavior.+> With shortname=lower it works ok. --[[Joey]]+> +>> So, the options for fixing this bug seem to be to fix Linux (which would+>> be a good idea IMHO but I don't really want to go there), or generally+>> convert git-annex to using lowercase for its hashing (which would be a+>> large amount of pain to rewrite all the symlinks in every git repo),+>> or some special hack around this problem. +>> +>> I've put in a workaround for the problem in the directory special+>> remote; it will use mixed case but fall-back to lowercase as necessary.+>> +>> That does leave the case of a bare git repository with annexed content+>> stored on VFAT. More special casing could fix it, but that is, I+>> think, an unusual configuration. Leaving the bug open for that case,+>> and for the even more unlikely configuration of a rsync special remote+>> stored on VFAT. --[[Joey]] ++>>> Bare repositories now use lowercase. rsync is the only remaining+>>> unsupported possibility. --[[Joey]]+>>>> Everything now uses lowercase, with the exception of non-bare+>>>> repos, which cannot be on FAT anyway due to using symlinks. [[done]]+>>>> --[[Joey]]
− doc/bugs/directory_remote_and_case_sensitivity_on_FAT.mdwn
@@ -1,28 +0,0 @@-I was copying files to a directory remote with `git annex copy`. Out of 114 files, 9 of them failed with no message, just:-- copy data/foo.dat (to usbdrive...) failed- copy data/bar.dat (to usbdrive...) failed--According to strace:-- 31338 mkdir("/media/annex/Zp/9v/SHA256-s1362999320--d650297c8cf8c2dc0575110a52d0c5cc0ff266f294a0599f85796a6b44b23492", 0777) = -1 ENOENT (No such file or directory)- 31338 mkdir("/media/annex/Zp/9v", 0777) = -1 ENOENT (No such file or directory)- 31338 mkdir("/media/annex/Zp", 0777) = -1 EEXIST (File exists)- 31338 stat("/media/annex/Zp", 0x7f8449f170d0) = -1 ENOENT (No such file or directory)--The filesystem is FAT32 and has weird case semantics. This was mounted by udisks with its default options:-- /dev/sdb1 on /media/annex type vfat (rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec)--I wonder if the directory remote should use hashDirLower instead of hashDirMixed?--> git-annex intentionally uses the same layout for directory and rsync-> special remotes as it does for the .git/annex directory. As far-> as I know it works ok on case-insensative filesystems.-> -> Based on your strace, if you `ls /media/annex/Zp`, you will see-> "No such file or directory", but if you `mkdir /media/annex/Zp` it will-> fail with "File exists". Doesn't make much sense to me.-> -> I cannot reproduce this problem using a vfat filesystem -> mounted using the same options you show (linux 3.0.0). --[[Joey]]
+ doc/bugs/dropunused_doesn__39__t_handle_double_spaces_in_filename.mdwn view
@@ -0,0 +1,87 @@+Unused files with double spaces in their name are not removed by `dropunused`:++Script:++ #!/bin/bash+ + BASE=/tmp/unused-bug+ + # setup+ set -x+ chmod -R +w $BASE+ rm -rf $BASE+ mkdir -p $BASE+ cd $BASE+ + # create annex+ git init .+ git annex init+ + # make a file with two spaces+ echo hello > 'foo bar'+ + # add it+ git annex add --backend WORM 'foo bar'+ git commit -m 'add'+ + # remove it+ git rm 'foo bar'+ git commit -m 'remove'+ + # unused+ git annex unused+ git annex dropunused 1+ git annex unused++Output:++ + chmod -R +w /tmp/unused-bug+ + rm -rf /tmp/unused-bug+ + mkdir -p /tmp/unused-bug+ + cd /tmp/unused-bug+ + git init .+ Initialized empty Git repository in /tmp/unused-bug/.git/+ + git annex init+ init ok+ + echo hello+ + git annex add --backend WORM 'foo bar'+ add foo bar ok+ (Recording state in git...)+ + git commit -m add+ [master (root-commit) 926f7f5] add+ 1 files changed, 1 insertions(+), 0 deletions(-)+ create mode 120000 foo bar+ + git rm 'foo bar'+ rm 'foo bar'+ + git commit -m remove+ [master d025e3f] remove+ 1 files changed, 0 insertions(+), 1 deletions(-)+ delete mode 120000 foo bar+ + git annex unused+ unused . (checking for unused data...) (checking master...) + Some annexed data is no longer used by any files:+ NUMBER KEY+ 1 WORM-s6-m1322200438--foo bar+ (To see where data was previously used, try: git log --stat -S'KEY')+ + To remove unwanted data: git-annex dropunused NUMBER+ + ok+ + git annex dropunused 1+ dropunused 1 ok+ + git annex unused+ unused . (checking for unused data...) (checking master...) + Some annexed data is no longer used by any files:+ NUMBER KEY+ 1 WORM-s6-m1322200438--foo bar+ (To see where data was previously used, try: git log --stat -S'KEY')+ + To remove unwanted data: git-annex dropunused NUMBER+ + ok++Strange that `dropunused` still said "ok" when it didn't succeed at removing the file.++> It was misparsing the unused file, so it thought you'd asked it to drop a+> key that didn't exist (which means already dropped) so no error. I've+> fixed the bug. [[done]] --[[Joey]]
+ doc/bugs/not_possible_to_have_annex_on_a_separate_filesystem.mdwn view
@@ -0,0 +1,32 @@+I belive I have found a regression.++Inspired by +<http://git-annex.branchable.com/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/>+I tried to only have .git/annex/objects (also tested moving .git/annex) on NFS while having the rest on local SSD disk.++But when trying to add files i get:++ > git annex add testfile+ add testfile (checksum...) + git-annex: testfile: rename: unsupported operation (Invalid cross-device link)+ failed+ git-annex: add: 1 failed++I have tried both using bind-mount and with a sym-link.++> Grepping for `renameFile` and `createLink` will find all the places+> in git-annex that assume one filesystem. These would have to be changed+> to catch errors and fall back to expensive copying.+> +> Putting a separate repository on the file server could work better+> depending on what you're trying to do. --[[Joey]] ++>> I've added support for putting `.git/annex` on a separate filesystem+>> from the rest of the git repository.+>> +>> Putting individual subdirectories like `.git/annex/objects` on separate+>> filesystems from other subdirectories is not fully supported; it may+>> work but it may be slow and a few things (like `git annex migrate`) are+>> known to fail due to using hard links. I don't think this is worth+>> supporting. [[done]]+>> --[[Joey]]
+ doc/bugs/on--git-dir_and_--work-tree_options.mdwn view
@@ -0,0 +1,29 @@+git-annex does not take into account the --git-dir and --work-tree command line options (while they can be useful when scripting).++ > mkdir /tmp/test+ > cd /tmp/test+ > git init+ Initialized empty Git repository in /tmp/test/.git/+ > git annex init test+ init test ok+ > touch foo+ > cd+ > git --git-dir=/tmp/test/.git --work-tree=/tmp/test annex add foo+ git-annex: Not in a git repository.++regular git add works:++ > git --git-dir=/tmp/test/.git --work-tree=/tmp/test add foo+ > git --git-dir=/tmp/test/.git --work-tree=/tmp/test status + # On branch master+ #+ # Initial commit+ #+ # Changes to be committed:+ # (use "git rm --cached <file>..." to unstage)+ #+ # new file: foo+ #++git-annex version: 3.20110702+
+ doc/forum/Podcast_syncing_use-case.mdwn view
@@ -0,0 +1,34 @@+I've been trying to use git-annex with the following strategy.++* Download podcasts into the annex `gpodder-downloads`+* Check the podcasts into the annex using `git annex add`.+* Copy the podcasts over to my mp3 player in the annex `usb-ariaz`.+ This is a FAT-formatted mp3 player, so I have been using a bare+ repository. +* Move the podcasts to a different annex called `gpodder-on-usbdisk`+ to indicate that they have been successfully put on the mp3 player.+* `chmod` the files on the mp3 player to `0600` so that I can delete+ them from the player when I am done listening to them.+ +Then I go for a run or something and listen to a bunch of podcasts,+deleting them after I have listened to them. When I get back, I would+like to find the files that I have listened to and remove them from+the annexes that are not on the mp3 player. What I have been hoping+is that something like++ ~/gpodder-on-usbdisk $ git annex find --not --in usb-ariaz --print0 | xargs -0 git rm+ ~/gpodder-on-usbdisk $ git annex unused+ ~/gpodder-on-usbdisk $ git annex dropunused `seq X`+ +would work. However, it appears that `git-annex find` does not+actually check to see that the file contents are present, but only+looks at the `git-annex` branch of the `usb-ariaz` repository. Since+I have not changed that with my sneaky deletions, it has no way of+knowing that the files have been deleted.++Is there any way to do this properly? (And by properly, I don't mean+"don't delete the files". That is really the only way I have of+marking that I have listened to podcasts on this particular mp3 player.)++I tried setting the `usb-ariaz` repository to be untrusted, but that+did not change the behavior of `git annex find`.
+ doc/forum/Podcast_syncing_use-case/comment_1_ace6f9d3a950348a3ac0ff592b62e786._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joey.kitenet.net/"+ nickname="joey"+ subject="comment 1"+ date="2011-11-27T17:56:31Z"+ content="""+Right, --in goes by git-annex's [[location_tracking]] information; actually checking if a remote still has the files would make --in too expensive in many cases.++So you need to give `gpodder-on-usbdisk` current information. You can do that by going to `usb-ariaz` and doing a `git annex fsck`. That will find the deleted files and update the location information. Then, back on `gpodder-on-usbdisk`, `git pull usb-ariaz`, and then you can proceed with the commands you showed.+"""]]
+ doc/forum/Podcast_syncing_use-case/comment_2_930a6620b4d516e69ed952f9da5371bb._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://cgray.myopenid.com/"+ nickname="cgray"+ subject="comment 2"+ date="2011-11-27T22:10:44Z"+ content="""+Thanks, that works perfectly!+"""]]
doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk.mdwn view
@@ -1,3 +1,12 @@ This works with bind-mount, I might try with softlinks as well. -Going through git's data on push/pull can take ages on a spindle disk even if the repo is rather small in size. This is especially true if you are used to ssd speeds, but ssd storage is expensive. Storing the annex objects on a cheap spindle disk and everything else on a ssd makes things a _lot_ faster.+Going through git's data on push/pull can take ages on a spindle disk even+if the repo is rather small in size. This is especially true if you are+used to ssd speeds, but ssd storage is expensive. Storing the annex objects+on a cheap spindle disk and everything else on a ssd makes things a _lot_+faster.++> Update: git-annex supports `.git/annex/` being moved to a different disk+> than the rest of the repisitory, but does *not* support individual +> subdirectories, like `.git/annex/objects/` being on a different disk+> than the main `.git/annex/` directory. --[[Joey]]
doc/git-annex.mdwn view
@@ -173,6 +173,11 @@ Returns a repository to the default semi trusted state. +* dead [repository ...]++ Indicates that the repository has been irretrevably lost.+ (To undo, use semitrust.)+ # REPOSITORY MAINTENANCE COMMANDS * fsck [path ...]@@ -435,7 +440,8 @@ * --in=repository Matches only files that git-annex believes have their contents present- in a repository.+ in a repository. Note that it does not check the repository to verify+ that it still has the content. The repository should be specified using the name of a configured remote, or the UUID or description of a repository. For the current repository,@@ -444,7 +450,13 @@ * --copies=number Matches only files that git-annex believes to have the specified number- of copies, or more.+ of copies, or more. Note that it does not check remotes to verify that+ the copies still exist.++* --inbackend=name++ Matches only files whose content is stored using the specified key-value+ backend. * --not
doc/install/FreeBSD.mdwn view
@@ -1,2 +1,2 @@ git-annex is in FreeBSD ports in-[devel/git-annex](http://www.freshports.org/devel/git-annex/)+[devel/git-annex](http://www.freshports.org/devel/hs-git-annex/)
doc/internals.mdwn view
@@ -62,8 +62,8 @@ [[trust]] values are configured. The file format is one line per repository, with the uuid followed by a-space, and then either 1 (trusted), 0 (untrusted), or ? (semi-trusted),-and finally a timestamp.+space, and then either `1` (trusted), `0` (untrusted), `?` (semi-trusted),+`X` (dead) and finally a timestamp. Example:
doc/location_tracking.mdwn view
@@ -1,8 +1,7 @@ git-annex keeps track of in which repositories it last saw a file's content. This location tracking information is stored in the git-annex branch. Repositories record their UUID and the date when they get or drop -a file's content. (Git is configured to use a union merge for this file,-so the lines may be in arbitrary order, but it will never conflict.)+a file's content. This location tracking information is useful if you have multiple repositories, and not all are always accessible. For example, perhaps one@@ -10,7 +9,7 @@ tell you what git remote it needs access to in order to get a file: # git annex get myfile - get myfile(not available)+ get myfile (not available) I was unable to access these remotes: home Another way the location tracking comes in handy is if you put repositories
− doc/news/version_3.20111025.mdwn
@@ -1,8 +0,0 @@-git-annex 3.20111025 released with [[!toggle text="these changes"]]-[[!toggleable text="""- * A remote can have a annexUrl configured, that is used by git-annex- instead of its usual url. (Similar to pushUrl.)- * migrate: Copy url logs for keys when migrating.- * git-annex-shell: GIT\_ANNEX\_SHELL\_READONLY and GIT\_ANNEX\_SHELL\_LIMITED- environment variables can be set to limit what commands can be run.- This is used by gitolite's new git-annex support!"""]]
+ doc/news/version_3.20111203.mdwn view
@@ -0,0 +1,19 @@+git-annex 3.20111203 released with [[!toggle text="these changes"]]+[[!toggleable text="""+ * The VFAT filesystem on recent versions of Linux, when mounted with+ shortname=mixed, does not get along well with git-annex's mixed case+ .git/annex/objects hash directories. To avoid this problem, new content+ is now stored in all-lowercase hash directories. Except for non-bare+ repositories which would be a pain to transition and cannot be put on FAT.+ (Old mixed-case hash directories are still tried for backwards+ compatibility.)+ * Flush json output, avoiding a buffering problem that could result in+ doubled output.+ * Avoid needing haskell98 and other fixes for new ghc. Thanks, Mark Wright.+ * Bugfix: dropunused did not drop keys with two spaces in their name.+ * Support for storing .git/annex on a different device than the rest of the+ git repository.+ * --inbackend can be used to make git-annex only operate on files+ whose content is stored using a specified key-value backend.+ * dead: A command which says that a repository is gone for good+ and you don't want git-annex to mention it again."""]]
doc/tips/what_to_do_when_you_lose_a_repository.mdwn view
@@ -4,16 +4,16 @@ Unless you configured backups, git-annex can't get your data back. But it can help you deal with the loss. -First, go somewhere that knows about the lost repository, and mark it as-untrusted.+Go somewhere that knows about the lost repository, and mark it as+dead: - git annex untrust usbdrive+ git annex dead usbdrive -To remind yourself later what happened, you can change its description, too:+This retains the [[location_tracking]] information for the repository,+but avoids trying to access it, or list it as a location where files+are present. - git annex describe usbdrive "USB drive lost in Timbuktu. Probably gone forever."+If you later found the drive, you could let git-annex know it's found+like so: -This retains the [[location_tracking]] information for the repository.-Maybe you'll find the drive later. Maybe that's impossible. Either way,-this lets git-annex tell you why a file is no longer accessible, and-it avoids it relying on that drive to hold any content.+ git annex semitrusted usbdrive
+ doc/todo/add_-all_option.mdwn view
@@ -0,0 +1,16 @@+`--all` would make git-annex operate on either every key with content+present (or in some cases like `get` and `copy --from` on +every keys with content not present).++This would be useful when a repository has a history with deleted files+whose content you want to keep (so you're not using `dropunused`).+Or when you have a lot of branches and just want to be able to fsck+every file referenced in any branch.++A problem with the idea is that `.gitattributes` values for keys not+currently in the tree would not be available (without horrific anounts of+grubbing thru history to find where/when the key used to exist). So+`numcopies` set via `.gitattributes` would not work. This would be a+particular problem for `drop` and for `--auto`.++--[[Joey]]
doc/trust.mdwn view
@@ -1,8 +1,9 @@-Git-annex supports three levels of trust of a repository:+Git-annex supports several levels of trust of a repository: * semitrusted (default) * untrusted * trusted+* dead ## semitrusted @@ -49,3 +50,10 @@ To configure a repository as fully and permanently trusted, use the `git annex trust` command.++## dead++This is used to indicate that you have no trust that the repository+exists at all. It's appropriate to use when a drive has been lost,+or a directory irretrevably deleted. It will make git-annex avoid+even showing the repository as a place where data might still reside.
git-annex.cabal view
@@ -1,5 +1,5 @@ Name: git-annex-Version: 3.20111122+Version: 3.20111203 Cabal-Version: >= 1.6 License: GPL Maintainer: Joey Hess <joey@kitenet.net>@@ -7,7 +7,7 @@ Stability: Stable Copyright: 2010-2011 Joey Hess License-File: GPL-Extra-Source-Files: ./debian/NEWS ./debian/control ./debian/rules ./debian/manpages ./debian/changelog ./debian/doc-base ./debian/copyright ./debian/compat ./Messages/JSON.hs ./configure.hs ./Annex.hs ./Seek.hs ./Crypto.hs ./Common.hs ./README ./Command/Merge.hs ./Command/AddUrl.hs ./Command/Whereis.hs ./Command/Unlock.hs ./Command/Version.hs ./Command/FromKey.hs ./Command/PreCommit.hs ./Command/Map.hs ./Command/Unused.hs ./Command/Uninit.hs ./Command/Migrate.hs ./Command/Init.hs ./Command/ConfigList.hs ./Command/Trust.hs ./Command/Lock.hs ./Command/SendKey.hs ./Command/RecvKey.hs ./Command/Reinject.hs ./Command/Add.hs ./Command/Fix.hs ./Command/Untrust.hs ./Command/InitRemote.hs ./Command/Semitrust.hs ./Command/Fsck.hs ./Command/Move.hs ./Command/DropUnused.hs ./Command/Get.hs ./Command/Upgrade.hs ./Command/Describe.hs ./Command/Drop.hs ./Command/DropKey.hs ./Command/InAnnex.hs ./Command/Find.hs ./Command/Unannex.hs ./Command/Status.hs ./Command/Copy.hs ./Init.hs ./Types.hs ./Common/Annex.hs ./Makefile ./git-annex.cabal ./Upgrade/V1.hs ./Upgrade/V2.hs ./Upgrade/V0.hs ./CHANGELOG ./Git/LsFiles.hs ./Git/UnionMerge.hs ./Git/CatFile.hs ./Git/Queue.hs ./Git/LsTree.hs ./doc/upgrades.mdwn ./doc/forum/Recommended_number_of_repositories.mdwn ./doc/forum/wishlist:_define_remotes_that_must_have_all_files.mdwn ./doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__.mdwn ./doc/forum/wishlist:_command_options_changes/comment_2_f6a637c78c989382e3c22d41b7fb4cc2._comment ./doc/forum/wishlist:_command_options_changes/comment_3_bf1114533d2895804e531e76eb6b8095._comment ./doc/forum/wishlist:_command_options_changes/comment_1_bfba72a696789bf21b2435dea15f967a._comment ./doc/forum/wishlist:_git-annex_replicate/comment_3_c13f4f9c3d5884fc6255fd04feadc2b1._comment ./doc/forum/wishlist:_git-annex_replicate/comment_1_9926132ec6052760cdf28518a24e2358._comment ./doc/forum/wishlist:_git-annex_replicate/comment_2_c43932f4194aba8fb2470b18e0817599._comment ./doc/forum/wishlist:_git-annex_replicate/comment_4_63f24abf086d644dced8b01e1a9948c9._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/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/git_annex_ls___47___metadata_in_git_annex_whereis.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/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/working_without_git-annex_commits.mdwn ./doc/forum/migrate_existing_git_repository_to_git-annex.mdwn ./doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo.mdwn ./doc/forum/wishlist:_traffic_accounting_for_git-annex.mdwn ./doc/forum/rsync_over_ssh__63__.mdwn ./doc/forum/unannex_alternatives/comment_3_b1687fc8f9e7744327bbeb6f0635d1cd._comment ./doc/forum/unannex_alternatives/comment_1_dcd4cd41280b41512bbdffafaf307993._comment ./doc/forum/unannex_alternatives/comment_2_58a72a9fe0f58c7af0b4d7927a2dd21d._comment ./doc/forum/wishlist:_git_annex_status/comment_4_9aeeb83d202dc8fb33ff364b0705ad94._comment ./doc/forum/wishlist:_git_annex_status/comment_3_d1fd70c67243971c96d59e1ffb7ef6e7._comment ./doc/forum/wishlist:_git_annex_status/comment_2_c2b0ce025805b774dc77ce264a222824._comment ./doc/forum/wishlist:_git_annex_status/comment_1_994bfd12c5d82e08040d6116915c5090._comment ./doc/forum/wishlist:_command_options_changes.mdwn ./doc/forum/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/advantages_of_SHA__42___over_WORM.mdwn ./doc/forum/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults.mdwn ./doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set.mdwn ./doc/forum/bainstorming:_git_annex_push___38___pull.mdwn ./doc/forum/sparse_git_checkouts_with_annex.mdwn ./doc/forum/Need_new_build_instructions_for_Debian_stable.mdwn ./doc/forum/batch_check_on_remote_when_using_copy.mdwn ./doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs.mdwn ./doc/forum/wishlist:alias_system.mdwn ./doc/forum/incompatible_versions__63__.mdwn ./doc/forum/wishlist:_git_backend_for_git-annex.mdwn ./doc/forum/seems_to_build_fine_on_haskell_platform_2011.mdwn ./doc/forum/rsync_over_ssh__63__/comment_1_ee21f32e90303e20339e0a568321bbbe._comment ./doc/forum/rsync_over_ssh__63__/comment_2_aa690da6ecfb2b30fc5080ad76dc77b1._comment ./doc/forum/wishlist:_special_remote_for_sftp_or_rsync.mdwn ./doc/forum/OSX__39__s_haskell-platform_statically_links_things.mdwn ./doc/forum/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/git-annex_communication_channels.mdwn ./doc/forum/can_git-annex_replace_ddm__63__/comment_3_4c69097fe2ee81359655e59a03a9bb8d._comment ./doc/forum/can_git-annex_replace_ddm__63__/comment_2_008554306dd082d7f543baf283510e92._comment ./doc/forum/can_git-annex_replace_ddm__63__/comment_1_aa05008dfe800474ff76678a400099e1._comment ./doc/forum/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/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/wishlist:_push_to_cia.vc_from_the_website__39__s_repo__44___not_your_personal_one.mdwn ./doc/forum/new_microfeatures.mdwn ./doc/backends.mdwn ./doc/bugs/__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/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/add_script-friendly_output_options.mdwn ./doc/bugs/uninit_does_not_work_in_old_repos.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/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/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/fat_support.mdwn ./doc/bugs/problems_with_utf8_names.mdwn ./doc/bugs/error_with_file_names_starting_with_dash.mdwn ./doc/bugs/unhappy_without_UTF8_locale.mdwn ./doc/bugs/S3_memory_leaks.mdwn ./doc/bugs/git_annex_map_has_problems_with_urls_containing___126__.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/--git-dir_and_--work-tree_options.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/No_version_information_from_cli.mdwn ./doc/bugs/Error_while_adding_a_file___34__createSymbolicLink:_already_exists__34__.mdwn ./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/git_annex_initremote_walks_.git-annex.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/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/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_3_57010bcaca42089b451ad8659a1e018e._comment ./doc/bugs/git_rename_detection_on_file_move/comment_4_79d96599f757757f34d7b784e6c0e81c._comment ./doc/bugs/git_rename_detection_on_file_move/comment_5_d61f5693d947b9736b29fca1dbc7ad76._comment ./doc/bugs/git_rename_detection_on_file_move/comment_2_7101d07400ad5935f880dc00d89bf90e._comment ./doc/bugs/git_rename_detection_on_file_move/comment_1_0531dcfa833b0321a7009526efe3df33._comment ./doc/bugs/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/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/directory_remote_and_case_sensitivity_on_FAT.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_fsck_is_a_no-op_in_bare_repos.mdwn ./doc/bugs/Unfortunate_interaction_with_Calibre.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/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/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.20111122.mdwn ./doc/news/version_3.20111025.mdwn ./doc/news/version_3.20111105.mdwn ./doc/news/version_3.20111107.mdwn ./doc/news/LWN_article.mdwn ./doc/news/version_3.20111111.mdwn ./doc/git-union-merge.mdwn ./doc/special_remotes/S3.mdwn ./doc/special_remotes/web.mdwn ./doc/special_remotes/bup.mdwn ./doc/special_remotes/directory.mdwn ./doc/special_remotes/hook.mdwn ./doc/special_remotes/rsync.mdwn ./doc/users/joey.mdwn ./doc/users/fmarier.mdwn ./doc/users/chrysn.mdwn ./doc/templates/walkthrough.tmpl ./doc/templates/bare.tmpl ./doc/index.mdwn ./doc/summary.mdwn ./doc/forum.mdwn ./doc/encryption/comment_1_1afca8d7182075d46db41f6ad3dd5911._comment ./doc/transferring_data.mdwn ./doc/download.mdwn ./doc/future_proofing.mdwn ./doc/todo/auto_remotes/discussion.mdwn ./doc/todo/file_copy_progress_bar.mdwn ./doc/todo/use_cp_reflink.mdwn ./doc/todo/gitrm.mdwn ./doc/todo/exclude_files_on_a_given_remote.mdwn ./doc/todo/git-annex_unused_eats_memory.mdwn ./doc/todo/add_--exclude_option_to_git_annex_find.mdwn ./doc/todo/tahoe_lfs_for_reals/comment_2_80b9e848edfdc7be21baab7d0cef0e3a._comment ./doc/todo/tahoe_lfs_for_reals/comment_1_0a4793ce6a867638f6e510e71dd4bb44._comment ./doc/todo/object_dir_reorg_v2.mdwn ./doc/todo/S3.mdwn ./doc/todo/auto_remotes.mdwn ./doc/todo/wishlist:_support_for_more_ssh_urls_.mdwn ./doc/todo/support-non-utf8-locales.mdwn ./doc/todo/done.mdwn ./doc/todo/fsck.mdwn ./doc/todo/support_S3_multipart_uploads.mdwn ./doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates.mdwn ./doc/todo/pushpull.mdwn ./doc/todo/smudge.mdwn ./doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment ./doc/todo/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/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/using_url_backend.mdwn ./doc/todo/branching.mdwn ./doc/todo/rsync.mdwn ./doc/todo/backendSHA1.mdwn ./doc/todo/cache_key_info.mdwn ./doc/todo/parallel_possibilities.mdwn ./doc/todo/symlink_farming_commit_hook.mdwn ./doc/feeds.mdwn ./doc/copies.mdwn ./doc/repomap.png ./doc/special_remotes.mdwn ./doc/todo.mdwn ./doc/walkthrough/using_ssh_remotes.mdwn ./doc/walkthrough/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/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/untrusted_repositories.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/powerful_file_matching.mdwn ./doc/tips/using_gitolite_with_git-annex.mdwn ./doc/tips/recover_data_from_lost+found.mdwn ./doc/tips/centralized_git_repository_tutorial.mdwn ./doc/tips/using_the_SHA1_backend.mdwn ./doc/tips/migrating_data_to_a_new_backend.mdwn ./doc/encryption.mdwn ./doc/not.mdwn ./doc/download/comment_7_a5eebd214b135f34b18274a682211943._comment ./doc/download/comment_3_cf6044ebe99f71158034e21197228abd._comment ./doc/download/comment_5_c6b1bc40226fc2c8ba3e558150856992._comment ./doc/download/comment_6_3a52993d3553deb9a413debec9a5f92d._comment ./doc/download/comment_2_f85f72b33aedc3425f0c0c47867d02f3._comment ./doc/download/comment_8_59a976de6c7d333709b92f7cd5830850._comment ./doc/download/comment_4_10fc013865c7542c2ed9d6c0963bb391._comment ./doc/download/comment_1_fbd8b6d39e9d3c71791551358c863966._comment ./doc/contact.mdwn ./doc/trust.mdwn ./doc/bare_repositories.mdwn ./doc/distributed_version_control.mdwn ./doc/install.mdwn ./doc/git-annex-shell.mdwn ./doc/bugs.mdwn ./doc/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/users.mdwn ./doc/install/Ubuntu.mdwn ./doc/install/Debian.mdwn ./doc/install/OSX.mdwn ./doc/install/FreeBSD.mdwn ./doc/install/OSX/comment_1_0a1760bf0db1f1ba89bdb4c62032f631._comment ./doc/install/comment_3_cff163ea3e7cad926f4ed9e78b896598._comment ./doc/install/Debian/comment_2_648e3467e260cdf233acdb0b53313ce0._comment ./doc/install/Debian/comment_1_029486088d098c2d4f1099f2f0e701a9._comment ./doc/install/Fedora.mdwn ./doc/install/comment_4_82a17eee4a076c6c79fddeda347e0c9a._comment ./doc/walkthrough.mdwn ./CmdLine.hs ./Messages.hs ./Setup.hs ./GPL ./mdwn2man ./Remote.hs ./git-annex.hs ./Locations.hs ./Backend/WORM.hs ./Backend/URL.hs ./Backend/SHA.hs ./Options.hs ./git-annex-shell.hs ./test.hs ./INSTALL ./Remote/Web.hs ./Remote/S3stub.hs ./Remote/Helper/Encryptable.hs ./Remote/Helper/Special.hs ./Remote/Directory.hs ./Remote/S3real.hs ./Remote/Bup.hs ./Remote/Hook.hs ./Remote/Rsync.hs ./Remote/Git.hs ./Build/TestConfig.hs ./Upgrade.hs ./Annex/Version.hs ./Annex/Exception.hs ./Annex/CatFile.hs ./Annex/Ssh.hs ./Annex/Queue.hs ./Annex/Branch.hs ./Annex/UUID.hs ./Annex/Content.hs ./git-union-merge.hs ./Utility/Path.hs ./Utility/Matcher.hs ./Utility/TempFile.hs ./Utility/Url.hs ./Utility/DataUnits.hs ./Utility/StatFS.hsc ./Utility/Conditional.hs ./Utility/Monad.hs ./Utility/RsyncFile.hs ./Utility/CopyFile.hs ./Utility/Misc.hs ./Utility/SafeCommand.hs ./Utility/FileMode.hs ./Utility/JSONStream.hs ./Utility/Dot.hs ./Utility/Touch.hsc ./Utility/Base64.hs ./Types/Crypto.hs ./Types/UUID.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+Extra-Source-Files: ./debian/NEWS ./debian/control ./debian/rules ./debian/manpages ./debian/changelog ./debian/doc-base ./debian/copyright ./debian/compat ./Messages/JSON.hs ./configure.hs ./Annex.hs ./Seek.hs ./Crypto.hs ./Common.hs ./README ./Command/Merge.hs ./Command/AddUrl.hs ./Command/Whereis.hs ./Command/Unlock.hs ./Command/Version.hs ./Command/FromKey.hs ./Command/PreCommit.hs ./Command/Map.hs ./Command/Unused.hs ./Command/Uninit.hs ./Command/Migrate.hs ./Command/Init.hs ./Command/ConfigList.hs ./Command/Trust.hs ./Command/Lock.hs ./Command/SendKey.hs ./Command/RecvKey.hs ./Command/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/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 ./CHANGELOG ./Git/LsFiles.hs ./Git/UnionMerge.hs ./Git/CatFile.hs ./Git/Queue.hs ./Git/LsTree.hs ./doc/upgrades.mdwn ./doc/forum/Recommended_number_of_repositories.mdwn ./doc/forum/wishlist:_define_remotes_that_must_have_all_files.mdwn ./doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__.mdwn ./doc/forum/wishlist:_command_options_changes/comment_2_f6a637c78c989382e3c22d41b7fb4cc2._comment ./doc/forum/wishlist:_command_options_changes/comment_3_bf1114533d2895804e531e76eb6b8095._comment ./doc/forum/wishlist:_command_options_changes/comment_1_bfba72a696789bf21b2435dea15f967a._comment ./doc/forum/wishlist:_git-annex_replicate/comment_3_c13f4f9c3d5884fc6255fd04feadc2b1._comment ./doc/forum/wishlist:_git-annex_replicate/comment_1_9926132ec6052760cdf28518a24e2358._comment ./doc/forum/wishlist:_git-annex_replicate/comment_2_c43932f4194aba8fb2470b18e0817599._comment ./doc/forum/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/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/git_annex_ls___47___metadata_in_git_annex_whereis.mdwn ./doc/forum/Podcast_syncing_use-case.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/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/working_without_git-annex_commits.mdwn ./doc/forum/migrate_existing_git_repository_to_git-annex.mdwn ./doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo.mdwn ./doc/forum/wishlist:_traffic_accounting_for_git-annex.mdwn ./doc/forum/rsync_over_ssh__63__.mdwn ./doc/forum/unannex_alternatives/comment_3_b1687fc8f9e7744327bbeb6f0635d1cd._comment ./doc/forum/unannex_alternatives/comment_1_dcd4cd41280b41512bbdffafaf307993._comment ./doc/forum/unannex_alternatives/comment_2_58a72a9fe0f58c7af0b4d7927a2dd21d._comment ./doc/forum/wishlist:_git_annex_status/comment_4_9aeeb83d202dc8fb33ff364b0705ad94._comment ./doc/forum/wishlist:_git_annex_status/comment_3_d1fd70c67243971c96d59e1ffb7ef6e7._comment ./doc/forum/wishlist:_git_annex_status/comment_2_c2b0ce025805b774dc77ce264a222824._comment ./doc/forum/wishlist:_git_annex_status/comment_1_994bfd12c5d82e08040d6116915c5090._comment ./doc/forum/wishlist:_command_options_changes.mdwn ./doc/forum/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/advantages_of_SHA__42___over_WORM.mdwn ./doc/forum/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults.mdwn ./doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set.mdwn ./doc/forum/bainstorming:_git_annex_push___38___pull.mdwn ./doc/forum/sparse_git_checkouts_with_annex.mdwn ./doc/forum/Need_new_build_instructions_for_Debian_stable.mdwn ./doc/forum/batch_check_on_remote_when_using_copy.mdwn ./doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs.mdwn ./doc/forum/wishlist:alias_system.mdwn ./doc/forum/incompatible_versions__63__.mdwn ./doc/forum/wishlist:_git_backend_for_git-annex.mdwn ./doc/forum/seems_to_build_fine_on_haskell_platform_2011.mdwn ./doc/forum/rsync_over_ssh__63__/comment_1_ee21f32e90303e20339e0a568321bbbe._comment ./doc/forum/rsync_over_ssh__63__/comment_2_aa690da6ecfb2b30fc5080ad76dc77b1._comment ./doc/forum/wishlist:_special_remote_for_sftp_or_rsync.mdwn ./doc/forum/OSX__39__s_haskell-platform_statically_links_things.mdwn ./doc/forum/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/git-annex_communication_channels.mdwn ./doc/forum/can_git-annex_replace_ddm__63__/comment_3_4c69097fe2ee81359655e59a03a9bb8d._comment ./doc/forum/can_git-annex_replace_ddm__63__/comment_2_008554306dd082d7f543baf283510e92._comment ./doc/forum/can_git-annex_replace_ddm__63__/comment_1_aa05008dfe800474ff76678a400099e1._comment ./doc/forum/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/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/wishlist:_push_to_cia.vc_from_the_website__39__s_repo__44___not_your_personal_one.mdwn ./doc/forum/new_microfeatures.mdwn ./doc/backends.mdwn ./doc/bugs/__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/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/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/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/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/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/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/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/No_version_information_from_cli.mdwn ./doc/bugs/Error_while_adding_a_file___34__createSymbolicLink:_already_exists__34__.mdwn ./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/git_annex_initremote_walks_.git-annex.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/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/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_3_57010bcaca42089b451ad8659a1e018e._comment ./doc/bugs/git_rename_detection_on_file_move/comment_4_79d96599f757757f34d7b784e6c0e81c._comment ./doc/bugs/git_rename_detection_on_file_move/comment_5_d61f5693d947b9736b29fca1dbc7ad76._comment ./doc/bugs/git_rename_detection_on_file_move/comment_2_7101d07400ad5935f880dc00d89bf90e._comment ./doc/bugs/git_rename_detection_on_file_move/comment_1_0531dcfa833b0321a7009526efe3df33._comment ./doc/bugs/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/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/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_fsck_is_a_no-op_in_bare_repos.mdwn ./doc/bugs/Unfortunate_interaction_with_Calibre.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/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.20111122.mdwn ./doc/news/version_3.20111203.mdwn ./doc/news/version_3.20111105.mdwn ./doc/news/version_3.20111107.mdwn ./doc/news/LWN_article.mdwn ./doc/news/version_3.20111111.mdwn ./doc/git-union-merge.mdwn ./doc/special_remotes/S3.mdwn ./doc/special_remotes/web.mdwn ./doc/special_remotes/bup.mdwn ./doc/special_remotes/directory.mdwn ./doc/special_remotes/hook.mdwn ./doc/special_remotes/rsync.mdwn ./doc/users/joey.mdwn ./doc/users/fmarier.mdwn ./doc/users/chrysn.mdwn ./doc/templates/walkthrough.tmpl ./doc/templates/bare.tmpl ./doc/index.mdwn ./doc/summary.mdwn ./doc/forum.mdwn ./doc/encryption/comment_1_1afca8d7182075d46db41f6ad3dd5911._comment ./doc/transferring_data.mdwn ./doc/download.mdwn ./doc/future_proofing.mdwn ./doc/todo/auto_remotes/discussion.mdwn ./doc/todo/file_copy_progress_bar.mdwn ./doc/todo/use_cp_reflink.mdwn ./doc/todo/gitrm.mdwn ./doc/todo/exclude_files_on_a_given_remote.mdwn ./doc/todo/git-annex_unused_eats_memory.mdwn ./doc/todo/add_--exclude_option_to_git_annex_find.mdwn ./doc/todo/tahoe_lfs_for_reals/comment_2_80b9e848edfdc7be21baab7d0cef0e3a._comment ./doc/todo/tahoe_lfs_for_reals/comment_1_0a4793ce6a867638f6e510e71dd4bb44._comment ./doc/todo/object_dir_reorg_v2.mdwn ./doc/todo/S3.mdwn ./doc/todo/auto_remotes.mdwn ./doc/todo/wishlist:_support_for_more_ssh_urls_.mdwn ./doc/todo/support-non-utf8-locales.mdwn ./doc/todo/done.mdwn ./doc/todo/fsck.mdwn ./doc/todo/support_S3_multipart_uploads.mdwn ./doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates.mdwn ./doc/todo/pushpull.mdwn ./doc/todo/smudge.mdwn ./doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment ./doc/todo/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/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/rsync.mdwn ./doc/todo/backendSHA1.mdwn ./doc/todo/cache_key_info.mdwn ./doc/todo/parallel_possibilities.mdwn ./doc/todo/symlink_farming_commit_hook.mdwn ./doc/feeds.mdwn ./doc/copies.mdwn ./doc/repomap.png ./doc/special_remotes.mdwn ./doc/todo.mdwn ./doc/walkthrough/using_ssh_remotes.mdwn ./doc/walkthrough/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/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/untrusted_repositories.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/powerful_file_matching.mdwn ./doc/tips/using_gitolite_with_git-annex.mdwn ./doc/tips/recover_data_from_lost+found.mdwn ./doc/tips/centralized_git_repository_tutorial.mdwn ./doc/tips/using_the_SHA1_backend.mdwn ./doc/tips/migrating_data_to_a_new_backend.mdwn ./doc/encryption.mdwn ./doc/not.mdwn ./doc/download/comment_7_a5eebd214b135f34b18274a682211943._comment ./doc/download/comment_3_cf6044ebe99f71158034e21197228abd._comment ./doc/download/comment_5_c6b1bc40226fc2c8ba3e558150856992._comment ./doc/download/comment_6_3a52993d3553deb9a413debec9a5f92d._comment ./doc/download/comment_2_f85f72b33aedc3425f0c0c47867d02f3._comment ./doc/download/comment_8_59a976de6c7d333709b92f7cd5830850._comment ./doc/download/comment_4_10fc013865c7542c2ed9d6c0963bb391._comment ./doc/download/comment_1_fbd8b6d39e9d3c71791551358c863966._comment ./doc/contact.mdwn ./doc/trust.mdwn ./doc/bare_repositories.mdwn ./doc/distributed_version_control.mdwn ./doc/install.mdwn ./doc/git-annex-shell.mdwn ./doc/bugs.mdwn ./doc/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/users.mdwn ./doc/install/Ubuntu.mdwn ./doc/install/Debian.mdwn ./doc/install/OSX.mdwn ./doc/install/FreeBSD.mdwn ./doc/install/OSX/comment_1_0a1760bf0db1f1ba89bdb4c62032f631._comment ./doc/install/comment_3_cff163ea3e7cad926f4ed9e78b896598._comment ./doc/install/Debian/comment_2_648e3467e260cdf233acdb0b53313ce0._comment ./doc/install/Debian/comment_1_029486088d098c2d4f1099f2f0e701a9._comment ./doc/install/Fedora.mdwn ./doc/install/comment_4_82a17eee4a076c6c79fddeda347e0c9a._comment ./doc/walkthrough.mdwn ./CmdLine.hs ./Messages.hs ./Setup.hs ./GPL ./mdwn2man ./Remote.hs ./git-annex.hs ./Locations.hs ./Backend/WORM.hs ./Backend/URL.hs ./Backend/SHA.hs ./Options.hs ./git-annex-shell.hs ./test.hs ./INSTALL ./Remote/Web.hs ./Remote/S3stub.hs ./Remote/Helper/Encryptable.hs ./Remote/Helper/Special.hs ./Remote/Directory.hs ./Remote/S3real.hs ./Remote/Bup.hs ./Remote/Hook.hs ./Remote/Rsync.hs ./Remote/Git.hs ./Build/TestConfig.hs ./Upgrade.hs ./Annex/Version.hs ./Annex/Exception.hs ./Annex/CatFile.hs ./Annex/Ssh.hs ./Annex/Queue.hs ./Annex/Branch.hs ./Annex/UUID.hs ./Annex/Content.hs ./git-union-merge.hs ./Utility/Path.hs ./Utility/Matcher.hs ./Utility/TempFile.hs ./Utility/Url.hs ./Utility/DataUnits.hs ./Utility/StatFS.hsc ./Utility/Conditional.hs ./Utility/Monad.hs ./Utility/RsyncFile.hs ./Utility/CopyFile.hs ./Utility/Misc.hs ./Utility/SafeCommand.hs ./Utility/Directory.hs ./Utility/FileMode.hs ./Utility/JSONStream.hs ./Utility/Dot.hs ./Utility/Touch.hsc ./Utility/Base64.hs ./Types/Crypto.hs ./Types/UUID.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@@ -28,7 +28,7 @@ Executable git-annex Main-Is: git-annex.hs- Build-Depends: haskell98, MissingH, hslogger, directory, filepath,+ Build-Depends: MissingH, hslogger, directory, filepath, unix, containers, utf8-string, network, mtl, bytestring, old-locale, time, pcre-light, extensible-exceptions, dataenc, SHA, process, hS3, HTTP, base < 5, monad-control, json
test.hs view
@@ -11,7 +11,7 @@ import System.Posix.Directory (changeWorkingDirectory) import System.Posix.Files-import IO (bracket_, bracket)+import Control.Exception (bracket_, bracket) import System.IO.Error import System.Posix.Env import qualified Control.Exception.Extensible as E@@ -523,8 +523,7 @@ -- Assertion failures throw non-IO errors; catch -- any type of error and change back to cwd before -- rethrowing.- r <- bracket_ (changeToTmpDir dir)- (\_ -> changeWorkingDirectory cwd)+ r <- bracket_ (changeToTmpDir dir) (changeWorkingDirectory cwd) (E.try (a)::IO (Either E.SomeException ())) case r of Right () -> return ()