git-annex 5.20131221 → 5.20131230
raw patch · 118 files changed
+4504/−1309 lines, 118 files
Files
- .gitignore +1/−0
- Annex/Version.hs +4/−10
- Assistant/Pairing/MakeRemote.hs +2/−1
- Assistant/WebApp/Configurators/Local.hs +6/−3
- Assistant/WebApp/MakeRemote.hs +2/−1
- Assistant/WebApp/RepoList.hs +1/−1
- Build/BundledPrograms.hs +5/−0
- Build/DistributionUpdate.hs +1/−1
- Build/EvilSplicer.hs +86/−80
- Build/LinuxMkLibs.hs +144/−0
- Build/Standalone.hs +1/−8
- CHANGELOG +23/−0
- Command/AddUrl.hs +19/−14
- Command/Direct.hs +0/−2
- Command/ImportFeed.hs +69/−31
- Command/Indirect.hs +0/−2
- Command/Version.hs +1/−3
- Config.hs +8/−7
- Creds.hs +13/−11
- Init.hs +1/−2
- Makefile +11/−45
- Remote/External.hs +399/−0
- Remote/External/Types.hs +273/−0
- Remote/Hook.hs +1/−1
- Remote/List.hs +2/−0
- Test.hs +1/−1
- Types/GitConfig.hs +2/−0
- Upgrade.hs +4/−6
- Upgrade/V1.hs +2/−2
- Upgrade/V3.hs +12/−0
- Upgrade/V4.hs +2/−2
- Utility/Batch.hs +4/−0
- Utility/Directory.hs +1/−1
- Utility/Metered.hs +1/−1
- Utility/Path.hs +3/−3
- Utility/Tmp.hs +12/−1
- debian/changelog +23/−0
- debian/control +3/−0
- debian/rules +0/−3
- doc/assistant/release_notes.mdwn +8/−0
- doc/bugs/Latest_64_bit_standalone_Linux_build_broken.mdwn +18/−0
- doc/bugs/Unable_to_copy_from_Android.mdwn +148/−0
- doc/bugs/__39__Cannot_write_a_repository_there__39___on_Windows.mdwn +6/−0
- doc/bugs/amd64_standalone:_ld-linux-x86-64.so.2:_not_found.mdwn +21/−0
- doc/bugs/android_cannot_get_from_5.20131221.mdwn +41/−0
- doc/bugs/failure_during_ssh_key_setup___40__windows__41__.mdwn +12/−0
- doc/bugs/fatal:_git-write-tree:_error_building_trees.mdwn +101/−0
- doc/bugs/import_memleak_from_the_assistant.mdwn +1598/−0
- doc/bugs/on_encfs__44___.fuse__95__hiddenXXXXX_files_left_behind.mdwn +52/−0
- doc/bugs/one_test_fail_on_osx.mdwn +30/−0
- doc/bugs/webdav_special_remote_fails_on_android___40__box.com__41__.mdwn +30/−0
- doc/design/external_special_remote_protocol.mdwn +100/−120
- doc/devblog/day_84__ho_uh_oh.mdwn +11/−0
- doc/devblog/day_85__external_special_remote_protocol_types.mdwn +25/−0
- doc/devblog/day_86__external_special_remote_implementation.mdwn +11/−0
- doc/devblog/day_87__external_special_remotes_done.mdwn +16/−0
- doc/devblog/day_88__lazy_sunday.mdwn +15/−0
- doc/forum/Consistency_Check_for_S3.mdwn +1/−0
- doc/forum/DO_NOT_use_ntfs-3g_on_mac_osx_for_annex.mdwn +41/−0
- doc/forum/No_output_from_git-annex_status_v5.20131224-g692aa01.mdwn +16/−0
- doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories.mdwn +1/−0
- doc/forum/Webapp_not_watching_repos.mdwn +1/−0
- doc/forum/confused_about_external_drives.mdwn +30/−0
- doc/forum/luks_encrypted_disk_support.mdwn +3/−0
- doc/forum/multiple_repositories_single_backup.txt +6/−0
- doc/forum/partial_synchronisation._android_phone.txt +7/−0
- doc/forum/trusted_repositories:_fatal:_not_a_git_repo.mdwn +32/−0
- doc/forum/what_happens_to_deleted_files__63__.mdwn +24/−0
- doc/git-annex.mdwn +12/−3
- doc/install/ArchLinux/comment_5_cbc960cd78bf5b90e3bb6cb605d6d970._comment +10/−0
- doc/install/Linux_standalone.mdwn +3/−1
- doc/news/version_5.20131120.mdwn +0/−11
- doc/news/version_5.20131230.mdwn +20/−0
- doc/special_remotes.mdwn +25/−8
- doc/special_remotes/external.mdwn +27/−0
- doc/special_remotes/external/example.sh +195/−0
- doc/special_remotes/hook.mdwn +9/−3
- doc/tips/downloading_podcasts.mdwn +6/−0
- doc/tips/fully_encrypted_git_repositories_with_gcrypt.mdwn +1/−1
- doc/tips/using_the_web_as_a_special_remote.mdwn +9/−1
- doc/todo/Wishlist:_Import_youtube_playlists.mdwn +30/−0
- doc/todo/support_for_writing_external_special_remotes.mdwn +2/−0
- doc/todo/wishlist:_allow_custom_S3_url_in_webapp.mdwn +3/−0
- doc/upgrades.mdwn +2/−2
- doc/users/anarcat.mdwn +7/−0
- doc/users/claes.wallin.mdwn +1/−0
- doc/users/greg.mdwn +3/−0
- git-annex.1 +11/−3
- git-annex.cabal +1/−1
- standalone/android/Makefile +1/−0
- standalone/android/buildchroot-inchroot +1/−0
- standalone/android/haskell-patches/async_fix-build-with-new-ghc.patch +0/−25
- standalone/android/haskell-patches/crypto-numbers_build-fix.patch +25/−33
- standalone/android/haskell-patches/process_fix-build-with-new-ghc.patch +0/−24
- standalone/android/install-haskell-packages +5/−5
- standalone/linux/README +0/−20
- standalone/linux/git-annex +0/−31
- standalone/linux/git-annex-shell +0/−31
- standalone/linux/git-annex-webapp +0/−31
- standalone/linux/runshell +0/−90
- standalone/linux/skel/README +20/−0
- standalone/linux/skel/git +31/−0
- standalone/linux/skel/git-annex +31/−0
- standalone/linux/skel/git-annex-shell +31/−0
- standalone/linux/skel/git-annex-webapp +31/−0
- standalone/linux/skel/git-receive-pack +31/−0
- standalone/linux/skel/git-shell +31/−0
- standalone/linux/skel/git-upload-pack +31/−0
- standalone/linux/skel/runshell +90/−0
- standalone/no-th/haskell-patches/persistent-template_stub-out.patch +7/−7
- standalone/no-th/haskell-patches/yesod-routes_remove-TH.patch +18/−17
- standalone/no-th/haskell-patches/yesod-static_hack.patch +70/−0
- standalone/no-th/haskell-patches/yesod-static_remove-TH.patch +0/−597
- standalone/osx/git-annex.app/Contents/MacOS/git +31/−0
- standalone/osx/git-annex.app/Contents/MacOS/git-receive-pack +31/−0
- standalone/osx/git-annex.app/Contents/MacOS/git-shell +31/−0
- standalone/osx/git-annex.app/Contents/MacOS/git-upload-pack +31/−0
- standalone/windows/build.sh +1/−1
.gitignore view
@@ -10,6 +10,7 @@ Build/EvilSplicer Build/Standalone Build/OSXMkLibs+Build/LinuxMkLibs git-annex git-annex.1 git-annex-shell.1
Annex/Version.hs view
@@ -15,24 +15,18 @@ type Version = String -defaultVersion :: Version-defaultVersion = "3"--directModeVersion :: Version-directModeVersion = "5"--supportedVersions :: [Version]-supportedVersions = [defaultVersion, directModeVersion]+supportedVersion :: Version+supportedVersion = "5" upgradableVersions :: [Version] #ifndef mingw32_HOST_OS upgradableVersions = ["0", "1", "2", "4"] #else-upgradableVersions = ["2", "4"]+upgradableVersions = ["2", "3", "4"] #endif autoUpgradeableVersions :: [Version]-autoUpgradeableVersions = ["4"]+autoUpgradeableVersions = ["3", "4"] versionField :: ConfigKey versionField = annexConfig "version"
Assistant/Pairing/MakeRemote.hs view
@@ -15,6 +15,7 @@ import Assistant.Sync import Config.Cost import Config+import qualified Types.Remote as Remote import Network.Socket import qualified Data.Text as T@@ -46,7 +47,7 @@ ] Nothing r <- liftAnnex $ addRemote $ makeSshRemote sshdata- liftAnnex $ setRemoteCost r semiExpensiveRemoteCost+ liftAnnex $ setRemoteCost (Remote.repo r) semiExpensiveRemoteCost syncRemote r {- Mostly a straightforward conversion. Except:
Assistant/WebApp/Configurators/Local.hs view
@@ -124,17 +124,20 @@ , inhome ) #else- -- Windows user can probably write anywhere, so always default- -- to ~/Desktop/annex.+ -- On Windows, always default to ~/Desktop/annex or ~/annex,+ -- no cwd handling because the user might be able to write+ -- to the entire drive. inhome #endif where inhome = do desktop <- userDesktopDir- ifM (doesDirectoryExist desktop)+ ifM (doesDirectoryExist desktop <&&> canWrite desktop) ( relHome $ desktop </> gitAnnexAssistantDefaultDir , return $ "~" </> gitAnnexAssistantDefaultDir )+ -- Avoid using eg, standalone build's git-annex.linux/ directory+ -- when run from there. legit d = not <$> doesFileExist (d </> "git-annex") newRepositoryForm :: FilePath -> Hamlet.Html -> MkMForm RepositoryPath
Assistant/WebApp/MakeRemote.hs view
@@ -14,6 +14,7 @@ import Assistant.WebApp.Types import Assistant.Sync import qualified Remote+import qualified Types.Remote as Remote import qualified Config import Config.Cost import Types.StandardGroups@@ -31,6 +32,6 @@ r <- liftAnnex $ addRemote maker liftAnnex $ do setStandardGroup (Remote.uuid r) defaultgroup- maybe noop (Config.setRemoteCost r) mcost+ maybe noop (Config.setRemoteCost (Remote.repo r)) mcost liftAssistant $ syncRemote r redirect $ EditNewCloudRepositoryR $ Remote.uuid r
Assistant/WebApp/RepoList.hs view
@@ -223,7 +223,7 @@ rs <- catMaybes <$> mapM Remote.remoteFromUUID list forM_ (reorderCosts remote rs) $ \(r, newcost) -> when (Remote.cost r /= newcost) $- setRemoteCost r newcost+ setRemoteCost (Remote.repo r) newcost void remoteListRefresh fromjs = toUUID . T.unpack
Build/BundledPrograms.hs view
@@ -22,6 +22,11 @@ #ifndef mingw32_HOST_OS -- git is not included in the windows bundle , Just "git"+ -- Not strictly needed in PATH by git-annex, but called+ -- by git when it sshes to a remote.+ , Just "git-upload-pack"+ , Just "git-receive-pack"+ , Just "git-shell" #endif , Just "cp" #ifndef mingw32_HOST_OS
Build/DistributionUpdate.hs view
@@ -25,7 +25,7 @@ version <- liftIO getChangelogVersion now <- liftIO getCurrentTime liftIO $ putStrLn $ "building info files for version " ++ version ++ " in " ++ basedir- fs <- liftIO $ dirContentsRecursiveSkipping (== "info") (basedir </> "git-annex")+ fs <- liftIO $ dirContentsRecursiveSkipping (== "info") True (basedir </> "git-annex") forM_ fs $ \f -> do v <- lookupFile f case v of
Build/EvilSplicer.hs view
@@ -34,18 +34,21 @@ import Text.Parsec.String import Control.Applicative ((<$>)) import Data.Either-import Data.List+import Data.List hiding (find) import Data.String.Utils import Data.Char import System.Environment import System.FilePath import System.Directory+import System.IO import Control.Monad+import Prelude hiding (log) import Utility.Monad import Utility.Misc import Utility.Exception import Utility.Path+import Utility.FileSystemEncoding data Coord = Coord { coordLine :: Int@@ -85,27 +88,27 @@ where singleline = do line <- number- char ':'+ void $ char ':' startcol <- number- char '-'+ void $ char '-' endcol <- number return $ (Coord line startcol, Coord line endcol) weird = do line <- number- char ':'+ void $ char ':' col <- number return $ (Coord line col, Coord line col) multiline = do start <- fromparens- char '-'+ void $ char '-' end <- fromparens return $ (start, end) fromparens = between (char '(') (char ')') $ do line <- number- char ','+ void $ char ',' col <- number return $ Coord line col @@ -121,19 +124,19 @@ spliceParser :: Parser Splice spliceParser = do file <- many1 (noneOf ":\n")- char ':'+ void $ char ':' (start, end) <- coordsParser- string ": Splicing "+ void $ string ": Splicing " splicetype <- tosplicetype <$> (string "expression" <|> string "declarations")- newline+ void newline getthline <- expressionextractor expression <- unlines <$> many1 getthline - indent- string "======>" - newline+ void indent+ void $ string "======>" + void newline getcodeline <- expressionextractor realcoords <- try (Right <$> getrealcoords file) <|> (Left <$> getcodeline)@@ -157,7 +160,7 @@ expressionextractor = do i <- lookAhead indent return $ try $ do- string i+ void $ string i restOfLine {- When splicing declarations, GHC will output a splice@@ -165,9 +168,9 @@ - the first line will give the actual coordinates of the - line that was spliced. -} getrealcoords file = do- indent- string file- char ':'+ void indent+ void $ string file+ void $ char ':' char '\n' `after` coordsParser {- Extracts the splices, ignoring the rest of the compiler output. -}@@ -196,6 +199,7 @@ - starts with "import " -} applySplices :: FilePath -> Maybe String -> [Splice] -> IO ()+applySplices _ _ [] = noop applySplices destdir imports splices@(first:_) = do let f = splicedFile first let dest = (destdir </> f)@@ -205,7 +209,10 @@ oldcontent <- catchMaybeIO $ readFileStrictAnyEncoding dest when (oldcontent /= Just newcontent) $ do putStrLn $ "splicing " ++ f- writeFile dest newcontent+ withFile dest WriteMode $ \h -> do+ fileEncoding h+ hPutStr h newcontent+ hClose h where expand lls [] = lls expand lls (s:rest)@@ -237,10 +244,10 @@ {- Expression splices are expanded within their line. -} expandExpressionSplice :: Splice -> [String] -> [String]-expandExpressionSplice s lls = concat [before, spliced:padding, end]+expandExpressionSplice sp lls = concat [before, spliced:padding, end] where- cs = spliceStart s- ce = spliceEnd s+ cs = spliceStart sp+ ce = spliceEnd sp (before, rest) = splitAt (coordLine cs - 1) lls (oldlines, end) = splitAt (1 + coordLine (offsetCoord ce cs)) rest@@ -251,7 +258,7 @@ _ -> ([], [], []) spliced = concat [ joinsplice $ deqqstart $ take (coordColumn cs - 1) splicestart- , addindent (findindent splicestart) (mangleCode $ splicedCode s)+ , addindent (findindent splicestart) (mangleCode $ splicedCode sp) , deqqend $ drop (coordColumn ce) spliceend ] @@ -260,7 +267,7 @@ {- splicing leaves $() quasiquote behind; remove it -} deqqstart s = case reverse s of- ('(':'$':rest) -> reverse rest+ ('(':'$':restq) -> reverse restq _ -> s deqqend (')':s) = s deqqend s = s@@ -331,27 +338,27 @@ -- skip lambdas inside tuples or parens prefix <- noneOf "(, \n" preindent <- many1 $ oneOf " \n"- string "\\ "+ void $ string "\\ " lambdaparams <- restofline continuedlambdaparams <- many $ try $ do- indent <- many1 $ char ' '+ indent1 <- many1 $ char ' ' p <- satisfy isLetter aram <- many $ satisfy isAlphaNum <|> oneOf "_"- newline- return $ indent ++ p:aram ++ "\n"- indent <- many1 $ char ' '- string "-> "+ void newline+ return $ indent1 ++ p:aram ++ "\n"+ indent1 <- many1 $ char ' '+ void $ string "-> " firstline <- restofline lambdalines <- many $ try $ do- string indent- char ' '+ void $ string indent1+ void $ char ' ' l <- restofline- return $ indent ++ " " ++ l+ return $ indent1 ++ " " ++ l return $ concat [ prefix:preindent , "(\\ " ++ lambdaparams ++ "\n" , concat continuedlambdaparams- , indent ++ "-> "+ , indent1 ++ "-> " , lambdaparens $ intercalate "\n" (firstline:lambdalines) , ")\n" ]@@ -376,27 +383,27 @@ - layer of parens even when a lambda seems to be in parent. -} lambdaparenhack = parsecAndReplace $ do- indent <- many1 $ char ' '+ indent1 <- many1 $ char ' ' staticr <- string "StaticR"- newline- string indent+ void newline+ void $ string indent1 yesod_dispatch_env <- restofline- string indent+ void $ string indent1 lambdaprefix <- string "(\\ " l1 <- restofline- string indent+ void $ string indent1 lambdaarrow <- string " ->" l2 <- restofline l3 <- if '{' `elem` l2 && '}' `elem` l2 then return "" else do- string indent+ void $ string indent1 restofline return $ unlines- [ indent ++ staticr- , indent ++ yesod_dispatch_env- , indent ++ "(" ++ lambdaprefix ++ l1- , indent ++ lambdaarrow ++ l2 ++ l3 ++ ")"+ [ indent1 ++ staticr+ , indent1 ++ yesod_dispatch_env+ , indent1 ++ "(" ++ lambdaprefix ++ l1+ , indent1 ++ lambdaarrow ++ l2 ++ l3 ++ ")" ] restofline = manyTill (noneOf "\n") newline@@ -408,9 +415,9 @@ - To work around what is likely a GHC bug, just collapse - multiline strings. -} collapse_multiline_strings = parsecAndReplace $ do- string "\\\n"- many1 $ oneOf " \t"- string "\\"+ void $ string "\\\n"+ void $ many1 $ oneOf " \t"+ void $ string "\\" return "\\n" {- GHC outputs splices using explicit braces rather than layout.@@ -439,8 +446,8 @@ - all whitespace up until it. -} case_layout = parsecAndReplace $ do- newline- indent <- many1 $ char ' '+ void newline+ indent1 <- many1 $ char ' ' prefix <- manyTill (noneOf "\n") (try (string "-> ")) if length prefix > 10 then unexpected "too long a prefix"@@ -448,24 +455,24 @@ then unexpected "lambda expression" else if null prefix then unexpected "second line of lambda"- else return $ "\n" ++ indent ++ "; " ++ prefix ++ " -> "+ else return $ "\n" ++ indent1 ++ "; " ++ prefix ++ " -> " {- Sometimes cases themselves span multiple lines: - - Nothing - -> foo -} case_layout_multiline = parsecAndReplace $ do- newline- indent <- many1 $ char ' '+ void newline+ indent1 <- many1 $ char ' ' firstline <- restofline - string indent+ void $ string indent1 indent2 <- many1 $ char ' '- string "-> "+ void $ string "-> " if "\\ " `isInfixOf` firstline then unexpected "lambda expression"- else return $ "\n" ++ indent ++ "; " ++ firstline ++ "\n"- ++ indent ++ indent2 ++ "-> "+ else return $ "\n" ++ indent1 ++ "; " ++ firstline ++ "\n"+ ++ indent1 ++ indent2 ++ "-> " {- (foo, \ -> bar) is not valid haskell, GHC. - Change to (foo, bar)@@ -497,11 +504,11 @@ - signature is easily inferred, so is just removed. -} remove_unnecessary_type_signatures = parsecAndReplace $ do- string " ::"- newline- many1 $ char ' '- string "Text.Css.Block Text.Css.Resolved"- newline+ void $ string " ::"+ void newline+ void $ many1 $ char ' '+ void $ string "Text.Css.Block Text.Css.Resolved"+ void newline return "" {- GHC may add full package and version qualifications for@@ -520,15 +527,14 @@ qualifiedSymbol :: Parser String qualifiedSymbol = do- s <- token- char ':'+ s <- hstoken+ void $ char ':' if length s < 5 then unexpected "too short to be a namespace"- else do- token+ else hstoken - token :: Parser String- token = do+ hstoken :: Parser String+ hstoken = do t <- satisfy isLetter oken <- many $ satisfy isAlphaNum <|> oneOf "-.'" return $ t:oken@@ -561,25 +567,25 @@ -} yesod_url_render_hack :: String -> String yesod_url_render_hack = parsecAndReplace $ do- string "(toHtml"- whitespace- string "(\\"- whitespace- wtf <- token- whitespace- string "->"- whitespace- renderer <- token- whitespace- string wtf- whitespace+ void $ string "(toHtml"+ void whitespace+ void $ string "(\\"+ void whitespace+ wtf <- hstoken+ void whitespace+ void $ string "->"+ void whitespace+ renderer <- hstoken+ void whitespace+ void $ string wtf+ void whitespace return $ "(toHtml (flip " ++ renderer ++ " " where whitespace :: Parser String whitespace = many $ oneOf " \t\r\n" - token :: Parser String- token = many1 $ satisfy isAlphaNum <|> oneOf "_"+ hstoken :: Parser String+ hstoken = many1 $ satisfy isAlphaNum <|> oneOf "_" {- Use exported symbol. -} text_builder_hack :: String -> String@@ -591,7 +597,7 @@ - Rather slow, but crazy powerful. -} parsecAndReplace :: Parser String -> String -> String parsecAndReplace p s = case parse find "" s of- Left e -> s+ Left _e -> s Right l -> concatMap (either return id) l where find :: Parser [Either Char String]
+ Build/LinuxMkLibs.hs view
@@ -0,0 +1,144 @@+{- Linux library copier and binary shimmer+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Main where++import Control.Applicative+import System.Environment+import Data.Maybe+import System.FilePath+import System.Directory+import Control.Monad+import Data.List+import Data.List.Utils+import System.Posix.Files+import Data.Char+import Control.Monad.IfElse++import Utility.PartialPrelude+import Utility.Directory+import Utility.Process+import Utility.Monad+import Utility.Path+import Utility.FileMode+import Utility.CopyFile++main :: IO ()+main = getArgs >>= go+ where+ go [] = error "specify LINUXSTANDALONE_DIST"+ go (top:_) = mklibs top++mklibs :: FilePath -> IO ()+mklibs top = do+ fs <- dirContentsRecursive top+ mapM_ symToHardLink fs+ exes <- filterM checkExe fs+ libs <- parseLdd <$> readProcess "ldd" exes+ glibclibs <- glibcLibs+ let libs' = nub $ libs ++ glibclibs+ libdirs <- nub . catMaybes <$> mapM (installLib top) libs'++ -- Various files used by runshell to set up env vars used by the+ -- linker shims.+ writeFile (top </> "libdirs") (unlines libdirs)+ writeFile (top </> "linker")+ (Prelude.head $ filter ("ld-linux" `isInfixOf`) libs')+ writeFile (top </> "gconvdir")+ (parentDir $ Prelude.head $ filter ("/gconv/" `isInfixOf`) glibclibs)+ + mapM_ (installLinkerShim top) exes++{- Installs a library. If the library is a symlink to another file,+ - install the file it links to, and update the symlink to be relative. -}+installLib :: FilePath -> FilePath -> IO (Maybe FilePath)+installLib top lib = ifM (doesFileExist lib)+ ( do+ installFile top lib+ checksymlink lib+ return $ Just $ parentDir lib+ , return Nothing+ )+ where+ checksymlink f = whenM (isSymbolicLink <$> getSymbolicLinkStatus (inTop top f)) $ do+ l <- readSymbolicLink (inTop top f)+ let absl = absPathFrom (parentDir f) l+ let target = relPathDirToFile (parentDir f) absl+ installFile top absl+ nukeFile (top ++ f)+ createSymbolicLink target (inTop top f)+ checksymlink absl++{- Installs a linker shim script around a binary.+ -+ - Note that each binary is put into its own separate directory,+ - to avoid eg git looking for binaries in its directory rather+ - than in PATH.-}+installLinkerShim :: FilePath -> FilePath -> IO ()+installLinkerShim top exe = do+ createDirectoryIfMissing True shimdir+ renameFile exe exedest+ writeFile exe $ unlines+ [ "#!/bin/sh"+ , "exec \"$GIT_ANNEX_LINKER\" --library-path \"$GIT_ANNEX_LD_LIBRARY_PATH\" \"$GIT_ANNEX_SHIMMED/" ++ base ++ "/" ++ base ++ "\" \"$@\""+ ]+ modifyFileMode exe $ addModes executeModes+ where+ base = takeFileName exe+ shimdir = top </> "shimmed" </> base+ exedest = shimdir </> base++{- Converting symlinks to hard links simplifies the binary shimming+ - process. -}+symToHardLink :: FilePath -> IO ()+symToHardLink f = whenM (isSymbolicLink <$> getSymbolicLinkStatus f) $ do+ l <- readSymbolicLink f+ let absl = absPathFrom (parentDir f) l+ nukeFile f+ createLink absl f++installFile :: FilePath -> FilePath -> IO ()+installFile top f = do+ createDirectoryIfMissing True destdir+ void $ copyFileExternal f destdir+ where+ destdir = inTop top $ parentDir f++-- Note that f is not relative, so cannot use </>+inTop :: FilePath -> FilePath -> FilePath+inTop top f = top ++ f -- ++checkExe :: FilePath -> IO Bool+checkExe f+ | ".so" `isSuffixOf` f = return False+ | otherwise = ifM (isExecutable . fileMode <$> getFileStatus f)+ ( checkFileExe <$> readProcess "file" [f]+ , return False+ )++{- Check that file(1) thinks it's a Linux ELF executable, or possibly+ - a shared library (a few executables like ssh appear as shared libraries). -}+checkFileExe :: String -> Bool+checkFileExe s = and+ [ "ELF" `isInfixOf` s+ , "executable" `isInfixOf` s || "shared object" `isInfixOf` s+ ]++{- Parse ldd output, getting all the libraries that the input files+ - link to. Note that some of the libraries may not exist + - (eg, linux-vdso.so) -}+parseLdd :: String -> [FilePath]+parseLdd = catMaybes . map (getlib . dropWhile isSpace) . lines+ where+ getlib l = headMaybe . words =<< lastMaybe (split " => " l)++{- Get all glibc libs and other support files, including gconv files+ -+ - XXX Debian specific. -}+glibcLibs :: IO [FilePath]+glibcLibs = lines <$> readProcess "sh"+ ["-c", "dpkg -L libc6 | egrep '\\.so|gconv'"]
Build/Standalone.hs view
@@ -9,21 +9,13 @@ module Main where -import Control.Applicative import Control.Monad.IfElse import System.Environment-import Data.Maybe import System.FilePath import System.Directory-import System.IO import Control.Monad-import Data.List import Build.BundledPrograms -import Utility.PartialPrelude-import Utility.Directory-import Utility.Process-import Utility.Monad import Utility.SafeCommand import Utility.Path @@ -44,6 +36,7 @@ error $ "install failed for " ++ prog return (dest, f) +main :: IO () main = getArgs >>= go where go [] = error "specify topdir"
CHANGELOG view
@@ -1,3 +1,26 @@+git-annex (5.20131230) unstable; urgency=medium++ * Added new external special remote interface.+ * importfeed: Support youtube playlists.+ * Add tasty to build-depends, so that test suite builds again.+ (tasty was stuck in incoming.)+ * Fix typo in test suite.+ * Fix bug in Linux standalone build's shimming that broke git-annex-shell.+ * Include git-receive-pack, git-upload-pack, git, and git-shell wrappers+ in the Linux standalone build, and OSX app, so they will be available+ when it's added to PATH.+ * addurl, importfeed: Sanitize | and some other symbols and special+ characters.+ * Auto-upgrade v3 indirect repos to v5 with no changes.+ This also fixes a problem when a direct mode repo was somehow set to v3+ rather than v4, and so the automatic direct mode upgrade to v5 was not+ done.+ * Android: Avoid trying to use Android's own ionice, which does not+ allow specifying a command to run. Fixes transferring files to/from+ android and probably a few other things.++ -- Joey Hess <joeyh@debian.org> Mon, 30 Dec 2013 14:13:40 -0400+ git-annex (5.20131221) unstable; urgency=low * assistant: Fix OSX-specific bug that caused the startup scan to try to
Command/AddUrl.hs view
@@ -98,20 +98,25 @@ where quviurl = setDownloader pageurl QuviDownloader addurl (key, _backend) = next $ cleanup quviurl file key Nothing- geturl = do- key <- Backend.URL.fromUrl quviurl Nothing- ifM (pure relaxed <||> Annex.getState Annex.fast)- ( next $ cleanup quviurl file key Nothing- , do- tmp <- fromRepo $ gitAnnexTmpLocation key- showOutput- ok <- Transfer.download webUUID key (Just file) Transfer.forwardRetry $ const $ do- liftIO $ createDirectoryIfMissing True (parentDir tmp)- downloadUrl [videourl] tmp- if ok- then next $ cleanup quviurl file key (Just tmp)- else stop- )+ geturl = next $ addUrlFileQuvi relaxed quviurl videourl file+#endif++#ifdef WITH_QUVI+addUrlFileQuvi :: Bool -> URLString -> URLString -> FilePath -> Annex Bool+addUrlFileQuvi relaxed quviurl videourl file = do+ key <- Backend.URL.fromUrl quviurl Nothing+ ifM (pure relaxed <||> Annex.getState Annex.fast)+ ( cleanup quviurl file key Nothing+ , do+ tmp <- fromRepo $ gitAnnexTmpLocation key+ showOutput+ ok <- Transfer.download webUUID key (Just file) Transfer.forwardRetry $ const $ do+ liftIO $ createDirectoryIfMissing True (parentDir tmp)+ downloadUrl [videourl] tmp+ if ok+ then cleanup quviurl file key (Just tmp)+ else return False+ ) #endif perform :: Bool -> URLString -> FilePath -> CommandPerform
Command/Direct.hs view
@@ -16,7 +16,6 @@ import qualified Git.LsFiles import Config import Annex.Direct-import Annex.Version import Annex.Exception def :: [Command]@@ -69,5 +68,4 @@ cleanup = do showStart "direct" "" setDirect True- setVersion directModeVersion return True
Command/ImportFeed.hs view
@@ -5,6 +5,8 @@ - Licensed under the GNU GPL version 3 or higher. -} +{-# LANGUAGE CPP #-}+ module Command.ImportFeed where import Text.Feed.Import@@ -25,6 +27,11 @@ import Command.AddUrl (addUrlFile, relaxedOption) import Annex.Perms import Backend.URL (fromUrl)+#ifdef WITH_QUVI+import Annex.Quvi+import qualified Utility.Quvi as Quvi+import Command.AddUrl (addUrlFileQuvi)+#endif def :: [Command] def = [notBareRepo $ withOptions [templateOption, relaxedOption] $@@ -47,16 +54,16 @@ perform :: Bool -> Cache -> URLString -> CommandPerform perform relaxed cache url = do- v <- findEnclosures url+ v <- findDownloads url case v of- Just l | not (null l) -> do- ok <- and <$> mapM (downloadEnclosure relaxed cache) l+ [] -> do+ feedProblem url "bad feed content"+ next $ return True+ l -> do+ ok <- and <$> mapM (performDownload relaxed cache) l unless ok $ feedProblem url "problem downloading item" next $ cleanup url True- _ -> do- feedProblem url "bad feed content"- next $ return True cleanup :: URLString -> Bool -> CommandCleanup cleanup url ok = do@@ -68,13 +75,10 @@ { feed :: Feed , feedurl :: URLString , item :: Item- , location :: URLString+ , location :: DownloadLocation } -mkToDownload :: Feed -> URLString -> Item -> Maybe ToDownload-mkToDownload f u i = case getItemEnclosure i of- Nothing -> Nothing- Just (enclosureurl, _, _) -> Just $ ToDownload f u i enclosureurl+data DownloadLocation = Enclosure URLString | QuviLink URLString data Cache = Cache { knownurls :: S.Set URLString@@ -92,12 +96,27 @@ tmpl = Utility.Format.gen $ fromMaybe defaultTemplate opttemplate ret s = return $ Cache s tmpl -findEnclosures :: URLString -> Annex (Maybe [ToDownload])-findEnclosures url = extract <$> downloadFeed url+findDownloads :: URLString -> Annex [ToDownload]+findDownloads u = go =<< downloadFeed u where- extract Nothing = Nothing- extract (Just f) = Just $ mapMaybe (mkToDownload f url) (feedItems f)+ go Nothing = pure []+ go (Just f) = catMaybes <$> mapM (mk f) (feedItems f) + mk f i = case getItemEnclosure i of+ Just (enclosureurl, _, _) -> return $ + Just $ ToDownload f u i $ Enclosure enclosureurl+ Nothing -> mkquvi f i+#ifdef WITH_QUVI+ mkquvi f i = case getItemLink i of+ Just link -> ifM (liftIO $ Quvi.supported link)+ ( return $ Just $ ToDownload f u i $ QuviLink link+ , return Nothing+ )+ Nothing -> return Nothing+#else+ mkquvi = return Nothing+#endif+ {- Feeds change, so a feed download cannot be resumed. -} downloadFeed :: URLString -> Annex (Maybe Feed) downloadFeed url = do@@ -110,35 +129,54 @@ , return Nothing ) -{- Avoids downloading any urls that are already known to be associated- - with a file in the annex, unless forced. -}-downloadEnclosure :: Bool -> Cache -> ToDownload -> Annex Bool-downloadEnclosure relaxed cache enclosure- | S.member url (knownurls cache) = ifM forced (go, return True)- | otherwise = go+performDownload :: Bool -> Cache -> ToDownload -> Annex Bool+performDownload relaxed cache todownload = case location todownload of+ Enclosure url -> checkknown url $+ rundownload url (takeExtension url) $ + addUrlFile relaxed url+ QuviLink pageurl -> do+ mp <- withQuviOptions Quvi.query [Quvi.quiet, Quvi.httponly] pageurl+ case mp of+ Nothing -> return False+ Just page -> case headMaybe $ Quvi.pageLinks page of+ Nothing -> return False+ Just link -> do+ let quviurl = setDownloader pageurl QuviDownloader+ let videourl = Quvi.linkUrl link+ checkknown videourl $+ rundownload videourl ("." ++ Quvi.linkSuffix link) $+ addUrlFileQuvi relaxed quviurl videourl where forced = Annex.getState Annex.force- url = location enclosure- go = do- dest <- makeunique (1 :: Integer) $ feedFile (template cache) enclosure++ {- Avoids downloading any urls that are already known to be+ - associated with a file in the annex, unless forced. -}+ checkknown url a+ | S.member url (knownurls cache) = ifM forced (a, return True)+ | otherwise = a++ rundownload url extension getter = do+ dest <- makeunique url (1 :: Integer) $+ feedFile (template cache) todownload extension case dest of Nothing -> return True Just f -> do showStart "addurl" f- ok <- addUrlFile relaxed url f+ ok <- getter f if ok then do showEndOk return True else do showEndFail- checkFeedBroken (feedurl enclosure)+ checkFeedBroken (feedurl todownload)+ {- Find a unique filename to save the url to. - If the file exists, prefixes it with a number. - When forced, the file may already exist and have the same - url, in which case Nothing is returned as it does not need - to be re-downloaded. -}- makeunique n file = ifM alreadyexists+ makeunique url n file = ifM alreadyexists ( ifM forced ( ifAnnexed f checksameurl tryanother , tryanother@@ -151,7 +189,7 @@ else let (d, base) = splitFileName file in d </> show n ++ "_" ++ base- tryanother = makeunique (n + 1) file+ tryanother = makeunique url (n + 1) file alreadyexists = liftIO $ isJust <$> catchMaybeIO (getSymbolicLinkStatus f) checksameurl (k, _) = ifM (elem url <$> getUrls k) ( return Nothing@@ -163,8 +201,8 @@ {- Generates a filename to use for a feed item by filling out the template. - The filename may not be unique. -}-feedFile :: Utility.Format.Format -> ToDownload -> FilePath-feedFile tmpl i = Utility.Format.format tmpl $ M.fromList+feedFile :: Utility.Format.Format -> ToDownload -> String -> FilePath+feedFile tmpl i extension = Utility.Format.format tmpl $ M.fromList [ field "feedtitle" $ getFeedTitle $ feed i , fieldMaybe "itemtitle" $ getItemTitle $ item i , fieldMaybe "feedauthor" $ getFeedAuthor $ feed i@@ -173,7 +211,7 @@ , fieldMaybe "itemdescription" $ getItemDescription $ item i , fieldMaybe "itemrights" $ getItemRights $ item i , fieldMaybe "itemid" $ snd <$> getItemId (item i)- , ("extension", sanitizeFilePath $ takeExtension $ location i)+ , ("extension", sanitizeFilePath extension) ] where field k v =
Command/Indirect.hs view
@@ -22,7 +22,6 @@ import Annex.Content import Annex.Content.Direct import Annex.CatFile-import Annex.Version import Annex.Exception import Init import qualified Command.Add@@ -107,7 +106,6 @@ cleanup :: CommandCleanup cleanup = do- setVersion defaultVersion showStart "indirect" "" showEndOk return True
Command/Version.hs view
@@ -30,9 +30,7 @@ liftIO $ do showPackageVersion info "local repository version" $ fromMaybe "unknown" v- info "default repository version" defaultVersion- info "supported repository versions" $- unwords supportedVersions+ info "supported repository version" supportedVersion info "upgrade supported from repository versions" $ unwords upgradableVersions stop
Config.hs view
@@ -12,7 +12,6 @@ import qualified Git.Config import qualified Git.Command import qualified Annex-import qualified Types.Remote as Remote import Config.Cost type UnqualifiedConfigKey = String@@ -55,14 +54,16 @@ - by remote.<name>.annex-cost, or if remote.<name>.annex-cost-command - is set and prints a number, that is used. -} remoteCost :: RemoteGitConfig -> Cost -> Annex Cost-remoteCost c def = case remoteAnnexCostCommand c of+remoteCost c def = fromMaybe def <$> remoteCost' c++remoteCost' :: RemoteGitConfig -> Annex (Maybe Cost)+remoteCost' c = case remoteAnnexCostCommand c of Just cmd | not (null cmd) -> liftIO $- (fromMaybe def . readish) <$>- readProcess "sh" ["-c", cmd]- _ -> return $ fromMaybe def $ remoteAnnexCost c+ readish <$> readProcess "sh" ["-c", cmd]+ _ -> return $ remoteAnnexCost c -setRemoteCost :: Remote -> Cost -> Annex ()-setRemoteCost r c = setConfig (remoteConfig (Remote.repo r) "cost") (show c)+setRemoteCost :: Git.Repo -> Cost -> Annex ()+setRemoteCost r c = setConfig (remoteConfig r "cost") (show c) getNumCopies :: Maybe Int -> Annex Int getNumCopies (Just v) = return v
Creds.hs view
@@ -35,25 +35,27 @@ {- Stores creds in a remote's configuration, if the remote allows - that. Otherwise, caches them locally. -} setRemoteCredPair :: RemoteConfig -> CredPairStorage -> Annex RemoteConfig-setRemoteCredPair c storage = go =<< getRemoteCredPair c storage- where- go (Just creds)- | embedCreds c = case credPairRemoteKey storage of- Nothing -> localcache creds- Just key -> storeconfig creds key =<< remoteCipher c- | otherwise = localcache creds- go Nothing = return c+setRemoteCredPair c storage = + maybe (return c) (setRemoteCredPair' c storage)+ =<< getRemoteCredPair c storage - localcache creds = do+setRemoteCredPair' :: RemoteConfig -> CredPairStorage -> CredPair -> Annex RemoteConfig+setRemoteCredPair' c storage creds+ | embedCreds c = case credPairRemoteKey storage of+ Nothing -> localcache+ Just key -> storeconfig key =<< remoteCipher c+ | otherwise = localcache+ where+ localcache = do writeCacheCredPair creds storage return c - storeconfig creds key (Just cipher) = do+ storeconfig key (Just cipher) = do s <- liftIO $ encrypt [] cipher (feedBytes $ L.pack $ encodeCredPair creds) (readBytes $ return . L.unpack) return $ M.insert key (toB64 s) c- storeconfig creds key Nothing =+ storeconfig key Nothing = return $ M.insert key (toB64 $ encodeCredPair creds) c {- Gets a remote's credpair, from the environment if set, otherwise
Init.hs view
@@ -65,13 +65,12 @@ checkCrippledFileSystem unlessM isBare $ hookWrite preCommitHook+ setVersion supportedVersion ifM (crippledFileSystem <&&> not <$> isBare) ( do enableDirectMode setDirect True- setVersion directModeVersion , do- setVersion defaultVersion -- Handle case where this repo was cloned from a -- direct mode repo. unlessM isBare
Makefile view
@@ -79,19 +79,21 @@ rm -rf tmp dist git-annex $(mans) configure *.tix .hpc \ doc/.ikiwiki html dist tags Build/SysConfig.hs build-stamp \ Setup Build/InstallDesktopFile Build/EvilSplicer \- Build/Standalone Build/OSXMkLibs Build/DistributionUpdate \+ Build/Standalone Build/OSXMkLibs Build/LinuxMkLibs Build/DistributionUpdate \ git-union-merge find . -name \*.o -exec rm {} \; find . -name \*.hi -exec rm {} \; Build/InstallDesktopFile: Build/InstallDesktopFile.hs- $(GHC) --make $@+ $(GHC) --make $@ -Wall Build/EvilSplicer: Build/EvilSplicer.hs- $(GHC) --make $@+ $(GHC) --make $@ -Wall Build/Standalone: Build/Standalone.hs Build/SysConfig.hs- $(GHC) --make $@+ $(GHC) --make $@ -Wall Build/OSXMkLibs: Build/OSXMkLibs.hs- $(GHC) --make $@+ $(GHC) --make $@ -Wall+Build/LinuxMkLibs: Build/LinuxMkLibs.hs+ $(GHC) --make $@ -Wall sdist: clean $(mans) ./Build/make-sdist.sh@@ -103,10 +105,10 @@ LINUXSTANDALONE_DEST=tmp/git-annex.linux linuxstandalone: $(MAKE) git-annex linuxstandalone-nobuild-linuxstandalone-nobuild: Build/Standalone+linuxstandalone-nobuild: Build/Standalone Build/LinuxMkLibs rm -rf "$(LINUXSTANDALONE_DEST)" mkdir -p tmp- cp -R standalone/linux "$(LINUXSTANDALONE_DEST)"+ cp -R standalone/linux/skel "$(LINUXSTANDALONE_DEST)" install -d "$(LINUXSTANDALONE_DEST)/bin" cp dist/build/git-annex/git-annex "$(LINUXSTANDALONE_DEST)/bin/"@@ -121,42 +123,8 @@ (cd "$(shell git --exec-path)" && tar c .) | (cd "$(LINUXSTANDALONE_DEST)"/git-core && tar x) install -d "$(LINUXSTANDALONE_DEST)/templates" - touch "$(LINUXSTANDALONE_DEST)/libdirs.tmp"- for lib in $$(ldd "$(LINUXSTANDALONE_DEST)"/bin/* $$(find "$(LINUXSTANDALONE_DEST)"/git-core/ -type f) | grep -v "not a dynamic executable" | egrep '^ ' | sed 's/^\t//' | sed 's/.*=> //' | cut -d ' ' -f 1 | sort | uniq); do \- dir=$$(dirname "$$lib"); \- install -d "$(LINUXSTANDALONE_DEST)/$$dir"; \- echo "$$dir" >> "$(LINUXSTANDALONE_DEST)/libdirs.tmp"; \- cp "$$lib" "$(LINUXSTANDALONE_DEST)/$$dir"; \- if [ -L "$lib" ]; then \- link=$$(readlink -f "$$lib"); \- cp "$$link" "$(LINUXSTANDALONE_DEST)/$$(dirname "$$link")"; \- fi; \- done- sort "$(LINUXSTANDALONE_DEST)/libdirs.tmp" | uniq > "$(LINUXSTANDALONE_DEST)/libdirs"- rm -f "$(LINUXSTANDALONE_DEST)/libdirs.tmp"-- # Ensure bundle includes all glibc libs, and other support- # files it loads.- # XXX Debian specific.- cd $(LINUXSTANDALONE_DEST) && dpkg -L libc6 | egrep '\.so|gconv'|tar c --files-from=- | tar x-- find $(LINUXSTANDALONE_DEST) -type d -name gconv | head -n 1 | sed 's!$(LINUXSTANDALONE_DEST)/*!!' > $(LINUXSTANDALONE_DEST)/gconvdir- find $(LINUXSTANDALONE_DEST) | grep ld-linux | head -n 1 | sed 's!$(LINUXSTANDALONE_DEST)/*!!' > $(LINUXSTANDALONE_DEST)/linker+ ./Build/LinuxMkLibs "$(LINUXSTANDALONE_DEST)" - # Install linker shim for each binary. Note that each binary is put- # in its own separate directory, to avoid eg git looking for- # binaries in its directory rather than in PATH.- for file in $$(find "$(LINUXSTANDALONE_DEST)" -type f | grep -v \.so); do \- if file "$$file" | grep ELF | egrep -q 'executable|shared object' && test -x "$$file"; then \- base=$$(basename "$$file"); \- mkdir -p "$(LINUXSTANDALONE_DEST)/shimmed/$$base"; \- mv "$$file" "$(LINUXSTANDALONE_DEST)/shimmed/$$base/"; \- echo "#!/bin/sh" > "$$file"; \- echo "exec \"\$$GIT_ANNEX_LINKER\" --library-path \"\$$GIT_ANNEX_LD_LIBRARY_PATH\" \"\$$GIT_ANNEX_SHIMMED/$$base/$$base\" \"\$$@\"" >> "$$file"; \- chmod +x "$$file"; \- fi; \- done- $(MAKE) install-mans DESTDIR="$(LINUXSTANDALONE_DEST)" cd tmp/git-annex.linux && find . -type f > git-annex.MANIFEST@@ -186,14 +154,12 @@ # OSX looks in man dir nearby the bin $(MAKE) install-mans DESTDIR="$(OSXAPP_BASE)/.." SHAREDIR="" PREFIX=""- # This file breaks hditul create- rm -f "$(OSXAPP_BASE)/../man/man1/git-annex-shell.1" ./Build/OSXMkLibs $(OSXAPP_BASE) cd $(OSXAPP_DEST) && find . -type f > Contents/MacOS/git-annex.MANIFEST cd $(OSXAPP_DEST) && find . -type l >> Contents/MacOS/git-annex.MANIFEST rm -f tmp/git-annex.dmg- hdiutil create -format UDBZ -srcfolder tmp/build-dmg \+ hdiutil create -format UDBZ -size 640m -srcfolder tmp/build-dmg \ -volname git-annex -o tmp/git-annex.dmg # Must be run on a system with TH supported, and the same
+ Remote/External.hs view
@@ -0,0 +1,399 @@+{- External special remote interface.+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Remote.External (remote) where++import Remote.External.Types+import qualified Annex+import Common.Annex+import Types.Remote+import qualified Git+import Config+import Remote.Helper.Special+import Remote.Helper.Encryptable+import Crypto+import Utility.Metered+import Logs.Transfer+import Config.Cost+import Annex.Content+import Annex.UUID+import Annex.Exception+import Creds++import Control.Concurrent.STM+import System.Process (std_in, std_out, std_err)+import System.Log.Logger (debugM)+import qualified Data.Map as M+import qualified Data.ByteString.Lazy as L++remote :: RemoteType+remote = RemoteType {+ typename = "external",+ enumerate = findSpecialRemotes "externaltype",+ generate = gen,+ setup = externalSetup+}++gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote)+gen r u c gc = do+ external <- newExternal externaltype u c+ Annex.addCleanup (fromUUID u) $ stopExternal external+ cst <- getCost external r gc+ return $ Just $ encryptableRemote c+ (storeEncrypted external $ getGpgEncParams (c,gc))+ (retrieveEncrypted external)+ Remote {+ uuid = u,+ cost = cst,+ name = Git.repoDescribe r,+ storeKey = store external,+ retrieveKeyFile = retrieve external,+ retrieveKeyFileCheap = \_ _ -> return False,+ removeKey = remove external,+ hasKey = checkPresent external,+ hasKeyCheap = False,+ whereisKey = Nothing,+ remoteFsck = Nothing,+ repairRepo = Nothing,+ config = c,+ localpath = Nothing,+ repo = r,+ gitconfig = gc,+ readonly = False,+ globallyAvailable = False,+ remotetype = remote+ }+ where+ externaltype = fromMaybe (error "missing externaltype") $ remoteAnnexExternalType gc++externalSetup :: Maybe UUID -> RemoteConfig -> Annex (RemoteConfig, UUID)+externalSetup mu c = do+ u <- maybe (liftIO genUUID) return mu+ let externaltype = fromMaybe (error "Specify externaltype=") $+ M.lookup "externaltype" c+ c' <- encryptionSetup c++ external <- newExternal externaltype u c'+ handleRequest external INITREMOTE Nothing $ \resp -> case resp of+ INITREMOTE_SUCCESS -> Just noop+ INITREMOTE_FAILURE errmsg -> Just $ error errmsg+ _ -> Nothing+ c'' <- liftIO $ atomically $ readTMVar $ externalConfig external++ gitConfigSpecialRemote u c'' "externaltype" externaltype+ return (c'', u)++store :: External -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool+store external k _f p = sendAnnex k rollback $ \f ->+ storeHelper external k f p+ where+ rollback = void $ remove external k++storeEncrypted :: External -> [CommandParam] -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool+storeEncrypted external gpgOpts (cipher, enck) k p = withTmp enck $ \tmp ->+ sendAnnex k rollback $ \src -> do+ liftIO $ encrypt gpgOpts cipher (feedFile src) $+ readBytes $ L.writeFile tmp+ storeHelper external enck tmp p+ where+ rollback = void $ remove external enck++storeHelper :: External -> Key -> FilePath -> MeterUpdate -> Annex Bool+storeHelper external k f p = safely $+ handleRequest external (TRANSFER Upload k f) (Just p) $ \resp ->+ case resp of+ TRANSFER_SUCCESS Upload k' | k == k' ->+ Just $ return True+ TRANSFER_FAILURE Upload k' errmsg | k == k' ->+ Just $ do+ warning errmsg+ return False+ _ -> Nothing++retrieve :: External -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool+retrieve external k _f d p = retrieveHelper external k d p++retrieveEncrypted :: External -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool+retrieveEncrypted external (cipher, enck) _ f p = withTmp enck $ \tmp ->+ ifM (retrieveHelper external enck tmp p)+ ( liftIO $ catchBoolIO $ do+ decrypt cipher (feedFile tmp) $+ readBytes $ L.writeFile f+ return True+ , return False+ )++retrieveHelper :: External -> Key -> FilePath -> MeterUpdate -> Annex Bool+retrieveHelper external k d p = safely $+ handleRequest external (TRANSFER Download k d) (Just p) $ \resp ->+ case resp of+ TRANSFER_SUCCESS Download k'+ | k == k' -> Just $ return True+ TRANSFER_FAILURE Download k' errmsg+ | k == k' -> Just $ do+ warning errmsg+ return False+ _ -> Nothing++remove :: External -> Key -> Annex Bool+remove external k = safely $ + handleRequest external (REMOVE k) Nothing $ \resp ->+ case resp of+ REMOVE_SUCCESS k'+ | k == k' -> Just $ return True+ REMOVE_FAILURE k' errmsg+ | k == k' -> Just $ do+ warning errmsg+ return False+ _ -> Nothing++checkPresent :: External -> Key -> Annex (Either String Bool)+checkPresent external k = either (Left . show) id <$> tryAnnex go+ where+ go = handleRequest external (CHECKPRESENT k) Nothing $ \resp ->+ case resp of+ CHECKPRESENT_SUCCESS k'+ | k' == k -> Just $ return $ Right True+ CHECKPRESENT_FAILURE k'+ | k' == k -> Just $ return $ Right False+ CHECKPRESENT_UNKNOWN k' errmsg+ | k' == k -> Just $ return $ Left errmsg+ _ -> Nothing++safely :: Annex Bool -> Annex Bool+safely a = go =<< tryAnnex a+ where+ go (Right r) = return r+ go (Left e) = do+ warning $ show e+ return False++{- Sends a Request to the external remote, and waits for it to generate+ - a Response. That is fed into the responsehandler, which should return+ - the action to run for it (or Nothing if there's a protocol error).+ -+ - While the external remote is processing the Request, it may send+ - any number of RemoteRequests, that are handled here.+ -+ - Only one request can be made at a time, so locking is used.+ -+ - May throw exceptions, for example on protocol errors, or+ - when the repository cannot be used.+ -}+handleRequest :: External -> Request -> Maybe MeterUpdate -> (Response -> Maybe (Annex a)) -> Annex a+handleRequest external req mp responsehandler = + withExternalLock external $ \lck ->+ handleRequest' lck external req mp responsehandler++handleRequest' :: ExternalLock -> External -> Request -> Maybe MeterUpdate -> (Response -> Maybe (Annex a)) -> Annex a+handleRequest' lck external req mp responsehandler+ | needsPREPARE req = do+ checkPrepared lck external+ go+ | otherwise = go+ where+ go = do+ sendMessage lck external req+ loop+ loop = receiveMessage lck external responsehandler+ (\rreq -> Just $ handleRemoteRequest rreq >> loop)+ (\msg -> Just $ handleAsyncMessage msg >> loop)++ handleRemoteRequest (PROGRESS bytesprocessed) =+ maybe noop (\a -> liftIO $ a bytesprocessed) mp+ handleRemoteRequest (DIRHASH k) = + sendMessage lck external $ VALUE $ hashDirMixed k+ handleRemoteRequest (SETCONFIG setting value) =+ liftIO $ atomically $ do+ let v = externalConfig external+ m <- takeTMVar v+ putTMVar v $ M.insert setting value m+ handleRemoteRequest (GETCONFIG setting) = do+ value <- fromMaybe "" . M.lookup setting+ <$> liftIO (atomically $ readTMVar $ externalConfig external)+ sendMessage lck external $ VALUE value+ handleRemoteRequest (SETCREDS setting login password) = do+ c <- liftIO $ atomically $ readTMVar $ externalConfig external+ c' <- setRemoteCredPair' c (credstorage setting)+ (login, password)+ void $ liftIO $ atomically $ swapTMVar (externalConfig external) c'+ handleRemoteRequest (GETCREDS setting) = do+ c <- liftIO $ atomically $ readTMVar $ externalConfig external+ creds <- fromMaybe ("", "") <$> + getRemoteCredPair c (credstorage setting)+ sendMessage lck external $ CREDS (fst creds) (snd creds)+ handleRemoteRequest (VERSION _) =+ sendMessage lck external $ ERROR "too late to send VERSION"++ handleAsyncMessage (ERROR err) = error $ "external special remote error: " ++ err++ credstorage setting = CredPairStorage+ { credPairFile = base+ , credPairEnvironment = (base ++ "login", base ++ "password")+ , credPairRemoteKey = Just setting+ }+ where+ base = replace "/" "_" $ fromUUID (externalUUID external) ++ "-" ++ setting++sendMessage :: Sendable m => ExternalLock -> External -> m -> Annex ()+sendMessage lck external m = + fromExternal lck external externalSend $ \h ->+ liftIO $ do+ protocolDebug external True line+ hPutStrLn h line+ hFlush h+ where+ line = unwords $ formatMessage m++{- Waits for a message from the external remote, and passes it to the+ - apppropriate handler. + -+ - If the handler returns Nothing, this is a protocol error.-}+receiveMessage+ :: ExternalLock+ -> External + -> (Response -> Maybe (Annex a))+ -> (RemoteRequest -> Maybe (Annex a))+ -> (AsyncMessage -> Maybe (Annex a))+ -> Annex a+receiveMessage lck external handleresponse handlerequest handleasync =+ go =<< fromExternal lck external externalReceive+ (liftIO . catchMaybeIO . hGetLine)+ where+ go Nothing = protocolError False ""+ go (Just s) = do+ liftIO $ protocolDebug external False s+ case parseMessage s :: Maybe Response of+ Just resp -> maybe (protocolError True s) id (handleresponse resp)+ Nothing -> case parseMessage s :: Maybe RemoteRequest of+ Just req -> maybe (protocolError True s) id (handlerequest req)+ Nothing -> case parseMessage s :: Maybe AsyncMessage of+ Just msg -> maybe (protocolError True s) id (handleasync msg)+ Nothing -> protocolError False s+ protocolError parsed s = error $ "external special remote protocol error, unexpectedly received \"" ++ s ++ "\" " +++ if parsed then "(command not allowed at this time)" else "(unable to parse command)"++protocolDebug :: External -> Bool -> String -> IO ()+protocolDebug external sendto line = debugM "external" $ unwords+ [ externalRemoteProgram (externalType external)+ , if sendto then "<--" else "-->"+ , line+ ]++{- Starts up the external remote if it's not yet running,+ - and passes a value extracted from its state to an action.+ -}+fromExternal :: ExternalLock -> External -> (ExternalState -> v) -> (v -> Annex a) -> Annex a+fromExternal lck external extractor a =+ go =<< liftIO (atomically (tryReadTMVar v))+ where+ go (Just st) = run st+ go Nothing = do+ st <- startExternal $ externalType external+ void $ liftIO $ atomically $ do+ void $ tryReadTMVar v+ putTMVar v st++ {- Handle initial protocol startup; check the VERSION+ - the remote sends. -}+ receiveMessage lck external+ (const Nothing)+ (checkVersion lck external)+ (const Nothing)++ run st++ run st = a $ extractor st+ v = externalState external++{- Starts an external remote process running, but does not handle checking+ - VERSION, etc. -}+startExternal :: ExternalType -> Annex ExternalState+startExternal externaltype = liftIO $ do+ (Just hin, Just hout, _, pid) <- createProcess $ (proc cmd [])+ { std_in = CreatePipe+ , std_out = CreatePipe+ , std_err = Inherit+ }+ fileEncoding hin+ fileEncoding hout+ checkearlytermination =<< getProcessExitCode pid+ return $ ExternalState+ { externalSend = hin+ , externalReceive = hout+ , externalPid = pid+ , externalPrepared = Unprepared+ }+ where+ cmd = externalRemoteProgram externaltype++ checkearlytermination Nothing = noop+ checkearlytermination (Just exitcode) = ifM (inPath cmd)+ ( error $ unwords [ "failed to run", cmd, "(" ++ show exitcode ++ ")" ]+ , error $ cmd ++ " is not installed in PATH"+ )++stopExternal :: External -> Annex ()+stopExternal external = liftIO $ stop =<< atomically (tryReadTMVar v)+ where+ stop Nothing = noop+ stop (Just st) = do+ void $ atomically $ tryTakeTMVar v+ hClose $ externalSend st+ hClose $ externalReceive st+ void $ waitForProcess $ externalPid st+ v = externalState external++externalRemoteProgram :: ExternalType -> String+externalRemoteProgram externaltype = "git-annex-remote-" ++ externaltype++checkVersion :: ExternalLock -> External -> RemoteRequest -> Maybe (Annex ())+checkVersion lck external (VERSION v) = Just $+ if v `elem` supportedProtocolVersions+ then noop+ else sendMessage lck external (ERROR "unsupported VERSION")+checkVersion _ _ _ = Nothing++{- If repo has not been prepared, sends PREPARE.+ -+ - If the repo fails to prepare, or failed before, throws an exception with+ - the error message. -}+checkPrepared :: ExternalLock -> External -> Annex ()+checkPrepared lck external = + fromExternal lck external externalPrepared $ \prepared ->+ case prepared of+ Prepared -> noop+ FailedPrepare errmsg -> error errmsg+ Unprepared -> + handleRequest' lck external PREPARE Nothing $ \resp ->+ case resp of+ PREPARE_SUCCESS -> Just $+ setprepared Prepared+ PREPARE_FAILURE errmsg -> Just $ do+ setprepared $ FailedPrepare errmsg+ error errmsg+ _ -> Nothing+ where+ setprepared status = liftIO . atomically $ do+ let v = externalState external+ st <- takeTMVar v+ void $ putTMVar v $ st { externalPrepared = status }++{- Caches the cost in the git config to avoid needing to start up an+ - external special remote every time time just to ask it what its+ - cost is. -}+getCost :: External -> Git.Repo -> RemoteGitConfig -> Annex Cost+getCost external r gc = go =<< remoteCost' gc+ where+ go (Just c) = return c+ go Nothing = do+ c <- handleRequest external GETCOST Nothing $ \req -> case req of+ COST c -> Just $ return c+ UNSUPPORTED_REQUEST -> Just $ return expensiveRemoteCost+ _ -> Nothing+ setRemoteCost r c+ return c
+ Remote/External/Types.hs view
@@ -0,0 +1,273 @@+{- External special remote data types.+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++{-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-}++module Remote.External.Types (+ External(..),+ newExternal,+ ExternalType,+ ExternalLock,+ withExternalLock,+ ExternalState(..),+ PrepareStatus(..),+ parseMessage,+ Sendable(..),+ Receivable(..),+ Request(..),+ needsPREPARE,+ Response(..),+ RemoteRequest(..),+ RemoteResponse(..),+ AsyncMessage(..),+ ErrorMsg,+ Setting,+ ProtocolVersion,+ supportedProtocolVersions,+) where++import Common.Annex+import Annex.Exception+import Types.Key (file2key, key2file)+import Utility.Metered (BytesProcessed(..))+import Logs.Transfer (Direction(..))+import Config.Cost (Cost)+import Types.Remote (RemoteConfig)++import Data.Char+import Control.Concurrent.STM++-- If the remote is not yet running, the ExternalState TMVar is empty.+-- The +data External = External+ { externalType :: ExternalType+ , externalUUID :: UUID+ -- Empty until the remote is running.+ , externalState :: TMVar ExternalState+ -- Empty when a remote is in use.+ , externalLock :: TMVar ExternalLock+ -- Never left empty.+ , externalConfig :: TMVar RemoteConfig+ }++newExternal :: ExternalType -> UUID -> RemoteConfig -> Annex External+newExternal externaltype u c = liftIO $ External+ <$> pure externaltype+ <*> pure u+ <*> atomically newEmptyTMVar+ <*> atomically (newTMVar ExternalLock)+ <*> atomically (newTMVar c)++type ExternalType = String++data ExternalState = ExternalState+ { externalSend :: Handle+ , externalReceive :: Handle+ , externalPid :: ProcessHandle+ , externalPrepared :: PrepareStatus+ }++data PrepareStatus = Unprepared | Prepared | FailedPrepare ErrorMsg++-- Constructor is not exported, and only created by newExternal.+data ExternalLock = ExternalLock++withExternalLock :: External -> (ExternalLock -> Annex a) -> Annex a+withExternalLock external = bracketIO setup cleanup+ where+ setup = atomically $ takeTMVar v+ cleanup = atomically . putTMVar v+ v = externalLock external++-- Messages that git-annex can send.+class Sendable m where+ formatMessage :: m -> [String]++-- Messages that git-annex can receive.+class Receivable m where+ -- Passed the first word of the message, returns+ -- a Parser that can be be fed the rest of the message to generate+ -- the value.+ parseCommand :: String -> Parser m++parseMessage :: (Receivable m) => String -> Maybe m+parseMessage s = parseCommand command rest+ where+ (command, rest) = splitWord s++-- Messages that can be sent to the external remote to request it do something.+data Request + = PREPARE + | INITREMOTE+ | GETCOST+ | TRANSFER Direction Key FilePath+ | CHECKPRESENT Key+ | REMOVE Key+ deriving (Show)++-- Does PREPARE need to have been sent before this request?+needsPREPARE :: Request -> Bool+needsPREPARE PREPARE = False+needsPREPARE INITREMOTE = False+needsPREPARE _ = True++instance Sendable Request where+ formatMessage PREPARE = ["PREPARE"]+ formatMessage INITREMOTE = ["INITREMOTE"]+ formatMessage GETCOST = ["GETCOST"]+ formatMessage (TRANSFER direction key file) =+ [ "TRANSFER", serialize direction, serialize key, serialize file ]+ formatMessage (CHECKPRESENT key) = [ "CHECKPRESENT", serialize key ]+ formatMessage (REMOVE key) = [ "REMOVE", serialize key ]++-- Responses the external remote can make to requests.+data Response+ = PREPARE_SUCCESS+ | PREPARE_FAILURE ErrorMsg+ | TRANSFER_SUCCESS Direction Key+ | TRANSFER_FAILURE Direction Key ErrorMsg+ | CHECKPRESENT_SUCCESS Key+ | CHECKPRESENT_FAILURE Key+ | CHECKPRESENT_UNKNOWN Key ErrorMsg+ | REMOVE_SUCCESS Key+ | REMOVE_FAILURE Key ErrorMsg+ | COST Cost+ | INITREMOTE_SUCCESS+ | INITREMOTE_FAILURE ErrorMsg+ | UNSUPPORTED_REQUEST+ deriving (Show)++instance Receivable Response where+ parseCommand "PREPARE-SUCCESS" = parse0 PREPARE_SUCCESS+ parseCommand "PREPARE-FAILURE" = parse1 PREPARE_FAILURE+ parseCommand "TRANSFER-SUCCESS" = parse2 TRANSFER_SUCCESS+ parseCommand "TRANSFER-FAILURE" = parse3 TRANSFER_FAILURE+ parseCommand "CHECKPRESENT-SUCCESS" = parse1 CHECKPRESENT_SUCCESS+ parseCommand "CHECKPRESENT-FAILURE" = parse1 CHECKPRESENT_FAILURE+ parseCommand "CHECKPRESENT-UNKNOWN" = parse2 CHECKPRESENT_UNKNOWN+ parseCommand "REMOVE-SUCCESS" = parse1 REMOVE_SUCCESS+ parseCommand "REMOVE-FAILURE" = parse2 REMOVE_FAILURE+ parseCommand "COST" = parse1 COST+ parseCommand "INITREMOTE-SUCCESS" = parse0 INITREMOTE_SUCCESS+ parseCommand "INITREMOTE-FAILURE" = parse1 INITREMOTE_FAILURE+ parseCommand "UNSUPPORTED-REQUEST" = parse0 UNSUPPORTED_REQUEST+ parseCommand _ = parseFail++-- Requests that the external remote can send at any time it's in control.+data RemoteRequest+ = VERSION ProtocolVersion+ | PROGRESS BytesProcessed+ | DIRHASH Key+ | SETCONFIG Setting String+ | GETCONFIG Setting+ | SETCREDS Setting String String+ | GETCREDS Setting+ deriving (Show)++instance Receivable RemoteRequest where+ parseCommand "VERSION" = parse1 VERSION+ parseCommand "PROGRESS" = parse1 PROGRESS+ parseCommand "DIRHASH" = parse1 DIRHASH+ parseCommand "SETCONFIG" = parse2 SETCONFIG+ parseCommand "GETCONFIG" = parse1 GETCONFIG+ parseCommand "SETCREDS" = parse3 SETCREDS+ parseCommand "GETCREDS" = parse1 GETCREDS+ parseCommand _ = parseFail++-- Responses to RemoteRequest.+data RemoteResponse+ = VALUE String+ | CREDS String String+ deriving (Show)++instance Sendable RemoteResponse where+ formatMessage (VALUE s) = [ "VALUE", serialize s ]+ formatMessage (CREDS login password) = [ "CREDS", serialize login, serialize password ]++-- Messages that can be sent at any time by either git-annex or the remote.+data AsyncMessage+ = ERROR ErrorMsg+ deriving (Show)++instance Sendable AsyncMessage where+ formatMessage (ERROR err) = [ "ERROR", serialize err ]++instance Receivable AsyncMessage where+ parseCommand "ERROR" = parse1 ERROR+ parseCommand _ = parseFail++-- Data types used for parameters when communicating with the remote.+-- All are serializable.+type ErrorMsg = String+type Setting = String+type ProtocolVersion = Int++supportedProtocolVersions :: [ProtocolVersion]+supportedProtocolVersions = [1]++class Serializable a where+ serialize :: a -> String+ deserialize :: String -> Maybe a++instance Serializable Direction where+ serialize Upload = "STORE"+ serialize Download = "RETRIEVE"++ deserialize "STORE" = Just Upload+ deserialize "RETRIEVE" = Just Download+ deserialize _ = Nothing++instance Serializable Key where+ serialize = key2file+ deserialize = file2key++instance Serializable [Char] where+ serialize = id+ deserialize = Just++instance Serializable ProtocolVersion where+ serialize = show+ deserialize = readish++instance Serializable Cost where+ serialize = show+ deserialize = readish++instance Serializable BytesProcessed where+ serialize (BytesProcessed n) = show n+ deserialize = BytesProcessed <$$> readish++{- Parsing the parameters of messages. Using the right parseN ensures+ - that the string is split into exactly the requested number of words,+ - which allows the last parameter of a message to contain arbitrary+ - whitespace, etc, without needing any special quoting.+ -}+type Parser a = String -> Maybe a++parseFail :: Parser a+parseFail _ = Nothing++parse0 :: a -> Parser a+parse0 mk "" = Just mk+parse0 _ _ = Nothing++parse1 :: Serializable p1 => (p1 -> a) -> Parser a+parse1 mk p1 = mk <$> deserialize p1++parse2 :: (Serializable p1, Serializable p2) => (p1 -> p2 -> a) -> Parser a+parse2 mk s = mk <$> deserialize p1 <*> deserialize p2+ where+ (p1, p2) = splitWord s++parse3 :: (Serializable p1, Serializable p2, Serializable p3) => (p1 -> p2 -> p3 -> a) -> Parser a+parse3 mk s = mk <$> deserialize p1 <*> deserialize p2 <*> deserialize p3+ where+ (p1, rest) = splitWord s+ (p2, p3) = splitWord rest++splitWord :: String -> (String, String)+splitWord = separate isSpace
Remote/Hook.hs view
@@ -63,7 +63,7 @@ remotetype = remote } where- hooktype = fromMaybe (error "missing hooktype") $ remoteAnnexHookType gc + hooktype = fromMaybe (error "missing hooktype") $ remoteAnnexHookType gc hookSetup :: Maybe UUID -> RemoteConfig -> Annex (RemoteConfig, UUID) hookSetup mu c = do
Remote/List.hs view
@@ -35,6 +35,7 @@ #endif import qualified Remote.Glacier import qualified Remote.Hook+import qualified Remote.External remoteTypes :: [RemoteType] remoteTypes =@@ -52,6 +53,7 @@ #endif , Remote.Glacier.remote , Remote.Hook.remote+ , Remote.External.remote ] {- Builds a list of all available Remotes.
Test.hs view
@@ -424,7 +424,7 @@ changecontent annexedfile writeFile annexedfile $ content annexedfile ++ "foo" not <$> git_annex env "lock" [annexedfile] @? "lock failed to fail without --force"- git_annex env "lock" ["---force", annexedfile] @? "lock --force failed"+ git_annex env "lock" ["--force", annexedfile] @? "lock --force failed" annexed_present annexedfile git_annex env "unlock" [annexedfile] @? "unlock failed" unannexed annexedfile
Types/GitConfig.hs view
@@ -113,6 +113,7 @@ , remoteAnnexDirectory :: Maybe FilePath , remoteAnnexGCrypt :: Maybe String , remoteAnnexHookType :: Maybe String+ , remoteAnnexExternalType :: Maybe String {- A regular git remote's git repository config. -} , remoteGitConfig :: Maybe GitConfig }@@ -137,6 +138,7 @@ , remoteAnnexDirectory = notempty $ getmaybe "directory" , remoteAnnexGCrypt = notempty $ getmaybe "gcrypt" , remoteAnnexHookType = notempty $ getmaybe "hooktype"+ , remoteAnnexExternalType = notempty $ getmaybe "externaltype" , remoteGitConfig = Nothing } where
Upgrade.hs view
@@ -11,12 +11,12 @@ import Common.Annex import Annex.Version-import Config #ifndef mingw32_HOST_OS import qualified Upgrade.V0 import qualified Upgrade.V1 #endif import qualified Upgrade.V2+import qualified Upgrade.V3 import qualified Upgrade.V4 checkUpgrade :: Version -> Annex ()@@ -24,7 +24,7 @@ needsUpgrade :: Version -> Annex (Maybe String) needsUpgrade v- | v `elem` supportedVersions = ok+ | v == supportedVersion = ok | v `elem` autoUpgradeableVersions = ifM (upgrade True) ( ok , err "Automatic upgrade failed!"@@ -40,10 +40,7 @@ upgrade automatic = do upgraded <- go =<< getVersion when upgraded $- ifM isDirect- ( setVersion directModeVersion- , setVersion defaultVersion- )+ setVersion supportedVersion return upgraded where #ifndef mingw32_HOST_OS@@ -54,5 +51,6 @@ go (Just "1") = error "upgrade from v1 on Windows not supported" #endif go (Just "2") = Upgrade.V2.upgrade+ go (Just "3") = Upgrade.V3.upgrade automatic go (Just "4") = Upgrade.V4.upgrade automatic go _ = return True
Upgrade/V1.hs view
@@ -53,14 +53,14 @@ ifM (fromRepo Git.repoIsLocalBare) ( do moveContent- setVersion defaultVersion+ setVersion supportedVersion , do moveContent updateSymlinks moveLocationLogs Annex.Queue.flush- setVersion defaultVersion+ setVersion supportedVersion ) Upgrade.V2.upgrade
+ Upgrade/V3.hs view
@@ -0,0 +1,12 @@+{- git-annex v3 -> v4 uppgrade support+ -+ - There was no explicit v3 to v4 upgrade, so run v5 upgrade code.+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Upgrade.V3 (upgrade) where++import Upgrade.V4 (upgrade)
Upgrade/V4.hs view
@@ -11,7 +11,7 @@ import Config import Annex.Direct -{- Direct mode only upgrade. -}+{- Direct mode only upgrade. v4 to v5 indirect update is a no-op -} upgrade :: Bool -> Annex Bool upgrade automatic = ifM isDirect ( do@@ -19,5 +19,5 @@ showAction "v4 to v5" setDirect True return True- , return False+ , return True )
Utility/Batch.hs view
@@ -52,7 +52,11 @@ #ifndef mingw32_HOST_OS nicers <- filterM (inPath . fst) [ ("nice", [])+#ifndef __ANDROID__+ -- Android's ionice does not allow specifying a command,+ -- so don't use it. , ("ionice", ["-c3"])+#endif , ("nocache", []) ] return $ \(command, params) ->
Utility/Directory.hs view
@@ -37,7 +37,7 @@ {- Gets files in a directory, and then its subdirectories, recursively, - and lazily. -- - Follows symlinks to other subdirectories.+ - Does not follow symlinks to other subdirectories. - - When the directory does not exist, no exception is thrown, - instead, [] is returned. -}
Utility/Metered.hs view
@@ -25,7 +25,7 @@ {- Total number of bytes processed so far. -} newtype BytesProcessed = BytesProcessed Integer- deriving (Eq, Ord)+ deriving (Eq, Ord, Show) class AsBytesProcessed a where toBytesProcessed :: a -> BytesProcessed
Utility/Path.hs view
@@ -242,13 +242,13 @@ - was provided by a third party and is not to be trusted, returns the closest - sane FilePath. -- - All spaces and punctuation are replaced with '_', except for '.'- - "../" will thus turn into ".._", which is safe.+ - All spaces and punctuation and other wacky stuff are replaced+ - with '_', except for '.' "../" will thus turn into ".._", which is safe. -} sanitizeFilePath :: String -> FilePath sanitizeFilePath = map sanitize where sanitize c | c == '.' = c- | isSpace c || isPunctuation c || c == '/' = '_'+ | isSpace c || isPunctuation c || isSymbol c || isControl c || c == '/' = '_' | otherwise = c
Utility/Tmp.hs view
@@ -5,6 +5,8 @@ - Licensed under the GNU GPL version 3 or higher. -} +{-# LANGUAGE CPP #-}+ module Utility.Tmp where import Control.Exception (bracket)@@ -61,8 +63,17 @@ withTmpDirIn :: FilePath -> Template -> (FilePath -> IO a) -> IO a withTmpDirIn tmpdir template = bracket create remove where- remove d = whenM (doesDirectoryExist d) $+ remove d = whenM (doesDirectoryExist d) $ do+#if mingw32_HOST_OS+ -- Windows will often refuse to delete a file+ -- after a process has just written to it and exited.+ -- Because it's crap, presumably. So, ignore failure+ -- to delete the temp directory.+ _ <- tryIO $ removeDirectoryRecursive d+ return ()+#else removeDirectoryRecursive d+#endif create = do createDirectoryIfMissing True tmpdir makenewdir (tmpdir </> template) (0 :: Int)
debian/changelog view
@@ -1,3 +1,26 @@+git-annex (5.20131230) unstable; urgency=medium++ * Added new external special remote interface.+ * importfeed: Support youtube playlists.+ * Add tasty to build-depends, so that test suite builds again.+ (tasty was stuck in incoming.)+ * Fix typo in test suite.+ * Fix bug in Linux standalone build's shimming that broke git-annex-shell.+ * Include git-receive-pack, git-upload-pack, git, and git-shell wrappers+ in the Linux standalone build, and OSX app, so they will be available+ when it's added to PATH.+ * addurl, importfeed: Sanitize | and some other symbols and special+ characters.+ * Auto-upgrade v3 indirect repos to v5 with no changes.+ This also fixes a problem when a direct mode repo was somehow set to v3+ rather than v4, and so the automatic direct mode upgrade to v5 was not+ done.+ * Android: Avoid trying to use Android's own ionice, which does not+ allow specifying a command to run. Fixes transferring files to/from+ android and probably a few other things.++ -- Joey Hess <joeyh@debian.org> Mon, 30 Dec 2013 14:13:40 -0400+ git-annex (5.20131221) unstable; urgency=low * assistant: Fix OSX-specific bug that caused the startup scan to try to
debian/control view
@@ -51,6 +51,9 @@ libghc-async-dev, libghc-http-dev, libghc-feed-dev,+ libghc-tasty-dev,+ libghc-tasty-hunit-dev,+ libghc-tasty-quickcheck-dev, lsof, ikiwiki, perlmagick,
debian/rules view
@@ -9,9 +9,6 @@ %: dh $@ -override_dh_auto_test:- echo test suite currently disabled until haskell-tasty is out of NEW- # Not intended for use by anyone except the author. announcedir: @echo ${HOME}/src/git-annex/doc/news
doc/assistant/release_notes.mdwn view
@@ -1,3 +1,11 @@+## version 5.20131221++There is now a arm [[install/linux_standalone]] build of git-annex,+including the assistant and webapp,+which can be installed on a variety of systems including Raspberry Pi,+Synology NAS, and Google Chromebooks. Details in+[[this forum thread|forum/new_linux_arm_tarball_build]].+ ## version 5.20131213 The assistant can now be used on Windows! However, it has known problems,
+ doc/bugs/Latest_64_bit_standalone_Linux_build_broken.mdwn view
@@ -0,0 +1,18 @@+ [0 zerodogg@firefly git-annex]$ ls+ bin/ favicon.png git-annex git-annex-shell git-core/ lib/ libdirs linker README shimmed/ uninstall+ etc/ gconvdir git-annex.MANIFEST git-annex-webapp install-haskell-packages lib64/ LICENSE logo.svg runshell templates/ usr/+ [0 zerodogg@firefly git-annex]$ pwd+ /home/zerodogg/.local/share/git-annex+ [0 zerodogg@firefly git-annex]$ ./git-annex version+ /home/zerodogg/.local/share/git-annex/bin/git-annex: line 2: /home/zerodogg/.local/share/git-annex/lib64/ld-linux-x86-64.so.2: No such file or directory+ [127 zerodogg@firefly git-annex]$ ls -l /home/zerodogg/.local/share/git-annex/lib64/ld-linux-x86-64.so.2 + lrwxrwxrwx. 1 zerodogg zerodogg 32 2012-12-30 16:35 /home/zerodogg/.local/share/git-annex/lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.13.so+ [0 zerodogg@firefly git-annex]$ ls /lib/x86_64-linux-gnu/ld-2.13.so+ ls: cannot access /lib/x86_64-linux-gnu/ld-2.13.so: No such file or directory++This is on Fedora 20, 64bit, installed from http://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz as of Sun Dec 22 00:44:53 CET 2013.++> [[fixed|done]]; converted ugly shell code to much nicer haskell code,+> which let me reuse relative symlink generation code from git-annex+> to fix this. Updated the amd64 build for the last release only.+> --[[Joey]]
+ doc/bugs/Unable_to_copy_from_Android.mdwn view
@@ -0,0 +1,148 @@+### Please describe the problem.++I am unable to copy files from my Android git annex repository into a remote repository on a Ubuntu machine.+It was previously working fine, but after recent upgrades, it throws odd errors and refuses to copy the files.++### What steps will reproduce the problem?++Run this command:++`git annex copy --to remote Path/To/File.txt`++### What version of git-annex are you using? On what operating system?++Souce Android Tablet++[[!format sh """+git-annex version: 5.20131221-gf8c928d +build flags: Assistant Webapp Testsuite S3 WebDAV Inotify XMPP DNS Feeds Quvi TDFA CryptoHash+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL+remote types: git gcrypt S3 bup directory rsync web webdav glacier hook+local repository version: 5+default repository version: 3+supported repository versions: 3 5+upgrade supported from repository versions: 0 1 2 4+"""]]++Destination Ubuntu server++[[!format sh """+git-annex version: 5.20131224-g692aa01+build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+remote types: git gcrypt S3 bup directory rsync web webdav glacier hook+"""]]++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++git annex copy --to gimli Books/Laravel/laravel.mobi+copy Books/Laravel/laravel.mobi (checking gimli...) git-annex: Not in a git repository.+(to gimli...) git-annex: unknown command recvkey++Usage: git-annex command [option ...]++Commonly used commands:++add [PATH ...] add files to annex+addurl URL ... add urls to annex+assistant automatically handle changes+copy [PATH ...] copy content of files to/from another repository+drop [PATH ...] indicate content of files not currently wanted+edit [PATH ...] same as unlock+get [PATH ...] make content of annexed files available+import [PATH ...] move and add files from outside git working copy+importfeed URL ... import files from podcast feeds+lock [PATH ...] undo unlock command+mirror [PATH ...] mirror content of files to/from another repository+move [PATH ...] move content of files to/from another repository+rmurl FILE URL record file is not available at url+status [PATH ...] show the working tree status+sync [REMOTE ...] synchronize local repository with remotes+unlock [PATH ...] unlock files for modification+watch watch for changes+webapp launch webapp++Repository setup commands:++dead REMOTE ... hide a lost repository+describe REMOTE DESC change description of a repository+direct switch repository to direct mode+enableremote NAME [K=V ...] enables use of an existing special remote+group REMOTE DESC add a repository to a group+indirect switch repository to indirect mode+init DESC initialize git-annex+initremote NAME [K=V ...] creates a special (non-git) remote+schedule REMOTE [EXPR] get or set scheduled jobs+semitrust REMOTE ... return repository to default trust level+trust REMOTE ... trust a repository+ungroup REMOTE DESC remove a repository from a group+untrust REMOTE ... do not trust a repository+vicfg edit git-annex's configuration+wanted REMOTE [EXPR] get or set preferred content expression++Repository maintenance commands:++addunused NUM|RANGE ... add back unused files+dropunused NUM|RANGE ... drop unused file content+fix [PATH ...] fix up symlinks to point to annexed content+forget prune git-annex branch history+fsck [PATH ...] check for problems+merge automatically merge changes from remotes+repair recover broken git repository+unused look for unused file content+upgrade upgrade repository layout++Query commands:++find [PATH ...] lists available files+help display help+info [PATH ...] shows general information about the annex+list [PATH ...] show which remotes contain files+log [PATH ...] shows location log+map generate map of repositories+version show version info+whereis [PATH ...] lists repositories that have file content++Utility commands:++migrate [PATH ...] switch data to different backend+reinject SRC DEST sets content of annexed file+unannex [PATH ...] undo accidential add command+uninit [PATH ...] de-initialize git-annex and clean out repository++Plumbing commands:++dropkey KEY ... drops annexed content for specified keys+examinekey KEY ... prints information from a key+fromkey KEY PATH adds a file using a specific key+lookupkey FILE ... looks up key used for file+pre-commit [PATH ...] run by git pre-commit hook+rekey [PATH KEY ...] change keys used for files+transferkey KEY transfers a key from or to a remote+transferkeys transfers keys+xmppgit git to XMPP relay++rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(224) [sender=3.1.0dev]+++rsync failed -- run git annex again to resume file transfer+failed+git-annex: copy: 1 failed++# End of transcript or log.+"""]]++> There was a bug in the linux standalone tarball distributed+> with 5.20131221 that made the `git-annex-shell` wrapper accidentially run+> `git-annex` instead of `git-annex-shell`. Which results in +> this error about recvkey, which is a git-annex-shell command, not a+> git-annex command.+> +> I think your ubuntu system must have git-annex installed from that tarball.+> This bug is fixed in the daily builds, and I have updated the+> tarballs for the release too, now. [[done]] --[[Joey]]
doc/bugs/__39__Cannot_write_a_repository_there__39___on_Windows.mdwn view
@@ -24,3 +24,9 @@ [[!format sh """ Launching web browser on file://C:\Users\bbigras\AppData\Local\Temp\webapp9924.html """]]++> It checks if the directory can be written to, and it seems that for some+> reason Windows is preventing you from writing to your Desktop. That seems+> really weird to me (and I have not seen that behavior). But, I can easily+> make it check if that's the case, and fall back to the other path, so+> have done so. [[done]] --[[Joey]]
+ doc/bugs/amd64_standalone:_ld-linux-x86-64.so.2:_not_found.mdwn view
@@ -0,0 +1,21 @@+### Please describe the problem.+While trying to diagnose [[bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed/]] I updated the version of the standalone git-annex on Server A from 3.20121017 to the latest not daily build.++### What steps will reproduce the problem?+1. download git-annex standalone for amd64 (I did both the normal not-daily build, and the daily build, same thing in both)+2. extract+3. ./runshell++### What version of git-annex are you using? On what operating system?+Debian amd64 (yes... I know, blame asheesh)++### Please provide any additional information below.++[[!format sh """+greg@rose:~/bin/git-annex.linux$ ./runshell +exec: 2: /home/greg/bin/git-annex.linux/lib64/ld-linux-x86-64.so.2: not found+"""]]+++### Indeed a dupe ###+Thanks clacke, [[done]] - Greg
+ doc/bugs/android_cannot_get_from_5.20131221.mdwn view
@@ -0,0 +1,41 @@+## Reproduce++ - run `git annex get --from mylinuxbox` on git-annex Android 5.20131213 or 5.20131221+ - `mylinuxbox` is running 5.20131221 standalone++## Expected result++The Android box gets the missing file.++## Actual result++ git-annex: unknown command sendkey++## Workaround++Run 5.20131213 on `mylinuxbox`, which does not have this problem.++## Additional++linux standalone 5.20131213 and 5.20131221 are both able to `get` from linux standalone 5.20131221 -- this only affects the Android version.++*Edit:* On second thought, Android is not the only distinguishing factor. Apart from being Android, the box and repo having trouble have the following distinguishing factors from the ones I tried that worked:++ - Android+ - Direct mode+ - Remote was set up by the Assistant++> [[clacke]]++> There was a bug in the linux standalone tarball distributed+> with 5.20131221 that made the `git-annex-shell` wrapper accidentially run+> `git-annex` instead of `git-annex-shell`. Which results in +> this error about recvkey, which is a git-annex-shell command, not a+> git-annex command.+> +> So, the problem is not in the android build, but in the git-annex+> installed on the server (or laptop or whatever) that the android is+> trying to access. ++> This bug is fixed in the daily builds, and I have updated the+> tarballs for the release too, now. [[done]] --[[Joey]]
+ doc/bugs/failure_during_ssh_key_setup___40__windows__41__.mdwn view
@@ -0,0 +1,12 @@+### Please describe the problem.+While attempting to create a remote repository, the assistant is trying to set up public key authentication, but fails when trying to delete the temporary files. Perhaps this doesn't need to be a fatal error; it could warn the user instead, or try again later.++DeleteFile "C:\\Users\\FAMILY~1\\AppData\\Local\\Temp\\git-annex-keygen.1\\key.pub": permission denied (The process cannot access the file because it is being used by another process.)++### What steps will reproduce the problem?+Create a remote repository++### What version of git-annex are you using? On what operating system?+Windows 7, git-annex version 5.20131221-gf8c928d++> [[fixed|done]].. thanks for testing the assistant on windows! --[[Joey]]
+ doc/bugs/fatal:_git-write-tree:_error_building_trees.mdwn view
@@ -0,0 +1,101 @@+### Please describe the problem.+Not able to successfully git-annex sync with a remote due to a git fatal. Caused by masters diverging?++### What steps will reproduce the problem?+git-annex sync, or, letting the assistant try.++### What version of git-annex are you using? On what operating system?+git-annex version: 5.20131221+b1 on my laptop+git-annex version: 5.20131224-g6ca5271 on the remote server++### Please provide any additional information below.++Output of a manual git-annex sync in the directory:++[[!format sh """+greg@x200s:~/Documents$ git-annex sync+commit (Recording state in git...)+Copyright Office/Orphan Works/ARROW/170409_ARROW_Leaflet.pdf: unmerged (783afced6bc43138373fda43edfda0c33be36525)+Copyright Office/Orphan Works/ARROW/ARROWproject_results1.pdf: unmerged (b536e5f3d93e7905e05510f26db1f743e9eae16e)+Copyright Office/Orphan Works/ARROW/ARROWproject_results1.ppt: unmerged (5543049b8940cc5702d37aff18b03c67d9c8374d)+Copyright Office/Orphan Works/ARROW/ARROWstandardPresent2010.pdf: unmerged (54d751bc98cb5da29d3d568856b74675e842072e)+Copyright Office/Orphan Works/ARROW/ARROWstandardPresent2010.ppt: unmerged (efe0e94b51eccb9a6a0c352f4a210bd5a6105050)+Copyright Office/Orphan Works/ARROW/ARROWtrifoldMAR2011.pdf: unmerged (b52ff16178e29261fe00a518c23610a3b0826482)+Copyright Office/Orphan Works/Documentation/20110531/Documentation.doc.odt: unmerged (1348d5f42f7e34706407f7936f4fb0438e4b8ffa)+Copyright Office/Orphan Works/Documentation/AAPpublishers.pdf: unmerged (3f448a03d31a38adb095e3031e4ee13771d22d70)+Copyright Office/Orphan Works/Documentation/Documentation.doc: unmerged (265fdff7787f560e3ba20789a12e15ffb165ec7f)+Copyright Office/Orphan Works/Documentation/Documentation.pdf: unmerged (7a9ff92663ed42b42b9baaefaf4721499d18d82d)+...+fatal: git-write-tree: error building trees+git-annex: failed to read sha from git write-tree+"""]]++See also:++1. the [partial daemon log](http://paste.debian.net/73176/) from the assistant running in that directory on the laptop and +2. the output of [git fsck](http://paste.debian.net/73175/) on the remote.++git-annex repair on the laptop and the server:+[[!format sh """+greg@x200s:~/Documents$ git-annex repair+Running git fsck ...+No problems found.+ok+"""]]+++### How I ended up fixing it:+[[!format sh """+greg@x200s:~/Documents$ killall git-annex+greg@x200s:~/Documents$ git-annex indirect+blah...............+indirect ok+ok+greg@x200s:~/Documents$ git status+On branch master+Your branch and 'rose/master' have diverged,+and have 294 and 1 different commit each, respectively.+ (use "git pull" to merge the remote branch into yours)++Untracked files:+ (use "git add <file>..." to include in what will be committed)++ .gitrefs/++nothing added to commit but untracked files present (use "git add" to track)+greg@x200s:~/Documents$ git pull+Merge made by the 'recursive' strategy.+ Copyright Office/Orphan Works/staging/reporting/process_report.txt.2 | 1 ++ Copyright Office/Orphan Works/staging/reporting/with-title.xls | 1 ++ Copyright Office/Orphan Works/staging/with-title.xls | 1 ++ Copyright Office/Orphan Works/worker_emails.txt | 1 ++ git.fsck.log | 1 ++ 5 files changed, 5 insertions(+)+ create mode 120000 Copyright Office/Orphan Works/staging/reporting/process_report.txt.2+ create mode 120000 Copyright Office/Orphan Works/staging/reporting/with-title.xls+ create mode 120000 Copyright Office/Orphan Works/staging/with-title.xls+ create mode 120000 Copyright Office/Orphan Works/worker_emails.txt+ create mode 120000 git.fsck.log+greg@x200s:~/Documents$ git-annex sync+commit ok+pull rose ++Already up-to-date.+ok+push rose +Counting objects: 1658, done.+Delta compression using up to 2 threads.+Compressing objects: 100% (904/904), done.+Writing objects: 100% (1604/1604), 138.97 KiB | 0 bytes/s, done.+Total 1604 (delta 892), reused 1298 (delta 688)+To greg@rose.makesad.us:/home/greg/Documents/+ f1d206e..e836b9b master -> synced/master+ok+greg@x200s:~/Documents$+"""]]++I restarted the assistant and the daemon.log looks good.++After sync'ing on the server, it appears that this has been the case for quite some time (based off of what symlinks were created).++Lastly: Joey, this is probably what caused that weird behavior in the webapp where it showed the bad transfer each day after the fsck at noon. I never diagnosed that more but I bet I won't see it tomorrow.
+ doc/bugs/import_memleak_from_the_assistant.mdwn view
@@ -0,0 +1,1598 @@+### Please describe the problem.+Git annex daemon are memleaking abundantly thus making it unusable for a long period of time. It is currently taking 38.8% of my available ram (8go) and has been launched arround 14h today.++### What steps will reproduce the problem?+The assistant has been launched using "git annex assistant" on a repository+created by the Webapp (the Webapp wasn't running at that time).++If I simply launch the Webapp, I've got the same result of memleaking.++### What version of git-annex are you using? On what operating system?+git-annex version: 5.20131213+build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+remote types: git gcrypt S3 bup directory rsync web webdav glacier hook++On Ubuntu LTS using the ppa.++### Please provide any additional information below.+This daemon.log come from a very fast moving repository but this also happen on other way slower moving repositories.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log++me@dolgoff ~/public/.git/annex ps avx | grep git+14647 pts/7 S+ 0:00 0 150 13493 948 0.0 grep -i --color=auto git+15910 ? Sl 273:24 0 39530 3879109 3207152 39.3 git-annex assistant+15925 ? R 134:10 1439 1283 544320 35660 0.4 git --git-dir=/home/me/public/.git --work-tree=/home/me/public -c core.bare=false cat-file --batch+15972 ? S 0:01 114 1283 530064 10576 0.1 git --git-dir=/home/me/public/.git --work-tree=/home/me/public -c core.bare=false cat-file --batch+16120 ? SN 0:00 0 1283 18196 1156 0.0 git --git-dir=/home/me/public/.git --work-tree=/home/me/public -c core.bare=false check-attr -z --stdin annex.backend annex.numcopies --+25646 ? SNl 0:01 0 42547 222616 22132 0.2 git-annex transferkeys+25667 ? SN 0:00 0 1447 117648 1976 0.0 git --git-dir=/home/me/public/.git --work-tree=/home/me/public -c core.bare=false cat-file --batch+25677 ? SNs 0:00 0 410 42657 2620 0.0 ssh: .git/annex/ssh/griboiedov [mux]++daemon.log+[2013-12-23 21:04:24 CET] NetWatcherFallback: Syncing with origin+From griboiedov:public+ 331ab7e..763310f annex/direct/master -> origin/annex/direct/master+ 4caf626..2171219 git-annex -> origin/git-annex+ 73c5341..153ec5a synced/master -> origin/synced/master+Updating 73c5341..763310f+Fast-forward+Auto packing the repository for optimum performance. You may also+run "git gc" manually. See "git help gc" for more information.+warning: There are too many unreachable loose objects; run 'git prune' to remove them.+ mails/.mhonarc.db | 2 +-+ mails/{bin16MhWOPiG7.bin => binjMrfB7aM7s.bin} | 0+ mails/{binQBJzxA5RDD.bin => binuVoVGDloKB.bin} | 0+ mails/{jpgaShwRlHqXe.jpg => jpg9a_S8ignCJ.jpg} | 0+ mails/{jpgJuMwpbTZuo.jpg => jpgAU20k3zk5w.jpg} | 0+ mails/{jpgfkvs_VW3jY.jpg => jpgAsv158YPXC.jpg} | 0+ mails/{jpgLxB5GBQiyP.jpg => jpgCfz3HNRLYo.jpg} | 0+ mails/{jpg1QSm88B_oJ.jpg => jpgCw4FBEkcOV.jpg} | 0+ mails/{jpgy8l7kt7I0v.jpg => jpgJnSKE5skVx.jpg} | 0+ mails/{jpg8x0JSWWfmK.jpg => jpgK4Lmnj5kJU.jpg} | 0+ mails/{jpge0T37S_zYg.jpg => jpgKyEVJPJdPY.jpg} | 0+ mails/{jpg1jMp8X95a8.jpg => jpgMi7I6uLnaD.jpg} | 0+ mails/{jpg2JyFa9xlTU.jpg => jpgScmPPKPHFq.jpg} | 0+ mails/{jpgAnrbLOKtQO.jpg => jpgU2vrhPtw4a.jpg} | 0+ mails/{jpg9UIRRve9l7.jpg => jpgV1Ek5XTDpl.jpg} | 0+ mails/{jpg0du_rqAmnI.jpg => jpgVt3cWtM2fp.jpg} | 0+ mails/{jpgmyWk1QqZ0G.jpg => jpgVzzX55uqdu.jpg} | 0+ mails/{jpgNzn6pCkQ7B.jpg => jpgbS7_tLed4m.jpg} | 0+ mails/{jpgmChZ6KvYvR.jpg => jpgdQNUXemgWT.jpg} | 0+ mails/{jpgwu68ViO7tN.jpg => jpgh1EzKSHWvb.jpg} | 0+ mails/{jpgmUuI33SG9G.jpg => jpghvPaq3_Be0.jpg} | 0+ mails/{jpgvzPlOi4YH2.jpg => jpgim5vpaDawh.jpg} | 0+ mails/{jpgysNt2t743E.jpg => jpgjY_paWcDcr.jpg} | 0+ mails/{jpgFicFpbY5n4.jpg => jpgkU70wDyd7n.jpg} | 0+ mails/{jpgpjFS0Ztnqa.jpg => jpgmFXSd2Dp97.jpg} | 0+ mails/{jpgqOZX1xKVfl.jpg => jpgoHLfpoWcUO.jpg} | 0+ mails/{jpgTVf7RAQot8.jpg => jpgpIVZxq60Dk.jpg} | 0+ mails/{jpgkq63BbVlrP.jpg => jpgrzViZx_4aI.jpg} | 0+ mails/{jpgxpwzaJnSuX.jpg => jpgtvEG4unHFl.jpg} | 0+ mails/{jpgldUBRrRrcn.jpg => jpgwgZCUHCRLD.jpg} | 0+ mails/{jpgsKpQQEouso.jpg => jpgyDMQ3JRqJQ.jpg} | 0+ mails/msg00006.html | 2 +-+ mails/msg00018.html | 2 +-+ mails/msg00023.html | 2 +-+ mails/msg00024.html | 2 +-+ mails/msg00025.html | 2 +-+ mails/msg00026.html | 2 +-+ mails/msg00027.html | 2 +-+ mails/msg00028.html | 2 +-+ mails/msg00032.html | 2 +-+ mails/msg00040.html | 2 +-+ mails/msg00041.html | 2 +-+ mails/msg00042.html | 2 +-+ mails/msg00055.html | 2 +-+ mails/{pdfyd4yHyuh7I.pdf => pdf82oysVxMKf.pdf} | 0+ mails/{pdfX5i1zjd35G.pdf => pdfDH4ZUAcsJE.pdf} | 0+ mails/{pdfDyhw6AitFo.pdf => pdfPePGLsDAym.pdf} | 0+ mails/{pdfkLRxiO4YS0.pdf => pdfU9I3NUvHOG.pdf} | 0+ mails/{pgpI_5jxFR7VZ.pgp => pgpBKaIcivKYa.pgp} | 0+ mails/{pngKStItI4meN.png => png9O3vtGcotx.png} | 0+ mails/{pngN5cn2FvoWV.png => pngBkJAx0zfhF.png} | 0+ 51 files changed, 14 insertions(+), 14 deletions(-)+ rename mails/{bin16MhWOPiG7.bin => binjMrfB7aM7s.bin} (100%)+ rename mails/{binQBJzxA5RDD.bin => binuVoVGDloKB.bin} (100%)+ rename mails/{jpgaShwRlHqXe.jpg => jpg9a_S8ignCJ.jpg} (100%)+ rename mails/{jpgJuMwpbTZuo.jpg => jpgAU20k3zk5w.jpg} (100%)+ rename mails/{jpgfkvs_VW3jY.jpg => jpgAsv158YPXC.jpg} (100%)+ rename mails/{jpgLxB5GBQiyP.jpg => jpgCfz3HNRLYo.jpg} (100%)+ rename mails/{jpg1QSm88B_oJ.jpg => jpgCw4FBEkcOV.jpg} (100%)+ rename mails/{jpgy8l7kt7I0v.jpg => jpgJnSKE5skVx.jpg} (100%)+ rename mails/{jpg8x0JSWWfmK.jpg => jpgK4Lmnj5kJU.jpg} (100%)+ rename mails/{jpge0T37S_zYg.jpg => jpgKyEVJPJdPY.jpg} (100%)+ rename mails/{jpg1jMp8X95a8.jpg => jpgMi7I6uLnaD.jpg} (100%)+ rename mails/{jpg2JyFa9xlTU.jpg => jpgScmPPKPHFq.jpg} (100%)+ rename mails/{jpgAnrbLOKtQO.jpg => jpgU2vrhPtw4a.jpg} (100%)+ rename mails/{jpg9UIRRve9l7.jpg => jpgV1Ek5XTDpl.jpg} (100%)+ rename mails/{jpg0du_rqAmnI.jpg => jpgVt3cWtM2fp.jpg} (100%)+ rename mails/{jpgmyWk1QqZ0G.jpg => jpgVzzX55uqdu.jpg} (100%)+ rename mails/{jpgNzn6pCkQ7B.jpg => jpgbS7_tLed4m.jpg} (100%)+ rename mails/{jpgmChZ6KvYvR.jpg => jpgdQNUXemgWT.jpg} (100%)+ rename mails/{jpgwu68ViO7tN.jpg => jpgh1EzKSHWvb.jpg} (100%)+ rename mails/{jpgmUuI33SG9G.jpg => jpghvPaq3_Be0.jpg} (100%)+ rename mails/{jpgvzPlOi4YH2.jpg => jpgim5vpaDawh.jpg} (100%)+ rename mails/{jpgysNt2t743E.jpg => jpgjY_paWcDcr.jpg} (100%)+ rename mails/{jpgFicFpbY5n4.jpg => jpgkU70wDyd7n.jpg} (100%)+ rename mails/{jpgpjFS0Ztnqa.jpg => jpgmFXSd2Dp97.jpg} (100%)+ rename mails/{jpgqOZX1xKVfl.jpg => jpgoHLfpoWcUO.jpg} (100%)+ rename mails/{jpgTVf7RAQot8.jpg => jpgpIVZxq60Dk.jpg} (100%)+ rename mails/{jpgkq63BbVlrP.jpg => jpgrzViZx_4aI.jpg} (100%)+ rename mails/{jpgxpwzaJnSuX.jpg => jpgtvEG4unHFl.jpg} (100%)+ rename mails/{jpgldUBRrRrcn.jpg => jpgwgZCUHCRLD.jpg} (100%)+ rename mails/{jpgsKpQQEouso.jpg => jpgyDMQ3JRqJQ.jpg} (100%)+ rename mails/{pdfyd4yHyuh7I.pdf => pdf82oysVxMKf.pdf} (100%)+ rename mails/{pdfX5i1zjd35G.pdf => pdfDH4ZUAcsJE.pdf} (100%)+ rename mails/{pdfDyhw6AitFo.pdf => pdfPePGLsDAym.pdf} (100%)+ rename mails/{pdfkLRxiO4YS0.pdf => pdfU9I3NUvHOG.pdf} (100%)+ rename mails/{pgpI_5jxFR7VZ.pgp => pgpBKaIcivKYa.pgp} (100%)+ rename mails/{pngKStItI4meN.png => png9O3vtGcotx.png} (100%)+ rename mails/{pngN5cn2FvoWV.png => pngBkJAx0zfhF.png} (100%)+[2013-12-23 21:04:40 CET] Committer: Committing changes to git+[2013-12-23 21:04:40 CET] Pusher: Syncing with public, dolgoff, origin+error: Ref refs/heads/synced/git-annex is at 4f98427ba635b1548da21b5e6e1a84c49f708284 but expected 217121951ca4ede24d91fe92acee9061a527ba93+remote: error: failed to lock refs/heads/synced/git-annex[K+Auto packing the repository for optimum performance.+Auto packing the repository for optimum performance.+fatal: Unable to create '/home/me/public/.git/packed-refs.lock': Le fichier existe.++If no other git process is currently running, this probably means a+git process crashed in this repository earlier. Make sure no other git+process is running and remove the file manually to continue.+error: failed to run pack-refs+To /home/me/public+ ! [remote rejected] git-annex -> synced/git-annex (failed to lock)+error: failed to push some refs to '/home/me/public'+[2013-12-23 21:04:42 CET] Committer: Adding pngBkJAx0zfhF.png png9O3vtGcotx.png pgpBKaIcivKYa.pgp pdfU9I3NUvHOG.pdf pdfPePGLsDAym.pdf pdfDH4ZUAcsJE.pdf pdf82oysVxMKf.pdf msg00040.html msg00032.html and 39 other files+ok+(Recording state in git...)+(Recording state in git...)+(merging synced/git-annex into git-annex...)+(Recording state in git...)++(Recording state in git...)+(Recording state in git...)+add mails/pngBkJAx0zfhF.png ok+add mails/png9O3vtGcotx.png ok+add mails/pgpBKaIcivKYa.pgp ok+add mails/pdfU9I3NUvHOG.pdf ok+add mails/pdfPePGLsDAym.pdf ok+add mails/pdfDH4ZUAcsJE.pdf ok+add mails/pdf82oysVxMKf.pdf ok+add mails/msg00040.html ok+add mails/msg00032.html ok+add mails/msg00028.html ok+add mails/msg00027.html ok+add mails/msg00026.html ok+add mails/msg00025.html ok+add mails/msg00024.html ok+add mails/msg00023.html ok+add mails/msg00018.html ok+add mails/msg00006.html ok+add mails/jpgyDMQ3JRqJQ.jpg ok+add mails/jpgwgZCUHCRLD.jpg ok+add mails/jpgtvEG4unHFl.jpg ok+add mails/jpgrzViZx_4aI.jpg ok+add mails/jpgpIVZxq60Dk.jpg ok+add mails/jpgoHLfpoWcUO.jpg ok+add mails/jpgmFXSd2Dp97.jpg ok+add mails/jpgmFXSd2Dp97.jpg ok+add mails/jpgkU70wDyd7n.jpg ok+add mails/jpgjY_paWcDcr.jpg ok+add mails/jpgim5vpaDawh.jpg ok+add mails/jpghvPaq3_Be0.jpg ok+add mails/jpgh1EzKSHWvb.jpg ok+add mails/jpgdQNUXemgWT.jpg ok+add mails/jpgbS7_tLed4m.jpg ok+add mails/jpgbS7_tLed4m.jpg ok+add mails/jpgVzzX55uqdu.jpg ok+add mails/jpgVzzX55uqdu.jpg ok+add mails/jpgVt3cWtM2fp.jpg ok+add mails/jpgV1Ek5XTDpl.jpg ok+add mails/jpgV1Ek5XTDpl.jpg ok+add mails/jpgU2vrhPtw4a.jpg ok+add mails/jpgU2vrhPtw4a.jpg ok+add mails/jpgScmPPKPHFq.jpg ok+add mails/jpgScmPPKPHFq.jpg ok+add mails/jpgMi7I6uLnaD.jpg ok+add mails/jpgMi7I6uLnaD.jpg ok+add mails/jpgKyEVJPJdPY.jpg ok+add mails/jpgKyEVJPJdPY.jpg ok+add mails/jpgK4Lmnj5kJU.jpg ok+add mails/jpgK4Lmnj5kJU.jpg ok+add mails/jpgJnSKE5skVx.jpg ok+add mails/jpgCw4FBEkcOV.jpg ok+add mails/jpgCw4FBEkcOV.jpg ok+add mails/jpgCfz3HNRLYo.jpg ok+add mails/jpgCfz3HNRLYo.jpg ok+add mails/jpgAsv158YPXC.jpg ok+add mails/jpgAsv158YPXC.jpg ok+add mails/jpgAU20k3zk5w.jpg ok+add mails/jpgAU20k3zk5w.jpg ok+add mails/jpg9a_S8ignCJ.jpg ok+add mails/jpg9a_S8ignCJ.jpg ok+add mails/binuVoVGDloKB.bin ok+add mails/binjMrfB7aM7s.bin ok+add mails/binjMrfB7aM7s.bin ok+add mails/.mhonarc.db [2013-12-23 21:04:43 CET] Committer: Committing changes to git+[2013-12-23 21:04:43 CET] Transferrer: Uploaded msg00028.html+[2013-12-23 21:04:43 CET] Transferrer: Uploaded jpgyDMQ3JRqJQ.jpg+[2013-12-23 21:04:43 CET] Transferrer: Uploaded jpgkU70wDyd7n.jpg+[2013-12-23 21:04:43 CET] Transferrer: Uploaded jpgVt3cWtM2fp.jpg+[2013-12-23 21:04:43 CET] Transferrer: Uploaded jpgKyEVJPJdPY.jpg+[2013-12-23 21:04:43 CET] Transferrer: Uploaded jpgAsv158YPXC.jpg+[2013-12-23 21:04:43 CET] Transferrer: Uploaded .mhonarc.db+[2013-12-23 21:04:48 CET] Committer: Adding msg00041.html+ok+(Recording state in git...)+add mails/msg00041.html [2013-12-23 21:04:48 CET] Committer: Committing changes to git+warning: There are too many unreachable loose objects; run 'git prune' to remove them.+To /home/me/public+ 2171219..4f98427 git-annex -> synced/git-annex+error: Ref refs/heads/synced/git-annex is at 90996528a22e94d52911e1abc8b90eb451d40dee but expected b0f556fff29e038eba46c95fecb4d1cc57d7dacd+remote: error: failed to lock refs/heads/synced/git-annex[K+To griboiedov:public+ ! [remote rejected] git-annex -> synced/git-annex (failed to lock)+error: failed to push some refs to 'griboiedov:public'+To griboiedov:public+ b0f556f..9099652 git-annex -> synced/git-annex+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+From /home/me/public+ 73c5341..763310f annex/direct/master -> dolgoff/annex/direct/master+ e326ebb..c8c86fe git-annex -> dolgoff/git-annex+ e326ebb..4f98427 synced/git-annex -> dolgoff/synced/git-annex+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-12-23 21:04:59 CET] Committer: Adding msg00042.html+ok+(Recording state in git...)+add mails/msg00042.html [2013-12-23 21:04:59 CET] Committer: Committing changes to git+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+From griboiedov:public+ 2171219..c7b4195 git-annex -> origin/git-annex+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+Auto packing the repository for optimum performance.+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-12-23 21:05:07 CET] Committer: Adding msg00055.html+ok+(Recording state in git...)+(merging synced/git-annex into git-annex...)+(Recording state in git...)+add mails/msg00055.html [2013-12-23 21:05:07 CET] Committer: Committing changes to git+To griboiedov:public+ 9099652..c8c86fe git-annex -> synced/git-annex+warning: There are too many unreachable loose objects; run 'git prune' to remove them.+To /home/me/public+ c7b4195..c6278b9 git-annex -> synced/git-annex+[2013-12-23 21:05:13 CET] Pusher: Syncing with public, dolgoff, origin+fatal: Unable to create '/home/me/public/.git/refs/heads/synced/git-annex.lock': Le fichier existe.++If no other git process is currently running, this probably means a+git process crashed in this repository earlier. Make sure no other git+process is running and remove the file manually to continue.+fatal: The remote end hung up unexpectedly+fatal: The remote end hung up unexpectedly+Auto packing the repository for optimum performance.+To griboiedov:public+ c8c86fe..c6278b9 git-annex -> synced/git-annex+warning: There are too many unreachable loose objects; run 'git prune' to remove them.+To /home/me/public+ c6278b9..fe337a3 git-annex -> synced/git-annex+From /home/me/public+ c8c86fe..fe337a3 git-annex -> dolgoff/git-annex+ c6278b9..fe337a3 synced/git-annex -> dolgoff/synced/git-annex+Everything up-to-date+[2013-12-23 22:04:54 CET] NetWatcherFallback: Syncing with origin+From griboiedov:public+ 763310f..4a82c94 annex/direct/master -> origin/annex/direct/master+ c7b4195..4051e5f git-annex -> origin/git-annex+ 763310f..4a82c94 synced/master -> origin/synced/master+Updating 763310f..4a82c94+Fast-forward+Auto packing the repository for optimum performance. You may also+run "git gc" manually. See "git help gc" for more information.+warning: There are too many unreachable loose objects; run 'git prune' to remove them.+ code.html | 2 +-+ libre.html | 2 +-+ mails/.mhonarc.db | 2 +-+ mails/{binuVoVGDloKB.bin => bin5AtY2Z6c7Y.bin} | 0+ mails/{binjMrfB7aM7s.bin => binrPJBAv0ZVt.bin} | 0+ mails/{jpghvPaq3_Be0.jpg => jpg1UMqWMrG7a.jpg} | 0+ mails/{jpgK4Lmnj5kJU.jpg => jpg3DFKEEjrkk.jpg} | 0+ mails/{jpgMi7I6uLnaD.jpg => jpg3krTrtBEkb.jpg} | 0+ mails/{jpgbS7_tLed4m.jpg => jpg7fboROgExn.jpg} | 0+ mails/{jpgVt3cWtM2fp.jpg => jpg924jbjXysn.jpg} | 0+ mails/{jpgCfz3HNRLYo.jpg => jpgE97mvEaO69.jpg} | 0+ mails/{jpgAU20k3zk5w.jpg => jpgFNaMv1VRz6.jpg} | 0+ mails/{jpgmFXSd2Dp97.jpg => jpgHsS_2rOL6Y.jpg} | 0+ mails/{jpgScmPPKPHFq.jpg => jpgKXplac49vA.jpg} | 0+ mails/{jpgJnSKE5skVx.jpg => jpgLRAgF_kk2y.jpg} | 0+ mails/{jpgKyEVJPJdPY.jpg => jpgLqoIemkRHW.jpg} | 0+ mails/{jpgVzzX55uqdu.jpg => jpgNehfnysPB_.jpg} | 0+ mails/{jpg9a_S8ignCJ.jpg => jpgOerFzfMUut.jpg} | 0+ mails/{jpgim5vpaDawh.jpg => jpgQJv5bJd7Z_.jpg} | 0+ mails/{jpgU2vrhPtw4a.jpg => jpgTmkvSP5OCN.jpg} | 0+ mails/{jpgAsv158YPXC.jpg => jpgWN0orLG26U.jpg} | 0+ mails/{jpgkU70wDyd7n.jpg => jpg_TlOpz5yEI.jpg} | 0+ mails/{jpgCw4FBEkcOV.jpg => jpgb6Amcdbt_p.jpg} | 0+ mails/{jpgrzViZx_4aI.jpg => jpgd4jRWMqhI3.jpg} | 0+ mails/{jpgyDMQ3JRqJQ.jpg => jpgdu9EKZP18V.jpg} | 0+ mails/{jpgoHLfpoWcUO.jpg => jpgfTUANHcfnz.jpg} | 0+ mails/{jpgjY_paWcDcr.jpg => jpggs4xMeCwqp.jpg} | 0+ mails/{jpgh1EzKSHWvb.jpg => jpgkoEH5SoLvR.jpg} | 0+ mails/{jpgwgZCUHCRLD.jpg => jpgmcn6CC58d1.jpg} | 0+ mails/{jpgV1Ek5XTDpl.jpg => jpgqYEKj5yxhL.jpg} | 0+ mails/{jpgtvEG4unHFl.jpg => jpgygiJgjjLdg.jpg} | 0+ mails/{jpgdQNUXemgWT.jpg => jpgzKwM4quoCJ.jpg} | 0+ mails/{jpgpIVZxq60Dk.jpg => jpgzTcmXOboBC.jpg} | 0+ mails/maillist.html | 2 +-+ mails/msg00006.html | 2 +-+ mails/msg00018.html | 2 +-+ mails/msg00023.html | 2 +-+ mails/msg00024.html | 2 +-+ mails/msg00025.html | 2 +-+ mails/msg00026.html | 2 +-+ mails/msg00027.html | 2 +-+ mails/msg00028.html | 2 +-+ mails/msg00032.html | 2 +-+ mails/msg00040.html | 2 +-+ mails/msg00041.html | 2 +-+ mails/msg00042.html | 2 +-+ mails/msg00048.html | 2 +-+ mails/msg00049.html | 2 +-+ mails/msg00050.html | 2 +-+ mails/msg00051.html | 2 +-+ mails/msg00052.html | 1 -+ mails/msg00053.html | 1 -+ mails/msg00054.html | 1 -+ mails/msg00055.html | 1 -+ mails/{pdfDH4ZUAcsJE.pdf => pdf2EajO3nKRV.pdf} | 0+ mails/{pdfU9I3NUvHOG.pdf => pdf3vLwdvymu6.pdf} | 0+ mails/{pdfPePGLsDAym.pdf => pdfF0TCUFYgxV.pdf} | 0+ mails/{pdf82oysVxMKf.pdf => pdfmQ9u5fWUkK.pdf} | 0+ mails/{pgpBKaIcivKYa.pgp => pgpcO0uja6Z0Q.pgp} | 0+ mails/{png9O3vtGcotx.png => pngfmEm5tkUDn.png} | 0+ mails/{pngBkJAx0zfhF.png => pngphoxRepygs.png} | 0+ mails/threads.html | 2 +-+ output.html | 2 +-+ reflets.html | 2 +-+ 64 files changed, 23 insertions(+), 27 deletions(-)+ rename mails/{binuVoVGDloKB.bin => bin5AtY2Z6c7Y.bin} (100%)+ rename mails/{binjMrfB7aM7s.bin => binrPJBAv0ZVt.bin} (100%)+ rename mails/{jpghvPaq3_Be0.jpg => jpg1UMqWMrG7a.jpg} (100%)+ rename mails/{jpgK4Lmnj5kJU.jpg => jpg3DFKEEjrkk.jpg} (100%)+ rename mails/{jpgMi7I6uLnaD.jpg => jpg3krTrtBEkb.jpg} (100%)+ rename mails/{jpgbS7_tLed4m.jpg => jpg7fboROgExn.jpg} (100%)+ rename mails/{jpgVt3cWtM2fp.jpg => jpg924jbjXysn.jpg} (100%)+ rename mails/{jpgCfz3HNRLYo.jpg => jpgE97mvEaO69.jpg} (100%)+ rename mails/{jpgAU20k3zk5w.jpg => jpgFNaMv1VRz6.jpg} (100%)+ rename mails/{jpgmFXSd2Dp97.jpg => jpgHsS_2rOL6Y.jpg} (100%)+ rename mails/{jpgScmPPKPHFq.jpg => jpgKXplac49vA.jpg} (100%)+ rename mails/{jpgJnSKE5skVx.jpg => jpgLRAgF_kk2y.jpg} (100%)+ rename mails/{jpgKyEVJPJdPY.jpg => jpgLqoIemkRHW.jpg} (100%)+ rename mails/{jpgVzzX55uqdu.jpg => jpgNehfnysPB_.jpg} (100%)+ rename mails/{jpg9a_S8ignCJ.jpg => jpgOerFzfMUut.jpg} (100%)+ rename mails/{jpgim5vpaDawh.jpg => jpgQJv5bJd7Z_.jpg} (100%)+ rename mails/{jpgU2vrhPtw4a.jpg => jpgTmkvSP5OCN.jpg} (100%)+ rename mails/{jpgAsv158YPXC.jpg => jpgWN0orLG26U.jpg} (100%)+ rename mails/{jpgkU70wDyd7n.jpg => jpg_TlOpz5yEI.jpg} (100%)+ rename mails/{jpgCw4FBEkcOV.jpg => jpgb6Amcdbt_p.jpg} (100%)+ rename mails/{jpgrzViZx_4aI.jpg => jpgd4jRWMqhI3.jpg} (100%)+ rename mails/{jpgyDMQ3JRqJQ.jpg => jpgdu9EKZP18V.jpg} (100%)+ rename mails/{jpgoHLfpoWcUO.jpg => jpgfTUANHcfnz.jpg} (100%)+ rename mails/{jpgjY_paWcDcr.jpg => jpggs4xMeCwqp.jpg} (100%)+ rename mails/{jpgh1EzKSHWvb.jpg => jpgkoEH5SoLvR.jpg} (100%)+ rename mails/{jpgwgZCUHCRLD.jpg => jpgmcn6CC58d1.jpg} (100%)+ rename mails/{jpgV1Ek5XTDpl.jpg => jpgqYEKj5yxhL.jpg} (100%)+ rename mails/{jpgtvEG4unHFl.jpg => jpgygiJgjjLdg.jpg} (100%)+ rename mails/{jpgdQNUXemgWT.jpg => jpgzKwM4quoCJ.jpg} (100%)+ rename mails/{jpgpIVZxq60Dk.jpg => jpgzTcmXOboBC.jpg} (100%)+ delete mode 120000 mails/msg00052.html+ delete mode 120000 mails/msg00053.html+ delete mode 120000 mails/msg00054.html+ delete mode 120000 mails/msg00055.html+ rename mails/{pdfDH4ZUAcsJE.pdf => pdf2EajO3nKRV.pdf} (100%)+ rename mails/{pdfU9I3NUvHOG.pdf => pdf3vLwdvymu6.pdf} (100%)+ rename mails/{pdfPePGLsDAym.pdf => pdfF0TCUFYgxV.pdf} (100%)+ rename mails/{pdf82oysVxMKf.pdf => pdfmQ9u5fWUkK.pdf} (100%)+ rename mails/{pgpBKaIcivKYa.pgp => pgpcO0uja6Z0Q.pgp} (100%)+ rename mails/{png9O3vtGcotx.png => pngfmEm5tkUDn.png} (100%)+ rename mails/{pngBkJAx0zfhF.png => pngphoxRepygs.png} (100%)+[2013-12-23 22:05:12 CET] Committer: Committing changes to git+[2013-12-23 22:05:13 CET] Pusher: Syncing with public, dolgoff, origin+Auto packing the repository for optimum performance.+fatal: Unable to create '/home/me/public/.git/refs/heads/synced/git-annex.lock': Le fichier existe.++If no other git process is currently running, this probably means a+git process crashed in this repository earlier. Make sure no other git+process is running and remove the file manually to continue.+fatal: The remote end hung up unexpectedly+fatal: The remote end hung up unexpectedly+[2013-12-23 22:05:16 CET] Committer: Adding reflets.html output.html threads.html pngphoxRepygs.png pngfmEm5tkUDn.png pgpcO0uja6Z0Q.pgp pdfmQ9u5fWUkK.pdf pdfF0TCUFYgxV.pdf pdf3vLwdvymu6.pdf and 51 other files+ok+(Recording state in git...)+(Recording state in git...)+(merging synced/git-annex into git-annex...)+(Recording state in git...)++(Recording state in git...)+(Recording state in git...)+(Recording state in git...)+add reflets.html ok+add reflets.html ok+add output.html ok+add mails/threads.html ok+add mails/pngphoxRepygs.png ok+add mails/pngfmEm5tkUDn.png ok+add mails/pgpcO0uja6Z0Q.pgp ok+add mails/pdfmQ9u5fWUkK.pdf ok+add mails/pdfF0TCUFYgxV.pdf ok+add mails/pdf3vLwdvymu6.pdf ok+add mails/pdf2EajO3nKRV.pdf ok+add mails/msg00051.html ok+add mails/msg00050.html ok+add mails/msg00049.html ok+add mails/msg00048.html ok+add mails/msg00042.html ok+add mails/msg00041.html ok+add mails/msg00040.html ok+add mails/msg00032.html ok+add mails/msg00032.html ok+add mails/msg00028.html ok+add mails/msg00027.html ok+add mails/msg00026.html ok+add mails/msg00025.html ok+add mails/msg00024.html ok+add mails/msg00023.html ok+add mails/msg00018.html ok+add mails/msg00006.html ok+add mails/maillist.html ok+add mails/jpgzTcmXOboBC.jpg ok+add mails/jpgzTcmXOboBC.jpg ok+add mails/jpgzKwM4quoCJ.jpg ok+add mails/jpgygiJgjjLdg.jpg ok+add mails/jpgqYEKj5yxhL.jpg ok+add mails/jpgmcn6CC58d1.jpg ok+add mails/jpgkoEH5SoLvR.jpg ok+add mails/jpggs4xMeCwqp.jpg ok+add mails/jpggs4xMeCwqp.jpg ok+add mails/jpgfTUANHcfnz.jpg ok+add mails/jpgdu9EKZP18V.jpg ok+add mails/jpgd4jRWMqhI3.jpg ok+add mails/jpgb6Amcdbt_p.jpg ok+add mails/jpgb6Amcdbt_p.jpg ok+add mails/jpg_TlOpz5yEI.jpg ok+add mails/jpgWN0orLG26U.jpg ok+add mails/jpgWN0orLG26U.jpg ok+add mails/jpgTmkvSP5OCN.jpg ok+add mails/jpgTmkvSP5OCN.jpg ok+add mails/jpgQJv5bJd7Z_.jpg ok+add mails/jpgOerFzfMUut.jpg ok+add mails/jpgOerFzfMUut.jpg ok+add mails/jpgNehfnysPB_.jpg ok+add mails/jpgNehfnysPB_.jpg ok+add mails/jpgLqoIemkRHW.jpg ok+add mails/jpgLqoIemkRHW.jpg ok+add mails/jpgLRAgF_kk2y.jpg ok+add mails/jpgKXplac49vA.jpg ok+add mails/jpgKXplac49vA.jpg ok+add mails/jpgHsS_2rOL6Y.jpg ok+add mails/jpgHsS_2rOL6Y.jpg ok+add mails/jpgFNaMv1VRz6.jpg ok+add mails/jpgFNaMv1VRz6.jpg ok+add mails/jpgE97mvEaO69.jpg ok+add mails/jpgE97mvEaO69.jpg ok+add mails/jpg924jbjXysn.jpg ok+add mails/jpg7fboROgExn.jpg ok+add mails/jpg7fboROgExn.jpg ok+add mails/jpg3krTrtBEkb.jpg ok+add mails/jpg3krTrtBEkb.jpg ok+add mails/jpg3DFKEEjrkk.jpg ok+add mails/jpg3DFKEEjrkk.jpg ok+add mails/jpg1UMqWMrG7a.jpg ok+add mails/binrPJBAv0ZVt.bin ok+add mails/bin5AtY2Z6c7Y.bin ok+add mails/.mhonarc.db ok+add libre.html ok+add code.html [2013-12-23 22:05:17 CET] Committer: Committing changes to git+[2013-12-23 22:05:17 CET] Transferrer: Uploaded jpgb6Amcdbt_p.jpg+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+fatal: Unable to create '/home/me/public/.git/refs/heads/synced/git-annex.lock': File exists.++If no other git process is currently running, this probably means a+git process crashed in this repository earlier. Make sure no other git+process is running and remove the file manually to continue.+git-annex-shell: fatal: The remote end hung up unexpectedly+fatal: The remote end hung up unexpectedly+key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+To griboiedov:public+ c6278b9..d7c3c7d git-annex -> synced/git-annex+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+warning: There are too many unreachable loose objects; run 'git prune' to remove them.+To /home/me/public+ 4051e5f..8092c30 git-annex -> synced/git-annex+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+From /home/me/public+ 763310f..2ec4f5d annex/direct/master -> dolgoff/annex/direct/master+ fe337a3..8092c30 git-annex -> dolgoff/git-annex+ fe337a3..8092c30 synced/git-annex -> dolgoff/synced/git-annex+ 763310f..6024c22 synced/master -> dolgoff/synced/master+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+Everything up-to-date+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+To griboiedov:public+ d7c3c7d..8092c30 git-annex -> synced/git-annex+ 4a82c94..2ec4f5d annex/direct/master -> synced/master+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-12-23 22:05:37 CET] Pusher: Syncing with public, dolgoff, origin+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+fatal: Unable to create '/home/me/public/.git/refs/heads/synced/git-annex.lock': Le fichier existe.++If no other git process is currently running, this probably means a+git process crashed in this repository earlier. Make sure no other git+process is running and remove the file manually to continue.+fatal: The remote end hung up unexpectedly+fatal: The remote end hung up unexpectedly+Auto packing the repository for optimum performance.+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: To griboiedov:public+ 8092c30..3f6f227 key is already present in annexgit-annex -> synced/git-annex++rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+warning: There are too many unreachable loose objects; run 'git prune' to remove them.+To /home/me/public+ 8092c30..3f6f227 git-annex -> synced/git-annex+From /home/me/public+ 8092c30..3f6f227 git-annex -> dolgoff/git-annex+ 8092c30..3f6f227 synced/git-annex -> dolgoff/synced/git-annex+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+Everything up-to-date+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-12-23 23:03:21 CET] SanityCheckerHourly: Rotated logs due to size: 1004794++# End of transcript or log.+"""]]
@@ -0,0 +1,52 @@+### Please describe the problem.++When git annex is used on a encfs mount, ``.fuse_hiddenXXXX`` files are left behind in ``.git/annex/objects/*/*/`` when I ``git annex move`` files off the encfs++### What steps will reproduce the problem?++ mkdir normal plain enc+ encfs -o kernel_cache "$(realpath enc)" "$(realpath plain)"++ cd normal+ git init+ git annex init normal++ cd ../plain+ git init+ git annex init enc+ dd if=/dev/urandom bs=1M count=11 of=11m+ git annex add 11m+ git remote add normal "$(realpath ../normal)"+ du -hscL *+ << 11MB-ish >>+ du -hsc .git/annex/objects+ << 11MB-ish >>+ git annex move --to=normal 11m+ du -hscL *+ << 0 >>+ du -hsc .git/annex/objects+ << 11MB-ish but should be 0-ish >>+ tree -a .git/annex/objects+ << ??/??/SHA1-*/.fuse_hidden??????? >>+ lsof .git/annex/objects/??/??/SHA*/.fuse_hidden*+ << shows no programs have this file open >>+++### What version of git-annex are you using? On what operating system?++5.20131221 on debian unstable (installed by aptitude from debian/main)++### Please provide any additional information below.++I did a couple quick internet searches on these .fuse_hidden files, and (if a random person on the internet is correct) they are created by enfs (or maybe fuse itself) when a file is unlinked while open. It is supposed to be deleted when the file is closed.++Possibilities come to mind:++* There's a bug in encfs/fuse+* git annex fails to close the file, and whatever cleanup happens when the linux kernel closes git annex fails to trigger encfs/fuse's real unlinking/cleanup thing++++I'm happy to help with further testing, experimenting, etc. I'm good at git, the commandline, programming, etc but I don't know Haskell.++- Jason <jason@jasonwoof.com>
+ doc/bugs/one_test_fail_on_osx.mdwn view
@@ -0,0 +1,30 @@+### Please describe the problem.++git-annex test reports: 1 out of 120 tests failed++ ...+ Unit Tests (indirect)+ ...+ lock: FAIL+ lock --force failed+ ...++### What version of git-annex are you using? On what operating system?++ $ git-annex version+ git-annex version: 5.20131221-g00d1673+ build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash+ key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL+ remote types: git gcrypt S3 bup directory rsync web webdav glacier hook+ local repository version: 3+ default repository version: 3+ supported repository versions: 3 5+ upgrade supported from repository versions: 0 1 2 4++ $ git --version+ git version 1.8.4++ System Version: OS X 10.9 (13A603)++> This was a type in the test suite. It's already fixed in git. [[done]]+> --[[Joey]]
+ doc/bugs/webdav_special_remote_fails_on_android___40__box.com__41__.mdwn view
@@ -0,0 +1,30 @@+### Please describe the problem.++The Box.com/WebDAV special remote fails with this error on my Android tablet:++ WebDAV failed to write file: InternalIOException user error (Network.Socket.setSocketOption: socket option NoDelay unsupported on this system): user error++### What steps will reproduce the problem?++ 1. Install the Android beta from the download page.+ 2. Create a repository (using the assistant)+ 3. (At this point I configured XMPP, if that's relevant.)+ 4. Configure a Box.com repository using the assistant++The repository will fail to add with the above error message.++### What version of git-annex are you using? On what operating system?++git-annex 5.20131221-gf8c928d++Android 4.0.4<br>+Kernel 2.6.35-palm-tenderloin<br>+CyanogenMod 9-20121202-NIGHTLY-tenderloin (HP Touchpad)++### Please provide any additional information below.++I have successfully set up the same Box.com account via the assistant on another machine.++I don't see any mention of WebDAV in daemon.log and friends. ++It seems like NODELAY should be optional, as it's just a performance optimization (and disabling packet coalescing may be battery-hostile on a mobile device, too).
doc/design/external_special_remote_protocol.mdwn view
@@ -1,10 +1,13 @@-See [[todo/support_for_writing_external_special_remotes]] for motivation.+Communication between git-annex and a program implementing an external+special remote uses this protocol. -This is a design for a protocol to be used to communicate between git-annex-and a program implementing an external special remote.+[[!toc]] +## starting the program+ The external special remote program has a name like-`git-annex-remote-$bar`. When `git annex initremote foo type=$bar` is run,+`git-annex-remote-$bar`. When +`git annex initremote foo type=external externaltype=$bar` is run, git-annex finds the appropriate program in PATH. The program is started by git-annex when it needs to access the special@@ -26,15 +29,21 @@ at any given time, and is responsible for sending requests, while the other only sends replies to the requests. +Each protocol line starts with a command, which is followed by the+command's parameters (a fixed number per command), each separated by a+single space. The last parameter may contain spaces. Parameters may be+empty, but the separating spaces are still required in that case.+ ## example session The special remote is responsible for sending the first message, indicating the version of the protocol it is using. - VERSION 0+ VERSION 1 -Once it knows the version, git-annex will send a message telling the-special remote to start up.+Once it knows the version, git-annex will generally +send a message telling the special remote to start up.+(Or it might send a INITREMOTE, so don't hardcode this order.) PREPARE @@ -60,8 +69,8 @@ transfer. It will typically send progress messages, indicating how many bytes have been sent: - PROGRESS STORE somekey 10240- PROGRESS STORE somekey 20480+ PROGRESS 10240+ PROGRESS 20480 Once the key has been stored, the special remote tells git-annex the result: @@ -72,32 +81,30 @@ ## git-annex request messages -These are the request messages git-annex may send to the special remote-program. None of these messages require an immediate reply. The special+These are messages git-annex sends to the special remote program.+None of these messages require an immediate reply. The special remote can send any messages it likes while handling the requests. Once the special remote has finished performing the request, it should send one of the corresponding replies listed in the next section. -* `PREPARE` - Tells the special remote it's time to prepare itself to be used.- Only run once, at startup, always immediately after the special remote- sends VERSION.+The following requests *must* all be supported by the special remote.+ * `INITREMOTE` - Request that the remote initialized itself. This is where any one-time+ Request that the remote initialize itself. This is where any one-time setup tasks can be done, for example creating an Amazon S3 bucket. - (PREPARE is still sent before this.) - Note: This may be run repeatedly, as a remote is initialized in+ Note: This may be run repeatedly over time, as a remote is initialized in different repositories, or as the configuration of a remote is changed.+ (Both `git annex initremote` and `git-annex enableremote` run this.) So any one-time setup tasks should be done idempotently.-* `GETCOST` - Requests the remote return a use cost. Higher costs are more expensive.- (See Config/Cost.hs for some standard costs.)+* `PREPARE` + Tells the special remote it's time to prepare itself to be used. + Only INITREMOTE can come before this. * `TRANSFER STORE|RETRIEVE Key File` Requests the transfer of a key. For Send, the File is the file to upload;- for Receive the File is where to store the download. Note that the File- should not influence the filename used on the remote. The filename used- should be derived from the Key. + for Receive the File is where to store the download. + Note that the File should not influence the filename used on the remote.+ The filename will not contain any whitespace. Multiple transfers might be requested by git-annex, but it's fine for the program to serialize them and only do one at a time. * `CHECKPRESENT Key` @@ -105,6 +112,16 @@ * `REMOVE Key` Requests the remote remove a key's contents. +The following requests can optionally be supported. If not handled,+replying with `UNSUPPORTED-REQUEST` is acceptable.++* `GETCOST` + Requests the remote return a use cost. Higher costs are more expensive.+ (See Config/Cost.hs for some standard costs.)++More optional requests may be added, without changing the protocol version,+so if an unknown request is seen, reply with `UNSUPPORTED-REQUEST`.+ ## special remote replies These should be sent only in response to the git-annex request messages.@@ -114,6 +131,8 @@ * `PREPARE-SUCCESS` Sent as a response to PREPARE once the special remote is ready for use.+* `PREPARE-FAILURE ErrorMsg`+ Sent as a response to PREPARE if the special remote cannot be used. * `TRANSFER-SUCCESS STORE|RETRIEVE Key` Indicates the transfer completed successfully. * `TRANSFER-FAILURE STORE|RETRIEVE Key ErrorMsg` @@ -130,19 +149,16 @@ * `REMOVE-SUCCESS Key` Indicates the key has been removed from the remote. May be returned if the remote didn't have the key at the point removal was requested.-* `REMOVE-FAILURE Key` +* `REMOVE-FAILURE Key ErrorMsg` Indicates that the key was unable to be removed from the remote. * `COST Int` Indicates the cost of the remote.-* `COST-UNKNOWN` - Indicates the remote has no opinion of its cost.-* `INITREMOTE-SUCCESS Setting=Value ...` +* `INITREMOTE-SUCCESS` Indicates the INITREMOTE succeeded and the remote is ready to use.- The settings and values can optionally be returned. They will be added- to the existing configuration of the remote (and may change existing- values in it). * `INITREMOTE-FAILURE ErrorMsg` Indicates that INITREMOTE failed.+* `UNSUPPORTED-REQUEST` + Indicates that the special remote does not know how to handle a request. ## special remote messages @@ -150,33 +166,49 @@ in control. * `VERSION Int` - Supported protocol version. Current version is 0. Must be sent first+ Supported protocol version. Current version is 1. Must be sent first thing at startup, as until it sees this git-annex does not know how to talk with the special remote program!-* `PROGRESS STORE|RETRIEVE Key Int` - Indicates the current progress of the transfer. May be repeated any- number of times during the transfer process. This is highly recommended- for STORE. (It is optional but good for RETRIEVE.) +* `PROGRESS Int` + Indicates the current progress of the transfer (in bytes). May be repeated+ any number of times during the transfer process, but it's wasteful to+ update the progress until at least another 1% of the file has been sent.+ This is highly recommended for STORE. (It is optional but good for RETRIEVE.) (git-annex does not send a reply to this message.) * `DIRHASH Key` Gets a two level hash associated with a Key. Something like "abc/def". This is always the same for any given Key, so can be used for eg, creating hash directory structures to store Keys in. (git-annex replies with VALUE followed by the value.)-* `GETCONFIG Setting`- Gets one of the special remote's configuration settings. - (git-annex replies with VALUE followed by the value.)-* `SETSTATE Key Value` - git-annex can store state in the git-annex branch on a- per-special-remote, per-key basis. This sets that state. - (git-annex replies with VALUE followed by the value stored.)-* `GETSTATE Key` - Gets any state previously stored for the key from the git-annex branch. - Note that some special remotes may be accessed from multiple- repositories, and the state is only eventually consistently synced- between them. If two repositories set different values in the state- for a key, the one that sets it last wins. - (git-annex replies with VALUE followed by the value.)+* `SETCONFIG Setting` + Sets one of the special remote's configuration settings. + Normally this is sent during INITREMOTE, which allows these settings+ to be stored in the git-annex branch, so will be available if the same+ special remote is used elsewhere. (If sent after INITREMOTE, the changed+ configuration will only be available while the remote is running.)+* `GETCONFIG Setting` + Gets one of the special remote's configuration settings, which can have+ been passed by the user when running `git annex initremote`, or+ can have been set by a previous SETCONFIG. Can be run at any time. + (git-annex replies with VALUE followed by the value. If the setting is+ not set, the value will be empty.)+* `SETCREDS Setting User Password` + When some form of user and password is needed to access a special remote,+ this can be used to securely store them for later use.+ (Like SETCONFIG, this is normally sent only during INITREMOTE.) + The Setting indicates which value in a remote's configuration can be+ used to store the creds. + Note that creds are normally only stored in the remote's configuration+ when it's surely safe to do so; when gpg encryption is used, in which+ case the creds will be encrypted using it. If creds are not stored in+ the configuration, they'll only be stored in a local file. + (embedcreds can be set to yes by the user or by SETCONFIG to force+ the creds to be stored in the remote's configuration).+* `GETCREDS Setting` + Gets any creds that were previously stored in the remote's configuration+ or a file.+ (git-annex replies with "CREDS User Password". If no creds are found,+ User and Password are both empty.) ## general messages @@ -184,78 +216,26 @@ remote. * `ERROR ErrorMsg` - Generic error. Can be sent at any time if things get messed up.- When possible, use a more specific reply from the list above. - It would be a good idea to send this if git-annex sends a command- you do not support. The program should exit after sending this, as+ Generic error. Can be sent at any time if things get too messed up+ to continue. When possible, use a more specific reply from the list above. + The special remote program should exit after sending this, as git-annex will not talk to it any further. If the program receives- an ERROR, it can try to recover, or exit with its own ERROR.--## Simple shell example--[[!format sh """-#!/bin/sh-set -e--echo VERSION 0--while read line; do- set -- $line- case "$1" in- INITREMOTE)- # XXX do anything necessary to create resources- # used by the remote. Try to be idempotent.- # Use GETCONFIG to get any needed configuration- # settings.- echo INITREMOTE-SUCCESS- ;;- GETCOST)- echo COST-UNKNOWN- ;;- PREPARE)- # XXX Use GETCONFIG to get configuration settings,- # and do anything needed to start using the- # special remote here.- echo PREPARE-SUCCESS- ;;- TRANSFER)- key="$3"- file="$4"- case "$2" in- STORE)- # XXX upload file here- # XXX when possible, send PROGRESS- echo TRANSFER-SUCCESS STORE "$key"- ;;- RETRIEVE)- # XXX download file here- echo TRANSFER-SUCCESS RETRIEVE "$key"- ;;- - esac- ;;- CHECKPRESENT)- key="$2"- echo CHECKPRESENT-UNKNOWN "$key" "not implemented"- ;;- REMOVE)- key="$2"- # XXX remove key here- echo REMOVE-SUCCESS "$key"- ;;- *)- echo ERROR "unknown command received: $line"- exit 1- ;;- esac -done--# XXX anything that needs to be done at shutdown can be done here-"""]]+ an ERROR from git-annex, it can exit with its own ERROR. ## TODO -* Communicate when the network connection may have changed, so long-running- remotes can reconnect.-* uuid discovery during initremote.+* When storing encrypted files stream the file up/down the pipe, rather+ than using a temp file. Will probably involve less space and disk IO, + and makes the progress display better, since the encryption can happen+ concurrently with the transfer. Also, no need to use PROGRESS in this+ scenario, since git-annex can see how much data it has sent/received from+ the remote. However, \n and probably \0 need to be escaped somehow in the+ file data, which adds complication.+* uuid discovery during INITREMOTE.+* uuid verification during PREPARE (so, for example, it can check if a+ removable drive repo has the expected uuid) * Support for splitting files into chunks.+* Support for getting and setting the list of urls that can be associated+ with a key.+* Hook into webapp. Needs a way to provide some kind of prompt to the user+ in the webapp, etc.
+ doc/devblog/day_84__ho_uh_oh.mdwn view
@@ -0,0 +1,11 @@+Resurfaced today to fix some problems with the Linux standalone builds+in the Solstice release. The worst of these prevented the amd64 build from+running on some systems, and that build has been updated. The other+problems all involved the binary shimming, and were less serious.++As part of that work, replaced the hacky shell script that handled the+linux library copying and binary shimming with a haskell program.++Also worked on some Windows bugs, and fixed a typo in the test suite.+Got my own little present: haskell-tasty finally got out of Incoming, so+the next Debian package build will once again include the test suite.
+ doc/devblog/day_85__external_special_remote_protocol_types.mdwn view
@@ -0,0 +1,25 @@+Only did a few hours today, getting started on implementing the+[[design/external_special_remote_protocol]].++Mostly this involved writing down types for the various messages,+and code to parse them. I'm very happy with how the parsing turned out;+nearly all the work is handled by the data types and type classes,+and so only one line of very simple code is needed to parse each message:++[[!format haskell """+instance Receivable Response where+ parseCommand "PREPARE-SUCCESS" = parse0 PREPARE_SUCCESS+ parseCommand "TRANSFER-SUCCESS" = parse2 TRANSFER_SUCCESS+ parseCommand "TRANSFER-FAILURE" = parse3 TRANSFER_FAILURE+"""]]++An especially nice part of this implementation is that it knows exactly how+many parameters each message should have (and their types of course), and so+can both reject invalid messages, and avoid ambiguity in tokenizing the+parameters. For example, the 3rd parameter of TRANSFER-FAILURE is an error+message, and as it's the last parameter, it can contain multiple words.++ *Remote.External> parseMessage "TRANSFER-FAILURE STORE SHA1--foo doesn't work on Christmas" :: Maybe Response+ Just (TRANSFER_FAILURE Upload (Key {keyName = "foo", keyBackendName = "SHA1", keySize = Nothing, keyMtime = Nothing}) "doesn't work on Christmas")++That's the easy groundwork for external special remotes, done.
+ doc/devblog/day_86__external_special_remote_implementation.mdwn view
@@ -0,0 +1,11 @@+Built most of the external special remote today. While I've written 600+lines of code for this, and think it's probably working, and complete+(except for a couple of features), all I know is that it compiles.++I've also written an [[example external special remote program in shell script|special_remotes/external/example.sh]],+so the next step is to put the two together and see how it works.+I also hope that some people who have built hook special remotes+in the past will update them to the new external special remote interface,+which is quite a lot better.++Today's work was sponsored by Justine Lam.
+ doc/devblog/day_87__external_special_remotes_done.mdwn view
@@ -0,0 +1,16 @@+The [[external_special_remote|special_remotes/external]] interface is now+done, and tested working great! Now we just need all the old hook special+remotes to be converted to use it..++I punted on per-special-remote, per-key state storage in the git-annex+branch for now. If I find an example of a remote that needs it (Tahoe-LAFS+may, but still TBD), I'll add it. Added suppport for using the same+credential storage that git-annex uses for S3 and WebDAV credentials.++The main improvement I'd like to make is to add an interface for transferring+files where the file is streamed to/from the external special remote,+rather than using temp files as it does now. This would be more efficient+(sometimes) and make the progress bars better. But it needs to either use a+named pipe, which is complicated and non-portable, or serialize the file's+contents over a currently line-based protocol, which would be a pain.+Anyway, this can be added later, the protocol is extensible.
+ doc/devblog/day_88__lazy_sunday.mdwn view
@@ -0,0 +1,15 @@+Fixed a bug that could leave a direct mode repository stuck at+annex.version 3. As part of that, v3 indirect mode repositories will be+automatically updated to v5. There's no actual change in that upgrade, it+just simplifies things to have only one supported annex.version.++Added youtube playlist support to git-annex. Seems I had almost all the+peices needed, and didn't know it. Only about a dozen lines of code!++Added PREPARE-FAILURE support to the external special remote interface.++After I found the cable my kitten stole (her apport level is high), fixed+file transfers to/from Android. This broke because git-annex assistant+tries to use ionice, if it's in PATH, and Android's ionice is not suitable.+It could probably include ionice in the busybox build and use that one, but+I wanted a quick fix for this before the upcoming release.
+ doc/forum/Consistency_Check_for_S3.mdwn view
@@ -0,0 +1,1 @@+Wepapp only allows me to setup consistency checks for the local repo. Non of my computers has full copy of repos. How can I setup annex so that every night for one hour it checks consistency of s3 data?
+ doc/forum/DO_NOT_use_ntfs-3g_on_mac_osx_for_annex.mdwn view
@@ -0,0 +1,41 @@+After testing around git-annex on my mac using ntfs-3g to access the removable harddrive, I conclude that this is very dangerous. ++Here are some example error snippets:++ add man/man1/git-tar-tree.1 + git-annex: /Volumes/SeagateExpansion/annex/testdirect/.git/annex/objects/0K/JJ/SHA256E-s3805--948fd508a364e036ec28f5287d11825062aea2c0ed86a3a89ed871edc6ddc7a8.1/: openTempFile: interrupted (Interrupted system call)+ failed++ add man/man1/git-bundle.1 + git-annex: /Volumes/SeagateExpansion/annex/testdirect/.git/annex/tmp/e3f_804_SHA256E-s8739--569a4b4fe1072e17ff0aa9a2f67d0130b9ec3ed23f96c5a4ea38ada82f50b4aa.1.log: rename: does not exist (No such file or directory)+ failed++ add git-core/git-completion.bash failed+ add man/man7/gitglossary.7 failed+ (Recording state in git...)++ git-annex: /Volumes/SeagateExpansion/annex/testdirect/.git/annex/journal/.fuse_hidden00005dd50000010a: removeLink: does not exist (No such file or directory)+ failed+ git-annex: add: 3 failed++It's interesting that after each git-annex add ., it would got fewer failures. But in the end it stuck at 2 files. After 60 times doing: git-annex add .++It went from this:++ git-annex: add: 248 failed++to this:++ git-annex: add: 2 failed++Now the repository has 246 objects, let's try to convert it into an indirect one:++ git-annex indirect+ ...+ git-annex info+ ...+ annexed files in working tree: 9++Only 9 files made into the indirect repository! Remaining files stay as original state. Now it would be a nightmare to try to recover form this mess.++I discourage anyone from using ntfs-3g on mac for annexing. Especially direct & indirect mode. Bare repo seems to be fine however.
+ doc/forum/No_output_from_git-annex_status_v5.20131224-g692aa01.mdwn view
@@ -0,0 +1,16 @@+I'm running version 5.20131224-g692aa01 standalone tarball on linux x86_64 (Linux Mint 15). When I run `git-annex status` in the terminal I get no output. ++I've tried:++* system linked (`ln -s`) the `git-annex`, `git-annex-shell`, and `git-annex-webapp` to `~/bin/` which is on my PATH+* run the `runshell` program from the terminal ++Other things to consider:++* I've just upgraded the repo from version 3 to version 5+* Repo was created using git-annex version 3 +* I don't use assistant or the webapp+* Only used from my terminal+* Repo is in indirect mode++What do I need to do to see the results of `git-annex status`? in my terminal?
+ doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories.mdwn view
@@ -0,0 +1,1 @@+In my documents folder I have some Mercurial and Git repositories. Are there any side effects if I track the whole directory with git annex?
+ doc/forum/Webapp_not_watching_repos.mdwn view
@@ -0,0 +1,1 @@+I am using the webapp to watch 3 repositories. When I run git annex webapp it starts watching one of the repos but unless I switch to other repos it does not start noticing changes after switching to each repo once it works as intended.
+ doc/forum/confused_about_external_drives.mdwn view
@@ -0,0 +1,30 @@+First off, to get that off my chest: I am not using Gnome, KDE, XFCE or any "desktop manager" (well, not quite true, I use some bits of XFCE, but it's easier to assume I'm not).++So automounting is always a little tricky for me, and I often use `pmount` to mount external drives and flash cards.++Now, I have tried to add an external drive as a backup to one of my git-annex repositories. I zero'd the drive, added a GPT partition (I wanted labels), formatted it as `ext4` and then gave it to my user:++ cfdisk /dev/sdd+ mkfs -t ext4 /dev/sdd1+ mount /dev/sdd1 /mnt+ chown anarcat /mnt+ umount /mnt++Now, at this step I would have assumed the drive would be seen by the webapp, but that wasn't the case. Maybe I wasn't patient enough? In any case, at some point I got tired and went to the commandline to add the drive as a remote. I did the following:++ mkdir -p /media/ata-WDC_WD15EADS-00P8B0_WD-WMAVU0748851-part1+ mount /dev/disk/by-id/ata-WDC_WD15EADS-00P8B0_WD-WMAVU0748851-part1 /media/ata-WDC_WD15EADS-00P8B0_WD-WMAVU0748851-part1+ cd /srv/mp3+ git annex remote add backup /media/ata-WDC_WD15EADS-00P8B0_WD-WMAVU0748851-part1/mp3+ git init /media/ata-WDC_WD15EADS-00P8B0_WD-WMAVU0748851-part1/mp3+ git annex sync+ git annex copy --to backup++So that worked, and the webapp was now seeing `backup` as yet another repository, but not quite removeable. So failed. Scratching that, I stopped the assistant, and trashed the repository:++ rm -rf /media/ata-WDC_WD15EADS-00P8B0_WD-WMAVU0748851-part1/mp3+ git remote rm backup++But now, oddly enough, the webapp would see the external drive after being restarted, and I was able to add that drive.++What am I doing wrong? how is the assistant finding those drives? --[[anarcat]]
+ doc/forum/luks_encrypted_disk_support.mdwn view
@@ -0,0 +1,3 @@+Is there a way to easily access, say, a FDE (Full Disk Encrypted) external drive using git-annex?++My use case is that I do not wish to encrypt each file individually - and find it more reliable to use a real filesystem encryption on this external hard drive. --[[anarcat]]
+ doc/forum/multiple_repositories_single_backup.txt view
@@ -0,0 +1,6 @@+hi++is it possible to have multiple repositories that share single backup directory ?++for example.+i have mp3, docs on my laptop as separate repositories. i would like to use single backup directory that is on my usb drive.
+ doc/forum/partial_synchronisation._android_phone.txt view
@@ -0,0 +1,7 @@+hi++i have a repository that is 30 gb large. i would like to sync some content onto my android phone. take mp3's for example. i would like to see whole content on android but my phone does not have that much flash space. i would like to manualy select what folders, files will be copied onto phone.++this use case may not even refer strictly to android devices but even pc's. for exaple i have small ssd drive on laptop. whole contentis kept on some hudge raid array. i will see whole directory structure but whenever i want a file i will just shedule it for download.++is it possible ? or maybe i just can not find the answer on project page ?
+ doc/forum/trusted_repositories:_fatal:_not_a_git_repo.mdwn view
@@ -0,0 +1,32 @@+When issuing a `git annex info`, I get:++~~~+$ git-annex info+repository mode: indirect+trusted repositories: fatal: Not a git repository: '/home/micas/Music/.git' fatal: Not a git repository: '/home/micas/Music/.git' 0+semitrusted repositories: 3+ 00000000-0000-0000-0000-000000000001 -- web+ 85f8a5ea-6278-11e2-9978-ebb59e8f37a2 -- here (Music annex backup)+ 9aff38f2-6447-11e2-8c89-ef50e6c0ea6c -- backupone (Music annex backupone)+untrusted repositories: 0+transfers in progress: none+available local disk space: 174.28 gigabytes (+1 megabyte reserved)+local annex keys: 5348+local annex size: 25.62 gigabytes+annexed files in working tree: 5374+size of annexed files in working tree: 25.68 gigabytes+bloom filter size: 16 mebibytes (1.1% full)+backend usage: + SHA256: 10692+ SHA256E: 30+~~~++The troubling part (I think) is `trusted repositories: fatal: Not a git repository: '/home/micas/Music/.git' fatal: Not a git repository: '/home/micas/Music/.git' 0`++Is there a command I can use to show all the uuid of known remotes? I thought I had marked all remotes pointing to /home/micas/Music/.git as `dead`++Is there another reason for the output? How can I get trusted repos back to 0?++**EDIT:**++I removed the folder (was not a git repo at the time of the error) `/home/micas/Music` and the error went away.
+ doc/forum/what_happens_to_deleted_files__63__.mdwn view
@@ -0,0 +1,24 @@+I have two repositories: A(direct) and B(indirect). At some point, I performed the following steps:++1. Add a file in A.+2. Sync A.+3. Sync B, but not get all files.+4. In B, remove a file F that was newly added in A, using `git rm` and `git commit`.+5. Now get all files from A.++This results in all "current" files being copied from A to B, but not file F.++If I checkout a branch in B for an older commit which still had file F, I can see the symlink created in the branch. But now if I try to get the file in B from A, annex says that the remote is not available: ++ sameerds@gajanan:/mnt/mandos/test$ git annex get+ get IMG_0570.JPG + Unable to access these remotes: A+ + Try making some of these repositories available:+ 530e4f81-474d-4b0b-9f13-4beb7361302c -- A+ failed+ git-annex: get: 1 failed++The remote for A exists in the listing for `git remote`, and `git annex sync` does not make this error message go away. If I checkout `master` again, then everything works fine.++But of course, this a different problem from my original one. It would a way to bring all files from the remote, that are ever used by any commit reachable in the local git history, irrespective of the currently checkout out commit. Perhaps an option `--deep-copy` to the standard `git annex get`.
doc/git-annex.mdwn view
@@ -107,7 +107,7 @@ To force checking the remote for every file when copying --from the repository, specify `--force`. -* `status` [path ...]`+* `status [path ...]` Similar to `git status --short`, displays the status of the files in the working tree. Shows files that are not checked into git, files that@@ -258,6 +258,10 @@ (Other available variables: feedauthor, itemauthor, itemsummary, itemdescription, itemrights, itemid) The `--relaxed` and `--fast` options behave the same as they do in addurl.+ + When quvi is installed, links in the feed are tested to see if they+ are on a video hosting site, and the video is downloaded. This allows+ importing eg, youtube playlists. * `watch` @@ -359,7 +363,7 @@ which may be a different repository than the one in which it was originally created with the initremote command. - The name of the remote is the same name used when origianlly + The name of the remote is the same name used when originally creating that remote with "initremote". Run "git annex enableremote" with no parameters to get a list of special remote names. @@ -1112,7 +1116,7 @@ content to avoid running out, and additional free space can be reserved via this option, to make space for more important content (such as git commit logs). Can be specified with any commonly used units, for example,- "0.5 gb" or "100 KiloBytes"+ "0.5 gb", "500M", or "100 KiloBytes" The default reserve is 1 megabyte. @@ -1399,6 +1403,11 @@ It is set to "true" if this is a gcrypt remote. If the gcrypt remote is accessible over ssh and has git-annex-shell available to manage it, it's set to "shell"++* `remote.<name>.hooktype`, `remote.<name>.externaltype`++ Used by hook special remotes and external special remotes to record+ the type of the remote. # CONFIGURATION VIA .gitattributes
+ doc/install/ArchLinux/comment_5_cbc960cd78bf5b90e3bb6cb605d6d970._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://alerque.com/"+ nickname="Caleb"+ subject="Out of date"+ date="2013-12-28T22:04:24Z"+ content="""+The AUR package you reference is woefully out of date. I have updated the standalone variant so it might be worth using that until the maintainer catches up.++ yaourt -Sy git-annex-standalone+"""]]
doc/install/Linux_standalone.mdwn view
@@ -8,7 +8,9 @@ The armel version can be installed on NAS devices and other embedded ARM linux systems. -[download tarball](https://downloads.kitenet.net/git-annex/linux/current/)+* i386: [download tarball](https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-i386.tar.gz)+* amd64: [download tarball](https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz)+* armel: [download tarball](https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-armel.tar.gz) To use, just unpack the tarball, `cd git-annex.linux` and run `./runshell` -- this sets up an environment where you can use `git annex`, as well
− doc/news/version_5.20131120.mdwn
@@ -1,11 +0,0 @@-git-annex 5.20131120 released with [[!toggle text="these changes"]]-[[!toggleable text="""- * Fix Debian package to not try to run test suite, since haskell-tasty- is not out of new or in Build-Depends yet.- * dropunused, addunused: Allow "all" instead of a range to- act on all unused data.- * Ensure execute bit is set on directories when core.sharedrepository is set.- * Ensure that core.sharedrepository is honored when creating the .git/annex- directory.- * Improve repair code in the case where the index file is corrupt,- and this hides other problems from git fsck."""]]
+ doc/news/version_5.20131230.mdwn view
@@ -0,0 +1,20 @@+git-annex 5.20131230 released with [[!toggle text="these changes"]]+[[!toggleable text="""+ * Added new external special remote interface.+ * importfeed: Support youtube playlists.+ * Add tasty to build-depends, so that test suite builds again.+ (tasty was stuck in incoming.)+ * Fix typo in test suite.+ * Fix bug in Linux standalone build's shimming that broke git-annex-shell.+ * Include git-receive-pack, git-upload-pack, git, and git-shell wrappers+ in the Linux standalone build, and OSX app, so they will be available+ when it's added to PATH.+ * addurl, importfeed: Sanitize | and some other symbols and special+ characters.+ * Auto-upgrade v3 indirect repos to v5 with no changes.+ This also fixes a problem when a direct mode repo was somehow set to v3+ rather than v4, and so the automatic direct mode upgrade to v5 was not+ done.+ * Android: Avoid trying to use Android's own ionice, which does not+ allow specifying a command to run. Fixes transferring files to/from+ android and probably a few other things."""]]
doc/special_remotes.mdwn view
@@ -18,14 +18,8 @@ * [[xmpp]] * [[hook]] -The above special remotes can be used to tie git-annex -into many cloud services. --There are many use cases for a special remote. You could use it as a backup. You could use it to archive files offline in a drive with encryption enabled so if the drive is stolen your data is not. You could git annex move --to specialremote large files when your local drive is getting full, and then git annex move the files back when free space is again available. You could have one repository copy files to a special remote, and then git annex get them on another repository, to transfer the files between computers that do not communicate directly. --The git-annex assistant makes it easy to set up rsync remotes using this last scenario, which is referred to as a transfer repository, and arranges to drop files from the transfer repository once they have been transferred to all known clients.--None of these use cases are particular to particular special remote types. Most special remotes can all be used in these and other ways. It largely doesn't matter for your use what underlying transport the special remote uses.+The above special remotes are built into git-annex, and can be used+to tie git-annex into many cloud services. Here are specific instructions for using git-annex with various services:@@ -44,6 +38,29 @@ * [[IMAP|forum/special_remote_for_IMAP]] * [[Usenet|forum/nntp__47__usenet special remote]] * [chef-vault](https://github.com/3ofcoins/knife-annex/)++Want to add support for something else? [[Write your own!|external]]++## Ways to use special remotes++There are many use cases for a special remote. You could use it as a+backup. You could use it to archive files offline in a drive with+encryption enabled so if the drive is stolen your data is not. You could+git annex move --to specialremote large files when your local drive is+getting full, and then git annex move the files back when free space is+again available. You could have one repository copy files to a special+remote, and then git annex get them on another repository, to transfer the+files between computers that do not communicate directly. ++The git-annex assistant makes it easy to set up rsync remotes using this+last scenario, which is referred to as a transfer repository, and arranges+to drop files from the transfer repository once they have been transferred+to all known clients.++None of these use cases are particular to particular special remote types.+Most special remotes can all be used in these and other ways. It largely+doesn't matter for your use what underlying transport the special remote+uses. ## Unused content on special remotes
+ doc/special_remotes/external.mdwn view
@@ -0,0 +1,27 @@+There are three ways to implement a new special remote:++1. Using the [[hook]] special remote to tell git-annex what commands+ to run to store and retrieve data. This is the easiest way, and+ is great for prototyping.+2. Writing it in Haskell and adding it to git-annex.+3. Writing a program in any language you like that speaks the+ [[design/external_special_remote_protocol]].++The rest of this page concentrates on writing new external special remotes.+It's not hard!++* All you need is to make a program with a name like `git-annex-remote-$bar`.+* Install it in PATH.+* When the user runs `git annex initremote foo type=external externaltype=$bar`,+ it will use your program.+* If things don't seem to work, pass `--debug` and you'll see, amoung other+ things, a transcript of git-annex's communication with your program.+* If you build a new special remote, please add it to the list+ of [[special_remotes]].++Here's a simple shell script example, which can easily be adapted+to run whatever commands you need. Or better, re-written in some better+language of your choice. See [[design/external_special_remote_protocol]]+for the details.++[[!inline pages="special_remotes/external/example.sh" feeds=no]]
+ doc/special_remotes/external/example.sh view
@@ -0,0 +1,195 @@+#!/bin/sh+# git-annex external special remote program+# +# This is basically the same as git-annex's built-in directory special remote.+# +# Install in PATH as git-annex-remote-directory+#+# Copyright 2013 Joey Hess; licenced under the GNU GPL version 3 or higher.++set -e++# This program speaks a line-based protocol on stdin and stdout.+# When running any commands, their stdout should be redirected to stderr+# (or /dev/null) to avoid messing up the protocol.+runcmd () {+ "$@" >&2+}++# Gets a value from the remote's configuration, and stores it in RET+getconfig () {+ ask GETCONFIG "$1"+}++# Stores a value in the remote's configuration.+setconfig () {+ echo SETCONFIG "$1" "$2"+}++# Sets LOC to the location to use to store a key.+calclocation () {+ ask DIRHASH "$1"+ LOC="$mydirectory/$RET/$1"+}++# Asks for some value, and stores it in RET+ask () {+ echo "$1" "$2"+ read resp+ # Tricky POSIX shell code to split first word of the resp,+ # preserving all other whitespace+ case "${resp%% *}" in+ VALUE)+ RET="$(echo "$resp" | sed 's/^VALUE \?//')"+ ;;+ *)+ RET=""+ ;;+ esac+}++# This remote doesn't need credentials to access it,+# but many of them will. Here's how to handle requiring the user+# set MYPASSWORD and MYLOGIN when running initremote. The creds+# will be stored securely for later use, so the user only needs+# to provide them once.+setupcreds () {+ if [ -z "$MYPASSWORD" ] || [ -z "$MYLOGIN" ]; then+ echo INITREMOTE-FAILURE "You need to set MYPASSWORD and MYLOGIN environment variables when running initremote."+ else+ echo SETCREDS mycreds "$MYLOGIN" "$MYPASSWORD" + echo INITREMOTE-SUCCESS+ fi+}++getcreds () {+ echo GETCREDS mycreds+ read resp+ case "${resp%% *}" in+ CREDS)+ MYLOGIN="$(echo "$resp" | sed 's/^CREDS \([^ ]*\) .*/\1/')"+ MYPASSWORD="$(echo "$resp" | sed 's/^CREDS [^ ]* //')"+ ;;+ esac++}++# This has to come first, to get the protocol started.+echo VERSION 1++while read line; do+ set -- $line+ case "$1" in+ INITREMOTE)+ # Do anything necessary to create resources+ # used by the remote. Try to be idempotent.+ # + # Use GETCONFIG to get any needed configuration+ # settings, and SETCONFIG to set any persistent+ # configuration settings.+ # + # (Note that this is not run every time, only when+ # git annex initremote or git annex enableremote is+ # run.)++ # The directory provided by the user+ # could be relative; make it absolute,+ # and store that.+ getconfig directory+ mydirectory="$(readlink -f "$RET")" || true+ setconfig directory "$mydirectory"+ if [ -z "$mydirectory" ]; then+ echo INITREMOTE-FAILURE "You need to set directory="+ else+ if mkdir -p "$mydirectory"; then+ setupcreds+ else+ echo INITREMOTE-FAILURE "Failed to write to $mydirectory"+ fi+ fi+ ;;+ PREPARE)+ # Use GETCONFIG to get configuration settings,+ # and do anything needed to get ready for using the+ # special remote here.+ getcreds+ getconfig directory+ mydirectory="$RET"+ if [ -d "$mydirectory" ]; then+ echo PREPARE-SUCCESS+ else+ echo PREPARE-FAILURE "$mydirectory not found"+ fi+ ;;+ TRANSFER)+ key="$3"+ file="$4"+ case "$2" in+ STORE)+ # Store the file to a location+ # based on the key.+ # XXX when possible, send PROGRESS+ calclocation "$key"+ mkdir -p "$(dirname "$LOC")"+ if runcmd cp "$file" "$LOC"; then+ echo TRANSFER-SUCCESS STORE "$key"+ else+ echo TRANSFER-FAILURE STORE "$key"+ fi+ ;;+ RETRIEVE)+ # Retrieve from a location based on+ # the key, outputting to the file.+ # XXX when easy to do, send PROGRESS+ calclocation "$key"+ if runcmd cp "$LOC" "$file"; then+ echo TRANSFER-SUCCESS RETRIEVE "$key"+ else+ echo TRANSFER-FAILURE RETRIEVE "$key"+ fi+ ;;+ esac+ ;;+ CHECKPRESENT)+ key="$2"+ calclocation "$key"+ if [ -e "$LOC" ]; then+ echo CHECKPRESENT-SUCCESS "$key"+ else+ if [ -d "$mydirectory" ]; then+ echo CHECKPRESENT-FAILURE "$key"+ else+ # When the directory does not exist,+ # the remote is not available.+ # (A network remote would similarly+ # fail with CHECKPRESENT-UNKNOWN+ # if it couldn't be contacted).+ echo CHECKPRESENT-UNKNOWN "$key" "this remote is not currently available"+ fi+ fi+ ;;+ REMOVE)+ key="$2"+ calclocation "$key"+ # Note that it's not a failure to remove a+ # key that is not present.+ if [ -e "$LOC" ]; then+ if runcmd rm -f "$LOC"; then+ echo REMOVE-SUCCESS "$key"+ else+ echo REMOVE-FAILURE "$key"+ fi+ else+ echo REMOVE-SUCCESS "$key"+ fi+ ;;+ *)+ # The requests listed above are all the ones+ # that are required to be supported, so it's fine+ # to say that any other request is unsupported.+ echo UNSUPPORTED-REQUEST+ ;;+ esac +done++# XXX anything that needs to be done at shutdown can be done here
doc/special_remotes/hook.mdwn view
@@ -1,10 +1,13 @@ This special remote type lets you store content in a remote of your own-devising.+devising, configured via some simple hooks. It's not recommended to use this remote type when another like [[rsync]] or [[directory]] will do. If your hooks are not carefully written, data-could be lost.+could be lost. +If you're building a special remote for others to use,+instead consider building an [[external_special_remote|external]].+ ## example Here's a simple example that stores content on clay tablets. If you@@ -68,6 +71,9 @@ ## combined hook program +This interface is deprecated -- it's better, and not much harder,+to write an [[external_special_remote|external]]!+ Rather than setting all of the above hooks, you can write a single program that handles everything, and set a single hook to make it be used. @@ -75,7 +81,7 @@ # git annex initremote mydemorepo type=hook hooktype=demo encryption=none The program just needs to look at the `ANNEX_ACTION` environment variable-to see what it's being asked to do For example:+to see what it's being asked to do. For example: [[!format sh """ #!/bin/sh
doc/tips/downloading_podcasts.mdwn view
@@ -61,3 +61,9 @@ downloads upstream by podcatching to a server with ample bandwidth or work around a slow local Internet connection by podcatching to your home server and transferring to your laptop on demand.++## youtube playlists++If your git-annex is also built with quvi support, you can also use+`git annex importfeed` on youtube playlists. It will automatically download+the videos linked to by the playlist.
doc/tips/fully_encrypted_git_repositories_with_gcrypt.mdwn view
@@ -124,4 +124,4 @@ git remote add sharedencrypted gcrypt::ssh://hostingsite/myrepo.git git config remote.sharedencrypted.gcryt-participants "$mykey $friendkey"- git config git push sharedencrypted master git-annex+ git push sharedencrypted master git-annex
doc/tips/using_the_web_as_a_special_remote.mdwn view
@@ -94,7 +94,15 @@ can force use of quvi with redirect detection, by prepending "quvi:" to the url. -Downloading whole YouTube playlists is not currently supported by quvi.+To download a youtube playlist, you need to find the feed associated with that+playlist, and pass it to `git annex importfeed`. There does not seem to be+an easy link anywhere to get the feed, but you can construct its url+manually. For a playlist like+"https://www.youtube.com/playlist?list=PL4F80C7D2DC8D9B6C", the+feed is "http://gdata.youtube.com/feeds/api/playlists/PL4F80C7D2DC8D9B6C"++More details about youtube feeds at <http://googlesystem.blogspot.com/2008/01/youtube-feeds.html>+-- `git-annex importfeed` should handle all of them. ## podcasts
+ doc/todo/Wishlist:_Import_youtube_playlists.mdwn view
@@ -0,0 +1,30 @@+Hi,++it would be great if the importfeed command would be able to read feeds generated by youtube (like for playlists). The youtube playlist feed contains links to separate youtube video pages, which quvi handles just fine. Currently I use the following python script:++ #!/usr/bin/env python+ import feedparser+ import sys+ d = feedparser.parse('http://gdata.youtube.com/feeds/api/playlists/%s' % sys.argv[1])+ for entry in d.entries:+ print entry.link++and then ++ kasimon@pc:~/annex/YouTube/debconf13$ youtube-playlist-urls PLz8ZG1e9MPlzefklz1Gv79icjywTXycR- | xargs git annex addurl --fast + addurl Welcome_talk.webm ok+ addurl Bits_from_the_DPL.webm ok+ addurl Debian_Cosmology.webm ok+ addurl Bits_from_the_DPL.webm ok+ addurl Debian_Cosmology.webm ok+ addurl Debian_on_Google_Compute_Engine.webm ok+ ^C++to create a backup of youtube media I'd like to keep.++It would be great if this functionality could be integrated directly into git annex.++Best+Karsten++> [[done]] --[[Joey]]
doc/todo/support_for_writing_external_special_remotes.mdwn view
@@ -23,3 +23,5 @@ special remote name. --[[Joey]]++[[done]]
+ doc/todo/wishlist:_allow_custom_S3_url_in_webapp.mdwn view
@@ -0,0 +1,3 @@+It is now relatively easy to build your own S3-compatible storage system with software such as Ceph radosgw or Openstack Swift.++So a way for users to specify their own S3 url would come pretty handy in the webapp's "add S3 remote" page.
doc/upgrades.mdwn view
@@ -20,8 +20,8 @@ ### v4 -> v5 (git-annex version 5.x) -v5 is only used for [[direct_mode]]. The upgrade from v4 to v5 is handled-automatically.+The upgrade from v4 to v5 is handled+automatically, and only affects [[direct mode]] repositories. This upgrade involves changing direct mode repositories to operate with core.bare=true.
doc/users/anarcat.mdwn view
@@ -39,3 +39,10 @@ [[!inline pages="bugs/* and !bugs/done and link(bugs/done) and link(users/anarcat) and !bugs/*/*" feeds=no actions=yes archive=yes show=0]]++Forum posts+===========++Forums where I posted.++[[!inline pages="forum/* and link(users/anarcat)" sort=mtime feeds=no actions=yes archive=yes show=0]]
+ doc/users/claes.wallin.mdwn view
@@ -0,0 +1,1 @@+[[!meta redir=clacke]]
+ doc/users/greg.mdwn view
@@ -0,0 +1,3 @@+Greg Grossmeier++<http://grossmeier.net/about>
git-annex.1 view
@@ -98,7 +98,7 @@ To force checking the remote for every file when copying \-\-from the repository, specify \fB\-\-force\fP. .IP-.IP "\fBstatus\fP [path ...]"+.IP "\fBstatus [path ...]\fP" Similar to \fBgit status \-\-short\fP, displays the status of the files in the working tree. Shows files that are not checked into git, files that have been deleted, and files that have been modified. @@ -239,6 +239,10 @@ .IP The \fB\-\-relaxed\fP and \fB\-\-fast\fP options behave the same as they do in addurl. .IP+When quvi is installed, links in the feed are tested to see if they+are on a video hosting site, and the video is downloaded. This allows+importing eg, youtube playlists.+.IP .IP "\fBwatch\fP" Watches for changes to files in the current directory and its subdirectories, and takes care of automatically adding new files, as well as dealing with@@ -332,7 +336,7 @@ which may be a different repository than the one in which it was originally created with the initremote command. .IP-The name of the remote is the same name used when origianlly +The name of the remote is the same name used when originally creating that remote with "initremote". Run "git annex enableremote" with no parameters to get a list of special remote names. .IP@@ -1002,7 +1006,7 @@ content to avoid running out, and additional free space can be reserved via this option, to make space for more important content (such as git commit logs). Can be specified with any commonly used units, for example,-"0.5 gb" or "100 KiloBytes"+"0.5 gb", "500M", or "100 KiloBytes" .IP The default reserve is 1 megabyte. .IP@@ -1248,6 +1252,10 @@ It is set to "true" if this is a gcrypt remote. If the gcrypt remote is accessible over ssh and has git\-annex\-shell available to manage it, it's set to "shell"+.IP+.IP "\fBremote.<name>.hooktype\fP, \fBremote.<name>.externaltype\fP"+Used by hook special remotes and external special remotes to record+the type of the remote. .IP .SH CONFIGURATION VIA .gitattributes The key\-value backend used when adding a new file to the annex can be
git-annex.cabal view
@@ -1,5 +1,5 @@ Name: git-annex-Version: 5.20131221+Version: 5.20131230 Cabal-Version: >= 1.8 License: GPL-3 Maintainer: Joey Hess <joey@kitenet.net>
standalone/android/Makefile view
@@ -108,6 +108,7 @@ $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox/build-stamp: busybox_config cp busybox_config $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox/.config+ cd $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox && git reset --hard a758e3e1e04e7705f5d37b2f27be654cd0e7282c cd $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox && yes '' | $(MAKE) oldconfig cd $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox && $(MAKE) touch $@
standalone/android/buildchroot-inchroot view
@@ -12,6 +12,7 @@ echo "deb-src http://ftp.us.debian.org/debian stable main" >> /etc/apt/sources.list apt-get update apt-get -y install build-essential ghc git libncurses5-dev cabal-install+apt-get -y install happy alex apt-get -y install llvm-3.0 # not 3.1; buggy on arm. 3.2 is ok too apt-get -y install ca-certificates curl file m4 autoconf zlib1g-dev apt-get -y install libgnutls-dev libxml2-dev libgsasl7-dev pkg-config c2hs
− standalone/android/haskell-patches/async_fix-build-with-new-ghc.patch
@@ -1,25 +0,0 @@-From 0035f0366e426af213244b2eb25ffb63cb9e74d0 Mon Sep 17 00:00:00 2001-From: foo <foo@bar>-Date: Sun, 22 Sep 2013 06:14:50 +0000-Subject: [PATCH] fix build with new ghc------ async.cabal | 2 +-- 1 file changed, 1 insertion(+), 1 deletion(-)--diff --git a/async.cabal b/async.cabal-index 8e47d9d..98e6312 100644---- a/async.cabal-+++ b/async.cabal-@@ -70,7 +70,7 @@ source-repository head- - library- exposed-modules: Control.Concurrent.Async-- build-depends: base >= 4.3 && < 4.7, stm >= 2.2 && < 2.5-+ build-depends: base >= 4.3 && < 4.9, stm >= 2.2 && < 2.5- - test-suite test-async- type: exitcode-stdio-1.0--- -1.7.10.4-
standalone/android/haskell-patches/crypto-numbers_build-fix.patch view
@@ -1,29 +1,20 @@-From f6ed5c3093111ffe0276f5b5bb6241783611ab1c Mon Sep 17 00:00:00 2001-From: androidbuilder <androidbuilder@example.com>-Date: Mon, 11 Nov 2013 01:54:25 +0000+From 0cfdb30120976290068f4bcbebbf236b960afbb6 Mon Sep 17 00:00:00 2001+From: dummy <dummy@example.com>+Date: Thu, 26 Dec 2013 20:01:30 -0400 Subject: [PATCH] hack to build ---- Crypto/Number/Basic.hs | 17 -----------------+ Crypto/Number/Basic.hs | 14 -------------- Crypto/Number/ModArithmetic.hs | 29 ----------------------------- Crypto/Number/Prime.hs | 18 ------------------ crypto-numbers.cabal | 2 +-- 4 files changed, 1 insertion(+), 65 deletions(-)+ 4 files changed, 1 insertion(+), 62 deletions(-) diff --git a/Crypto/Number/Basic.hs b/Crypto/Number/Basic.hs-index af03052..5de8518 100644+index 65c14b3..eaee853 100644 --- a/Crypto/Number/Basic.hs +++ b/Crypto/Number/Basic.hs-@@ -1,8 +1,5 @@- {-# LANGUAGE BangPatterns #-}- {-# LANGUAGE CPP #-}--#if MIN_VERSION_integer_gmp(0,5,1)--{-# LANGUAGE UnboxedTuples #-}--#endif- -- |- -- Module : Crypto.Number.Basic- -- License : BSD-style-@@ -17,11 +14,7 @@ module Crypto.Number.Basic+@@ -20,11 +20,7 @@ module Crypto.Number.Basic , areEven ) where @@ -35,7 +26,7 @@ -- | sqrti returns two integer (l,b) so that l <= sqrt i <= b -- the implementation is quite naive, use an approximation for the first number-@@ -60,25 +53,16 @@ sqrti i+@@ -63,25 +59,16 @@ sqrti i -- gcde 'a' 'b' find (x,y,gcd(a,b)) where ax + by = d -- gcde :: Integer -> Integer -> (Integer, Integer, Integer)@@ -61,7 +52,7 @@ gcde_binary a' b' | b' == 0 = (1,0,a') | a' >= b' = compute a' b'-@@ -102,7 +86,6 @@ gcde_binary a' b'+@@ -105,7 +92,6 @@ gcde_binary a' b' in if u2 >= v2 then loop g x y (u2 - v2) v2 (a2 - c2) (b2 - d2) c2 d2 else loop g x y u2 (v2 - u2) a2 b2 (c2 - a2) (d2 - b2)@@ -70,10 +61,10 @@ -- | check if a list of integer are all even areEven :: [Integer] -> Bool diff --git a/Crypto/Number/ModArithmetic.hs b/Crypto/Number/ModArithmetic.hs-index 031f477..38b22b7 100644+index 942c12f..f8cfc32 100644 --- a/Crypto/Number/ModArithmetic.hs +++ b/Crypto/Number/ModArithmetic.hs-@@ -26,12 +26,8 @@ module Crypto.Number.ModArithmetic+@@ -29,12 +29,8 @@ module Crypto.Number.ModArithmetic import Control.Exception (throw, Exception) import Data.Typeable @@ -86,7 +77,7 @@ -- | Raised when two numbers are supposed to be coprimes but are not. data CoprimesAssertionError = CoprimesAssertionError-@@ -52,13 +48,7 @@ expSafe :: Integer -- ^ base+@@ -55,13 +51,7 @@ expSafe :: Integer -- ^ base -> Integer -- ^ exponant -> Integer -- ^ modulo -> Integer -- ^ result@@ -100,7 +91,7 @@ -- | Compute the modular exponentiation of base^exponant using -- the fastest algorithm without any consideration for-@@ -71,11 +61,7 @@ expFast :: Integer -- ^ base+@@ -74,11 +64,7 @@ expFast :: Integer -- ^ base -> Integer -- ^ modulo -> Integer -- ^ result expFast =@@ -112,7 +103,7 @@ -- note on exponentiation: 0^0 is treated as 1 for mimicking the standard library; -- the mathematic debate is still open on whether or not this is true, but pratically-@@ -84,22 +70,15 @@ expFast =+@@ -87,22 +73,15 @@ expFast = -- | exponentiation_rtl_binary computes modular exponentiation as b^e mod m -- using the right-to-left binary exponentiation algorithm (HAC 14.79) exponentiation_rtl_binary :: Integer -> Integer -> Integer -> Integer@@ -135,7 +126,7 @@ exponentiation b e m | b == 1 = b | e == 0 = 1-@@ -107,7 +86,6 @@ exponentiation b e m+@@ -110,7 +89,6 @@ exponentiation b e m | even e = let p = (exponentiation b (e `div` 2) m) `mod` m in (p^(2::Integer)) `mod` m | otherwise = (b * exponentiation b (e-1) m) `mod` m@@ -143,7 +134,7 @@ --{-# DEPRECATED exponantiation_rtl_binary "typo in API name it's called exponentiation_rtl_binary #-} exponantiation_rtl_binary :: Integer -> Integer -> Integer -> Integer-@@ -119,17 +97,10 @@ exponantiation = exponentiation+@@ -122,17 +100,10 @@ exponantiation = exponentiation -- | inverse computes the modular inverse as in g^(-1) mod m inverse :: Integer -> Integer -> Maybe Integer@@ -162,19 +153,20 @@ -- | Compute the modular inverse of 2 coprime numbers. -- This is equivalent to inverse except that the result diff --git a/Crypto/Number/Prime.hs b/Crypto/Number/Prime.hs-index 2060f4d..61d37c0 100644+index 0cea9da..458c94d 100644 --- a/Crypto/Number/Prime.hs +++ b/Crypto/Number/Prime.hs-@@ -1,8 +1,6 @@- {-# LANGUAGE CPP #-}- {-# LANGUAGE BangPatterns #-}+@@ -3,9 +3,7 @@+ #ifndef MIN_VERSION_integer_gmp+ #define MIN_VERSION_integer_gmp(a,b,c) 0+ #endif -#if MIN_VERSION_integer_gmp(0,5,1) {-# LANGUAGE MagicHash #-} -#endif -- | -- Module : Crypto.Number.Prime -- License : BSD-style-@@ -27,12 +25,7 @@ import Crypto.Number.Generate+@@ -30,12 +28,7 @@ import Crypto.Number.Generate import Crypto.Number.Basic (sqrti, gcde_binary) import Crypto.Number.ModArithmetic (exponantiation) @@ -187,7 +179,7 @@ -- | returns if the number is probably prime. -- first a list of small primes are implicitely tested for divisibility,-@@ -75,21 +68,11 @@ findPrimeFromWith rng prop !n+@@ -78,21 +71,11 @@ findPrimeFromWith rng prop !n -- | find a prime from a starting point with no specific property. findPrimeFrom :: CPRG g => g -> Integer -> (Integer, g) findPrimeFrom rng n =@@ -209,7 +201,7 @@ primalityTestMillerRabin rng tries !n | n <= 3 = error "Miller-Rabin requires tested value to be > 3" | even n = (False, rng)-@@ -126,7 +109,6 @@ primalityTestMillerRabin rng tries !n+@@ -129,7 +112,6 @@ primalityTestMillerRabin rng tries !n | x2 == 1 = False | x2 /= nm1 = loop' ws ((x2*x2) `mod` n) (r+1) | otherwise = loop ws@@ -218,7 +210,7 @@ {- n < z -> witness to test diff --git a/crypto-numbers.cabal b/crypto-numbers.cabal-index 05c00c1..8da5e2a 100644+index 9610e34..6669d78 100644 --- a/crypto-numbers.cabal +++ b/crypto-numbers.cabal @@ -15,7 +15,7 @@ Extra-Source-Files: Tests/*.hs
− standalone/android/haskell-patches/process_fix-build-with-new-ghc.patch
@@ -1,24 +0,0 @@-From 0b0d4250cfce44b1a03b50458b4122370ab349ce Mon Sep 17 00:00:00 2001-From: foo <foo@bar>-Date: Sat, 21 Sep 2013 21:50:51 +0000-Subject: [PATCH] fix build with new ghc------ System/Process/Internals.hs | 1 +- 1 file changed, 1 insertion(+)--diff --git a/System/Process/Internals.hs b/System/Process/Internals.hs-index a73c6fc..6676a72 100644---- a/System/Process/Internals.hs-+++ b/System/Process/Internals.hs-@@ -61,6 +61,7 @@ import Control.Concurrent- import Control.Exception- import Foreign.C- import Foreign-+import System.IO.Unsafe- - # ifdef __GLASGOW_HASKELL__- --- -1.7.10.4-
standalone/android/install-haskell-packages view
@@ -66,14 +66,11 @@ patched unix-time patched lifted-base patched zlib- patched process patched MissingH patched bloomfilter patched SafeSemaphore patched distributive patched comonad- patched HTTP- patched MonadCatchIO-transformers patched iproute patched primitive patched socks@@ -88,6 +85,7 @@ patched wai-app-static patched shakespeare patched shakespeare-css+ patched shakespeare-js patched yesod-routes patched yesod-core patched yesod-persistent@@ -95,12 +93,14 @@ patched crypto-numbers patched yesod-auth patched yesod- patched async+ patched shakespeare-text+ patched process-conduit patched gnuidn patched DAV- patched language-javascript+ patched yesod-static patched uuid patched dns+ patched gnutls cd ..
− standalone/linux/README
@@ -1,20 +0,0 @@-You can put this directory into your PATH, or symlink the programs in this-directory to anyplace already in your PATH, and use git-annex the same-as if you'd installed it using a package manager.--Or, you can use the runshell script in this directory to start a shell-that is configured to use git-annex and the other utilities included in-this bundle, including git, gpg, rsync, ssh, etc.--This should work on any Linux system of the appropriate architecture.-More or less.---How it works: This directory tree contains a lot of libraries and programs-that git-annex needs. But it's not a chroot. Instead, runshell sets a lot-of environment variables to cause files from here to be used, and a shim-around the binaries arranges for them to be run with the libraries in here.--It shouldn't even be dependent on the host system's glibc libraries.-All that's needed is a kernel that supports the glibc included in this-bundle.
− standalone/linux/git-annex
@@ -1,31 +0,0 @@-#!/bin/sh-link="$(readlink "$0")" || true-if [ -n "$link" ]; then- base="$(dirname "$link")"-else- base="$(dirname "$0")"-fi--if [ ! -d "$base" ]; then- echo "** cannot find base directory (I seem to be $0)" >&2- exit 1-fi-if [ ! -e "$base/runshell" ]; then- echo "** cannot find $base/runshell" >&2- exit 1-fi--# Get absolute path to base, to avoid breakage when things change directories.-orig="$(pwd)"-cd "$base"-base="$(pwd)"-cd "$orig"--# If this is a standalone app, set a variable that git-annex can use to-# install itself.-if [ -e "$base/bin/git-annex" ]; then- GIT_ANNEX_APP_BASE="$base"- export GIT_ANNEX_APP_BASE-fi--exec "$base/runshell" git-annex "$@"
− standalone/linux/git-annex-shell
@@ -1,31 +0,0 @@-#!/bin/sh-link="$(readlink "$0")" || true-if [ -n "$link" ]; then- base="$(dirname "$link")"-else- base="$(dirname "$0")"-fi--if [ ! -d "$base" ]; then- echo "** cannot find base directory (I seem to be $0)" >&2- exit 1-fi-if [ ! -e "$base/runshell" ]; then- echo "** cannot find $base/runshell" >&2- exit 1-fi--# Get absolute path to base, to avoid breakage when things change directories.-orig="$(pwd)"-cd "$base"-base="$(pwd)"-cd "$orig"--# If this is a standalone app, set a variable that git-annex can use to-# install itself.-if [ -e "$base/bin/git-annex" ]; then- GIT_ANNEX_APP_BASE="$base"- export GIT_ANNEX_APP_BASE-fi--exec "$base/runshell" git-annex-shell "$@"
− standalone/linux/git-annex-webapp
@@ -1,31 +0,0 @@-#!/bin/sh-link="$(readlink "$0")" || true-if [ -n "$link" ]; then- base="$(dirname "$link")"-else- base="$(dirname "$0")"-fi--if [ ! -d "$base" ]; then- echo "** cannot find base directory (I seem to be $0)" >&2- exit 1-fi-if [ ! -e "$base/runshell" ]; then- echo "** cannot find $base/runshell" >&2- exit 1-fi--# Get absolute path to base, to avoid breakage when things change directories.-orig="$(pwd)"-cd "$base"-base="$(pwd)"-cd "$orig"--# If this is a standalone app, set a variable that git-annex can use to-# install itself.-if [ -e "$base/bin/git-annex" ]; then- GIT_ANNEX_APP_BASE="$base"- export GIT_ANNEX_APP_BASE-fi--exec "$base/runshell" git-annex webapp "$@"
− standalone/linux/runshell
@@ -1,90 +0,0 @@-#!/bin/sh-# Runs a shell command (or interactive shell) using the binaries and-# libraries bundled with this app.--set -e--base="$(dirname "$0")"--if [ ! -d "$base" ]; then- echo "** cannot find base directory (I seem to be $0)" >&2- exit 1-fi--if [ ! -e "$base/bin/git-annex" ]; then- echo "** base directory $base does not contain bin/git-annex" >&2- exit 1-fi-if [ ! -e "$base/bin/git" ]; then- echo "** base directory $base does not contain bin/git" >&2- exit 1-fi--# Get absolute path to base, to avoid breakage when things change directories.-orig="$(pwd)"-cd "$base"-base="$(pwd)"-cd "$orig"--# Install shim that's used to run git-annex-shell from ssh authorized_keys.-# The assistant also does this when run, but the user may not be using the-# assistant.-if [ ! -e "$HOME/.ssh/git-annex-shell" ]; then- mkdir "$HOME/.ssh" >/dev/null 2>&1 || true- (- echo "#!/bin/sh"- echo "set -e"- echo "exec $base/runshell git-annex-shell -c \"\$SSH_ORIGINAL_COMMAND\""- ) > "$HOME/.ssh/git-annex-shell"- chmod +x "$HOME/.ssh/git-annex-shell"-fi--# Put our binaries first, to avoid issues with out of date or incompatable-# system binaries.-ORIG_PATH="$PATH"-export ORIG_PATH-PATH=$base/bin:$PATH-export PATH--# This is used by the shim wrapper around each binary.-for lib in $(cat $base/libdirs); do- GIT_ANNEX_LD_LIBRARY_PATH="$base/$lib:$GIT_ANNEX_LD_LIBRARY_PATH"-done-export GIT_ANNEX_LD_LIBRARY_PATH-GIT_ANNEX_LINKER="$base/$(cat $base/linker)"-export GIT_ANNEX_LINKER-GIT_ANNEX_SHIMMED="$base/shimmed"-export GIT_ANNEX_SHIMMED--ORIG_GCONV_PATH="$GCONV_PATH"-export ORIG_GCONV_PATH-GCONV_PATH=$base/$(cat $base/gconvdir)-export GCONV_PATH--ORIG_GIT_EXEC_PATH="$GIT_EXEC_PATH"-export ORIG_GIT_EXEC_PATH-GIT_EXEC_PATH=$base/git-core-export GIT_EXEC_PATH--ORIG_GIT_TEMPLATE_DIR="$GIT_TEMPLATE_DIR"-export ORIG_GIT_TEMPLATE_DIR-GIT_TEMPLATE_DIR="$base/templates"-export GIT_TEMPLATE_DIR--ORIG_MANPATH="$MANPATH"-export ORIG_MANPATH-MANPATH="$base/usr/share/man:$MANPATH"-export MANPATH--# Indicate which variables were exported above and should be cleaned-# when running non-bundled programs.-GIT_ANNEX_STANDLONE_ENV="PATH GCONV_PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR MANPATH"-export GIT_ANNEX_STANDLONE_ENV--if [ "$1" ]; then- cmd="$1"- shift 1- exec "$cmd" "$@"-else- sh-fi
+ standalone/linux/skel/README view
@@ -0,0 +1,20 @@+You can put this directory into your PATH, or symlink the programs in this+directory to anyplace already in your PATH, and use git-annex the same+as if you'd installed it using a package manager.++Or, you can use the runshell script in this directory to start a shell+that is configured to use git-annex and the other utilities included in+this bundle, including git, gpg, rsync, ssh, etc.++This should work on any Linux system of the appropriate architecture.+More or less.+++How it works: This directory tree contains a lot of libraries and programs+that git-annex needs. But it's not a chroot. Instead, runshell sets a lot+of environment variables to cause files from here to be used, and a shim+around the binaries arranges for them to be run with the libraries in here.++It shouldn't even be dependent on the host system's glibc libraries.+All that's needed is a kernel that supports the glibc included in this+bundle.
+ standalone/linux/skel/git view
@@ -0,0 +1,31 @@+#!/bin/sh+link="$(readlink "$0")" || true+if [ -n "$link" ]; then+ base="$(dirname "$link")"+else+ base="$(dirname "$0")"+fi++if [ ! -d "$base" ]; then+ echo "** cannot find base directory (I seem to be $0)" >&2+ exit 1+fi+if [ ! -e "$base/runshell" ]; then+ echo "** cannot find $base/runshell" >&2+ exit 1+fi++# Get absolute path to base, to avoid breakage when things change directories.+orig="$(pwd)"+cd "$base"+base="$(pwd)"+cd "$orig"++# If this is a standalone app, set a variable that git-annex can use to+# install itself.+if [ -e "$base/bin/git-annex" ]; then+ GIT_ANNEX_APP_BASE="$base"+ export GIT_ANNEX_APP_BASE+fi++exec "$base/runshell" git "$@"
+ standalone/linux/skel/git-annex view
@@ -0,0 +1,31 @@+#!/bin/sh+link="$(readlink "$0")" || true+if [ -n "$link" ]; then+ base="$(dirname "$link")"+else+ base="$(dirname "$0")"+fi++if [ ! -d "$base" ]; then+ echo "** cannot find base directory (I seem to be $0)" >&2+ exit 1+fi+if [ ! -e "$base/runshell" ]; then+ echo "** cannot find $base/runshell" >&2+ exit 1+fi++# Get absolute path to base, to avoid breakage when things change directories.+orig="$(pwd)"+cd "$base"+base="$(pwd)"+cd "$orig"++# If this is a standalone app, set a variable that git-annex can use to+# install itself.+if [ -e "$base/bin/git-annex" ]; then+ GIT_ANNEX_APP_BASE="$base"+ export GIT_ANNEX_APP_BASE+fi++exec "$base/runshell" git-annex "$@"
+ standalone/linux/skel/git-annex-shell view
@@ -0,0 +1,31 @@+#!/bin/sh+link="$(readlink "$0")" || true+if [ -n "$link" ]; then+ base="$(dirname "$link")"+else+ base="$(dirname "$0")"+fi++if [ ! -d "$base" ]; then+ echo "** cannot find base directory (I seem to be $0)" >&2+ exit 1+fi+if [ ! -e "$base/runshell" ]; then+ echo "** cannot find $base/runshell" >&2+ exit 1+fi++# Get absolute path to base, to avoid breakage when things change directories.+orig="$(pwd)"+cd "$base"+base="$(pwd)"+cd "$orig"++# If this is a standalone app, set a variable that git-annex can use to+# install itself.+if [ -e "$base/bin/git-annex" ]; then+ GIT_ANNEX_APP_BASE="$base"+ export GIT_ANNEX_APP_BASE+fi++exec "$base/runshell" git-annex-shell "$@"
+ standalone/linux/skel/git-annex-webapp view
@@ -0,0 +1,31 @@+#!/bin/sh+link="$(readlink "$0")" || true+if [ -n "$link" ]; then+ base="$(dirname "$link")"+else+ base="$(dirname "$0")"+fi++if [ ! -d "$base" ]; then+ echo "** cannot find base directory (I seem to be $0)" >&2+ exit 1+fi+if [ ! -e "$base/runshell" ]; then+ echo "** cannot find $base/runshell" >&2+ exit 1+fi++# Get absolute path to base, to avoid breakage when things change directories.+orig="$(pwd)"+cd "$base"+base="$(pwd)"+cd "$orig"++# If this is a standalone app, set a variable that git-annex can use to+# install itself.+if [ -e "$base/bin/git-annex" ]; then+ GIT_ANNEX_APP_BASE="$base"+ export GIT_ANNEX_APP_BASE+fi++exec "$base/runshell" git-annex webapp "$@"
+ standalone/linux/skel/git-receive-pack view
@@ -0,0 +1,31 @@+#!/bin/sh+link="$(readlink "$0")" || true+if [ -n "$link" ]; then+ base="$(dirname "$link")"+else+ base="$(dirname "$0")"+fi++if [ ! -d "$base" ]; then+ echo "** cannot find base directory (I seem to be $0)" >&2+ exit 1+fi+if [ ! -e "$base/runshell" ]; then+ echo "** cannot find $base/runshell" >&2+ exit 1+fi++# Get absolute path to base, to avoid breakage when things change directories.+orig="$(pwd)"+cd "$base"+base="$(pwd)"+cd "$orig"++# If this is a standalone app, set a variable that git-annex can use to+# install itself.+if [ -e "$base/bin/git-annex" ]; then+ GIT_ANNEX_APP_BASE="$base"+ export GIT_ANNEX_APP_BASE+fi++exec "$base/runshell" git-receive-pack "$@"
+ standalone/linux/skel/git-shell view
@@ -0,0 +1,31 @@+#!/bin/sh+link="$(readlink "$0")" || true+if [ -n "$link" ]; then+ base="$(dirname "$link")"+else+ base="$(dirname "$0")"+fi++if [ ! -d "$base" ]; then+ echo "** cannot find base directory (I seem to be $0)" >&2+ exit 1+fi+if [ ! -e "$base/runshell" ]; then+ echo "** cannot find $base/runshell" >&2+ exit 1+fi++# Get absolute path to base, to avoid breakage when things change directories.+orig="$(pwd)"+cd "$base"+base="$(pwd)"+cd "$orig"++# If this is a standalone app, set a variable that git-annex can use to+# install itself.+if [ -e "$base/bin/git-annex" ]; then+ GIT_ANNEX_APP_BASE="$base"+ export GIT_ANNEX_APP_BASE+fi++exec "$base/runshell" git-shell "$@"
+ standalone/linux/skel/git-upload-pack view
@@ -0,0 +1,31 @@+#!/bin/sh+link="$(readlink "$0")" || true+if [ -n "$link" ]; then+ base="$(dirname "$link")"+else+ base="$(dirname "$0")"+fi++if [ ! -d "$base" ]; then+ echo "** cannot find base directory (I seem to be $0)" >&2+ exit 1+fi+if [ ! -e "$base/runshell" ]; then+ echo "** cannot find $base/runshell" >&2+ exit 1+fi++# Get absolute path to base, to avoid breakage when things change directories.+orig="$(pwd)"+cd "$base"+base="$(pwd)"+cd "$orig"++# If this is a standalone app, set a variable that git-annex can use to+# install itself.+if [ -e "$base/bin/git-annex" ]; then+ GIT_ANNEX_APP_BASE="$base"+ export GIT_ANNEX_APP_BASE+fi++exec "$base/runshell" git-upload-pack "$@"
+ standalone/linux/skel/runshell view
@@ -0,0 +1,90 @@+#!/bin/sh+# Runs a shell command (or interactive shell) using the binaries and+# libraries bundled with this app.++set -e++base="$(dirname "$0")"++if [ ! -d "$base" ]; then+ echo "** cannot find base directory (I seem to be $0)" >&2+ exit 1+fi++if [ ! -e "$base/bin/git-annex" ]; then+ echo "** base directory $base does not contain bin/git-annex" >&2+ exit 1+fi+if [ ! -e "$base/bin/git" ]; then+ echo "** base directory $base does not contain bin/git" >&2+ exit 1+fi++# Get absolute path to base, to avoid breakage when things change directories.+orig="$(pwd)"+cd "$base"+base="$(pwd)"+cd "$orig"++# Install shim that's used to run git-annex-shell from ssh authorized_keys.+# The assistant also does this when run, but the user may not be using the+# assistant.+if [ ! -e "$HOME/.ssh/git-annex-shell" ]; then+ mkdir "$HOME/.ssh" >/dev/null 2>&1 || true+ (+ echo "#!/bin/sh"+ echo "set -e"+ echo "exec $base/runshell git-annex-shell -c \"\$SSH_ORIGINAL_COMMAND\""+ ) > "$HOME/.ssh/git-annex-shell"+ chmod +x "$HOME/.ssh/git-annex-shell"+fi++# Put our binaries first, to avoid issues with out of date or incompatable+# system binaries.+ORIG_PATH="$PATH"+export ORIG_PATH+PATH=$base/bin:$PATH+export PATH++# This is used by the shim wrapper around each binary.+for lib in $(cat $base/libdirs); do+ GIT_ANNEX_LD_LIBRARY_PATH="$base/$lib:$GIT_ANNEX_LD_LIBRARY_PATH"+done+export GIT_ANNEX_LD_LIBRARY_PATH+GIT_ANNEX_LINKER="$base/$(cat $base/linker)"+export GIT_ANNEX_LINKER+GIT_ANNEX_SHIMMED="$base/shimmed"+export GIT_ANNEX_SHIMMED++ORIG_GCONV_PATH="$GCONV_PATH"+export ORIG_GCONV_PATH+GCONV_PATH=$base/$(cat $base/gconvdir)+export GCONV_PATH++ORIG_GIT_EXEC_PATH="$GIT_EXEC_PATH"+export ORIG_GIT_EXEC_PATH+GIT_EXEC_PATH=$base/git-core+export GIT_EXEC_PATH++ORIG_GIT_TEMPLATE_DIR="$GIT_TEMPLATE_DIR"+export ORIG_GIT_TEMPLATE_DIR+GIT_TEMPLATE_DIR="$base/templates"+export GIT_TEMPLATE_DIR++ORIG_MANPATH="$MANPATH"+export ORIG_MANPATH+MANPATH="$base/usr/share/man:$MANPATH"+export MANPATH++# Indicate which variables were exported above and should be cleaned+# when running non-bundled programs.+GIT_ANNEX_STANDLONE_ENV="PATH GCONV_PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR MANPATH"+export GIT_ANNEX_STANDLONE_ENV++if [ "$1" ]; then+ cmd="$1"+ shift 1+ exec "$cmd" "$@"+else+ sh+fi
standalone/no-th/haskell-patches/persistent-template_stub-out.patch view
@@ -1,6 +1,6 @@-From 0b9df0de3aa45918a2a9226a2da6be4680276419 Mon Sep 17 00:00:00 2001-From: foo <foo@bar>-Date: Sun, 22 Sep 2013 03:31:55 +0000+From 4b958f97bffdeedc0c946d5fdc9749d2cc566fcc Mon Sep 17 00:00:00 2001+From: dummy <dummy@example.com>+Date: Thu, 26 Dec 2013 15:54:37 -0400 Subject: [PATCH] stub out ---@@ -8,15 +8,15 @@ 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistent-template.cabal b/persistent-template.cabal-index 8216ce7..f23234b 100644+index c4aee68..7905278 100644 --- a/persistent-template.cabal +++ b/persistent-template.cabal-@@ -23,7 +23,7 @@ library- , containers+@@ -24,7 +24,7 @@ library , aeson , monad-logger+ , unordered-containers - exposed-modules: Database.Persist.TH-+ exposed-modules: ++ exposed-modules: ghc-options: -Wall if impl(ghc >= 7.4) cpp-options: -DGHC_7_4
standalone/no-th/haskell-patches/yesod-routes_remove-TH.patch view
@@ -1,17 +1,17 @@-From acebcf203b270d00aac0a29be48832ae2c64ce7e Mon Sep 17 00:00:00 2001-From: Joey Hess <joey@kitenet.net>-Date: Tue, 17 Dec 2013 06:57:07 +0000+From 8ba08c0efc035486a65f2fd33916a5da7e5210e7 Mon Sep 17 00:00:00 2001+From: dummy <dummy@example.com>+Date: Thu, 26 Dec 2013 19:32:55 -0400 Subject: [PATCH] remove TH ---- Yesod/Routes/Parse.hs | 39 +++++----------------------------------- Yesod/Routes/TH.hs | 16 ++++++++--------- Yesod/Routes/TH/Types.hs | 16 ----------------- yesod-routes.cabal | 4 ----- 4 files changed, 13 insertions(+), 62 deletions(-)+ Yesod/Routes/Parse.hs | 40 +++++-----------------------------------+ Yesod/Routes/TH.hs | 16 ++++++++--------+ Yesod/Routes/TH/Types.hs | 16 ----------------+ yesod-routes.cabal | 4 ----+ 4 files changed, 13 insertions(+), 63 deletions(-) diff --git a/Yesod/Routes/Parse.hs b/Yesod/Routes/Parse.hs-index 3d27980..c2e3e6d 100644+index 232982d..7df7750 100644 --- a/Yesod/Routes/Parse.hs +++ b/Yesod/Routes/Parse.hs @@ -2,11 +2,11 @@@@ -31,7 +31,7 @@ , parseTypeTree , TypeTree (..) ) where-@@ -19,41 +19,12 @@ import Yesod.Routes.TH+@@ -19,42 +19,12 @@ import Yesod.Routes.TH import Yesod.Routes.Overlap (findOverlapNames) import Data.List (foldl') @@ -45,7 +45,7 @@ - let res = resourcesFromString s - case findOverlapNames res of - [] -> lift res-- z -> error $ "Overlapping routes: " ++ unlines (map show z)+- z -> error $ unlines $ "Overlapping routes: " : map show z - -parseRoutesFile :: FilePath -> Q Exp -parseRoutesFile = parseRoutesFileWith parseRoutes@@ -70,9 +70,10 @@ -parseRoutesNoCheck = QuasiQuoter - { quoteExp = lift . resourcesFromString - }- +- -- | Convert a multi-line string to a set of resources. See documentation for -- the format of this string. This is a partial function which calls 'error' on+ -- invalid input. diff --git a/Yesod/Routes/TH.hs b/Yesod/Routes/TH.hs index 7b2e50b..b05fc57 100644 --- a/Yesod/Routes/TH.hs@@ -150,20 +151,20 @@ resourceMulti Resource { resourceDispatch = Methods (Just t) _ } = Just t resourceMulti _ = Nothing diff --git a/yesod-routes.cabal b/yesod-routes.cabal-index 0e44409..e01ea06 100644+index 61980d1..33d2380 100644 --- a/yesod-routes.cabal +++ b/yesod-routes.cabal-@@ -28,10 +28,6 @@ library+@@ -27,10 +27,6 @@ library+ Yesod.Routes.Class Yesod.Routes.Parse Yesod.Routes.Overlap- Yesod.Routes.TH.Types - other-modules: Yesod.Routes.TH.Dispatch - Yesod.Routes.TH.RenderRoute - Yesod.Routes.TH.ParseRoute - Yesod.Routes.TH.RouteAttrs+ Yesod.Routes.TH.Types ghc-options: -Wall - test-suite runtests -- -1.8.5.1+1.7.10.4
+ standalone/no-th/haskell-patches/yesod-static_hack.patch view
@@ -0,0 +1,70 @@+From 4ea1e94794b59ba4eb0dab7384c4195a224f468d Mon Sep 17 00:00:00 2001+From: androidbuilder <androidbuilder@example.com>+Date: Fri, 27 Dec 2013 00:28:51 -0400+Subject: [PATCH] avoid building with jsmin++jsmin needs language-javascript, which fails to build for android due to+a problem or incompatability with happy.++This also avoids all the TH code.++---+ Yesod/EmbeddedStatic/Generators.hs | 3 +--+ yesod-static.cabal | 7 -------+ 2 files changed, 1 insertion(+), 9 deletions(-)++diff --git a/Yesod/EmbeddedStatic/Generators.hs b/Yesod/EmbeddedStatic/Generators.hs+index e83785d..6b1c10e 100644+--- a/Yesod/EmbeddedStatic/Generators.hs++++ b/Yesod/EmbeddedStatic/Generators.hs+@@ -43,7 +43,6 @@ import Language.Haskell.TH+ import Network.Mime (defaultMimeLookup)+ import System.Directory (doesDirectoryExist, getDirectoryContents, findExecutable)+ import System.FilePath ((</>))+-import Text.Jasmine (minifym)+ import qualified Data.ByteString.Lazy as BL+ import qualified Data.Conduit.List as C+ import qualified Data.Text as T+@@ -158,7 +157,7 @@ concatFilesWith loc process files = do+ + -- | Convienient rexport of 'minifym' with a type signature to work with 'concatFilesWith'.+ jasmine :: BL.ByteString -> IO BL.ByteString+-jasmine ct = return $ either (const ct) id $ minifym ct++jasmine ct = return ct+ + -- | Use <https://github.com/mishoo/UglifyJS2 UglifyJS2> to compress javascript.+ -- Assumes @uglifyjs@ is located in the path and uses options @[\"-m\", \"-c\"]@+diff --git a/yesod-static.cabal b/yesod-static.cabal+index df05ecf..31abe1a 100644+--- a/yesod-static.cabal++++ b/yesod-static.cabal+@@ -48,18 +48,12 @@ library+ , data-default+ , shakespeare-css >= 1.0.3+ , mime-types >= 0.1+- , hjsmin+ , process-conduit >= 1.0 && < 1.1+ , filepath >= 1.3+ , resourcet >= 0.4+ , unordered-containers >= 0.2+ + exposed-modules: Yesod.Static+- Yesod.EmbeddedStatic+- Yesod.EmbeddedStatic.Generators+- Yesod.EmbeddedStatic.Types+-+- other-modules: Yesod.EmbeddedStatic.Internal+ + ghc-options: -Wall+ extensions: TemplateHaskell+@@ -99,7 +93,6 @@ test-suite tests+ , data-default+ , shakespeare-css+ , mime-types+- , hjsmin+ , process-conduit+ , filepath+ , resourcet+-- +1.7.10.4+
− standalone/no-th/haskell-patches/yesod-static_remove-TH.patch
@@ -1,597 +0,0 @@-From ad0166a6e537021c9f5a1e01cde4b7c520edcf3a Mon Sep 17 00:00:00 2001-From: Joey Hess <joey@kitenet.net>-Date: Wed, 18 Dec 2013 05:10:59 +0000-Subject: [PATCH] remove TH------ Yesod/EmbeddedStatic.hs | 64 ------------ Yesod/EmbeddedStatic/Generators.hs | 102 +----------------- Yesod/EmbeddedStatic/Internal.hs | 41 -------- Yesod/EmbeddedStatic/Types.hs | 14 ---- Yesod/Static.hs | 224 +------------------------------------- 5 files changed, 12 insertions(+), 433 deletions(-)--diff --git a/Yesod/EmbeddedStatic.hs b/Yesod/EmbeddedStatic.hs-index e819630..a564d4b 100644---- a/Yesod/EmbeddedStatic.hs-+++ b/Yesod/EmbeddedStatic.hs-@@ -41,7 +41,6 @@ module Yesod.EmbeddedStatic (- -- * Subsite- EmbeddedStatic- , embeddedResourceR-- , mkEmbeddedStatic- , embedStaticContent- - -- * Generators-@@ -91,69 +90,6 @@ instance Yesod master => YesodSubDispatch EmbeddedStatic (HandlerT master IO) wh- ("widget":_) -> staticApp (widgetSettings site) req- _ -> return $ responseLBS status404 [] "Not Found"- ---- | Create the haskell variable for the link to the entry--mkRoute :: ComputedEntry -> Q [Dec]--mkRoute (ComputedEntry { cHaskellName = Nothing }) = return []--mkRoute (c@ComputedEntry { cHaskellName = Just name }) = do-- routeType <- [t| Route EmbeddedStatic |]-- link <- [| $(cLink c) |]-- return [ SigD name routeType-- , ValD (VarP name) (NormalB link) []-- ]------ | Creates an 'EmbeddedStatic' by running, at compile time, a list of generators. ---- Each generator produces a list of entries to embed into the executable.-------- This template haskell splice creates a variable binding holding the resulting---- 'EmbeddedStatic' and in addition creates variable bindings for all the routes---- produced by the generators. For example, if a directory called static has---- the following contents:-------- * js/jquery.js-------- * css/bootstrap.css-------- * img/logo.png-------- then a call to-------- > #ifdef DEVELOPMENT---- > #define DEV_BOOL True---- > #else---- > #define DEV_BOOL False---- > #endif---- > mkEmbeddedStatic DEV_BOOL "myStatic" [embedDir "static"]-------- will produce variables-------- > myStatic :: EmbeddedStatic---- > js_jquery_js :: Route EmbeddedStatic---- > css_bootstrap_css :: Route EmbeddedStatic---- > img_logo_png :: Route EmbeddedStatic--mkEmbeddedStatic :: Bool -- ^ development?-- -> String -- ^ variable name for the created 'EmbeddedStatic'-- -> [Generator] -- ^ the generators (see "Yesod.EmbeddedStatic.Generators")-- -> Q [Dec]--mkEmbeddedStatic dev esName gen = do-- entries <- concat <$> sequence gen-- computed <- runIO $ mapM (if dev then devEmbed else prodEmbed) entries---- let settings = Static.mkSettings $ return $ map cStEntry computed-- devExtra = listE $ catMaybes $ map ebDevelExtraFiles entries-- ioRef = [| unsafePerformIO $ newIORef M.empty |]---- -- build the embedded static-- esType <- [t| EmbeddedStatic |]-- esCreate <- if dev-- then [| EmbeddedStatic (develApp $settings $devExtra) $ioRef |]-- else [| EmbeddedStatic (staticApp $! $settings) $ioRef |]-- let es = [ SigD (mkName esName) esType-- , ValD (VarP $ mkName esName) (NormalB esCreate) []-- ]---- routes <- mapM mkRoute computed---- return $ es ++ concat routes- - -- | Use this for 'addStaticContent' to have the widget static content be served by- -- the embedded static subsite. For example,-diff --git a/Yesod/EmbeddedStatic/Generators.hs b/Yesod/EmbeddedStatic/Generators.hs-index e83785d..bc35359 100644---- a/Yesod/EmbeddedStatic/Generators.hs-+++ b/Yesod/EmbeddedStatic/Generators.hs-@@ -6,12 +6,12 @@- module Yesod.EmbeddedStatic.Generators (- -- * Generators- Location-- , embedFile-- , embedFileAt-- , embedDir-- , embedDirAt-- , concatFiles-- , concatFilesWith-+ --, embedFile-+ --, embedFileAt-+ --, embedDir-+ --, embedDirAt-+ --, concatFiles-+ --, concatFilesWith- - -- * Compression options for 'concatFilesWith'- , jasmine-@@ -50,28 +50,6 @@ import qualified Data.Text as T- - import Yesod.EmbeddedStatic.Types- ---- | Embed a single file. Equivalent to passing the same string twice to 'embedFileAt'.--embedFile :: FilePath -> Generator--embedFile f = embedFileAt f f------ | Embed a single file at a given location within the static subsite and generate a---- route variable based on the location via 'pathToName'. The @FilePath@ must be a relative---- path to the directory in which you run @cabal build@. During development, the file located---- at this filepath will be reloaded on every request. When compiling for production, the contents---- of the file will be embedded into the executable and so the file does not need to be---- distributed along with the executable.--embedFileAt :: Location -> FilePath -> Generator--embedFileAt loc f = do-- let mime = defaultMimeLookup $ T.pack f-- let entry = def {-- ebHaskellName = Just $ pathToName loc-- , ebLocation = loc-- , ebMimeType = mime-- , ebProductionContent = BL.readFile f-- , ebDevelReload = [| BL.readFile $(litE $ stringL f) |]-- }-- return [entry]--- -- | List all files recursively in a directory- getRecursiveContents :: Location -- ^ The directory to search- -> FilePath -- ^ The prefix to add to the filenames-@@ -88,74 +66,6 @@ getRecursiveContents prefix topdir = do- else return [(loc, path)]- return (concat paths)- ---- | Embed all files in a directory into the static subsite.---- ---- Equivalent to passing the empty string as the location to 'embedDirAt',---- so the directory path itself is not part of the resource locations (and so---- also not part of the generated route variable names).--embedDir :: FilePath -> Generator--embedDir = embedDirAt ""------ | Embed all files in a directory to a given location within the static subsite.-------- The directory tree rooted at the 'FilePath' (which must be relative to the directory in---- which you run @cabal build@) is embedded into the static subsite at the given---- location. Also, route variables will be created based on the final location---- of each file. For example, if a directory \"static\" contains the files-------- * css/bootstrap.css-------- * js/jquery.js-------- * js/bootstrap.js---- ---- then @embedDirAt \"somefolder\" \"static\"@ will-------- * Make the file @static\/css\/bootstrap.css@ available at the location---- @somefolder\/css\/bootstrap.css@ within the static subsite and similarly---- for the other two files.-------- * Create variables @somefolder_css_bootstrap_css@, @somefolder_js_jquery_js@,---- @somefolder_js_bootstrap_js@ all of type @Route EmbeddedStatic@.-------- * During development, the files will be reloaded on every request. During---- production, the contents of all files will be embedded into the executable.-------- * During development, files that are added to the directory while the server---- is running will not be detected. You need to recompile the module which---- contains the call to @mkEmbeddedStatic@. This will also generate new route---- variables for the new files.--embedDirAt :: Location -> FilePath -> Generator--embedDirAt loc dir = do-- files <- runIO $ getRecursiveContents loc dir-- concat <$> mapM (uncurry embedFileAt) files------ | Concatinate a list of files and embed it at the location. Equivalent to passing @return@ to---- 'concatFilesWith'.--concatFiles :: Location -> [FilePath] -> Generator--concatFiles loc files = concatFilesWith loc return files------ | Concatinate a list of files into a single 'BL.ByteString', run the resulting content through the given---- function, embed it at the given location, and create a haskell variable name for the route based on---- the location.-------- The processing function is only run when compiling for production, and the processing function is---- executed at compile time. During development, on every request the files listed are reloaded,---- concatenated, and served as a single resource at the given location without being processed.--concatFilesWith :: Location -> (BL.ByteString -> IO BL.ByteString) -> [FilePath] -> Generator--concatFilesWith loc process files = do-- let load = do putStrLn $ "Creating " ++ loc-- BL.concat <$> mapM BL.readFile files >>= process-- expFiles = listE $ map (litE . stringL) files-- expCt = [| BL.concat <$> mapM BL.readFile $expFiles |]-- mime = defaultMimeLookup $ T.pack loc-- return [def { ebHaskellName = Just $ pathToName loc-- , ebLocation = loc-- , ebMimeType = mime-- , ebProductionContent = load-- , ebDevelReload = expCt-- }]--- -- | Convienient rexport of 'minifym' with a type signature to work with 'concatFilesWith'.- jasmine :: BL.ByteString -> IO BL.ByteString- jasmine ct = return $ either (const ct) id $ minifym ct-diff --git a/Yesod/EmbeddedStatic/Internal.hs b/Yesod/EmbeddedStatic/Internal.hs-index 0882c16..6f61a0f 100644---- a/Yesod/EmbeddedStatic/Internal.hs-+++ b/Yesod/EmbeddedStatic/Internal.hs-@@ -7,9 +7,6 @@- module Yesod.EmbeddedStatic.Internal (- EmbeddedStatic(..)- , Route(..)-- , ComputedEntry(..)-- , devEmbed-- , prodEmbed- , develApp- , AddStaticContent- , staticContentHelper-@@ -68,44 +65,6 @@ instance ParseRoute EmbeddedStatic where- parseRoute (["widget",h], _) = Just $ EmbeddedWidgetR h- parseRoute _ = Nothing- ---- | At compile time, one of these is created for every 'Entry' created by---- the generators. The cLink is a template haskell expression of type @Route EmbeddedStatic@.--data ComputedEntry = ComputedEntry {-- cHaskellName :: Maybe Name -- ^ Optional haskell name to create a variable for the route-- , cStEntry :: Static.EmbeddableEntry -- ^ The entry to be embedded into the executable-- , cLink :: ExpQ -- ^ The route for this entry--}----mkStr :: String -> ExpQ--mkStr = litE . stringL------ | Create a 'ComputedEntry' for development mode, reloading the content on every request.--devEmbed :: Entry -> IO ComputedEntry--devEmbed e = return computed-- where-- st = Static.EmbeddableEntry {-- Static.eLocation = "res/" `T.append` T.pack (ebLocation e)-- , Static.eMimeType = ebMimeType e-- , Static.eContent = Right [| $(ebDevelReload e) >>= \c ->-- return (T.pack (base64md5 c), c) |]-- }-- link = [| EmbeddedResourceR (T.splitOn (T.pack "/") $ T.pack $(mkStr $ ebLocation e)) [] |]-- computed = ComputedEntry (ebHaskellName e) st link------ | Create a 'ComputedEntry' for production mode, hashing and embedding the content into the executable.--prodEmbed :: Entry -> IO ComputedEntry--prodEmbed e = do-- ct <- ebProductionContent e-- let hash = base64md5 ct-- link = [| EmbeddedResourceR (T.splitOn (T.pack "/") $ T.pack $(mkStr $ ebLocation e))-- [(T.pack "etag", T.pack $(mkStr hash))] |]-- st = Static.EmbeddableEntry {-- Static.eLocation = "res/" `T.append` T.pack (ebLocation e)-- , Static.eMimeType = ebMimeType e-- , Static.eContent = Left (T.pack hash, ct)-- }-- return $ ComputedEntry (ebHaskellName e) st link--- tryExtraDevelFiles :: [[T.Text] -> IO (Maybe (MimeType, BL.ByteString))] -> Application- tryExtraDevelFiles [] _ = return $ responseLBS status404 [] ""- tryExtraDevelFiles (f:fs) r = do-diff --git a/Yesod/EmbeddedStatic/Types.hs b/Yesod/EmbeddedStatic/Types.hs-index 5cbd662..d3e514f 100644---- a/Yesod/EmbeddedStatic/Types.hs-+++ b/Yesod/EmbeddedStatic/Types.hs-@@ -1,7 +1,6 @@- {-# LANGUAGE TemplateHaskell, QuasiQuotes, OverloadedStrings #-}- module Yesod.EmbeddedStatic.Types(- Location-- , Generator- -- ** Entry- , Entry- , ebHaskellName-@@ -52,16 +51,3 @@ data Entry = Entry {- -- taking as input the list of path pieces and optionally returning a mime type- -- and content.- }------ | When using 'def', you must fill in at least 'ebLocation'.--instance Default Entry where-- def = Entry { ebHaskellName = Nothing-- , ebLocation = "xxxx"-- , ebMimeType = "application/octet-stream"-- , ebProductionContent = return BL.empty-- , ebDevelReload = [| return BL.empty |]-- , ebDevelExtraFiles = Nothing-- }------ | An embedded generator is executed at compile time to produce the entries to embed.--type Generator = Q [Entry]-diff --git a/Yesod/Static.hs b/Yesod/Static.hs-index ef27f1b..5795f45 100644---- a/Yesod/Static.hs-+++ b/Yesod/Static.hs-@@ -37,8 +37,8 @@ module Yesod.Static- , staticDevel- -- * Combining CSS/JS- -- $combining-- , combineStylesheets'-- , combineScripts'-+ --, combineStylesheets'-+ --, combineScripts'- -- ** Settings- , CombineSettings- , csStaticDir-@@ -48,13 +48,13 @@ module Yesod.Static- , csJsPreProcess- , csCombinedFolder- -- * Template Haskell helpers-- , staticFiles-- , staticFilesList-- , publicFiles-+ --, staticFiles-+ --, staticFilesList-+ --, publicFiles- -- * Hashing- , base64md5- -- * Embed-- , embed-+ --, embed- #ifdef TEST_EXPORT- , getFileListPieces- #endif-@@ -64,7 +64,6 @@ import Prelude hiding (FilePath)- import qualified Prelude- import System.Directory- import Control.Monad--import Data.FileEmbed (embedDir)- - import Yesod.Core- import Yesod.Core.Types-@@ -135,21 +134,6 @@ staticDevel dir = do- hashLookup <- cachedETagLookupDevel dir- return $ Static $ webAppSettingsWithLookup (F.decodeString dir) hashLookup- ---- | Produce a 'Static' based on embedding all of the static files' contents in the---- executable at compile time.-------- You should use "Yesod.EmbeddedStatic" instead, it is much more powerful.-------- Nota Bene: if you replace the scaffolded 'static' call in Settings/StaticFiles.hs---- you will need to change the scaffolded addStaticContent. Otherwise, some of your---- assets will be 404'ed. This is because by default yesod will generate compile those---- assets to @static/tmp@ which for 'static' is fine since they are served out of the---- directory itself. With embedded static, that will not work.---- You can easily change @addStaticContent@ to @\_ _ _ -> return Nothing@ as a workaround.---- This will cause yesod to embed those assets into the generated HTML file itself.--embed :: Prelude.FilePath -> Q Exp--embed fp = [|Static (embeddedSettings $(embedDir fp))|]--- instance RenderRoute Static where- -- | A route on the static subsite (see also 'staticFiles').- ---@@ -214,59 +198,6 @@ getFileListPieces = flip evalStateT M.empty . flip go id- put $ M.insert s s m- return s- ---- | Template Haskell function that automatically creates routes---- for all of your static files.-------- For example, if you used-------- > staticFiles "static/"-------- and you had files @\"static\/style.css\"@ and---- @\"static\/js\/script.js\"@, then the following top-level---- definitions would be created:-------- > style_css = StaticRoute ["style.css"] []---- > js_script_js = StaticRoute ["js/script.js"] []-------- Note that dots (@.@), dashes (@-@) and slashes (@\/@) are---- replaced by underscores (@\_@) to create valid Haskell---- identifiers.--staticFiles :: Prelude.FilePath -> Q [Dec]--staticFiles dir = mkStaticFiles dir------ | Same as 'staticFiles', but takes an explicit list of files---- to create identifiers for. The files path given are relative---- to the static folder. For example, to create routes for the---- files @\"static\/js\/jquery.js\"@ and---- @\"static\/css\/normalize.css\"@, you would use:-------- > staticFilesList \"static\" [\"js\/jquery.js\", \"css\/normalize.css\"]-------- This can be useful when you have a very large number of static---- files, but only need to refer to a few of them from Haskell.--staticFilesList :: Prelude.FilePath -> [Prelude.FilePath] -> Q [Dec]--staticFilesList dir fs =-- mkStaticFilesList dir (map split fs) "StaticRoute" True-- where-- split :: Prelude.FilePath -> [String]-- split [] = []-- split x =-- let (a, b) = break (== '/') x-- in a : split (drop 1 b)------ | Same as 'staticFiles', but doesn't append an ETag to the---- query string.-------- Using 'publicFiles' will speed up the compilation, since there---- won't be any need for hashing files during compile-time.---- However, since the ETag ceases to be part of the URL, the---- 'Static' subsite won't be able to set the expire date too far---- on the future. Browsers still will be able to cache the---- contents, however they'll need send a request to the server to---- see if their copy is up-to-date.--publicFiles :: Prelude.FilePath -> Q [Dec]--publicFiles dir = mkStaticFiles' dir "StaticRoute" False--- - mkHashMap :: Prelude.FilePath -> IO (M.Map F.FilePath S8.ByteString)- mkHashMap dir = do-@@ -309,53 +240,6 @@ cachedETagLookup dir = do- etags <- mkHashMap dir- return $ (\f -> return $ M.lookup f etags)- --mkStaticFiles :: Prelude.FilePath -> Q [Dec]--mkStaticFiles fp = mkStaticFiles' fp "StaticRoute" True----mkStaticFiles' :: Prelude.FilePath -- ^ static directory-- -> String -- ^ route constructor "StaticRoute"-- -> Bool -- ^ append checksum query parameter-- -> Q [Dec]--mkStaticFiles' fp routeConName makeHash = do-- fs <- qRunIO $ getFileListPieces fp-- mkStaticFilesList fp fs routeConName makeHash----mkStaticFilesList-- :: Prelude.FilePath -- ^ static directory-- -> [[String]] -- ^ list of files to create identifiers for-- -> String -- ^ route constructor "StaticRoute"-- -> Bool -- ^ append checksum query parameter-- -> Q [Dec]--mkStaticFilesList fp fs routeConName makeHash = do-- concat `fmap` mapM mkRoute fs-- where-- replace' c-- | 'A' <= c && c <= 'Z' = c-- | 'a' <= c && c <= 'z' = c-- | '0' <= c && c <= '9' = c-- | otherwise = '_'-- mkRoute f = do-- let name' = intercalate "_" $ map (map replace') f-- routeName = mkName $-- case () of-- ()-- | null name' -> error "null-named file"-- | isDigit (head name') -> '_' : name'-- | isLower (head name') -> name'-- | otherwise -> '_' : name'-- f' <- [|map pack $(TH.lift f)|]-- let route = mkName routeConName-- pack' <- [|pack|]-- qs <- if makeHash-- then do hash <- qRunIO $ base64md5File $ pathFromRawPieces fp f-- [|[(pack "etag", pack $(TH.lift hash))]|]-- else return $ ListE []-- return-- [ SigD routeName $ ConT route-- , FunD routeName-- [ Clause [] (NormalB $ (ConE route) `AppE` f' `AppE` qs) []-- ]-- ]- - base64md5File :: Prelude.FilePath -> IO String- base64md5File = fmap (base64 . encode) . hashFile-@@ -379,55 +263,6 @@ base64 = map tr- tr '/' = '_'- tr c = c- ---- $combining-------- A common scenario on a site is the desire to include many external CSS and---- Javascript files on every page. Doing so via the Widget functionality in---- Yesod will work, but would also mean that the same content will be---- downloaded many times. A better approach would be to combine all of these---- files together into a single static file and serve that as a static resource---- for every page. That resource can be cached on the client, and bandwidth---- usage reduced.-------- This could be done as a manual process, but that becomes tedious. Instead,---- you can use some Template Haskell code which will combine these files into a---- single static file at compile time.----data CombineType = JS | CSS----combineStatics' :: CombineType-- -> CombineSettings-- -> [Route Static] -- ^ files to combine-- -> Q Exp--combineStatics' combineType CombineSettings {..} routes = do-- texts <- qRunIO $ runResourceT $ mapM_ yield fps $$ awaitForever readUTFFile =$ consume-- ltext <- qRunIO $ preProcess $ TL.fromChunks texts-- bs <- qRunIO $ postProcess fps $ TLE.encodeUtf8 ltext-- let hash' = base64md5 bs-- suffix = csCombinedFolder </> F.decodeString hash' <.> extension-- fp = csStaticDir </> suffix-- qRunIO $ do-- createTree $ F.directory fp-- L.writeFile (F.encodeString fp) bs-- let pieces = map T.unpack $ T.splitOn "/" $ either id id $ F.toText suffix-- [|StaticRoute (map pack pieces) []|]-- where-- fps :: [F.FilePath]-- fps = map toFP routes-- toFP (StaticRoute pieces _) = csStaticDir </> F.concat (map F.fromText pieces)-- readUTFFile fp = sourceFile (F.encodeString fp) =$= CT.decode CT.utf8-- postProcess =-- case combineType of-- JS -> csJsPostProcess-- CSS -> csCssPostProcess-- preProcess =-- case combineType of-- JS -> csJsPreProcess-- CSS -> csCssPreProcess-- extension =-- case combineType of-- JS -> "js"-- CSS -> "css"- - -- | Data type for holding all settings for combining files.- ---@@ -504,50 +339,3 @@ instance Default CombineSettings where- errorIntro :: [FilePath] -> [Char] -> [Char]- errorIntro fps s = "Error minifying " ++ show fps ++ ": " ++ s- --liftRoutes :: [Route Static] -> Q Exp--liftRoutes =-- fmap ListE . mapM go-- where-- go :: Route Static -> Q Exp-- go (StaticRoute x y) = [|StaticRoute $(liftTexts x) $(liftPairs y)|]---- liftTexts = fmap ListE . mapM liftT-- liftT t = [|pack $(TH.lift $ T.unpack t)|]---- liftPairs = fmap ListE . mapM liftPair-- liftPair (x, y) = [|($(liftT x), $(liftT y))|]------ | Combine multiple CSS files together. Common usage would be:-------- >>> combineStylesheets' development def 'StaticR [style1_css, style2_css]-------- Where @development@ is a variable in your site indicated whether you are in---- development or production mode.-------- Since 1.2.0--combineStylesheets' :: Bool -- ^ development? if so, perform no combining-- -> CombineSettings-- -> Name -- ^ Static route constructor name, e.g. \'StaticR-- -> [Route Static] -- ^ files to combine-- -> Q Exp--combineStylesheets' development cs con routes-- | development = [| mapM_ (addStylesheet . $(return $ ConE con)) $(liftRoutes routes) |]-- | otherwise = [| addStylesheet $ $(return $ ConE con) $(combineStatics' CSS cs routes) |]-------- | Combine multiple JS files together. Common usage would be:-------- >>> combineScripts' development def 'StaticR [script1_js, script2_js]-------- Where @development@ is a variable in your site indicated whether you are in---- development or production mode.-------- Since 1.2.0--combineScripts' :: Bool -- ^ development? if so, perform no combining-- -> CombineSettings-- -> Name -- ^ Static route constructor name, e.g. \'StaticR-- -> [Route Static] -- ^ files to combine-- -> Q Exp--combineScripts' development cs con routes-- | development = [| mapM_ (addScript . $(return $ ConE con)) $(liftRoutes routes) |]-- | otherwise = [| addScript $ $(return $ ConE con) $(combineStatics' JS cs routes) |]--- -1.8.5.1-
+ standalone/osx/git-annex.app/Contents/MacOS/git view
@@ -0,0 +1,31 @@+#!/bin/sh+link="$(readlink "$0")" || true+if [ -n "$link" ]; then+ base="$(dirname "$link")"+else+ base="$(dirname "$0")"+fi++if [ ! -d "$base" ]; then+ echo "** cannot find base directory (I seem to be $0)" >&2+ exit 1+fi+if [ ! -e "$base/runshell" ]; then+ echo "** cannot find $base/runshell" >&2+ exit 1+fi++# Get absolute path to base, to avoid breakage when things change directories.+orig="$(pwd)"+cd "$base"+base="$(pwd)"+cd "$orig"++# If this is a standalone app, set a variable that git-annex can use to+# install itself.+if [ -e "$base/git-annex" ]; then+ GIT_ANNEX_APP_BASE="$base"+ export GIT_ANNEX_APP_BASE+fi++exec "$base/runshell" git "$@"
+ standalone/osx/git-annex.app/Contents/MacOS/git-receive-pack view
@@ -0,0 +1,31 @@+#!/bin/sh+link="$(readlink "$0")" || true+if [ -n "$link" ]; then+ base="$(dirname "$link")"+else+ base="$(dirname "$0")"+fi++if [ ! -d "$base" ]; then+ echo "** cannot find base directory (I seem to be $0)" >&2+ exit 1+fi+if [ ! -e "$base/runshell" ]; then+ echo "** cannot find $base/runshell" >&2+ exit 1+fi++# Get absolute path to base, to avoid breakage when things change directories.+orig="$(pwd)"+cd "$base"+base="$(pwd)"+cd "$orig"++# If this is a standalone app, set a variable that git-annex can use to+# install itself.+if [ -e "$base/git-annex" ]; then+ GIT_ANNEX_APP_BASE="$base"+ export GIT_ANNEX_APP_BASE+fi++exec "$base/runshell" git-receive-pack "$@"
+ standalone/osx/git-annex.app/Contents/MacOS/git-shell view
@@ -0,0 +1,31 @@+#!/bin/sh+link="$(readlink "$0")" || true+if [ -n "$link" ]; then+ base="$(dirname "$link")"+else+ base="$(dirname "$0")"+fi++if [ ! -d "$base" ]; then+ echo "** cannot find base directory (I seem to be $0)" >&2+ exit 1+fi+if [ ! -e "$base/runshell" ]; then+ echo "** cannot find $base/runshell" >&2+ exit 1+fi++# Get absolute path to base, to avoid breakage when things change directories.+orig="$(pwd)"+cd "$base"+base="$(pwd)"+cd "$orig"++# If this is a standalone app, set a variable that git-annex can use to+# install itself.+if [ -e "$base/git-annex" ]; then+ GIT_ANNEX_APP_BASE="$base"+ export GIT_ANNEX_APP_BASE+fi++exec "$base/runshell" git-shell "$@"
+ standalone/osx/git-annex.app/Contents/MacOS/git-upload-pack view
@@ -0,0 +1,31 @@+#!/bin/sh+link="$(readlink "$0")" || true+if [ -n "$link" ]; then+ base="$(dirname "$link")"+else+ base="$(dirname "$0")"+fi++if [ ! -d "$base" ]; then+ echo "** cannot find base directory (I seem to be $0)" >&2+ exit 1+fi+if [ ! -e "$base/runshell" ]; then+ echo "** cannot find $base/runshell" >&2+ exit 1+fi++# Get absolute path to base, to avoid breakage when things change directories.+orig="$(pwd)"+cd "$base"+base="$(pwd)"+cd "$orig"++# If this is a standalone app, set a variable that git-annex can use to+# install itself.+if [ -e "$base/git-annex" ]; then+ GIT_ANNEX_APP_BASE="$base"+ export GIT_ANNEX_APP_BASE+fi++exec "$base/runshell" git-upload-pack "$@"
standalone/windows/build.sh view
@@ -43,7 +43,7 @@ if [ -e last-incremental-failed ]; then cabal clean || true # windows breakage..- rm -rf dist+ rm -rf dist dist.old || mv -v dist dist.old fi touch last-incremental-failed