git-annex 5.20150528 → 5.20150617
raw patch · 278 files changed
+5526/−2470 lines, 278 filesdep −hamletdep ~shakespeare
Dependencies removed: hamlet
Dependency ranges changed: shakespeare
Files
- Annex/AutoMerge.hs +5/−2
- Annex/BloomFilter.hs +53/−0
- Annex/Branch.hs +4/−1
- Annex/Content.hs +39/−2
- Annex/FileMatcher.hs +1/−0
- Annex/NumCopies.hs +1/−1
- Annex/Quvi.hs +2/−2
- Annex/Ssh.hs +16/−12
- Assistant/Threads/NetWatcher.hs +30/−1
- Assistant/Threads/Watcher.hs +1/−1
- Assistant/WebApp/Gpg.hs +5/−1
- Build/DistributionUpdate.hs +4/−2
- CHANGELOG +53/−0
- CmdLine/GitAnnex/Options.hs +15/−7
- CmdLine/Seek.hs +29/−22
- Command/AddUrl.hs +1/−1
- Command/Dead.hs +29/−4
- Command/FromKey.hs +13/−5
- Command/Fsck.hs +17/−9
- Command/Get.hs +2/−1
- Command/Import.hs +1/−1
- Command/Info.hs +53/−39
- Command/Log.hs +5/−1
- Command/Sync.hs +55/−24
- Command/Unannex.hs +16/−2
- Command/Uninit.hs +1/−1
- Command/Unused.hs +2/−79
- Creds.hs +19/−13
- Git/CheckAttr.hs +2/−1
- Git/CheckIgnore.hs +4/−1
- Git/DiffTree.hs +7/−1
- Git/LsFiles.hs +54/−12
- Git/LsTree.hs +15/−2
- Git/Repair.hs +4/−2
- INSTALL +4/−2
- Limit.hs +4/−0
- Locations.hs +12/−6
- Logs/Difference.hs +2/−2
- Logs/Location.hs +33/−5
- Logs/MetaData.hs +0/−5
- Logs/PreferredContent.hs +6/−0
- Logs/Presence/Pure.hs +3/−1
- Makefile +17/−41
- Messages/JSON.hs +15/−1
- Remote.hs +26/−9
- Remote/Bup.hs +5/−3
- Remote/GCrypt.hs +2/−2
- Remote/Helper/Ssh.hs +1/−1
- Remote/Rsync.hs +8/−9
- Remote/S3.hs +136/−76
- Remote/Tahoe.hs +2/−2
- Test.hs +94/−29
- Types/Difference.hs +48/−12
- Types/Key.hs +10/−0
- Types/StandardGroups.hs +4/−4
- Utility/Bloom.hs +9/−2
- Utility/Glob.hs +2/−2
- Utility/Gpg.hs +22/−18
- Utility/LockPool/STM.hs +2/−1
- Utility/Process.hs +40/−40
- Utility/Quvi.hs +10/−9
- Utility/Rsync.hs +2/−1
- Utility/SafeCommand.hs +6/−8
- Utility/Url.hs +25/−7
- cabal.config +0/−1069
- debian/cabal-wrapper +0/−20
- debian/changelog +53/−0
- debian/control +1/−3
- debian/patches/standalone-build +18/−9
- debian/rules +2/−1
- doc/bugs/Can__39__t_initialize_Tahoe_special_remote.mdwn +40/−0
- doc/bugs/Corrupted_.git__47__annex__47__index_when_running_assistant.mdwn +658/−0
- doc/bugs/Stale_keys_not_forgotten_upon_git-annex_forget.mdwn +2/−0
- doc/bugs/Support_non-default_storage_classes_with_Google_Cloud_Storage.mdwn +91/−0
- doc/bugs/__96__git_annex_add_.__96___fails_for_all_files_if_one_fails.mdwn +34/−0
- doc/bugs/clean-duplicates_doesn__39__t_delete_duplicates.mdwn +113/−0
- doc/bugs/file_not_found.mdwn +30/−0
- doc/bugs/fsck_reports_unsolvable_problem.mdwn +7/−0
- doc/bugs/git-annex-shell_doesn__39__t_work_as_expected.mdwn +1/−1
- doc/bugs/git_annex_fsck_loops.mdwn +91/−0
- doc/bugs/import_leaves_empty_directories_behind.mdwn +18/−0
- doc/bugs/importfeed_can__39__t_deal_with_pycon_rss_feeds.mdwn +25/−0
- doc/bugs/metadata_view_does_not_vpop_to_original_view.mdwn +41/−0
- doc/bugs/s3_InternalIOException__63__.mdwn +28/−0
- doc/bugs/sharedRepository__61__world_not_working.mdwn +32/−0
- doc/bugs/symlinks_to_absent_files_remain_upon_switching_to_direct_mode.mdwn +72/−0
- doc/bugs/transfer_in_progress_not_present_in_json_output.mdwn +4/−0
- doc/bugs/unannexed_files_are_immediately_re-annexed_by_assistant.mdwn +4/−0
- doc/bugs/unlock_with_absolute_path__63__.mdwn +44/−0
- doc/design/assistant/polls/prioritizing_special_remotes.mdwn +1/−1
- doc/design/caching_database.mdwn +5/−5
- doc/devblog/day_289__new_arm_autobuilder.mdwn +21/−0
- doc/devblog/day_290__.mdwn +23/−0
- doc/devblog/day_291__public_S3.mdwn +20/−0
- doc/devblog/day_292__dead_keys.mdwn +21/−0
- doc/devblog/day_293__last_push_before_summer_vacation.mdwn +26/−0
- doc/download.mdwn +2/−8
- doc/forum/Always_sync_all_content_to_remote.mdwn +5/−0
- doc/forum/Does_the_windows_version_install_iStartSurf_malware__63__.mdwn +3/−0
- doc/forum/Handling_a_large_number_of_files.mdwn +3/−0
- doc/forum/Speed_up_remote_transfers.mdwn +5/−0
- doc/forum/__96__git_annex_sync__96___hangs.mdwn +113/−0
- doc/forum/assistant_periodical_unused_moves.mdwn +11/−0
- doc/forum/build_from_source_on_Linux_fails___40__out_of_memory__41__.mdwn +74/−0
- doc/forum/cannot_sync___39__unused__39___files.mdwn +45/−0
- doc/forum/downloading_mp4_by_default_with_importfeed.mdwn +1/−0
- doc/forum/files_only_visible_in_.git_annex.mdwn +15/−0
- doc/forum/renaming_directories_not_supported__63__.mdwn +45/−0
- doc/forum/s3_bandwidth_limitations_and_next_release.mdwn +7/−0
- doc/git-annex-add.mdwn +12/−0
- doc/git-annex-addunused.mdwn +4/−0
- doc/git-annex-addurl.mdwn +6/−0
- doc/git-annex-assistant.mdwn +7/−3
- doc/git-annex-copy.mdwn +6/−0
- doc/git-annex-dead.mdwn +24/−5
- doc/git-annex-describe.mdwn +2/−0
- doc/git-annex-direct.mdwn +2/−0
- doc/git-annex-direct/comment_1_5d6f9e9393e534e027ddcd555861196b._comment +9/−0
- doc/git-annex-direct/comment_2_ef8ac748470549776c1ee299b062add2._comment +7/−0
- doc/git-annex-drop.mdwn +7/−1
- doc/git-annex-dropunused.mdwn +2/−0
- doc/git-annex-enableremote.mdwn +2/−0
- doc/git-annex-find.mdwn +4/−0
- doc/git-annex-fix.mdwn +2/−0
- doc/git-annex-fsck.mdwn +4/−0
- doc/git-annex-get.mdwn +17/−0
- doc/git-annex-group.mdwn +6/−0
- doc/git-annex-groupwanted.mdwn +6/−0
- doc/git-annex-import.mdwn +2/−0
- doc/git-annex-importfeed.mdwn +3/−1
- doc/git-annex-indirect.mdwn +2/−0
- doc/git-annex-init.mdwn +6/−0
- doc/git-annex-initremote.mdwn +2/−0
- doc/git-annex-list.mdwn +4/−0
- doc/git-annex-lock.mdwn +4/−0
- doc/git-annex-lookupkey.mdwn +1/−1
- doc/git-annex-merge.mdwn +2/−0
- doc/git-annex-metadata.mdwn +2/−0
- doc/git-annex-migrate.mdwn +2/−0
- doc/git-annex-mirror.mdwn +3/−1
- doc/git-annex-move.mdwn +6/−0
- doc/git-annex-registerurl.mdwn +2/−0
- doc/git-annex-reinit.mdwn +2/−0
- doc/git-annex-reinject.mdwn +4/−0
- doc/git-annex-repair.mdwn +2/−0
- doc/git-annex-required.mdwn +11/−1
- doc/git-annex-rmurl.mdwn +2/−0
- doc/git-annex-schedule.mdwn +4/−0
- doc/git-annex-semitrust.mdwn +8/−0
- doc/git-annex-shell.mdwn +1/−1
- doc/git-annex-status.mdwn +2/−0
- doc/git-annex-sync.mdwn +23/−9
- doc/git-annex-trust.mdwn +6/−0
- doc/git-annex-undo.mdwn +2/−0
- doc/git-annex-ungroup.mdwn +2/−0
- doc/git-annex-uninit.mdwn +2/−0
- doc/git-annex-unlock.mdwn +6/−0
- doc/git-annex-untrust.mdwn +6/−0
- doc/git-annex-unused.mdwn +4/−0
- doc/git-annex-upgrade.mdwn +6/−0
- doc/git-annex-vadd.mdwn +2/−0
- doc/git-annex-vcycle.mdwn +2/−0
- doc/git-annex-vfilter.mdwn +2/−0
- doc/git-annex-vpop.mdwn +2/−0
- doc/git-annex-wanted.mdwn +6/−0
- doc/git-annex-watch.mdwn +2/−0
- doc/git-annex-webapp.mdwn +2/−0
- doc/git-annex-whereis.mdwn +4/−0
- doc/git-annex.mdwn +20/−16
- doc/install.mdwn +4/−2
- doc/install/Docker.mdwn +0/−36
- doc/install/Linux_standalone.mdwn +4/−1
- doc/internals.mdwn +8/−4
- doc/internals/comment_4_81293b180fb09105ec158fdfef73d249._comment +7/−0
- doc/internals/comment_5_354012b6a9ac11160eb926234d38051f._comment +12/−0
- doc/news/version_5.20150409.mdwn +0/−23
- doc/news/version_5.20150420.mdwn +0/−33
- doc/news/version_5.20150617.mdwn +50/−0
- doc/preferred_content.mdwn +174/−106
- doc/preferred_content/comment_7_c4acaa237bf1a8512c5e8ea4cdbd11b9._comment +3/−1
- doc/preferred_content/comment_8_ff2a2dc9c566ebd9f570bdfcd7bfc030._comment +0/−27
- doc/preferred_content/standard_groups.mdwn +8/−6
- doc/publicrepos.mdwn +5/−0
- doc/related_software.mdwn +13/−0
- doc/special_remotes/S3.mdwn +9/−0
- doc/special_remotes/bittorrent.mdwn +2/−2
- doc/tips/Repositories_with_large_number_of_files.mdwn +48/−0
- doc/tips/automatically_adding_metadata/pre-commit-annex +1/−0
- doc/tips/disabling_a_special_remote.mdwn +35/−0
- doc/tips/public_Amazon_S3_remote.mdwn +57/−0
- doc/tips/publishing_your_files_to_the_public.mdwn +34/−22
- doc/tips/using_Amazon_S3.mdwn +8/−7
- doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync.mdwn +2/−0
- doc/todo/Bittorrent-like_features.mdwn +12/−1
- doc/todo/Nearline_support.mdwn +0/−2
- doc/todo/S3_fsck_support.mdwn +55/−0
- doc/todo/S3_fsck_support/comment_1_9317598723ea38ae9432ad50e0de666d._comment +26/−0
- doc/todo/S3_fsck_support/comment_2_7a1ce64d362b8f75adf22709771a7787._comment +11/−0
- doc/todo/Support_dbus_monitor_for_networkd.mdwn +5/−0
- doc/todo/add_--quiet_option_to_fsck.mdwn +7/−0
- doc/todo/cloning_direct_mode_repo_over_http.mdwn +35/−0
- doc/todo/credentials-less_access_to_s3.mdwn +2/−0
- doc/todo/get_--incomplete.mdwn +2/−0
- doc/todo/git-annex_in_debian_sid.mdwn +6/−0
- doc/todo/git-annex_metadata_extractor_progress_bar.mdwn +7/−0
- doc/todo/git-hook_to_sanity-check_git-annex_branch_pushes.mdwn +41/−0
- doc/todo/git_annex_grep.mdwn +19/−0
- doc/todo/git_annex_grep/comment_1_890b3ecb679b941f9c0075ed360b203e._comment +9/−0
- doc/todo/shorten_git-annex_manpage.mdwn +38/−0
- doc/todo/syncthing_special_remote.mdwn +108/−0
- doc/tuning.mdwn +1/−1
- doc/upgrades.mdwn +18/−6
- doc/users/candyangel.mdwn +10/−0
- doc/users/frederik.mdwn +1/−0
- git-annex.cabal +3/−3
- man/git-annex-add.1 +12/−0
- man/git-annex-addunused.1 +4/−0
- man/git-annex-addurl.1 +6/−0
- man/git-annex-assistant.1 +7/−3
- man/git-annex-copy.1 +6/−0
- man/git-annex-dead.1 +24/−5
- man/git-annex-describe.1 +2/−0
- man/git-annex-direct.1 +2/−0
- man/git-annex-drop.1 +7/−1
- man/git-annex-dropunused.1 +2/−0
- man/git-annex-enableremote.1 +2/−0
- man/git-annex-find.1 +4/−0
- man/git-annex-fix.1 +2/−0
- man/git-annex-fsck.1 +4/−0
- man/git-annex-get.1 +16/−0
- man/git-annex-group.1 +6/−0
- man/git-annex-groupwanted.1 +6/−0
- man/git-annex-import.1 +2/−0
- man/git-annex-importfeed.1 +3/−1
- man/git-annex-indirect.1 +2/−0
- man/git-annex-init.1 +6/−0
- man/git-annex-initremote.1 +2/−0
- man/git-annex-list.1 +4/−0
- man/git-annex-lock.1 +4/−0
- man/git-annex-lookupkey.1 +1/−1
- man/git-annex-merge.1 +2/−0
- man/git-annex-metadata.1 +2/−0
- man/git-annex-migrate.1 +2/−0
- man/git-annex-mirror.1 +3/−1
- man/git-annex-move.1 +6/−0
- man/git-annex-registerurl.1 +2/−0
- man/git-annex-reinit.1 +2/−0
- man/git-annex-reinject.1 +4/−0
- man/git-annex-repair.1 +2/−0
- man/git-annex-required.1 +11/−1
- man/git-annex-rmurl.1 +2/−0
- man/git-annex-schedule.1 +4/−0
- man/git-annex-semitrust.1 +8/−0
- man/git-annex-shell.1 +1/−1
- man/git-annex-status.1 +2/−0
- man/git-annex-sync.1 +23/−9
- man/git-annex-trust.1 +6/−0
- man/git-annex-undo.1 +2/−0
- man/git-annex-ungroup.1 +2/−0
- man/git-annex-uninit.1 +2/−0
- man/git-annex-unlock.1 +6/−0
- man/git-annex-untrust.1 +6/−0
- man/git-annex-unused.1 +4/−0
- man/git-annex-upgrade.1 +6/−0
- man/git-annex-vadd.1 +2/−0
- man/git-annex-vcycle.1 +2/−0
- man/git-annex-vfilter.1 +2/−0
- man/git-annex-vpop.1 +2/−0
- man/git-annex-wanted.1 +6/−0
- man/git-annex-watch.1 +2/−0
- man/git-annex-webapp.1 +2/−0
- man/git-annex-whereis.1 +4/−0
- man/git-annex.1 +19/−15
- standalone/android/install-haskell-packages +0/−1
- standalone/linux/cabal.config +1069/−207
- standalone/linux/install-haskell-packages +2/−29
- standalone/no-th/haskell-patches/hamlet_hack_TH.patch +0/−205
- test too large to diff
Annex/AutoMerge.hs view
@@ -89,7 +89,9 @@ unlessM isDirect $ do (deleted, cleanup2) <- inRepo (LsFiles.deleted [top]) unless (null deleted) $- Annex.Queue.addCommand "rm" [Params "--quiet -f --"] deleted+ Annex.Queue.addCommand "rm"+ [Param "--quiet", Param "-f", Param "--"]+ deleted void $ liftIO cleanup2 when merged $ do@@ -173,7 +175,8 @@ resolveby a = do {- Remove conflicted file from index so merge can be resolved. -}- Annex.Queue.addCommand "rm" [Params "--quiet -f --cached --"] [file]+ Annex.Queue.addCommand "rm"+ [Param "--quiet", Param "-f", Param "--cached", Param "--"] [file] void a return (Just file)
+ Annex/BloomFilter.hs view
@@ -0,0 +1,53 @@+{- git-annex bloom filter+ -+ - Copyright 2010-2015 Joey Hess <id@joeyh.name>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Annex.BloomFilter where++import Common.Annex+import qualified Annex+import Utility.Bloom++import Control.Monad.ST++{- A bloom filter capable of holding half a million keys with a+ - false positive rate of 1 in 10000000 uses around 16 mb of memory,+ - so will easily fit on even my lowest memory systems.+ -}+bloomCapacity :: Annex Int+bloomCapacity = fromMaybe 500000 . annexBloomCapacity <$> Annex.getGitConfig+bloomAccuracy :: Annex Int+bloomAccuracy = fromMaybe 10000000 . annexBloomAccuracy <$> Annex.getGitConfig+bloomBitsHashes :: Annex (Int, Int)+bloomBitsHashes = do+ capacity <- bloomCapacity+ accuracy <- bloomAccuracy+ case safeSuggestSizing capacity (1 / fromIntegral accuracy) of+ Left e -> do+ warning $ "bloomfilter " ++ e ++ "; falling back to sane value"+ -- precaulculated value for 500000 (1/10000000)+ return (16777216,23)+ Right v -> return v++{- Creates a bloom filter, and runs an action to populate it.+ -+ - The action is passed a callback that it can use to feed values into the+ - bloom filter. + -+ - Once the action completes, the mutable filter is frozen+ - for later use.+ -}+genBloomFilter :: Hashable v => ((v -> Annex ()) -> Annex ()) -> Annex (Bloom v)+genBloomFilter populate = do+ (numbits, numhashes) <- bloomBitsHashes+ bloom <- lift $ newMB (cheapHashes numhashes) numbits+ populate $ \v -> lift $ insertMB bloom v+ lift $ unsafeFreezeMB bloom+ where+ lift = liftIO . stToIO++bloomFilter :: Hashable v => [v] -> Bloom v -> [v]+bloomFilter l bloom = filter (\v -> v `notElemB` bloom) l
Annex/Branch.hs view
@@ -315,7 +315,10 @@ - and without updating the branch. -} branchFiles :: Annex [FilePath] branchFiles = withIndex $ inRepo $ Git.Command.pipeNullSplitZombie- [ Params "ls-tree --name-only -r -z"+ [ Param "ls-tree"+ , Param "--name-only"+ , Param "-r"+ , Param "-z" , Param $ fromRef fullname ]
Annex/Content.hs view
@@ -35,9 +35,11 @@ thawContent, dirKeys, withObjectLoc,+ staleKeysPrune, ) where import System.IO.Unsafe (unsafeInterleaveIO)+import qualified Data.Set as S import Common.Annex import Logs.Location@@ -519,11 +521,12 @@ direct <- isDirect dir <- fromRepo gitAnnexObjectDir s <- getstate direct- liftIO $ walk s direct (2 :: Int) dir+ depth <- gitAnnexLocationDepth <$> Annex.getGitConfig+ liftIO $ walk s direct depth dir where walk s direct depth dir = do contents <- catchDefaultIO [] (dirContents dir)- if depth == 0+ if depth < 2 then do contents' <- filterM (present s direct) contents let keys = mapMaybe (fileKey . takeFileName) contents'@@ -663,3 +666,37 @@ , return [] ) +{- Looks in the specified directory for bad/tmp keys, and returns a list+ - of those that might still have value, or might be stale and removable.+ - + - Also, stale keys that can be proven to have no value+ - (ie, their content is already present) are deleted.+ -}+staleKeysPrune :: (Git.Repo -> FilePath) -> Bool -> Annex [Key]+staleKeysPrune dirspec nottransferred = do+ contents <- dirKeys dirspec+ + dups <- filterM inAnnex contents+ let stale = contents `exclude` dups++ dir <- fromRepo dirspec+ liftIO $ forM_ dups $ \t -> removeFile $ dir </> keyFile t++ if nottransferred+ then do+ inprogress <- S.fromList . map (transferKey . fst)+ <$> getTransfers+ return $ filter (`S.notMember` inprogress) stale+ else return stale++{- Finds items in the first, smaller list, that are not+ - present in the second, larger list.+ - + - Constructing a single set, of the list that tends to be+ - smaller, appears more efficient in both memory and CPU+ - than constructing and taking the S.difference of two sets. -}+exclude :: Ord a => [a] -> [a] -> [a]+exclude [] _ = [] -- optimisation+exclude smaller larger = S.toList $ remove larger $ S.fromList smaller+ where+ remove a b = foldl (flip S.delete) b a
Annex/FileMatcher.hs view
@@ -74,6 +74,7 @@ | t == "present" = use checkpresent | t == "inpreferreddir" = use checkpreferreddir | t == "unused" = Right $ Operation limitUnused+ | t == "anything" = Right $ Operation limitAnything | otherwise = maybe (Left $ "near " ++ show t) use $ M.lookup k $ M.fromList [ ("include", limitInclude)
Annex/NumCopies.hs view
@@ -95,7 +95,7 @@ :: String -- message to print when there are no known locations -> Key -> NumCopies- -> [UUID] -- repos to skip (generally untrusted remotes)+ -> [UUID] -- repos to skip considering (generally untrusted remotes) -> [UUID] -- repos that are trusted or already verified to have it -> [Remote] -- remotes to check to see if they have it -> Annex Bool
Annex/Quvi.hs view
@@ -14,11 +14,11 @@ import Utility.Quvi import Utility.Url -withQuviOptions :: forall a. Query a -> [QuviParam] -> URLString -> Annex a+withQuviOptions :: forall a. Query a -> [QuviParams] -> URLString -> Annex a withQuviOptions a ps url = do v <- quviVersion opts <- map Param . annexQuviOptions <$> Annex.getGitConfig- liftIO $ a v (map (\mkp -> mkp v) ps++opts) url+ liftIO $ a v (concatMap (\mkp -> mkp v) ps ++ opts) url quviSupported :: URLString -> Annex Bool quviSupported u = liftIO . flip supported u =<< quviVersion
Annex/Ssh.hs view
@@ -92,7 +92,8 @@ sshConnectionCachingParams :: FilePath -> [CommandParam] sshConnectionCachingParams socketfile = [ Param "-S", Param socketfile- , Params "-o ControlMaster=auto -o ControlPersist=yes"+ , Param "-o", Param "ControlMaster=auto"+ , Param "-o", Param "ControlPersist=yes" ] {- ssh connection caching creates sockets, so will not work on a@@ -180,8 +181,8 @@ void $ liftIO $ catchMaybeIO $ withQuietOutput createProcessSuccess $ (proc "ssh" $ toCommand $- [ Params "-O stop"- ] ++ params ++ [Param "localhost"])+ [ Param "-O", Param "stop" ] ++ + params ++ [Param "localhost"]) { cwd = Just dir } liftIO $ nukeFile socketfile @@ -271,19 +272,22 @@ Just host -> do (msockfile, _) <- sshCachingInfo (host, Git.Url.port remote) case msockfile of- Nothing -> return g+ Nothing -> use [] Just sockfile -> do- command <- liftIO programPath prepSocket sockfile- let val = toSshOptionsEnv $ concat- [ sshConnectionCachingParams sockfile- , map Param (remoteAnnexSshOptions gc)- ]- liftIO $ do- g' <- addGitEnv g sshOptionsEnv val- addGitEnv g' "GIT_SSH" command+ use (sshConnectionCachingParams sockfile) where uncached = return g++ use opts = do+ let val = toSshOptionsEnv $ concat+ [ opts+ , map Param (remoteAnnexSshOptions gc)+ ]+ command <- liftIO programPath+ liftIO $ do+ g' <- addGitEnv g sshOptionsEnv val+ addGitEnv g' "GIT_SSH" command runSshOptions :: [String] -> String -> IO () runSshOptions args s = do
Assistant/Threads/NetWatcher.hs view
@@ -65,6 +65,7 @@ callback <- asIO1 connchange liftIO $ do listenNMConnections client callback+ listenNDConnections client callback listenWicdConnections client callback , do liftAnnex $@@ -88,7 +89,7 @@ - are any we can use to monitor network connections. -} checkNetMonitor :: Client -> Assistant Bool checkNetMonitor client = do- running <- liftIO $ filter (`elem` [networkmanager, wicd])+ running <- liftIO $ filter (`elem` manager_addresses) <$> listServiceNames client case running of [] -> return False@@ -99,8 +100,36 @@ ] return True where+ manager_addresses = [networkmanager, networkd, wicd] networkmanager = "org.freedesktop.NetworkManager"+ networkd = "org.freedesktop.network1" wicd = "org.wicd.daemon"++{- Listens for systemd-networkd connections and diconnections.+ -+ - Connection example (once fully connected):+ - [Variant {"OperationalState": Variant "routable"}]+ -+ - Disconnection example:+ - [Variant {"OperationalState": Variant _}]+ -}+listenNDConnections :: Client -> (Bool -> IO ()) -> IO ()+listenNDConnections client setconnected =+ void $ addMatch client matcher+ $ \event -> mapM_ handleevent+ (map dictionaryItems $ mapMaybe fromVariant $ signalBody event)+ where+ matcher = matchAny+ { matchInterface = Just "org.freedesktop.DBus.Properties"+ , matchMember = Just "PropertiesChanged"+ }+ operational_state_key = toVariant ("OperationalState" :: String)+ routable = toVariant $ toVariant ("routable" :: String)+ handleevent m = case lookup operational_state_key m of+ Just state -> if state == routable+ then setconnected True+ else setconnected False+ Nothing -> noop {- Listens for NetworkManager connections and diconnections. -
Assistant/Threads/Watcher.hs view
@@ -202,7 +202,7 @@ ( pendingAddChange file , do liftAnnex $ Annex.Queue.addCommand "add"- [Params "--force --"] [file]+ [Param "--force", Param "--"] [file] madeChange file AddFileChange )
Assistant/WebApp/Gpg.hs view
@@ -69,7 +69,11 @@ getGCryptRemoteName u repoloc = do tmpremote <- uniqueRemoteName "tmpgcryptremote" 0 <$> gitRepo void $ inRepo $ Git.Command.runBool- [Params "remote add", Param tmpremote, Param $ Git.GCrypt.urlPrefix ++ repoloc]+ [ Param "remote"+ , Param "add"+ , Param tmpremote+ , Param $ Git.GCrypt.urlPrefix ++ repoloc+ ] mname <- ifM (inRepo $ Git.Command.runBool [Param "fetch", Param tmpremote]) ( do void Annex.Branch.forceUpdate
Build/DistributionUpdate.hs view
@@ -130,11 +130,13 @@ ] void $ inRepo $ runBool [ Param "annex"- , Params "move --to website"+ , Param "move"+ , Param "--to"+ , Param "website" ] void $ inRepo $ runBool [ Param "annex"- , Params "sync"+ , Param "sync" ] -- Check for out of date info files.
CHANGELOG view
@@ -1,3 +1,56 @@+git-annex (5.20150617) unstable; urgency=medium++ * Now supports git annex sync --all --content to sync all versions of all+ files with all repos that want them.+ * Added new "anything" preferred content expression, which matches all+ versions of all files.+ * Standard preferred content for client, backup, incremental backup,+ and unwanted groups have been adjusted to work better when used+ with git annex sync --all --content.+ * fromkey, registerurl: Improve handling of urls that happen to also+ be parsable as strange keys.+ * sync, remotedaemon: Pass configured ssh-options even when+ annex.sshcaching is disabled.+ * assistant: Consume systemd-networkd dbus events to learn about+ changes to network connections, as was already done with+ network-manager and wicd.+ Thanks to Sebastian Reuße for the patches.+ * get --incomplete: New option to resume any interrupted downloads.+ * dead --key: Can be used to mark a key as dead.+ * fsck: Ignore keys that are known to be dead when running in+ --all/--unused/--key mode or a in a bare repo. Closes: #753888+ Otherwise, still reports files with lost contents, even if the content+ is dead.+ * S3: Special remotes can be configured with public=yes to allow+ the public to access the bucket's content.+ * S3: Publically accessible buckets can be used without creds.+ * import --clean-duplicates: Fix bug that didn't count local or trusted+ repo's copy of a file as one of the necessary copies to allow removing+ it from the import location.+ * tahoe: Use ~/.tahoe-git-annex/ rather than ~/.tahoe/git-annex/+ when setting up a tahoe special remote to avoid old versions of+ tahoe create-client choking.+ * Fix bug that prevented enumerating locally present objects in repos+ tuned with annex.tune.objecthash1=true.+ Fixes: unused, object count in info, unannex.+ * Improve url parsing to handle some urls containing illegal []+ characters in their paths.+ * info: Added json output for "backend usage", "numcopies stats",+ "repositories containing these files", and "transfers in progress".+ * Fix incremental backup standard preferred content expression to match+ its documentation, which says it does not want files that have reached+ a backup repository.+ * Increased the default annex.bloomaccuracy from 1000 to 10000000.+ This makes git annex unused use up to 16 mb more memory than it did+ before, but the massive increase in accuracy makes this worthwhile+ for all but the smallest systems.+ * Build documentation with deterministic=1 for reproducible builds.+ (A new ikiwiki feature.) Closes: #785736+ * Re-remove dependency on obsolete hamlet package. Closes: #786659+ * debian/cabal-wrapper: Removed this hack which should not be needed anymore.++ -- Joey Hess <id@joeyh.name> Wed, 17 Jun 2015 13:50:35 -0400+ git-annex (5.20150528) unstable; urgency=medium * fromkey, registerurl: Allow urls to be specified instead of keys,
CmdLine/GitAnnex/Options.hs view
@@ -53,14 +53,22 @@ -- Options for matching on annexed keys, rather than work tree files. keyOptions :: [Option]-keyOptions = - [ Option ['A'] ["all"] (NoArg (Annex.setFlag "all"))- "operate on all versions of all files"- , Option ['U'] ["unused"] (NoArg (Annex.setFlag "unused"))- "operate on files found by last run of git-annex unused"- , Option [] ["key"] (ReqArg (Annex.setField "key") paramKey)+keyOptions = [ allOption, unusedOption, keyOption]++allOption :: Option+allOption = Option ['A'] ["all"] (NoArg (Annex.setFlag "all"))+ "operate on all versions of all files"++unusedOption :: Option+unusedOption = Option ['U'] ["unused"] (NoArg (Annex.setFlag "unused"))+ "operate on files found by last run of git-annex unused"++keyOption :: Option+keyOption = Option [] ["key"] (ReqArg (Annex.setField "key") paramKey) "operate on specified key"- ]++incompleteOption :: Option+incompleteOption = flagOption [] "incomplete" "resume previous downloads" -- Options to match properties of annexed files. annexedMatchingOptions :: [Option]
CmdLine/Seek.hs view
@@ -4,7 +4,7 @@ - the values a user passes to a command, and prepare actions operating - on them. -- - Copyright 2010-2014 Joey Hess <id@joeyh.name>+ - Copyright 2010-2015 Joey Hess <id@joeyh.name> - - Licensed under the GNU GPL version 3 or higher. -}@@ -27,6 +27,7 @@ import Logs.Location import Logs.Unused import Annex.CatFile+import Annex.Content withFilesInGit :: (FilePath -> CommandStart) -> CommandSeek withFilesInGit a params = seekActions $ prepFiltered a $@@ -163,42 +164,48 @@ withNothing a [] = seekActions $ return [a] withNothing _ _ = error "This command takes no parameters." -{- If --all is specified, or in a bare repo, runs an action on all- - known keys.- -- - If --unused is specified, runs an action on all keys found by- - the last git annex unused scan.+{- Handles the --all, --unused, --key, and --incomplete options,+ - which specify particular keys to run an action on. -- - If --key is specified, operates only on that key.+ - In a bare repo, --all is the default. -- - Otherwise, fall back to a regular CommandSeek action on+ - Otherwise falls back to a regular CommandSeek action on - whatever params were passed. -} withKeyOptions :: Bool -> (Key -> CommandStart) -> CommandSeek -> CommandSeek-withKeyOptions auto keyop fallbackop params = do+withKeyOptions auto keyop = withKeyOptions' auto $ \getkeys -> do+ matcher <- Limit.getMatcher+ seekActions $ map (process matcher) <$> getkeys+ where+ process matcher k = ifM (matcher $ MatchingKey k)+ ( keyop k+ , return Nothing+ )++withKeyOptions' :: Bool -> (Annex [Key] -> Annex ()) -> CommandSeek -> CommandSeek+withKeyOptions' auto keyop fallbackop params = do bare <- fromRepo Git.repoIsLocalBare allkeys <- Annex.getFlag "all" unused <- Annex.getFlag "unused"+ incomplete <- Annex.getFlag "incomplete" specifickey <- Annex.getField "key" when (auto && bare) $ error "Cannot use --auto in a bare repository"- case (allkeys, unused, null params, specifickey) of- (False , False , True , Nothing)+ case (allkeys, unused, incomplete, null params, specifickey) of+ (False , False , False , True , Nothing) | bare -> go auto loggedKeys | otherwise -> fallbackop params- (False , False , _ , Nothing) -> fallbackop params- (True , False , True , Nothing) -> go auto loggedKeys- (False , True , True , Nothing) -> go auto unusedKeys'- (False , False , True , Just ks) -> case file2key ks of+ (False , False , False , _ , Nothing) -> fallbackop params+ (True , False , False , True , Nothing) -> go auto loggedKeys+ (False , True , False , True , Nothing) -> go auto unusedKeys'+ (False , False , True , True , Nothing) -> go auto incompletekeys+ (False , False , False , True , Just ks) -> case file2key ks of Nothing -> error "Invalid key" Just k -> go auto $ return [k]- _ -> error "Can only specify one of file names, --all, --unused, or --key"+ _ -> error "Can only specify one of file names, --all, --unused, --key, or --incomplete" where- go True _ = error "Cannot use --auto with --all or --unused or --key"- go False a = do- matcher <- Limit.getMatcher- seekActions $ map (process matcher) <$> a- process matcher k = ifM (matcher $ MatchingKey k)- ( keyop k , return Nothing)+ go True _ = error "Cannot use --auto with --all or --unused or --key or --incomplete"+ go False getkeys = keyop getkeys+ incompletekeys = staleKeysPrune gitAnnexTmpObjectDir True prepFiltered :: (FilePath -> CommandStart) -> Annex [FilePath] -> Annex [CommandStart] prepFiltered a fs = do
Command/AddUrl.hs view
@@ -139,7 +139,7 @@ where (urlstring, downloader) = getDownloader s bad = fromMaybe (error $ "bad url " ++ urlstring) $- parseURI $ escapeURIString isUnescapedInURI urlstring+ Url.parseURIRelaxed $ urlstring go url = case downloader of QuviDownloader -> usequvi _ ->
Command/Dead.hs view
@@ -1,6 +1,6 @@ {- git-annex command -- - Copyright 2011 Joey Hess <id@joeyh.name>+ - Copyright 2011, 2015 Joey Hess <id@joeyh.name> - - Licensed under the GNU GPL version 3 or higher. -}@@ -8,12 +8,37 @@ module Command.Dead where import Command+import Common.Annex+import qualified Annex import Types.TrustLevel+import Types.Key import Command.Trust (trustCommand)+import Logs.Location+import Remote (keyLocations) cmd :: [Command]-cmd = [command "dead" (paramRepeating paramRemote) seek- SectionSetup "hide a lost repository"]+cmd = [withOptions [keyOption] $ + command "dead" (paramRepeating paramRemote) seek+ SectionSetup "hide a lost repository or key"] seek :: CommandSeek-seek = trustCommand "dead" DeadTrusted+seek ps = maybe (trustCommand "dead" DeadTrusted ps) (flip seekKey ps)+ =<< Annex.getField "key"++seekKey :: String -> CommandSeek+seekKey ks = case file2key ks of+ Nothing -> error "Invalid key"+ Just key -> withNothing (startKey key)++startKey :: Key -> CommandStart+startKey key = do+ showStart "dead" (key2file key)+ ls <- keyLocations key+ case ls of+ [] -> next $ performKey key+ _ -> error "This key is still known to be present in some locations; not marking as dead."+ +performKey :: Key -> CommandPerform+performKey key = do+ setDead key+ next $ return True
Command/FromKey.hs view
@@ -54,12 +54,20 @@ go status' rest go _ _ = error "Expected pairs of key and file on stdin, but got something else." +-- From user input to a Key.+-- User can input either a serialized key, or an url.+--+-- In some cases, an input can be parsed as both a key and as an uri.+-- For example, "WORM--a:a" parses as an uri. To disambiguate, check+-- the uri scheme, to see if it looks like the prefix of a key. This relies+-- on key backend names never containing a ':'. mkKey :: String -> Key-mkKey s = case file2key s of- Just k -> k- Nothing -> case parseURI s of- Just _u -> Backend.URL.fromUrl s Nothing- Nothing -> error $ "bad key " ++ s+mkKey s = case parseURI s of+ Just u | not (isKeyPrefix (uriScheme u)) ->+ Backend.URL.fromUrl s Nothing+ _ -> case file2key s of+ Just k -> k+ Nothing -> error $ "bad key/url " ++ s perform :: Key -> FilePath -> CommandPerform perform key file = do
Command/Fsck.hs view
@@ -99,7 +99,7 @@ , verifyDirectMode key file , checkKeySize key , checkBackend backend key (Just file)- , checkKeyNumCopies key file numcopies+ , checkKeyNumCopies key (Just file) numcopies ] {- To fsck a remote, the content is retrieved to a tmp file,@@ -125,7 +125,7 @@ [ verifyLocationLogRemote key file remote present , checkKeySizeRemote key remote localcopy , checkBackendRemote backend key remote localcopy- , checkKeyNumCopies key file numcopies+ , checkKeyNumCopies key (Just file) numcopies ] withtmp a = do pid <- liftIO getPID@@ -160,7 +160,7 @@ [ verifyLocationLog key (key2file key) , checkKeySize key , checkBackend backend key Nothing- , checkKeyNumCopies key (key2file key) numcopies+ , checkKeyNumCopies key Nothing numcopies ] check :: [Annex Bool] -> Annex Bool@@ -343,15 +343,23 @@ , return True ) -checkKeyNumCopies :: Key -> String -> NumCopies -> Annex Bool-checkKeyNumCopies key file numcopies = do+checkKeyNumCopies :: Key -> AssociatedFile -> NumCopies -> Annex Bool+checkKeyNumCopies key afile numcopies = do+ let file = fromMaybe (key2file key) afile (untrustedlocations, safelocations) <- trustPartition UnTrusted =<< Remote.keyLocations key let present = NumCopies (length safelocations) if present < numcopies- then do- ppuuids <- Remote.prettyPrintUUIDs "untrusted" untrustedlocations- warning $ missingNote file present numcopies ppuuids- return False+ then ifM (pure (isNothing afile) <&&> checkDead key)+ ( do+ showLongNote $ "This key is dead, skipping."+ return True+ , do+ ppuuids <- Remote.prettyPrintUUIDs "untrusted" untrustedlocations+ warning $ missingNote file present numcopies ppuuids+ when (fromNumCopies present == 0 && isNothing afile) $+ showLongNote "(Avoid this check by running: git annex dead --key )"+ return False+ ) else return True missingNote :: String -> NumCopies -> NumCopies -> String -> String
Command/Get.hs view
@@ -21,7 +21,8 @@ SectionCommon "make content of annexed files available"] getOptions :: [Option]-getOptions = fromOption : autoOption : jobsOption : annexedMatchingOptions ++ keyOptions+getOptions = fromOption : autoOption : jobsOption : annexedMatchingOptions+ ++ incompleteOption : keyOptions seek :: CommandSeek seek ps = do
Command/Import.hs view
@@ -144,4 +144,4 @@ (remotes, trusteduuids) <- knownCopies key untrusteduuids <- trustGet UnTrusted let tocheck = Remote.remotesWithoutUUID remotes (trusteduuids++untrusteduuids)- verifyEnoughCopies [] key need trusteduuids [] tocheck+ verifyEnoughCopies [] key need [] trusteduuids tocheck
Command/Info.hs view
@@ -5,7 +5,7 @@ - Licensed under the GNU GPL version 3 or higher. -} -{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE BangPatterns, DeriveDataTypeable #-} module Command.Info where @@ -16,7 +16,6 @@ import Data.Ord import Common.Annex-import qualified Command.Unused import qualified Git import qualified Annex import qualified Remote@@ -38,6 +37,9 @@ import Types.TrustLevel import Types.FileMatcher import qualified Limit+import Messages.JSON (DualDisp(..))+import Annex.BloomFilter+import qualified Command.Unused -- a named computation that produces a statistic type Stat = StatState (Maybe (String, StatState String))@@ -59,8 +61,8 @@ instance Show Variance where show (Variance n)- | n >= 0 = "numcopies +" ++ show n- | otherwise = "numcopies " ++ show n+ | n >= 0 = "+" ++ show n+ | otherwise = show n -- cached info that multiple Stats use data StatInfo = StatInfo@@ -221,10 +223,10 @@ nostat = return Nothing json :: JSON j => (j -> String) -> StatState j -> String -> StatState String-json serialize a desc = do+json fmt a desc = do j <- a lift $ maybeShowJSON [(desc, j)]- return $ serialize j+ return $ fmt j nojson :: StatState String -> String -> StatState String nojson a _ = a@@ -251,11 +253,16 @@ us <- filter (/= NoUUID) . M.keys <$> (M.union <$> uuidMap <*> remoteMap Remote.name) rs <- fst <$> trustPartition level us- s <- prettyPrintUUIDs n rs- return $ if null s then "0" else show (length rs) ++ "\n" ++ beginning s+ countRepoList (length rs)+ -- This also handles json display.+ <$> prettyPrintUUIDs n rs where n = showTrustLevel level ++ " repositories"- ++countRepoList :: Int -> String -> String+countRepoList _ [] = "0"+countRepoList n s = show n ++ "\n" ++ beginning s+ dir_name :: FilePath -> Stat dir_name dir = simpleStat "directory" $ pure dir @@ -324,29 +331,31 @@ bloom_info :: Stat bloom_info = simpleStat "bloom filter size" $ do localkeys <- countKeys <$> cachedPresentData- capacity <- fromIntegral <$> lift Command.Unused.bloomCapacity+ capacity <- fromIntegral <$> lift bloomCapacity let note = aside $ if localkeys >= capacity then "appears too small for this repository; adjust annex.bloomcapacity" else showPercentage 1 (percentage capacity localkeys) ++ " full" - -- Two bloom filters are used at the same time, so double the size- -- of one.+ -- Two bloom filters are used at the same time when running+ -- git-annex unused, so double the size of one. sizer <- lift mkSizer size <- sizer memoryUnits False . (* 2) . fromIntegral . fst <$>- lift Command.Unused.bloomBitsHashes+ lift bloomBitsHashes return $ size ++ note transfer_list :: Stat-transfer_list = stat "transfers in progress" $ nojson $ lift $ do+transfer_list = stat desc $ nojson $ lift $ do uuidmap <- Remote.remoteMap id ts <- getTransfers+ maybeShowJSON [(desc, map (uncurry jsonify) ts)] return $ if null ts then "none" else multiLine $ map (uncurry $ line uuidmap) $ sort ts where+ desc = "transfers in progress" line uuidmap t i = unwords [ showLcDirection (transferDirection t) ++ "ing" , fromMaybe (key2file $ transferKey t) (associatedFile i)@@ -354,6 +363,12 @@ , maybe (fromUUID $ transferUUID t) Remote.name $ M.lookup (transferUUID t) uuidmap ]+ jsonify t i = toJSObject+ [ ("transfer", showLcDirection (transferDirection t))+ , ("key", key2file (transferKey t))+ , ("file", fromMaybe "" (associatedFile i))+ , ("remote", fromUUID (transferUUID t))+ ] disk_size :: Stat disk_size = simpleStat "available local disk space" $ lift $@@ -374,42 +389,41 @@ | otherwise = 0 backend_usage :: Stat-backend_usage = stat "backend usage" $ nojson $+backend_usage = stat "backend usage" $ json fmt $ calc <$> (backendsKeys <$> cachedReferencedData) <*> (backendsKeys <$> cachedPresentData) where- calc x y = multiLine $- map (\(n, b) -> b ++ ": " ++ show n) $- sortBy (flip compare) $ map swap $ M.toList $- M.unionWith (+) x y+ calc x y = sort $ M.toList $ M.unionWith (+) x y+ fmt = multiLine . map (\(n, b) -> b ++ ": " ++ show n) . map swap numcopies_stats :: Stat-numcopies_stats = stat "numcopies stats" $ nojson $+numcopies_stats = stat "numcopies stats" $ json fmt $ calc <$> (maybe M.empty numCopiesVarianceMap <$> cachedNumCopiesStats) where- calc = multiLine- . map (\(variance, count) -> show variance ++ ": " ++ show count)- . sortBy (flip (comparing snd)) . M.toList+ calc = map (\(variance, count) -> (show variance, count)) + . sortBy (flip (comparing snd))+ . M.toList+ fmt = multiLine . map (\(variance, count) -> "numcopies " ++ variance ++ ": " ++ show count) reposizes_stats :: Stat-reposizes_stats = stat "repositories containing these files" $ nojson $- calc- <$> lift uuidDescriptions- <*> lift mkSizer- <*> cachedRepoData+reposizes_stats = stat desc $ nojson $ do+ sizer <- lift mkSizer+ l <- map (\(u, kd) -> (u, sizer storageUnits True (sizeKeys kd)))+ . sortBy (flip (comparing (sizeKeys . snd)))+ . M.toList+ <$> cachedRepoData+ let maxlen = maximum (map (length . snd) l)+ -- This also handles json display.+ s <- lift $ prettyPrintUUIDsWith (Just "size") desc $+ map (\(u, sz) -> (u, Just $ mkdisp sz maxlen)) l+ return $ countRepoList (length l) s where- calc descm sizer = multiLine- . format- . map (\(u, d) -> line descm sizer u d)- . sortBy (flip (comparing (sizeKeys . snd))) . M.toList- line descm sizer u d = (sz, fromUUID u ++ " -- " ++ desc)- where- sz = sizer storageUnits True (sizeKeys d)- desc = fromMaybe "" (M.lookup u descm)- format l = map (\(c1, c2) -> lpad maxc1 c1 ++ ": " ++ c2 ) l- where- maxc1 = maximum (map (length . fst) l)+ desc = "repositories containing these files"+ mkdisp sz maxlen = DualDisp+ { dispNormal = lpad maxlen sz+ , dispJson = sz+ } lpad n s = (replicate (n - length s) ' ') ++ s cachedPresentData :: StatState KeyData
Command/Log.hs view
@@ -148,7 +148,11 @@ config <- Annex.getGitConfig let logfile = p </> locationLogFile config key inRepo $ pipeNullSplitZombie $- [ Params "log -z --pretty=format:%ct --raw --abbrev=40"+ [ Param "log"+ , Param "-z"+ , Param "--pretty=format:%ct"+ , Param "-raw"+ , Param "--abbrev=40" , Param "--remove-empty" ] ++ os ++ [ Param $ Git.fromRef Annex.Branch.fullname
Command/Sync.hs view
@@ -45,6 +45,8 @@ import Logs.UUID import Annex.AutoMerge import Annex.Ssh+import Annex.BloomFilter+import Utility.Bloom import Control.Concurrent.MVar import qualified Data.Map as M@@ -58,6 +60,7 @@ syncOptions = [ contentOption , messageOption+ , allOption ] contentOption :: Option@@ -355,6 +358,31 @@ , return True ) +{- Without --all, only looks at files in the work tree. With --all,+ - makes 2 passes, first looking at the work tree and then all keys.+ - This ensures that preferred content expressions that match on+ - filenames work, even when in --all mode.+ -+ - If any file movements were generated, returns true.+ -}+seekSyncContent :: [Remote] -> Annex Bool+seekSyncContent rs = do+ mvar <- liftIO newEmptyMVar+ bloom <- ifM (Annex.getFlag "all")+ ( Just <$> genBloomFilter (seekworktree mvar [])+ , seekworktree mvar [] (const noop) >> pure Nothing+ )+ withKeyOptions' False (seekkeys mvar bloom) (const noop) []+ liftIO $ not <$> isEmptyMVar mvar+ where+ seekworktree mvar l bloomfeeder = seekHelper LsFiles.inRepo l >>=+ mapM_ (\f -> ifAnnexed f (go (Right bloomfeeder) mvar (Just f)) noop)+ seekkeys mvar bloom getkeys =+ mapM_ (go (Left bloom) mvar Nothing) =<< getkeys+ go ebloom mvar af k = do+ void $ liftIO $ tryPutMVar mvar ()+ syncFile ebloom rs af k+ {- If it's preferred content, and we don't have it, get it from one of the - listed remotes (preferring the cheaper earlier ones). -@@ -365,21 +393,9 @@ - - Drop it from each remote that has it, where it's not preferred content - (honoring numcopies).- -- - If any file movements were generated, returns true. -}-seekSyncContent :: [Remote] -> Annex Bool-seekSyncContent rs = do- mvar <- liftIO newEmptyMVar- mapM_ (go mvar) =<< seekHelper LsFiles.inRepo []- liftIO $ not <$> isEmptyMVar mvar- where- go mvar f = ifAnnexed f- (\v -> void (liftIO (tryPutMVar mvar ())) >> syncFile rs f v)- noop--syncFile :: [Remote] -> FilePath -> Key -> Annex ()-syncFile rs f k = do+syncFile :: Either (Maybe (Bloom Key)) (Key -> Annex ()) -> [Remote] -> AssociatedFile -> Key -> Annex ()+syncFile ebloom rs af k = do locs <- loggedLocations k let (have, lack) = partition (\r -> Remote.uuid r `elem` locs) rs @@ -389,33 +405,48 @@ u <- getUUID let locs' = concat [[u | got], putrs, locs] - -- Using callCommandAction rather than includeCommandAction for drops,- -- because a failure to drop does not mean the sync failed.- handleDropsFrom locs' rs "unwanted" True k (Just f)- Nothing callCommandAction+ -- A bloom filter is populated with all the keys in the first pass.+ -- On the second pass, avoid dropping keys that were seen in the+ -- first pass, which would happen otherwise when preferred content+ -- matches on the filename, which is not available in the second+ -- pass.+ --+ -- When there's a false positive in the bloom filter, the result+ -- is keeping a key that preferred content doesn't really want.+ seenbloom <- case ebloom of+ Left Nothing -> pure False+ Left (Just bloom) -> pure (elemB k bloom)+ Right bloomfeeder -> bloomfeeder k >> return False+ unless seenbloom $+ -- Using callCommandAction rather than+ -- includeCommandAction for drops,+ -- because a failure to drop does not mean+ -- the sync failed.+ handleDropsFrom locs' rs "unwanted" True k af+ Nothing callCommandAction where wantget have = allM id [ pure (not $ null have) , not <$> inAnnex k- , wantGet True (Just k) (Just f)+ , wantGet True (Just k) af ] handleget have = ifM (wantget have) ( return [ get have ] , return [] ) get have = includeCommandAction $ do- showStart "get" f- next $ next $ getViaTmp k $ \dest -> getKeyFile' k (Just f) dest have+ showStart' "get" k af+ next $ next $ getViaTmp k $ \dest -> getKeyFile' k af dest have wantput r | Remote.readonly r || remoteAnnexReadOnly (Remote.gitconfig r) = return False- | otherwise = wantSend True (Just k) (Just f) (Remote.uuid r)+ | otherwise = wantSend True (Just k) af (Remote.uuid r) handleput lack = ifM (inAnnex k) ( map put <$> filterM wantput lack , return [] ) put dest = do ok <- includeCommandAction $ do- showStart "copy" f- Command.Move.toStart' dest False (Just f) k+ showStart' "copy" k af+ Command.Move.toStart' dest False af k return (ok, if ok then Just (Remote.uuid dest) else Nothing)
Command/Unannex.hs view
@@ -72,7 +72,14 @@ performIndirect :: FilePath -> Key -> CommandPerform performIndirect file key = do liftIO $ removeFile file- inRepo $ Git.Command.run [Params "rm --cached --force --quiet --", File file]+ inRepo $ Git.Command.run+ [ Param "rm"+ , Param "--cached"+ , Param "--force"+ , Param "--quiet"+ , Param "--"+ , File file+ ] next $ cleanupIndirect file key cleanupIndirect :: FilePath -> Key -> CommandCleanup@@ -108,7 +115,14 @@ performDirect :: FilePath -> Key -> CommandPerform performDirect file key = do -- --force is needed when the file is not committed- inRepo $ Git.Command.run [Params "rm --cached --force --quiet --", File file]+ inRepo $ Git.Command.run+ [ Param "rm"+ , Param "--cached"+ , Param "--force"+ , Param "--quiet"+ , Param "--"+ , File file+ ] next $ cleanupDirect file key {- The direct mode file is not touched during unannex, so the content
Command/Uninit.hs view
@@ -37,7 +37,7 @@ where current_branch = Git.Ref . Prelude.head . lines <$> revhead revhead = inRepo $ Git.Command.pipeReadStrict- [Params "rev-parse --abbrev-ref HEAD"]+ [Param "rev-parse", Param "--abbrev-ref", Param "HEAD"] seek :: CommandSeek seek ps = do
Command/Unused.hs view
@@ -9,8 +9,6 @@ module Command.Unused where -import qualified Data.Set as S-import Control.Monad.ST import qualified Data.Map as M import Common.Annex@@ -18,7 +16,6 @@ import Logs.Unused import Annex.Content import Logs.Location-import Logs.Transfer import qualified Annex import qualified Git import qualified Git.Command@@ -34,7 +31,7 @@ import Types.RefSpec import Git.FilePath import Logs.View (is_branchView)-import Utility.Bloom+import Annex.BloomFilter cmd :: [Command] cmd = [withOptions [unusedFromOption, refSpecOption] $@@ -170,62 +167,10 @@ excludeReferenced refspec ks = runfilter firstlevel ks >>= runfilter secondlevel where runfilter _ [] = return [] -- optimisation- runfilter a l = bloomFilter show l <$> genBloomFilter show a+ runfilter a l = bloomFilter l <$> genBloomFilter a firstlevel = withKeysReferencedM secondlevel = withKeysReferencedInGit refspec -{- Finds items in the first, smaller list, that are not- - present in the second, larger list.- - - - Constructing a single set, of the list that tends to be- - smaller, appears more efficient in both memory and CPU- - than constructing and taking the S.difference of two sets. -}-exclude :: Ord a => [a] -> [a] -> [a]-exclude [] _ = [] -- optimisation-exclude smaller larger = S.toList $ remove larger $ S.fromList smaller- where- remove a b = foldl (flip S.delete) b a--{- A bloom filter capable of holding half a million keys with a- - false positive rate of 1 in 1000 uses around 8 mb of memory,- - so will easily fit on even my lowest memory systems.- -}-bloomCapacity :: Annex Int-bloomCapacity = fromMaybe 500000 . annexBloomCapacity <$> Annex.getGitConfig-bloomAccuracy :: Annex Int-bloomAccuracy = fromMaybe 1000 . annexBloomAccuracy <$> Annex.getGitConfig-bloomBitsHashes :: Annex (Int, Int)-bloomBitsHashes = do- capacity <- bloomCapacity- accuracy <- bloomAccuracy- case safeSuggestSizing capacity (1 / fromIntegral accuracy) of- Left e -> do- warning $ "bloomfilter " ++ e ++ "; falling back to sane value"- -- precaulculated value for 500000 (1/1000)- return (8388608,10)- Right v -> return v--{- Creates a bloom filter, and runs an action, such as withKeysReferenced,- - to populate it.- -- - The action is passed a callback that it can use to feed values into the- - bloom filter. - -- - Once the action completes, the mutable filter is frozen- - for later use.- -}-genBloomFilter :: Hashable t => (v -> t) -> ((v -> Annex ()) -> Annex b) -> Annex (Bloom t)-genBloomFilter convert populate = do- (numbits, numhashes) <- bloomBitsHashes- bloom <- lift $ newMB (cheapHashes numhashes) numbits- _ <- populate $ \v -> lift $ insertMB bloom (convert v)- lift $ unsafeFreezeMB bloom- where- lift = liftIO . stToIO--bloomFilter :: Hashable t => (v -> t) -> [v] -> Bloom t -> [v]-bloomFilter convert l bloom = filter (\k -> convert k `notElemB` bloom) l- {- Given an initial value, folds it with each key referenced by - symlinks in the git repo. -} withKeysReferenced :: v -> (Key -> v -> v) -> Annex v@@ -312,28 +257,6 @@ tKey True = Backend.lookupFile . getTopFilePath . DiffTree.file tKey False = fileKey . takeFileName . decodeBS <$$> catFile ref . getTopFilePath . DiffTree.file--{- Looks in the specified directory for bad/tmp keys, and returns a list- - of those that might still have value, or might be stale and removable.- - - - Also, stale keys that can be proven to have no value are deleted.- -}-staleKeysPrune :: (Git.Repo -> FilePath) -> Bool -> Annex [Key]-staleKeysPrune dirspec nottransferred = do- contents <- dirKeys dirspec- - dups <- filterM inAnnex contents- let stale = contents `exclude` dups-- dir <- fromRepo dirspec- liftIO $ forM_ dups $ \t -> removeFile $ dir </> keyFile t-- if nottransferred- then do- inprogress <- S.fromList . map (transferKey . fst)- <$> getTransfers- return $ filter (`S.notMember` inprogress) stale- else return stale data UnusedMaps = UnusedMaps { unusedMap :: UnusedMap
Creds.hs view
@@ -9,8 +9,9 @@ module Types.Creds, CredPairStorage(..), setRemoteCredPair,- getRemoteCredPairFor, getRemoteCredPair,+ getRemoteCredPairFor,+ warnMissingCredPairFor, getEnvCredPair, writeCacheCreds, readCacheCreds,@@ -74,18 +75,6 @@ {- Gets a remote's credpair, from the environment if set, otherwise - from the cache in gitAnnexCredsDir, or failing that, from the - value in RemoteConfig. -}-getRemoteCredPairFor :: String -> RemoteConfig -> CredPairStorage -> Annex (Maybe CredPair)-getRemoteCredPairFor this c storage = maybe missing (return . Just) =<< getRemoteCredPair c storage- where- (loginvar, passwordvar) = credPairEnvironment storage- missing = do- warning $ unwords- [ "Set both", loginvar- , "and", passwordvar- , "to use", this- ]- return Nothing- getRemoteCredPair :: RemoteConfig -> CredPairStorage -> Annex (Maybe CredPair) getRemoteCredPair c storage = maybe fromcache (return . Just) =<< fromenv where@@ -121,6 +110,23 @@ return $ Just credpair _ -> error "bad creds"++getRemoteCredPairFor :: String -> RemoteConfig -> CredPairStorage -> Annex (Maybe CredPair)+getRemoteCredPairFor this c storage = go =<< getRemoteCredPair c storage+ where+ go Nothing = do+ warnMissingCredPairFor this storage+ return Nothing+ go (Just credpair) = return $ Just credpair++warnMissingCredPairFor :: String -> CredPairStorage -> Annex ()+warnMissingCredPairFor this storage = warning $ unwords+ [ "Set both", loginvar+ , "and", passwordvar+ , "to use", this+ ]+ where+ (loginvar, passwordvar) = credPairEnvironment storage {- Gets a CredPair from the environment. -} getEnvCredPair :: CredPairStorage -> IO (Maybe CredPair)
Git/CheckAttr.hs view
@@ -30,7 +30,8 @@ where params = [ Param "check-attr" - , Params "-z --stdin"+ , Param "-z"+ , Param "--stdin" ] ++ map Param attrs ++ [ Param "--" ]
Git/CheckIgnore.hs view
@@ -43,7 +43,10 @@ where params = [ Param "check-ignore" - , Params "-z --stdin --verbose --non-matching"+ , Param "-z"+ , Param "--stdin"+ , Param "--verbose"+ , Param "--non-matching" ] repo' = repo { gitGlobalOpts = filter (not . pathspecs) (gitGlobalOpts repo) } pathspecs (Param "--literal-pathspecs") = True
Git/DiffTree.hs view
@@ -78,7 +78,13 @@ (diff, cleanup) <- pipeNullSplit ps repo return (parseDiffRaw diff, cleanup) where- ps = command : Params "-z --raw --no-renames -l0" : params+ ps = + command :+ Param "-z" :+ Param "--raw" :+ Param "--no-renames" :+ Param "-l0" :+ params {- Parses --raw output used by diff-tree and git-log. -} parseDiffRaw :: [String] -> [DiffTreeItem]
Git/LsFiles.hs view
@@ -35,14 +35,23 @@ {- Scans for files that are checked into git at the specified locations. -} inRepo :: [FilePath] -> Repo -> IO ([FilePath], IO Bool)-inRepo l = pipeNullSplit $ Params "ls-files --cached -z --" : map File l+inRepo l = pipeNullSplit $ + Param "ls-files" :+ Param "--cached" :+ Param "-z" :+ Param "--" :+ map File l {- Scans for files at the specified locations that are not checked into git. -} notInRepo :: Bool -> [FilePath] -> Repo -> IO ([FilePath], IO Bool) notInRepo include_ignored l repo = pipeNullSplit params repo where- params = [Params "ls-files --others"] ++ exclude ++- [Params "-z --"] ++ map File l+ params = concat+ [ [ Param "ls-files", Param "--others"]+ , exclude+ , [ Param "-z", Param "--" ]+ , map File l+ ] exclude | include_ignored = [] | otherwise = [Param "--exclude-standard"]@@ -50,28 +59,51 @@ {- Finds all files in the specified locations, whether checked into git or - not. -} allFiles :: [FilePath] -> Repo -> IO ([FilePath], IO Bool)-allFiles l = pipeNullSplit $ Params "ls-files --cached --others -z --" : map File l+allFiles l = pipeNullSplit $+ Param "ls-files" :+ Param "--cached" :+ Param "--others" :+ Param "-z" :+ Param "--" :+ map File l {- Returns a list of files in the specified locations that have been - deleted. -} deleted :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) deleted l repo = pipeNullSplit params repo where- params = [Params "ls-files --deleted -z --"] ++ map File l+ params =+ Param "ls-files" :+ Param "--deleted" :+ Param "-z" :+ Param "--" :+ map File l {- Returns a list of files in the specified locations that have been - modified. -} modified :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) modified l repo = pipeNullSplit params repo where- params = [Params "ls-files --modified -z --"] ++ map File l+ params = + Param "ls-files" :+ Param "--modified" :+ Param "-z" :+ Param "--" :+ map File l {- Files that have been modified or are not checked into git (and are not - ignored). -} modifiedOthers :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) modifiedOthers l repo = pipeNullSplit params repo where- params = [Params "ls-files --modified --others --exclude-standard -z --"] ++ map File l+ params = + Param "ls-files" :+ Param "--modified" :+ Param "--others" :+ Param "--exclude-standard" :+ Param "-z" :+ Param "--" :+ map File l {- Returns a list of all files that are staged for commit. -} staged :: [FilePath] -> Repo -> IO ([FilePath], IO Bool)@@ -85,7 +117,7 @@ staged' :: [CommandParam] -> [FilePath] -> Repo -> IO ([FilePath], IO Bool) staged' ps l = pipeNullSplit $ prefix ++ ps ++ suffix where- prefix = [Params "diff --cached --name-only -z"]+ prefix = [Param "diff", Param "--cached", Param "--name-only", Param "-z"] suffix = Param "--" : map File l type StagedDetails = (FilePath, Maybe Sha, Maybe FileMode)@@ -93,7 +125,7 @@ {- Returns details about files that are staged in the index, - as well as files not yet in git. Skips ignored files. -} stagedOthersDetails :: [FilePath] -> Repo -> IO ([StagedDetails], IO Bool)-stagedOthersDetails = stagedDetails' [Params "--others --exclude-standard"]+stagedOthersDetails = stagedDetails' [Param "--others", Param "--exclude-standard"] {- Returns details about all files that are staged in the index. -} stagedDetails :: [FilePath] -> Repo -> IO ([StagedDetails], IO Bool)@@ -106,7 +138,7 @@ (ls, cleanup) <- pipeNullSplit params repo return (map parse ls, cleanup) where- params = Params "ls-files --stage -z" : ps ++ + params = Param "ls-files" : Param "--stage" : Param "-z" : ps ++ Param "--" : map File l parse s | null file = (s, Nothing, Nothing)@@ -135,7 +167,12 @@ currdir <- getCurrentDirectory return (map (\f -> relPathDirToFileAbs currdir $ top </> f) fs, cleanup) where- prefix = [Params "diff --name-only --diff-filter=T -z"]+ prefix = + [ Param "diff"+ , Param "--name-only"+ , Param "--diff-filter=T"+ , Param "-z"+ ] suffix = Param "--" : (if null l then [File "."] else map File l) {- A item in conflict has two possible values.@@ -166,7 +203,12 @@ (fs, cleanup) <- pipeNullSplit params repo return (reduceUnmerged [] $ catMaybes $ map parseUnmerged fs, cleanup) where- params = Params "ls-files --unmerged -z --" : map File l+ params = + Param "ls-files" :+ Param "--unmerged" :+ Param "-z" :+ Param "--" :+ map File l data InternalUnmerged = InternalUnmerged { isus :: Bool
Git/LsTree.hs view
@@ -37,13 +37,26 @@ <$> pipeNullSplitZombie (lsTreeParams t) repo lsTreeParams :: Ref -> [CommandParam]-lsTreeParams t = [ Params "ls-tree --full-tree -z -r --", File $ fromRef t ]+lsTreeParams t =+ [ Param "ls-tree"+ , Param "--full-tree"+ , Param "-z"+ , Param "-r"+ , Param "--"+ , File $ fromRef t+ ] {- Lists specified files in a tree. -} lsTreeFiles :: Ref -> [FilePath] -> Repo -> IO [TreeItem] lsTreeFiles t fs repo = map parseLsTree <$> pipeNullSplitStrict ps repo where- ps = [Params "ls-tree --full-tree -z --", File $ fromRef t] ++ map File fs+ ps =+ [ Param "ls-tree"+ , Param "--full-tree"+ , Param "-z"+ , Param "--"+ , File $ fromRef t+ ] ++ map File fs {- Parses a line of ls-tree output. - (The --long format is not currently supported.) -}
Git/Repair.hs view
@@ -99,7 +99,7 @@ retrieveMissingObjects missing referencerepo r | not (foundBroken missing) = return missing | otherwise = withTmpDir "tmprepo" $ \tmpdir -> do- unlessM (boolSystem "git" [Params "init", File tmpdir]) $+ unlessM (boolSystem "git" [Param "init", File tmpdir]) $ error $ "failed to create temp repository in " ++ tmpdir tmpr <- Config.read =<< Construct.fromAbsPath tmpdir stillmissing <- pullremotes tmpr (remotes r) fetchrefstags missing@@ -140,7 +140,9 @@ ps' = [ Param "fetch" , Param fetchurl- , Params "--force --update-head-ok --quiet"+ , Param "--force"+ , Param "--update-head-ok"+ , Param "--quiet" ] ++ ps fetchr' = fetchr { gitGlobalOpts = gitGlobalOpts fetchr ++ nogc } nogc = [ Param "-c", Param "gc.auto=0" ]
INSTALL view
@@ -19,6 +19,8 @@ [[Windows]] | [download installer](https://downloads.kitenet.net/git-annex/windows/current/) **beta** """]] +Note: [[todo/git-annex_in_debian_sid]] is somewhat outdated, which makes the above Debian and Ubuntu release not quite up to date. The [NeuroDebian team](http://neuro.debian.net/) provides a [standalone build package](http://neuro.debian.net/pkgs/git-annex-standalone.html) that is regularly updated and that should work across all releases of Ubuntu and Debian. See [[todo/git-annex-standalone_Debian_package/]] for more information.+ All the download links above use https for security. For added security, see [[verifying_downloads]]. @@ -30,5 +32,5 @@ ## See also --[[autobuild overview|builds]]+ * [[autobuild overview|builds]]+ * [[upgrades]]
Limit.hs view
@@ -193,6 +193,10 @@ limitUnused _ (MatchingFile _) = return False limitUnused _ (MatchingKey k) = S.member k <$> unusedKeys +{- Limit that matches any version of any file. -}+limitAnything :: MatchFiles Annex+limitAnything _ _ = return True+ {- Adds a limit to skip files not believed to be present in all - repositories in the specified group. -} addInAllGroup :: String -> Annex ()
Locations.hs view
@@ -13,6 +13,7 @@ annexDir, objectDir, gitAnnexLocation,+ gitAnnexLocationDepth, gitAnnexLink, gitAnnexContentLock, gitAnnexMapping,@@ -115,6 +116,13 @@ annexLocation :: GitConfig -> Key -> (HashLevels -> Hasher) -> FilePath annexLocation config key hasher = objectDir </> keyPath key (hasher $ objectHashLevels config) +{- Number of subdirectories from the gitAnnexObjectDir+ - to the gitAnnexLocation. -}+gitAnnexLocationDepth :: GitConfig -> Int+gitAnnexLocationDepth config = hashlevels + 1+ where+ HashLevels hashlevels = objectHashLevels config+ {- Annexed object's location in a repository. - - When there are multiple possible locations, returns the one where the@@ -136,13 +144,11 @@ - Repositories on filesystems that are crippled also use - hashDirLower, since they do not use symlinks and it's - more portable.- -- - ObjectHashLower can also be set to force it. -}- | Git.repoIsLocalBare r - || crippled - || hasDifference ObjectHashLower (annexDifferences config) =- check $ map inrepo $ annexLocations config key+ | Git.repoIsLocalBare r || crippled =+ check $ map inrepo $ annexLocations config key+ | hasDifference ObjectHashLower (annexDifferences config) =+ return $ inrepo $ annexLocation config key hashDirLower {- Non-bare repositories only use hashDirMixed, so - don't need to do any work to check if the file is - present. -}
Logs/Difference.hs view
@@ -23,10 +23,10 @@ import Logs.Difference.Pure recordDifferences :: Differences -> UUID -> Annex ()-recordDifferences (Differences differences) uuid = do+recordDifferences ds@(Differences {}) uuid = do ts <- liftIO getPOSIXTime Annex.Branch.change differenceLog $- showLog id . changeLog ts uuid (show differences) . parseLog Just+ showLog id . changeLog ts uuid (showDifferences ds) . parseLog Just recordDifferences UnknownDifferences _ = return () -- Map of UUIDs that have Differences recorded.
Logs/Location.hs view
@@ -8,7 +8,7 @@ - Repositories record their UUID and the date when they --get or --drop - a value. - - - Copyright 2010-2014 Joey Hess <id@joeyh.name>+ - Copyright 2010-2015 Joey Hess <id@joeyh.name> - - Licensed under the GNU GPL version 3 or higher. -}@@ -19,7 +19,8 @@ logChange, loggedLocations, loggedLocationsHistorical,- locationLog,+ checkDead,+ setDead, loggedKeys, loggedKeysFor, ) where@@ -32,6 +33,8 @@ import Git.Types (RefDate) import qualified Annex +import Data.Time.Clock+ {- Log a change in the presence of a key's value in current repository. -} logStatus :: Key -> LogStatus -> Annex () logStatus key s = do@@ -62,10 +65,35 @@ config <- Annex.getGitConfig map toUUID <$> getter (locationLogFile config key) -locationLog :: Key -> Annex [LogLine]-locationLog key = do+{- For a key to be dead, all locations that have location status for the key+ - must have InfoDead set. -}+checkDead :: Key -> Annex Bool+checkDead key = do config <- Annex.getGitConfig- currentLog (locationLogFile config key)+ ls <- compactLog <$> readLog (locationLogFile config key)+ return $ all (\l -> status l == InfoDead) ls++{- Updates the log to say that a key is dead. + - + - Changes all logged lines for the key, in any location, that are+ - currently InfoMissing, to be InfoDead.+ -}+setDead :: Key -> Annex ()+setDead key = do+ config <- Annex.getGitConfig+ let logfile = locationLogFile config key+ ls <- compactLog <$> readLog logfile+ mapM_ (go logfile) (filter (\l -> status l == InfoMissing) ls)+ where+ go logfile l = addLog logfile $ setDead' l++{- Note that the timestamp in the log is updated minimally, so that this+ - can be overruled by other location log changes. -}+setDead' :: LogLine -> LogLine+setDead' l = l+ { status = InfoDead+ , date = date l + realToFrac (picosecondsToDiffTime 1)+ } {- Finds all keys that have location log information. - (There may be duplicate keys in the list.) -}
Logs/MetaData.hs view
@@ -24,7 +24,6 @@ -} {-# OPTIONS_GHC -fno-warn-orphans #-}-{-# LANGUAGE CPP #-} module Logs.MetaData ( getCurrentMetaData,@@ -157,11 +156,7 @@ else s _ -> s where-#if MIN_VERSION_containers(0,5,0) sl = S.toDescList s-#else- sl = reverse (S.toAscList s)-#endif go c _ [] = c go c newer (l:ls)
Logs/PreferredContent.hs view
@@ -20,6 +20,7 @@ setStandardGroup, defaultStandardGroup, preferredRequiredMapsLoad,+ prop_standardGroups_parse, ) where import qualified Data.Map as M@@ -151,3 +152,8 @@ where hasgroup = not . S.null <$> lookupGroups u haspc = isJust . M.lookup u <$> preferredContentMap++prop_standardGroups_parse :: Bool+prop_standardGroups_parse = + all (isNothing . checkPreferredContentExpression . standardPreferredContent)+ [ minBound .. maxBound]
Logs/Presence/Pure.hs view
@@ -20,7 +20,7 @@ info :: String } deriving (Eq, Show) -data LogStatus = InfoPresent | InfoMissing+data LogStatus = InfoPresent | InfoMissing | InfoDead deriving (Eq, Show, Bounded, Enum) {- Parses a log file. Unparseable lines are ignored. -}@@ -38,6 +38,7 @@ parseStatus :: String -> Maybe LogStatus parseStatus "1" = Just InfoPresent parseStatus "0" = Just InfoMissing+parseStatus "X" = Just InfoDead parseStatus _ = Nothing {- Generates a log file. -}@@ -47,6 +48,7 @@ genline (LogLine d s i) = unwords [show d, genstatus s, i] genstatus InfoPresent = "1" genstatus InfoMissing = "0"+ genstatus InfoDead = "X" {- Given a log, returns only the info that is are still in effect. -} getLog :: String -> [String]
Makefile view
@@ -62,7 +62,7 @@ # If ikiwiki is available, build static html docs suitable for being # shipped in the software package. ifeq ($(shell which ikiwiki),)-IKIWIKI=@echo "** ikiwiki not found, skipping building docs" >&2; true+IKIWIKI=echo "** ikiwiki not found, skipping building docs" >&2; true else IKIWIKI=ikiwiki endif@@ -73,10 +73,11 @@ mkdir -p man docs: mans- TZ=UTC $(IKIWIKI) doc html -v --wikiname git-annex --plugin=goodstuff \+ LC_ALL=C TZ=UTC $(IKIWIKI) doc html -v --wikiname git-annex \+ --plugin=goodstuff \ --no-usedirs --disable-plugin=openid --plugin=sidebar \- --underlaydir=/dev/null --disable-plugin=shortcut \- --disable-plugin=smiley \+ --underlaydir=/dev/null --set deterministic=1 \+ --disable-plugin=shortcut --disable-plugin=smiley \ --plugin=comments --set comments_pagespec="*" \ --exclude='news/.*' --exclude='design/assistant/blog/*' \ --exclude='bugs/*' --exclude='todo/*' --exclude='forum/*' \@@ -93,15 +94,15 @@ find . -name \*.hi -exec rm {} \; Build/InstallDesktopFile: Build/InstallDesktopFile.hs- $(GHC) --make $@ -Wall+ $(GHC) --make $@ -Wall -fno-warn-tabs Build/EvilSplicer: Build/EvilSplicer.hs- $(GHC) --make $@ -Wall+ $(GHC) --make $@ -Wall -fno-warn-tabs Build/Standalone: Build/Standalone.hs Build/SysConfig.hs- $(GHC) --make $@ -Wall+ $(GHC) --make $@ -Wall -fno-warn-tabs Build/OSXMkLibs: Build/OSXMkLibs.hs- $(GHC) --make $@ -Wall+ $(GHC) --make $@ -Wall -fno-warn-tabs Build/LinuxMkLibs: Build/LinuxMkLibs.hs- $(GHC) --make $@ -Wall+ $(GHC) --make $@ -Wall -fno-warn-tabs sdist: clean mans ./Build/make-sdist.sh@@ -138,7 +139,7 @@ cd tmp/git-annex.linux && find . -type f > git-annex.MANIFEST cd tmp/git-annex.linux && find . -type l >> git-annex.MANIFEST- cd tmp && tar czf git-annex-standalone-$(shell dpkg --print-architecture).tar.gz git-annex.linux+ cd tmp && tar c git-annex.linux | gzip -9 --rsyncable > git-annex-standalone-$(shell dpkg --print-architecture).tar.gz # Run this target to build git-annex-standalone*.deb debianstandalone: dpkg-buildpackage-F@@ -155,6 +156,9 @@ git checkout debian/changelog quilt pop -a || true +commit-standalone:+ QUILT_PATCHES=debian/patches QUILT_SERIES=series.standalone-build quilt refresh+ dpkg-buildpackage%: prep-standalone umask 022; dpkg-buildpackage -rfakeroot $* $(MAKE) undo-standalone@@ -191,35 +195,6 @@ 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-# versions of TH splice generating packages as the arm system installed.-no-th-webapp-stage1: Build/EvilSplicer- echo "Running throwaway build, to get TH splices.."- if [ ! -e dist/setup/setup ]; then $(CABAL) configure -f-Production -O0; fi- mkdir -p tmp- if ! $(CABAL) build --ghc-options=-ddump-splices 2> tmp/dump-splices; then tail tmp/dump-splices >&2; exit 1; fi- echo "Setting up no-th build tree.."- ./Build/EvilSplicer tmp/splices tmp/dump-splices standalone/no-th/evilsplicer-headers.hs- rsync -az --exclude tmp --exclude dist . tmp/no-th-tree-# Copy the files with expanded splices to the source tree, but-# only if the existing source file is not newer. (So, if a file-# used to have TH splices but they were removed, it will be newer,-# and not overwritten.)- cp -uR tmp/splices/* tmp/no-th-tree || true-# Some additional dependencies needed by the expanded splices.- sed -i 's/^ Build-Depends: */ Build-Depends: yesod-routes, yesod-core, shakespeare-css, shakespeare-js, shakespeare, blaze-markup, file-embed, wai-app-static, unordered-containers, /' tmp/no-th-tree/git-annex.cabal-# Avoid warnings due to sometimes unused imports added for the splices.- sed -i 's/GHC-Options: \(.*\)-Wall/GHC-Options: \1-Wall -fno-warn-unused-imports /i' tmp/no-th-tree/git-annex.cabal- sed -i 's/Extensions: /Extensions: MagicHash /i' tmp/no-th-tree/git-annex.cabal--# Run on the arm system, after stage1-no-th-webapp-stage2: - if [ ! -e tmp/no-th-tree/dist/setup-config ]; then \- cd tmp/no-th-tree && cabal configure; \- fi- cd tmp/no-th-tree && cabal build --ghc-option=-D__NO_TH__- cd tmp/no-th-tree && $(MAKE) linuxstandalone-nobuild- ANDROID_FLAGS?= # Cross compile for Android. # Uses https://github.com/neurocyte/ghc-android@@ -237,7 +212,7 @@ # and not overwritten.) cp -uR tmp/splices/* tmp/androidtree || true # Some additional dependencies needed by the expanded splices.- sed -i 's/^ Build-Depends: */ Build-Depends: yesod-routes, yesod-core, shakespeare-css, shakespeare-js, shakespeare, blaze-markup, file-embed, wai-app-static, unordered-containers, /' tmp/androidtree/git-annex.cabal+ sed -i 's/^ Build-Depends: */ Build-Depends: yesod-routes, yesod-core, shakespeare-css, shakespeare-js, shakespeare, blaze-markup, file-embed, wai-app-static, hamlet, wai, unordered-containers, /' tmp/androidtree/git-annex.cabal # Avoid warnings due to sometimes unused imports added for the splices. sed -i 's/GHC-Options: \(.*\)-Wall/GHC-Options: \1-Wall -fno-warn-unused-imports /i' tmp/androidtree/git-annex.cabal sed -i 's/Extensions: /Extensions: MagicHash /i' tmp/androidtree/git-annex.cabal@@ -262,7 +237,8 @@ $(MAKE) -C standalone/android # We bypass cabal, and only run the main ghc --make command for a-# fast development built. Note: Does not rebuild C libraries.+# fast development built. Note: Does not rebuild C libraries, or link+# executable. fast: dist/caballog @$$(grep 'ghc --make' dist/caballog | head -n 1 | sed -e 's/-package-id [^ ]*//g' -e 's/-hide-all-packages//') -O0 @ln -sf dist/build/git-annex/git-annex git-annex
Messages/JSON.hs view
@@ -10,7 +10,8 @@ end, note, add,- complete+ complete,+ DualDisp(..), ) where import Text.JSON@@ -35,3 +36,16 @@ complete :: JSON a => [(String, a)] -> IO () complete v = putStr $ Stream.start v ++ Stream.end++-- A value that can be displayed either normally, or as JSON.+data DualDisp = DualDisp+ { dispNormal :: String+ , dispJson :: String+ }++instance JSON DualDisp where+ showJSON = JSString . toJSString . dispJson+ readJSON _ = Error "stub"++instance Show DualDisp where+ show = dispNormal
Remote.hs view
@@ -31,6 +31,7 @@ byNameWithUUID, byCost, prettyPrintUUIDs,+ prettyPrintUUIDsWith, prettyListUUIDs, prettyUUID, remoteFromUUID,@@ -168,19 +169,29 @@ {- Pretty-prints a list of UUIDs of remotes, for human display. -- - When JSON is enabled, also generates a machine-readable description+ - When JSON is enabled, also outputs a machine-readable description - of the UUIDs. -} prettyPrintUUIDs :: String -> [UUID] -> Annex String-prettyPrintUUIDs desc uuids = do+prettyPrintUUIDs desc uuids = prettyPrintUUIDsWith Nothing desc $+ zip uuids (repeat (Nothing :: Maybe String))++{- An optional field can be included in the list of UUIDs. -}+prettyPrintUUIDsWith+ :: (JSON v, Show v) + => Maybe String + -> String + -> [(UUID, Maybe v)] + -> Annex String+prettyPrintUUIDsWith optfield desc uuids = do hereu <- getUUID m <- uuidDescriptions maybeShowJSON [(desc, map (jsonify m hereu) uuids)] return $ unwords $ map (\u -> "\t" ++ prettify m hereu u ++ "\n") uuids where finddescription m u = M.findWithDefault "" u m- prettify m hereu u- | not (null d) = fromUUID u ++ " -- " ++ d- | otherwise = fromUUID u+ prettify m hereu (u, optval)+ | not (null d) = addoptval $ fromUUID u ++ " -- " ++ d+ | otherwise = addoptval $ fromUUID u where ishere = hereu == u n = finddescription m u@@ -188,10 +199,16 @@ | null n && ishere = "here" | ishere = addName n "here" | otherwise = n- jsonify m hereu u = toJSObject- [ ("uuid", toJSON $ fromUUID u)- , ("description", toJSON $ finddescription m u)- , ("here", toJSON $ hereu == u)+ addoptval s = case optval of+ Nothing -> s+ Just val -> show val ++ ": " ++ s+ jsonify m hereu (u, optval) = toJSObject $ catMaybes+ [ Just ("uuid", toJSON $ fromUUID u)+ , Just ("description", toJSON $ finddescription m u)+ , Just ("here", toJSON $ hereu == u)+ , case (optfield, optval) of+ (Just field, Just val) -> Just (field, showJSON val)+ _ -> Nothing ] {- List of remote names and/or descriptions, for human display. -}
Remote/Bup.hs view
@@ -167,7 +167,7 @@ | otherwise = void $ liftIO $ catchMaybeIO $ do r' <- Git.Config.read r boolSystem "git" $ Git.Command.gitCommandLine params r'- params = [ Params "branch -q -D", Param (bupRef k) ]+ params = [ Param "branch", Param "-q", Param "-D", Param (bupRef k) ] {- Bup does not provide a way to tell if a given dataset is present - in a bup repository. One way it to check if the git repository has@@ -182,7 +182,9 @@ Git.Command.gitCommandLine params bupr where params = - [ Params "show-ref --quiet --verify"+ [ Param "show-ref"+ , Param "--quiet"+ , Param "--verify" , Param $ "refs/heads/" ++ bupRef k ] @@ -194,7 +196,7 @@ then do showAction "storing uuid" unlessM (onBupRemote r boolSystem "git"- [Params $ "config annex.uuid " ++ v]) $+ [Param "config", Param "annex.uuid", Param v]) $ error "ssh failed" else liftIO $ do r' <- Git.Config.read r
Remote/GCrypt.hs view
@@ -175,7 +175,7 @@ go (Just gitrepo) = do (c', _encsetup) <- encryptionSetup c inRepo $ Git.Command.run - [ Params "remote add"+ [ Param "remote", Param "add" , Param remotename , Param $ Git.GCrypt.urlPrefix ++ gitrepo ]@@ -251,7 +251,7 @@ void $ Git.Config.changeFile tmpconfig coreGCryptId gcryptid void $ Git.Config.changeFile tmpconfig denyNonFastForwards (Git.Config.boolConfig False) ok <- liftIO $ rsync $ rsynctransport ++- [ Params "--recursive"+ [ Param "--recursive" , Param $ tmp ++ "/" , Param rsyncurl ]
Remote/Helper/Ssh.hs view
@@ -95,7 +95,7 @@ {- Removes a key from a remote. -} dropKey :: Git.Repo -> Key -> Annex Bool dropKey r key = onRemote r (boolSystem, return False) "dropkey"- [ Params "--quiet --force"+ [ Param "--quiet", Param "--force" , Param $ key2file key ] []
Remote/Rsync.hs view
@@ -172,10 +172,9 @@ ps <- sendParams if ok then showResumable $ rsyncRemote Upload o (Just meterupdate) $ ps ++- [ Param "--recursive"- , partialParams+ Param "--recursive" : partialParams ++ -- tmp/ to send contents of tmp dir- , File $ addTrailingPathSeparator tmp+ [ File $ addTrailingPathSeparator tmp , Param $ rsyncUrl o ] else return False@@ -204,9 +203,9 @@ rsync $ rsyncOptions o ++ ps ++ map (\s -> Param $ "--include=" ++ s) includes ++ [ Param "--exclude=*" -- exclude everything else- , Params "--quiet --delete --recursive"- , partialParams- , Param $ addTrailingPathSeparator dummy+ , Param "--quiet", Param "--delete", Param "--recursive"+ ] ++ partialParams ++ + [ Param $ addTrailingPathSeparator dummy , Param $ rsyncUrl o ] where@@ -237,8 +236,8 @@ {- Rsync params to enable resumes of sending files safely, - ensure that files are only moved into place once complete -}-partialParams :: CommandParam-partialParams = Params "--partial --partial-dir=.rsync-partial"+partialParams :: [CommandParam]+partialParams = [Param "--partial", Param "--partial-dir=.rsync-partial"] {- When sending files from crippled filesystems, the permissions can be all - messed up, and it's better to use the default permissions on the@@ -290,7 +289,7 @@ oh <- mkOutputHandler liftIO $ rsyncProgress oh meter ps where- ps = opts ++ [Params "--progress"] ++ params+ ps = opts ++ Param "--progress" : params opts | direction == Download = rsyncDownloadOptions o | otherwise = rsyncUploadOptions o
Remote/S3.hs view
@@ -1,6 +1,6 @@ {- S3 remotes -- - Copyright 2011-2014 Joey Hess <id@joeyh.name>+ - Copyright 2011-2015 Joey Hess <id@joeyh.name> - - Licensed under the GNU GPL version 3 or higher. -}@@ -45,6 +45,9 @@ import Logs.Web import Utility.Metered import Utility.DataUnits+import Annex.Content+import Annex.Url (withUrlOptions)+import Utility.Url (checkBoth) type BucketName = String @@ -63,10 +66,10 @@ return $ new cst info where new cst info = Just $ specialRemote c- (prepareS3 this info $ store this)- (prepareS3 this info retrieve)- (prepareS3 this info remove)- (prepareS3 this info $ checkKey this)+ (prepareS3Handle this $ store this info)+ (prepareS3HandleMaybe this $ retrieve this info)+ (prepareS3Handle this $ remove info)+ (prepareS3HandleMaybe this $ checkKey this info) this where this = Remote@@ -79,7 +82,7 @@ , removeKey = removeKeyDummy , checkPresent = checkPresentDummy , checkPresentCheap = False- , whereisKey = Nothing+ , whereisKey = Just (getWebUrls info) , remoteFsck = Nothing , repairRepo = Nothing , config = c@@ -90,7 +93,7 @@ , availability = GloballyAvailable , remotetype = remote , mkUnavailable = gen r u (M.insert "host" "!dne!" c) gc- , getInfo = includeCredsInfo c (AWS.creds u) (s3Info c)+ , getInfo = includeCredsInfo c (AWS.creds u) (s3Info c info) , claimUrl = Nothing , checkUrl = Nothing }@@ -142,19 +145,24 @@ -- special constraints on key names M.insert "mungekeys" "ia" defaults info <- extractS3Info archiveconfig- withS3Handle archiveconfig u info $- writeUUIDFile archiveconfig u+ withS3Handle archiveconfig u $+ writeUUIDFile archiveconfig u info use archiveconfig -- Sets up a http connection manager for S3 endpoint, which allows -- http connections to be reused across calls to the helper.-prepareS3 :: Remote -> S3Info -> (S3Handle -> helper) -> Preparer helper-prepareS3 r info = resourcePrepare $ const $- withS3Handle (config r) (uuid r) info+prepareS3Handle :: Remote -> (S3Handle -> helper) -> Preparer helper+prepareS3Handle r = resourcePrepare $ const $+ withS3Handle (config r) (uuid r) -store :: Remote -> S3Handle -> Storer-store r h = fileStorer $ \k f p -> do- case partSize (hinfo h) of+-- Allows for read-only actions, which can be run without a S3Handle.+prepareS3HandleMaybe :: Remote -> (Maybe S3Handle -> helper) -> Preparer helper+prepareS3HandleMaybe r = resourcePrepare $ const $+ withS3HandleMaybe (config r) (uuid r)++store :: Remote -> S3Info -> S3Handle -> Storer+store _r info h = fileStorer $ \k f p -> do+ case partSize info of Just partsz | partsz > 0 -> do fsz <- liftIO $ getFileSize f if fsz > partsz@@ -162,17 +170,16 @@ else singlepartupload k f p _ -> singlepartupload k f p -- Store public URL to item in Internet Archive.- when (isIA (hinfo h) && not (isChunkKey k)) $- setUrlPresent webUUID k (iaKeyUrl r k)+ when (isIA info && not (isChunkKey k)) $+ setUrlPresent webUUID k (iaPublicKeyUrl info k) return True where singlepartupload k f p = do rbody <- liftIO $ httpBodyStorer f p- void $ sendS3Handle h $ putObject h (bucketObject (hinfo h) k) rbody+ void $ sendS3Handle h $ putObject info (T.pack $ bucketObject info k) rbody multipartupload fsz partsz k f p = do #if MIN_VERSION_aws(0,10,6)- let info = hinfo h- let object = bucketObject info k+ let object = T.pack (bucketObject info k) let startreq = (S3.postInitiateMultipartUpload (bucket info) object) { S3.imuStorageClass = Just (storageClass info)@@ -218,15 +225,14 @@ {- Implemented as a fileRetriever, that uses conduit to stream the chunks - out to the file. Would be better to implement a byteRetriever, but - that is difficult. -}-retrieve :: S3Handle -> Retriever-retrieve h = fileRetriever $ \f k p -> liftIO $ runResourceT $ do+retrieve :: Remote -> S3Info -> Maybe S3Handle -> Retriever+retrieve _ info (Just h) = fileRetriever $ \f k p -> liftIO $ runResourceT $ do (fr, fh) <- allocate (openFile f WriteMode) hClose- let req = S3.getObject (bucket info) (bucketObject info k)+ let req = S3.getObject (bucket info) (T.pack $ bucketObject info k) S3.GetObjectResponse { S3.gorResponse = rsp } <- sendS3Handle' h req responseBody rsp $$+- sinkprogressfile fh p zeroBytesProcessed release fr where- info = hinfo h sinkprogressfile fh meterupdate sofar = do mbs <- await case mbs of@@ -237,6 +243,13 @@ void $ meterupdate sofar' S.hPut fh bs sinkprogressfile fh meterupdate sofar'+retrieve r info Nothing = case getpublicurl info of+ Nothing -> \_ _ _ -> do+ warnMissingCredPairFor "S3" (AWS.creds $ uuid r)+ return False+ Just geturl -> fileRetriever $ \f k _p ->+ unlessM (downloadUrl [geturl k] f) $+ error "failed to download content" retrieveCheap :: Key -> AssociatedFile -> FilePath -> Annex Bool retrieveCheap _ _ _ = return False@@ -244,20 +257,18 @@ {- Internet Archive doesn't easily allow removing content. - While it may remove the file, there are generally other files - derived from it that it does not remove. -}-remove :: S3Handle -> Remover-remove h k+remove :: S3Info -> S3Handle -> Remover+remove info h k | isIA info = do warning "Cannot remove content from the Internet Archive" return False | otherwise = do res <- tryNonAsync $ sendS3Handle h $- S3.DeleteObject (bucketObject info k) (bucket info)+ S3.DeleteObject (T.pack $ bucketObject info k) (bucket info) return $ either (const False) (const True) res- where- info = hinfo h -checkKey :: Remote -> S3Handle -> CheckPresent-checkKey r h k = do+checkKey :: Remote -> S3Info -> Maybe S3Handle -> CheckPresent+checkKey r info (Just h) k = do showAction $ "checking " ++ name r #if MIN_VERSION_aws(0,10,0) rsp <- go@@ -269,7 +280,7 @@ #endif where go = sendS3Handle h $- S3.headObject (bucket (hinfo h)) (bucketObject (hinfo h) k)+ S3.headObject (bucket info) (T.pack $ bucketObject info k) #if ! MIN_VERSION_aws(0,10,0) {- Catch exception headObject returns when an object is not present@@ -284,6 +295,14 @@ | otherwise = Nothing #endif +checkKey r info Nothing k = case getpublicurl info of+ Nothing -> do+ warnMissingCredPairFor "S3" (AWS.creds $ uuid r)+ error "No S3 credentials configured"+ Just geturl -> do+ showAction $ "checking " ++ name r+ withUrlOptions $ checkBoth (geturl k) (keySize k)+ {- Generate the bucket if it does not already exist, including creating the - UUID file within the bucket. -@@ -295,22 +314,23 @@ genBucket c u = do showAction "checking bucket" info <- extractS3Info c- withS3Handle c u info $ \h ->- go h =<< checkUUIDFile c u h+ withS3Handle c u $ \h ->+ go info h =<< checkUUIDFile c u info h where- go _ (Right True) = noop- go h _ = do- v <- tryNonAsync $ sendS3Handle h (S3.getBucket $ bucket $ hinfo h)+ go _ _ (Right True) = noop+ go info h _ = do+ v <- tryNonAsync $ sendS3Handle h (S3.getBucket $ bucket info) case v of Right _ -> noop Left _ -> do showAction $ "creating bucket in " ++ datacenter- void $ sendS3Handle h $- S3.PutBucket (bucket $ hinfo h) Nothing $- mkLocationConstraint $- T.pack datacenter- writeUUIDFile c u h+ void $ sendS3Handle h $ S3.PutBucket+ (bucket info)+ (acl info)+ locconstraint+ writeUUIDFile c u info h + locconstraint = mkLocationConstraint $ T.pack datacenter datacenter = fromJust $ M.lookup "datacenter" c {- Writes the UUID to an annex-uuid file within the bucket.@@ -320,9 +340,9 @@ - Note that IA buckets can only created by having a file - stored in them. So this also takes care of that. -}-writeUUIDFile :: RemoteConfig -> UUID -> S3Handle -> Annex ()-writeUUIDFile c u h = do- v <- checkUUIDFile c u h+writeUUIDFile :: RemoteConfig -> UUID -> S3Info -> S3Handle -> Annex ()+writeUUIDFile c u info h = do+ v <- checkUUIDFile c u info h case v of Right True -> noop _ -> void $ sendS3Handle h mkobject@@ -330,17 +350,17 @@ file = T.pack $ uuidFile c uuidb = L.fromChunks [T.encodeUtf8 $ T.pack $ fromUUID u] - mkobject = putObject h file (RequestBodyLBS uuidb)+ mkobject = putObject info file (RequestBodyLBS uuidb) {- Checks if the UUID file exists in the bucket - and has the specified UUID already. -}-checkUUIDFile :: RemoteConfig -> UUID -> S3Handle -> Annex (Either SomeException Bool)-checkUUIDFile c u h = tryNonAsync $ check <$> get+checkUUIDFile :: RemoteConfig -> UUID -> S3Info -> S3Handle -> Annex (Either SomeException Bool)+checkUUIDFile c u info h = tryNonAsync $ check <$> get where get = liftIO . runResourceT . either (pure . Left) (Right <$$> AWS.loadToMemory)- =<< tryS3 (sendS3Handle h (S3.getObject (bucket (hinfo h)) file))+ =<< tryS3 (sendS3Handle h (S3.getObject (bucket info) file)) check (Right (S3.GetObjectMemoryResponse _meta rsp)) = responseStatus rsp == ok200 && responseBody rsp == uuidb check (Left _S3Error) = False@@ -351,20 +371,10 @@ uuidFile :: RemoteConfig -> FilePath uuidFile c = getFilePrefix c ++ "annex-uuid" -putObject :: S3Handle -> T.Text -> RequestBody -> S3.PutObject-putObject h file rbody = (S3.putObject (bucket info) file rbody)- { S3.poStorageClass = Just (storageClass info)- , S3.poMetadata = metaHeaders info- , S3.poAutoMakeBucket = isIA info- }- where- info = hinfo h- data S3Handle = S3Handle { hmanager :: Manager , hawscfg :: AWS.Configuration , hs3cfg :: S3.S3Configuration AWS.NormalQuery- , hinfo :: S3Info } {- Sends a request to S3 and gets back the response.@@ -387,18 +397,27 @@ -> ResourceT IO a sendS3Handle' h r = AWS.pureAws (hawscfg h) (hs3cfg h) (hmanager h) r -withS3Handle :: RemoteConfig -> UUID -> S3Info -> (S3Handle -> Annex a) -> Annex a-withS3Handle c u info a = do- creds <- getRemoteCredPairFor "S3" c (AWS.creds u)- awscreds <- liftIO $ genCredentials $ fromMaybe nocreds creds- let awscfg = AWS.Configuration AWS.Timestamp awscreds debugMapper- bracketIO (newManager httpcfg) closeManager $ \mgr -> - a $ S3Handle mgr awscfg s3cfg info+withS3Handle :: RemoteConfig -> UUID -> (S3Handle -> Annex a) -> Annex a+withS3Handle c u a = withS3HandleMaybe c u $ \mh -> case mh of+ Just h -> a h+ Nothing -> do+ warnMissingCredPairFor "S3" (AWS.creds u)+ error "No S3 credentials configured"++withS3HandleMaybe :: RemoteConfig -> UUID -> (Maybe S3Handle -> Annex a) -> Annex a+withS3HandleMaybe c u a = do+ mcreds <- getRemoteCredPair c (AWS.creds u)+ case mcreds of+ Just creds -> do+ awscreds <- liftIO $ genCredentials creds+ let awscfg = AWS.Configuration AWS.Timestamp awscreds debugMapper+ bracketIO (newManager httpcfg) closeManager $ \mgr -> + a $ Just $ S3Handle mgr awscfg s3cfg+ Nothing -> a Nothing where s3cfg = s3Configuration c httpcfg = defaultManagerSettings { managerResponseTimeout = Nothing }- nocreds = error "Cannot use S3 without credentials configured" s3Configuration :: RemoteConfig -> S3.S3Configuration AWS.NormalQuery s3Configuration c = (S3.s3 proto endpoint False) { S3.s3Port = port }@@ -425,10 +444,12 @@ data S3Info = S3Info { bucket :: S3.Bucket , storageClass :: S3.StorageClass- , bucketObject :: Key -> T.Text+ , bucketObject :: Key -> String , metaHeaders :: [(T.Text, T.Text)] , partSize :: Maybe Integer , isIA :: Bool+ , public :: Bool+ , getpublicurl :: Maybe (Key -> URLString) } extractS3Info :: RemoteConfig -> Annex S3Info@@ -437,15 +458,41 @@ (error "S3 bucket not configured") (return . T.pack) (getBucketName c)- return $ S3Info+ let info = S3Info { bucket = b , storageClass = getStorageClass c- , bucketObject = T.pack . getBucketObject c+ , bucketObject = getBucketObject c , metaHeaders = getMetaHeaders c , partSize = getPartSize c , isIA = configIA c+ , public = case M.lookup "public" c of+ Just "yes" -> True+ _ -> False+ , getpublicurl = case M.lookup "publicurl" c of+ Just u -> Just $ genericPublicKeyUrl info u+ Nothing -> case M.lookup "host" c of+ Just h+ | h == AWS.s3DefaultHost ->+ Just $ awsPublicKeyUrl info+ | isIAHost h ->+ Just $ iaPublicKeyUrl info+ _ -> Nothing }+ return info +putObject :: S3Info -> T.Text -> RequestBody -> S3.PutObject+putObject info file rbody = (S3.putObject (bucket info) file rbody)+ { S3.poStorageClass = Just (storageClass info)+ , S3.poMetadata = metaHeaders info+ , S3.poAutoMakeBucket = isIA info+ , S3.poAcl = acl info+ }++acl :: S3Info -> Maybe S3.CannedAcl+acl info+ | public info = Just S3.AclPublicRead+ | otherwise = Nothing+ getBucketName :: RemoteConfig -> Maybe BucketName getBucketName = map toLower <$$> M.lookup "bucket" @@ -500,11 +547,17 @@ iaItemUrl :: BucketName -> URLString iaItemUrl b = "http://archive.org/details/" ++ b -iaKeyUrl :: Remote -> Key -> URLString-iaKeyUrl r k = "http://archive.org/download/" ++ b ++ "/" ++ getBucketObject (config r) k- where- b = fromMaybe "" $ getBucketName $ config r+iaPublicKeyUrl :: S3Info -> Key -> URLString+iaPublicKeyUrl info = genericPublicKeyUrl info $+ "http://archive.org/download/" ++ T.unpack (bucket info) ++ "/" +awsPublicKeyUrl :: S3Info -> Key -> URLString+awsPublicKeyUrl info = genericPublicKeyUrl info $ + "https://" ++ T.unpack (bucket info) ++ ".s3.amazonaws.com/" ++genericPublicKeyUrl :: S3Info -> URLString -> Key -> URLString+genericPublicKeyUrl info baseurl k = baseurl ++ bucketObject info k+ genCredentials :: CredPair -> IO AWS.Credentials genCredentials (keyid, secret) = AWS.Credentials <$> pure (T.encodeUtf8 (T.pack keyid))@@ -525,8 +578,8 @@ AWS.Warning -> warningM AWS.Error -> errorM -s3Info :: RemoteConfig -> [(String, String)]-s3Info c = catMaybes+s3Info :: RemoteConfig -> S3Info -> [(String, String)]+s3Info c info = catMaybes [ Just ("bucket", fromMaybe "unknown" (getBucketName c)) , Just ("endpoint", w82s (S.unpack (S3.s3Endpoint s3c))) , Just ("port", show (S3.s3Port s3c))@@ -535,6 +588,13 @@ then Just ("internet archive item", iaItemUrl $ fromMaybe "unknown" $ getBucketName c) else Nothing , Just ("partsize", maybe "unlimited" (roughSize storageUnits False) (getPartSize c))+ , Just ("public", if public info then "yes" else "no") ] where s3c = s3Configuration c++getWebUrls :: S3Info -> Key -> Annex [URLString]+getWebUrls info k = case (public info, getpublicurl info) of+ (True, Just geturl) -> return [geturl k]+ _ -> return []+
Remote/Tahoe.hs view
@@ -9,7 +9,7 @@ - configuration, when embedcreds is enabled. - - Using those creds, git-annex sets up a tahoe configuration directory in- - ~/.tahoe/git-annex/UUID/+ - ~/.tahoe-git-annex/UUID/ - - Tahoe has its own encryption, so git-annex's encryption is not used. -@@ -141,7 +141,7 @@ defaultTahoeConfigDir :: UUID -> IO TahoeConfigDir defaultTahoeConfigDir u = do h <- myHomeDir - return $ h </> ".tahoe" </> "git-annex" </> fromUUID u+ return $ h </> ".tahoe-git-annex" </> fromUUID u tahoeConfigure :: TahoeConfigDir -> IntroducerFurl -> Maybe SharedConvergenceSecret -> IO SharedConvergenceSecret tahoeConfigure configdir furl mscs = do
Test.hs view
@@ -43,6 +43,7 @@ import qualified Logs.Unused import qualified Logs.Transfer import qualified Logs.Presence+import qualified Logs.PreferredContent import qualified Types.MetaData import qualified Remote import qualified Types.Key@@ -71,6 +72,7 @@ import qualified Utility.HumanTime import qualified Utility.ThreadScheduler import qualified Utility.Base64+import qualified Utility.Tmp import qualified Command.Uninit import qualified CmdLine.GitAnnex as GitAnnex #ifndef mingw32_HOST_OS@@ -78,11 +80,9 @@ import qualified Types.Crypto import qualified Utility.Gpg #endif-import qualified Messages main :: [String] -> IO () main ps = do- Messages.enableDebugOutput let tests = testGroup "Tests" -- Test both direct and indirect mode. -- Windows is only going to use direct mode,@@ -165,6 +165,7 @@ , testProperty "prop_view_roundtrips" Annex.View.prop_view_roundtrips , testProperty "prop_viewedFile_rountrips" Annex.View.ViewedFile.prop_viewedFile_roundtrips , testProperty "prop_b64_roundtrips" Utility.Base64.prop_b64_roundtrips+ , testProperty "prop_standardGroups_parse" Logs.PreferredContent.prop_standardGroups_parse ] {- These tests set up the test environment, but also test some basic parts@@ -179,6 +180,7 @@ unitTests note = testGroup ("Unit Tests " ++ note) [ testCase "add sha1dup" test_add_sha1dup , testCase "add extras" test_add_extras+ , testCase "import" test_import , testCase "reinject" test_reinject , testCase "unannex (no copy)" test_unannex_nocopy , testCase "unannex (with copy)" test_unannex_withcopy@@ -261,7 +263,7 @@ , do writeFile ingitfile $ content ingitfile boolSystem "git" [Param "add", File ingitfile] @? "git add failed"- boolSystem "git" [Params "commit -q -m commit"] @? "git commit failed"+ boolSystem "git" [Param "commit", Param "-q", Param "-m", Param "commit"] @? "git commit failed" git_annex "add" [ingitfile] @? "add ingitfile should be no-op" unannexed ingitfile )@@ -280,6 +282,52 @@ annexed_present wormannexedfile checkbackend wormannexedfile backendWORM +test_import :: Assertion+test_import = intmpclonerepo $ Utility.Tmp.withTmpDir "importtest" $ \importdir -> do+ (toimport1, importf1, imported1) <- mktoimport importdir "import1"+ git_annex "import" [toimport1] @? "import failed"+ annexed_present imported1+ checkdoesnotexist importf1++ (toimport2, importf2, imported2) <- mktoimport importdir "import2"+ git_annex "import" [toimport2] @? "import of duplicate failed"+ annexed_present imported2+ checkdoesnotexist importf2++ (toimport3, importf3, imported3) <- mktoimport importdir "import3"+ git_annex "import" ["--skip-duplicates", toimport3]+ @? "import of duplicate with --skip-duplicates failed"+ checkdoesnotexist imported3+ checkexists importf3+ git_annex "import" ["--clean-duplicates", toimport3]+ @? "import of duplicate with --clean-duplicates failed"+ checkdoesnotexist imported3+ checkdoesnotexist importf3+ + (toimport4, importf4, imported4) <- mktoimport importdir "import4"+ git_annex "import" ["--deduplicate", toimport4] @? "import --deduplicate failed"+ checkdoesnotexist imported4+ checkdoesnotexist importf4+ + (toimport5, importf5, imported5) <- mktoimport importdir "import5"+ git_annex "import" ["--duplicate", toimport5] @? "import --duplicate failed"+ annexed_present imported5+ checkexists importf5+ + git_annex "drop" ["--force", imported1, imported2, imported5] @? "drop failed"+ annexed_notpresent imported2+ (toimportdup, importfdup, importeddup) <- mktoimport importdir "importdup"+ git_annex "import" ["--clean-duplicates", toimportdup] + @? "import of missing duplicate with --clean-duplicates failed"+ checkdoesnotexist importeddup+ checkexists importfdup+ where+ mktoimport importdir subdir = do+ createDirectory (importdir </> subdir)+ let importf = subdir </> "f"+ writeFile (importdir </> importf) (content importf)+ return (importdir </> subdir, importdir </> importf, importf)+ test_reinject :: Assertion test_reinject = intmpclonerepoInDirect $ do git_annex "drop" ["--force", sha1annexedfile] @? "drop failed"@@ -314,7 +362,7 @@ test_drop_noremote :: Assertion test_drop_noremote = intmpclonerepo $ do git_annex "get" [annexedfile] @? "get failed"- boolSystem "git" [Params "remote rm origin"]+ boolSystem "git" [Param "remote", Param "rm", Param "origin"] @? "git remote rm origin failed" not <$> git_annex "drop" [annexedfile] @? "drop wrongly succeeded with no known copy of file" annexed_present annexedfile@@ -503,7 +551,7 @@ if precommit then git_annex "pre-commit" [] @? "pre-commit failed"- else boolSystem "git" [Params "commit -q -m contentchanged"]+ else boolSystem "git" [Param "commit", Param "-q", Param "-m", Param "contentchanged"] @? "git commit of edited file failed" runchecks [checklink, checkunwritable] annexedfile c <- readFile annexedfile@@ -515,7 +563,7 @@ git_annex "get" [annexedfile] @? "get of file failed" annexed_present annexedfile git_annex "unlock" [annexedfile] @? "unlock failed"- not <$> boolSystem "git" [Params "commit -q -m test", File annexedfile]+ not <$> boolSystem "git" [Param "commit", Param "-q", Param "-m", Param "test", File annexedfile] @? "partial commit of unlocked file not blocked by pre-commit hook" test_fix :: Assertion@@ -675,15 +723,15 @@ git_annex "get" [annexedfile] @? "get of file failed" git_annex "get" [sha1annexedfile] @? "get of file failed" checkunused [] "after get"- boolSystem "git" [Params "rm -fq", File annexedfile] @? "git rm failed"+ boolSystem "git" [Param "rm", Param "-fq", File annexedfile] @? "git rm failed" checkunused [] "after rm"- boolSystem "git" [Params "commit -q -m foo"] @? "git commit failed"+ boolSystem "git" [Param "commit", Param "-q", Param "-m", Param "foo"] @? "git commit failed" checkunused [] "after commit" -- unused checks origin/master; once it's gone it is really unused- boolSystem "git" [Params "remote rm origin"] @? "git remote rm origin failed"+ boolSystem "git" [Param "remote", Param "rm", Param "origin"] @? "git remote rm origin failed" checkunused [annexedfilekey] "after origin branches are gone"- boolSystem "git" [Params "rm -fq", File sha1annexedfile] @? "git rm failed"- boolSystem "git" [Params "commit -q -m foo"] @? "git commit failed"+ boolSystem "git" [Param "rm", Param "-fq", File sha1annexedfile] @? "git rm failed"+ boolSystem "git" [Param "commit", Param "-q", Param "-m", Param "foo"] @? "git commit failed" checkunused [annexedfilekey, sha1annexedfilekey] "after rm sha1annexedfile" -- good opportunity to test dropkey also@@ -702,7 +750,7 @@ git_annex "add" ["unusedfile"] @? "add of unusedfile failed" unusedfilekey <- annexeval $ findkey "unusedfile" renameFile "unusedfile" "unusedunstagedfile"- boolSystem "git" [Params "rm -qf", File "unusedfile"] @? "git rm failed"+ boolSystem "git" [Param "rm", Param "-qf", File "unusedfile"] @? "git rm failed" checkunused [] "with unstaged link" removeFile "unusedunstagedfile" checkunused [unusedfilekey] "with unstaged link deleted"@@ -714,7 +762,7 @@ boolSystem "git" [Param "add", File "unusedfile"] @? "git add failed" unusedfilekey' <- annexeval $ findkey "unusedfile" checkunused [] "with staged deleted link"- boolSystem "git" [Params "rm -qf", File "unusedfile"] @? "git rm failed"+ boolSystem "git" [Param "rm", Param "-qf", File "unusedfile"] @? "git rm failed" checkunused [unusedfilekey'] "with staged link deleted" -- unused used to miss symlinks that were deleted or modified@@ -799,13 +847,13 @@ withtmpclonerepo False $ \r3 -> do forM_ [r1, r2, r3] $ \r -> indir r $ do when (r /= r1) $- boolSystem "git" [Params "remote add r1", File ("../../" ++ r1)] @? "remote add"+ boolSystem "git" [Param "remote", Param "add", Param "r1", File ("../../" ++ r1)] @? "remote add" when (r /= r2) $- boolSystem "git" [Params "remote add r2", File ("../../" ++ r2)] @? "remote add"+ boolSystem "git" [Param "remote", Param "add", Param "r2", File ("../../" ++ r2)] @? "remote add" when (r /= r3) $- boolSystem "git" [Params "remote add r3", File ("../../" ++ r3)] @? "remote add"+ boolSystem "git" [Param "remote", Param "add", Param "r3", File ("../../" ++ r3)] @? "remote add" git_annex "get" [annexedfile] @? "get failed"- boolSystem "git" [Params "remote rm origin"] @? "remote rm"+ boolSystem "git" [Param "remote", Param "rm", Param "origin"] @? "remote rm" forM_ [r3, r2, r1] $ \r -> indir r $ git_annex "sync" [] @? "sync failed" forM_ [r3, r2] $ \r -> indir r $@@ -995,7 +1043,7 @@ indir r2 $ do disconnectOrigin writeFile conflictor nonannexed_content- boolSystem "git" [Params "add", File conflictor] @? "git add conflictor failed"+ boolSystem "git" [Param "add", File conflictor] @? "git add conflictor failed" git_annex "sync" [] @? "sync failed in r2" pair r1 r2 let l = if inr1 then [r1, r2] else [r2, r1]@@ -1046,7 +1094,7 @@ indir r2 $ do disconnectOrigin createSymbolicLink symlinktarget "conflictor"- boolSystem "git" [Params "add", File conflictor] @? "git add conflictor failed"+ boolSystem "git" [Param "add", File conflictor] @? "git add conflictor failed" git_annex "sync" [] @? "sync failed in r2" pair r1 r2 let l = if inr1 then [r1, r2] else [r2, r1]@@ -1154,9 +1202,9 @@ pair :: FilePath -> FilePath -> Assertion pair r1 r2 = forM_ [r1, r2] $ \r -> indir r $ do when (r /= r1) $- boolSystem "git" [Params "remote add r1", File ("../../" ++ r1)] @? "remote add"+ boolSystem "git" [Param "remote", Param "add", Param "r1", File ("../../" ++ r1)] @? "remote add" when (r /= r2) $- boolSystem "git" [Params "remote add r2", File ("../../" ++ r2)] @? "remote add"+ boolSystem "git" [Param "remote", Param "add", Param "r2", File ("../../" ++ r2)] @? "remote add" test_map :: Assertion test_map = intmpclonerepo $ do@@ -1176,7 +1224,7 @@ test_uninit_inbranch :: Assertion test_uninit_inbranch = intmpclonerepoInDirect $ do- boolSystem "git" [Params "checkout git-annex"] @? "git checkout git-annex"+ boolSystem "git" [Param "checkout", Param "git-annex"] @? "git checkout git-annex" not <$> git_annex "uninit" [] @? "uninit failed to fail when git-annex branch was checked out" test_upgrade :: Assertion@@ -1448,7 +1496,7 @@ bracket (clonerepo mainrepodir dir bare) cleanup a disconnectOrigin :: Assertion-disconnectOrigin = boolSystem "git" [Params "remote rm origin"] @? "remote rm"+disconnectOrigin = boolSystem "git" [Param "remote", Param "rm", Param "origin"] @? "remote rm" withgitrepo :: (FilePath -> Assertion) -> Assertion withgitrepo = bracket (setuprepo mainrepodir) return@@ -1469,7 +1517,7 @@ setuprepo dir = do cleanup dir ensuretmpdir- boolSystem "git" [Params "init -q", File dir] @? "git init failed"+ boolSystem "git" [Param "init", Param "-q", File dir] @? "git init failed" configrepo dir return dir @@ -1478,8 +1526,14 @@ clonerepo old new bare = do cleanup new ensuretmpdir- let b = if bare then " --bare" else ""- boolSystem "git" [Params ("clone -q" ++ b), File old, File new] @? "git clone failed"+ let cloneparams = catMaybes+ [ Just $ Param "clone"+ , Just $ Param "-q"+ , if bare then Just (Param "--bare") else Nothing+ , Just $ File old+ , Just $ File new+ ]+ boolSystem "git" cloneparams @? "git clone failed" configrepo new indir new $ git_annex "init" ["-q", new] @? "git annex init failed"@@ -1491,10 +1545,10 @@ configrepo :: FilePath -> IO () configrepo dir = indir dir $ do -- ensure git is set up to let commits happen- boolSystem "git" [Params "config user.name", Param "Test User"] @? "git config failed"- boolSystem "git" [Params "config user.email test@example.com"] @? "git config failed"+ boolSystem "git" [Param "config", Param "user.name", Param "Test User"] @? "git config failed"+ boolSystem "git" [Param "config", Param "user.email", Param "test@example.com"] @? "git config failed" -- avoid signed commits by test suite- boolSystem "git" [Params "config commit.gpgsign false"] @? "git config failed"+ boolSystem "git" [Param "config", Param "commit.gpgsign", Param "false"] @? "git config failed" handleforcedirect :: IO () handleforcedirect = whenM ((==) "1" <$> Utility.Env.getEnvDefault "FORCEDIRECT" "") $@@ -1536,6 +1590,16 @@ isRegularFile s @? f ++ " is not a normal file" return () +checkdoesnotexist :: FilePath -> Assertion+checkdoesnotexist f = + (either (const True) (const False) <$> Utility.Exception.tryIO (getSymbolicLinkStatus f))+ @? f ++ " exists unexpectedly"++checkexists :: FilePath -> Assertion+checkexists f = + (either (const False) (const True) <$> Utility.Exception.tryIO (getSymbolicLinkStatus f))+ @? f ++ " does not exist"+ checkcontent :: FilePath -> Assertion checkcontent f = do c <- Utility.Exception.catchDefaultIO "could not read file" $ readFile f@@ -1687,6 +1751,7 @@ | f == sha1annexedfile ="sha1 annexed file content" | f == sha1annexedfiledup = content sha1annexedfile | f == wormannexedfile = "worm annexed file content"+ | "import" `isPrefixOf` f = "imported content" | otherwise = "unknown file " ++ f changecontent :: FilePath -> IO ()
Types/Difference.hs view
@@ -9,6 +9,7 @@ Difference(..), Differences(..), readDifferences,+ showDifferences, getDifferences, differenceConfigKey, differenceConfigVal,@@ -20,10 +21,10 @@ import qualified Git import qualified Git.Config -import qualified Data.Set as S import Data.Maybe import Data.Monoid import Prelude+import qualified Data.Set as S -- Describes differences from the v5 repository format. --@@ -31,7 +32,7 @@ -- would break compatability. -- -- Not breaking compatability is why a list of Differences is used, rather--- than a sum type. With a sum type, adding a new field for some future+-- than a record type. With a record type, adding a new field for some future -- difference would serialize to a value that an older version could not -- parse, even if that new field was not used. With the Differences list, -- old versions can still parse it, unless the new Difference constructor @@ -44,26 +45,45 @@ = ObjectHashLower | OneLevelObjectHash | OneLevelBranchHash- deriving (Show, Read, Ord, Eq, Enum, Bounded)+ deriving (Show, Read, Eq, Ord, Enum, Bounded) +-- This type is used internally for efficient checking for differences,+-- but converted to S.Set Difference for serialization. data Differences- = Differences (S.Set Difference)+ = Differences+ { objectHashLower :: Bool+ , oneLevelObjectHash :: Bool+ , oneLevelBranchHash :: Bool+ } | UnknownDifferences +-- UnknownDifferences cannot be equal instance Eq Differences where- Differences a == Differences b = a == b- _ == _ = False -- UnknownDifferences cannot be equal+ UnknownDifferences == _ = False+ _ == UnknownDifferences = False+ a == b = all (\f -> f a == f b)+ [ objectHashLower+ , oneLevelObjectHash+ , oneLevelBranchHash+ ] instance Monoid Differences where- mempty = Differences S.empty- mappend (Differences a) (Differences b) = Differences (S.union a b)+ mempty = Differences False False False+ mappend a@(Differences {}) b@(Differences {}) = a+ { objectHashLower = objectHashLower a || objectHashLower b+ , oneLevelObjectHash = oneLevelObjectHash a || oneLevelObjectHash b+ , oneLevelBranchHash = oneLevelBranchHash a || oneLevelBranchHash b+ } mappend _ _ = UnknownDifferences readDifferences :: String -> Differences-readDifferences = maybe UnknownDifferences Differences . readish+readDifferences = maybe UnknownDifferences mkDifferences . readish +showDifferences :: Differences -> String+showDifferences = show . S.fromList . listDifferences+ getDifferences :: Git.Repo -> Differences-getDifferences r = Differences $ S.fromList $+getDifferences r = mkDifferences $ S.fromList $ mapMaybe getmaybe [minBound .. maxBound] where getmaybe d = case Git.Config.isTrue =<< Git.Config.getMaybe (differenceConfigKey d) r of@@ -82,9 +102,25 @@ tunable k = "annex.tune." ++ k hasDifference :: Difference -> Differences -> Bool-hasDifference d (Differences s) = S.member d s hasDifference _ UnknownDifferences = False+hasDifference ObjectHashLower ds = objectHashLower ds+hasDifference OneLevelObjectHash ds = oneLevelObjectHash ds+hasDifference OneLevelBranchHash ds = oneLevelBranchHash ds listDifferences :: Differences -> [Difference]-listDifferences (Differences s) = S.toList s+listDifferences d@(Differences {}) = map snd $+ filter (\(f, _) -> f d)+ [ (objectHashLower, ObjectHashLower)+ , (oneLevelObjectHash, OneLevelObjectHash)+ , (oneLevelBranchHash, OneLevelBranchHash)+ ] listDifferences UnknownDifferences = []++mkDifferences :: S.Set Difference -> Differences+mkDifferences s = Differences+ { objectHashLower = check ObjectHashLower+ , oneLevelObjectHash = check OneLevelObjectHash+ , oneLevelBranchHash = check OneLevelBranchHash+ }+ where+ check f = f `S.member` s
Types/Key.hs view
@@ -16,6 +16,7 @@ nonChunkKey, chunkKeyOffset, isChunkKey,+ isKeyPrefix, prop_idempotent_key_encode, prop_idempotent_key_decode@@ -25,6 +26,7 @@ import Common import Utility.QuickCheck+import Utility.Bloom {- A Key has a unique name, which is derived from a particular backend, - and may contain other optional metadata. -}@@ -66,6 +68,10 @@ isChunkKey :: Key -> Bool isChunkKey k = isJust (keyChunkSize k) && isJust (keyChunkNum k) +-- Checks if a string looks like at least the start of a key.+isKeyPrefix :: String -> Bool+isKeyPrefix s = [fieldSep, fieldSep] `isInfixOf` s+ fieldSep :: Char fieldSep = '-' @@ -124,6 +130,10 @@ <*> arbitrary <*> ((abs <$>) <$> arbitrary) -- chunksize cannot be negative <*> ((succ . abs <$>) <$> arbitrary) -- chunknum cannot be 0 or negative++instance Hashable Key where+ hashIO32 = hashIO32 . key2file+ hashIO64 = hashIO64 . key2file prop_idempotent_key_encode :: Key -> Bool prop_idempotent_key_encode k = Just k == (file2key . key2file) k
Types/StandardGroups.hs view
@@ -80,19 +80,19 @@ {- See doc/preferred_content.mdwn for explanations of these expressions. -} standardPreferredContent :: StandardGroup -> PreferredContentExpression standardPreferredContent ClientGroup = lastResort $- "((exclude=*/archive/* and exclude=archive/*) or (" ++ notArchived ++ ")) and not unused"+ "include=* and ((exclude=*/archive/* and exclude=archive/*) or (" ++ notArchived ++ "))" standardPreferredContent TransferGroup = lastResort $ "not (inallgroup=client and copies=client:2) and (" ++ standardPreferredContent ClientGroup ++ ")"-standardPreferredContent BackupGroup = "include=* or unused"+standardPreferredContent BackupGroup = "anything" standardPreferredContent IncrementalBackupGroup = lastResort- "(include=* or unused) and (not copies=incrementalbackup:1)"+ "(not copies=backup:1) and (not copies=incrementalbackup:1)" standardPreferredContent SmallArchiveGroup = lastResort $ "(include=*/archive/* or include=archive/*) and (" ++ standardPreferredContent FullArchiveGroup ++ ")" standardPreferredContent FullArchiveGroup = lastResort notArchived standardPreferredContent SourceGroup = "not (copies=1)" standardPreferredContent ManualGroup = "present and (" ++ standardPreferredContent ClientGroup ++ ")" standardPreferredContent PublicGroup = "inpreferreddir"-standardPreferredContent UnwantedGroup = "exclude=*"+standardPreferredContent UnwantedGroup = "not anything" notArchived :: String notArchived = "not (copies=archive:1 or copies=smallarchive:1)"
Utility/Bloom.hs view
@@ -10,8 +10,9 @@ module Utility.Bloom ( Bloom, safeSuggestSizing,- Hashable,+ Hashable(..), cheapHashes,+ elemB, notElemB, newMB,@@ -26,7 +27,7 @@ import qualified Data.BloomFilter as Bloom #endif import Data.BloomFilter.Easy (safeSuggestSizing, Bloom)-import Data.BloomFilter.Hash (Hashable, cheapHashes)+import Data.BloomFilter.Hash (Hashable(..), cheapHashes) import Control.Monad.ST (ST) #if MIN_VERSION_bloomfilter(2,0,0)@@ -34,6 +35,9 @@ notElemB :: a -> Bloom a -> Bool notElemB = Bloom.notElem +elemB :: a -> Bloom a -> Bool+elemB = Bloom.elem+ newMB :: (a -> [Bloom.Hash]) -> Int -> ST s (MBloom.MBloom s a) newMB = MBloom.new @@ -47,6 +51,9 @@ notElemB :: a -> Bloom a -> Bool notElemB = Bloom.notElemB++elemB :: a -> Bloom a -> Bool+elemB = Bloom.elem newMB :: (a -> [Bloom.Hash]) -> Int -> ST s (Bloom.MBloom s a) newMB = Bloom.newMB
Utility/Glob.hs view
@@ -20,8 +20,8 @@ import System.Path.WildMatch #ifdef WITH_TDFA-import Text.Regex.TDFA-import Text.Regex.TDFA.String+import "regex-tdfa" Text.Regex.TDFA+import "regex-tdfa" Text.Regex.TDFA.String #else import Text.Regex import Data.Maybe
Utility/Gpg.hs view
@@ -60,17 +60,20 @@ {- Usual options for symmetric / public-key encryption. -} stdEncryptionParams :: Bool -> [CommandParam]-stdEncryptionParams symmetric =- [ enc symmetric- , Param "--force-mdc"+stdEncryptionParams symmetric = enc symmetric +++ [ Param "--force-mdc" , Param "--no-textmode" ] where- enc True = Param "--symmetric"+ enc True = [ Param "--symmetric" ] -- Force gpg to only encrypt to the specified recipients, not -- configured defaults. Recipients are assumed to be specified in -- elsewhere.- enc False = Params "--encrypt --no-encrypt-to --no-default-recipient"+ enc False =+ [ Param "--encrypt"+ , Param "--no-encrypt-to"+ , Param "--no-default-recipient"+ ] {- Runs gpg with some params and returns its stdout, strictly. -} readStrict :: [CommandParam] -> IO String@@ -152,7 +155,7 @@ findPubKeys :: String -> IO KeyIds findPubKeys for = KeyIds . parse . lines <$> readStrict params where- params = [Params "--with-colons --list-public-keys", Param for]+ params = [Param "--with-colons", Param "--list-public-keys", Param for] parse = mapMaybe (keyIdField . split ":") keyIdField ("pub":_:_:_:f:_) = Just f keyIdField _ = Nothing@@ -165,7 +168,7 @@ secretKeys = catchDefaultIO M.empty makemap where makemap = M.fromList . parse . lines <$> readStrict params- params = [Params "--with-colons --list-secret-keys --fixed-list-mode"]+ params = [Param "--with-colons", Param "--list-secret-keys", Param "--fixed-list-mode"] parse = extract [] Nothing . map (split ":") extract c (Just keyid) (("uid":_:_:_:_:_:_:_:_:userid:_):rest) = extract ((keyid, decode_c userid):c) Nothing rest@@ -215,13 +218,14 @@ - It is armored, to avoid newlines, since gpg only reads ciphers up to the - first newline. -} genRandom :: Bool -> Size -> IO String-genRandom highQuality size = checksize <$> readStrict- [ Params params- , Param $ show randomquality- , Param $ show size- ]+genRandom highQuality size = checksize <$> readStrict params where- params = "--gen-random --armor"+ params = + [ Param "--gen-random"+ , Param "--armor"+ , Param $ show randomquality+ , Param $ show size+ ] -- See http://www.gnupg.org/documentation/manuals/gcrypt/Quality-of-random-numbers.html -- for the meaning of random quality levels.@@ -242,7 +246,7 @@ else shortread len shortread got = error $ unwords- [ "Not enough bytes returned from gpg", params+ [ "Not enough bytes returned from gpg", show params , "(got", show got, "; expected", show expectedlength, ")" ] @@ -335,8 +339,8 @@ dir <- mktmpdir $ base </> "gpgtmpXXXXXX" setEnv var dir True -- For some reason, recent gpg needs a trustdb to be set up.- _ <- pipeStrict [Params "--trust-model auto --update-trustdb"] []- _ <- pipeStrict [Params "--import -q"] $ unlines+ _ <- pipeStrict [Param "--trust-model", Param "auto", Param "--update-trustdb"] []+ _ <- pipeStrict [Param "--import", Param "-q"] $ unlines [testSecretKey, testKey] return dir @@ -356,13 +360,13 @@ checkEncryptionFile filename keys = checkGpgPackets keys =<< readStrict params where- params = [Params "--list-packets --list-only", File filename]+ params = [Param "--list-packets", Param "--list-only", File filename] checkEncryptionStream :: String -> Maybe KeyIds -> IO Bool checkEncryptionStream stream keys = checkGpgPackets keys =<< pipeStrict params stream where- params = [Params "--list-packets --list-only"]+ params = [Param "--list-packets", Param "--list-only"] {- Parses an OpenPGP packet list, and checks whether data is - symmetrically encrypted (keys is Nothing), or encrypted to some
Utility/LockPool/STM.hs view
@@ -20,9 +20,10 @@ import System.IO.Unsafe (unsafePerformIO) import qualified Data.Map.Strict as M import Control.Concurrent.STM-import Control.Applicative import Control.Exception import Control.Monad+import Control.Applicative+import Prelude type LockFile = FilePath
Utility/Process.hs view
@@ -1,7 +1,7 @@ {- System.Process enhancements, including additional ways of running - processes, and logging. -- - Copyright 2012 Joey Hess <id@joeyh.name>+ - Copyright 2012-2015 Joey Hess <id@joeyh.name> - - License: BSD-2-clause -}@@ -65,8 +65,8 @@ data StdHandle = StdinHandle | StdoutHandle | StderrHandle deriving (Eq) -{- Normally, when reading from a process, it does not need to be fed any- - standard input. -}+-- | Normally, when reading from a process, it does not need to be fed any+-- standard input. readProcess :: FilePath -> [String] -> IO String readProcess cmd args = readProcessEnv cmd args Nothing @@ -84,9 +84,8 @@ hClose h return output -{- Runs an action to write to a process on its stdin, - - returns its output, and also allows specifying the environment.- -}+-- | Runs an action to write to a process on its stdin, +-- returns its output, and also allows specifying the environment. writeReadProcessEnv :: FilePath -> [String]@@ -126,8 +125,8 @@ , env = environ } -{- Waits for a ProcessHandle, and throws an IOError if the process- - did not exit successfully. -}+-- | Waits for a ProcessHandle, and throws an IOError if the process+-- did not exit successfully. forceSuccessProcess :: CreateProcess -> ProcessHandle -> IO () forceSuccessProcess p pid = do code <- waitForProcess pid@@ -135,10 +134,10 @@ ExitSuccess -> return () ExitFailure n -> fail $ showCmd p ++ " exited " ++ show n -{- Waits for a ProcessHandle and returns True if it exited successfully.- - Note that using this with createProcessChecked will throw away- - the Bool, and is only useful to ignore the exit code of a process,- - while still waiting for it. -}+-- | Waits for a ProcessHandle and returns True if it exited successfully.+-- Note that using this with createProcessChecked will throw away+-- the Bool, and is only useful to ignore the exit code of a process,+-- while still waiting for it. -} checkSuccessProcess :: ProcessHandle -> IO Bool checkSuccessProcess pid = do code <- waitForProcess pid@@ -149,13 +148,13 @@ void $ waitForProcess pid return True -{- Runs createProcess, then an action on its handles, and then- - forceSuccessProcess. -}+-- | Runs createProcess, then an action on its handles, and then+-- forceSuccessProcess. createProcessSuccess :: CreateProcessRunner createProcessSuccess p a = createProcessChecked (forceSuccessProcess p) p a -{- Runs createProcess, then an action on its handles, and then- - a checker action on its exit code, which must wait for the process. -}+-- | Runs createProcess, then an action on its handles, and then+-- a checker action on its exit code, which must wait for the process. createProcessChecked :: (ProcessHandle -> IO b) -> CreateProcessRunner createProcessChecked checker p a = do t@(_, _, _, pid) <- createProcess p@@ -163,14 +162,14 @@ _ <- checker pid either E.throw return r -{- Leaves the process running, suitable for lazy streaming.- - Note: Zombies will result, and must be waited on. -}+-- | Leaves the process running, suitable for lazy streaming.+-- Note: Zombies will result, and must be waited on. createBackgroundProcess :: CreateProcessRunner createBackgroundProcess p a = a =<< createProcess p -{- Runs a process, optionally feeding it some input, and- - returns a transcript combining its stdout and stderr, and- - whether it succeeded or failed. -}+-- | Runs a process, optionally feeding it some input, and+-- returns a transcript combining its stdout and stderr, and+-- whether it succeeded or failed. processTranscript :: String -> [String] -> (Maybe String) -> IO (String, Bool) processTranscript cmd opts input = processTranscript' cmd opts Nothing input @@ -234,9 +233,9 @@ hClose inh writeinput Nothing _ = return () -{- Runs a CreateProcessRunner, on a CreateProcess structure, that- - is adjusted to pipe only from/to a single StdHandle, and passes- - the resulting Handle to an action. -}+-- | Runs a CreateProcessRunner, on a CreateProcess structure, that+-- is adjusted to pipe only from/to a single StdHandle, and passes+-- the resulting Handle to an action. withHandle :: StdHandle -> CreateProcessRunner@@ -258,7 +257,7 @@ | h == StderrHandle = (stderrHandle, base { std_err = CreatePipe }) -{- Like withHandle, but passes (stdin, stdout) handles to the action. -}+-- | Like withHandle, but passes (stdin, stdout) handles to the action. withIOHandles :: CreateProcessRunner -> CreateProcess@@ -272,7 +271,7 @@ , std_err = Inherit } -{- Like withHandle, but passes (stdout, stderr) handles to the action. -}+-- | Like withHandle, but passes (stdout, stderr) handles to the action. withOEHandles :: CreateProcessRunner -> CreateProcess@@ -286,8 +285,8 @@ , std_err = CreatePipe } -{- Forces the CreateProcessRunner to run quietly;- - both stdout and stderr are discarded. -}+-- | Forces the CreateProcessRunner to run quietly;+-- both stdout and stderr are discarded. withQuietOutput :: CreateProcessRunner -> CreateProcess@@ -299,8 +298,8 @@ } creator p' $ const $ return () -{- Stdout and stderr are discarded, while the process is fed stdin- - from the handle. -}+-- | Stdout and stderr are discarded, while the process is fed stdin+-- from the handle. feedWithQuietOutput :: CreateProcessRunner -> CreateProcess@@ -321,11 +320,11 @@ devNull = "NUL" #endif -{- Extract a desired handle from createProcess's tuple.- - These partial functions are safe as long as createProcess is run- - with appropriate parameters to set up the desired handle.- - Get it wrong and the runtime crash will always happen, so should be- - easily noticed. -}+-- | Extract a desired handle from createProcess's tuple.+-- These partial functions are safe as long as createProcess is run+-- with appropriate parameters to set up the desired handle.+-- Get it wrong and the runtime crash will always happen, so should be+-- easily noticed. type HandleExtractor = (Maybe Handle, Maybe Handle, Maybe Handle, ProcessHandle) -> Handle stdinHandle :: HandleExtractor stdinHandle (Just h, _, _, _) = h@@ -346,7 +345,7 @@ processHandle :: (Maybe Handle, Maybe Handle, Maybe Handle, ProcessHandle) -> ProcessHandle processHandle (_, _, _, pid) = pid -{- Debugging trace for a CreateProcess. -}+-- | Debugging trace for a CreateProcess. debugProcess :: CreateProcess -> IO () debugProcess p = do debugM "Utility.Process" $ unwords@@ -362,15 +361,15 @@ piped Inherit = False piped _ = True -{- Shows the command that a CreateProcess will run. -}+-- | Shows the command that a CreateProcess will run. showCmd :: CreateProcess -> String showCmd = go . cmdspec where go (ShellCommand s) = s go (RawCommand c ps) = c ++ " " ++ show ps -{- Starts an interactive process. Unlike runInteractiveProcess in- - System.Process, stderr is inherited. -}+-- | Starts an interactive process. Unlike runInteractiveProcess in+-- System.Process, stderr is inherited. startInteractiveProcess :: FilePath -> [String]@@ -386,7 +385,8 @@ (Just from, Just to, _, pid) <- createProcess p return (pid, to, from) -{- Wrapper around System.Process function that does debug logging. -}+-- | Wrapper around 'System.Process.createProcess' from System.Process,+-- that does debug logging. createProcess :: CreateProcess -> IO (Maybe Handle, Maybe Handle, Maybe Handle, ProcessHandle) createProcess p = do debugProcess p
Utility/Quvi.hs view
@@ -108,7 +108,8 @@ supported :: QuviVersion -> URLString -> IO Bool supported NoQuvi _ = return False supported Quvi04 url = boolSystem "quvi"- [ Params "--verbosity mute --support"+ [ Param "--verbosity", Param "mute"+ , Param "--support" , Param url ] {- Use quvi-info to see if the url's domain is supported.@@ -134,18 +135,18 @@ (toCommand [Param "info", Param "-p", Param "domains"]) listdomains _ = return [] -type QuviParam = QuviVersion -> CommandParam+type QuviParams = QuviVersion -> [CommandParam] {- Disables progress, but not information output. -}-quiet :: QuviParam+quiet :: QuviParams -- Cannot use quiet as it now disables informational output. -- No way to disable progress.-quiet Quvi09 = Params "--verbosity verbose"-quiet Quvi04 = Params "--verbosity quiet"-quiet NoQuvi = Params ""+quiet Quvi09 = [Param "--verbosity", Param "verbose"]+quiet Quvi04 = [Param "--verbosity", Param "quiet"]+quiet NoQuvi = [] {- Only return http results, not streaming protocols. -}-httponly :: QuviParam+httponly :: QuviParams -- No way to do it with 0.9?-httponly Quvi04 = Params "-c http"-httponly _ = Params "" -- No way to do it with 0.9?+httponly Quvi04 = [Param "-c", Param "http"]+httponly _ = [] -- No way to do it with 0.9?
Utility/Rsync.hs view
@@ -44,7 +44,8 @@ -- allow resuming of transfers of big files , Param "--inplace" -- other options rsync normally uses in server mode- , Params "-e.Lsf ."+ , Param "-e.Lsf"+ , Param "." ] rsyncUseDestinationPermissions :: CommandParam
Utility/SafeCommand.hs view
@@ -19,25 +19,23 @@ -- | Parameters that can be passed to a shell command. data CommandParam- = Params String -- ^ Contains multiple parameters, separated by whitespace- | Param String -- ^ A single parameter+ = Param String -- ^ A parameter | File FilePath -- ^ The name of a file deriving (Eq, Show, Ord) -- | Used to pass a list of CommandParams to a function that runs -- a command and expects Strings. -} toCommand :: [CommandParam] -> [String]-toCommand = concatMap unwrap+toCommand = map unwrap where- unwrap (Param s) = [s]- unwrap (Params s) = filter (not . null) (split " " s)+ unwrap (Param s) = s -- Files that start with a non-alphanumeric that is not a path -- separator are modified to avoid the command interpreting them as -- options or other special constructs. unwrap (File s@(h:_))- | isAlphaNum h || h `elem` pathseps = [s]- | otherwise = ["./" ++ s]- unwrap (File s) = [s]+ | isAlphaNum h || h `elem` pathseps = s+ | otherwise = "./" ++ s+ unwrap (File s) = s -- '/' is explicitly included because it's an alternative -- path separator on Windows. pathseps = pathSeparator:"./"
Utility/Url.hs view
@@ -228,14 +228,14 @@ - a less cluttered download display. -} #ifndef __ANDROID__- wgetparams = catMaybes+ wgetparams = concat [ if Build.SysConfig.wgetquietprogress && not quiet- then Just $ Params "-q --show-progress"- else Nothing- , Just $ Params "--clobber -c -O"+ then [Param "-q", Param "--show-progress"]+ else []+ , [ Param "--clobber", Param "-c", Param "-O"] ] #else- wgetparams = [Params "-c -O"]+ wgetparams = [Param "-c", Param "-O"] #endif {- Uses the -# progress display, because the normal - one is very confusing when resuming, showing@@ -247,7 +247,7 @@ -- if the url happens to be empty, so pre-create. writeFile file "" go "curl" $ headerparams ++ quietopt "-s" ++- [Params "-f -L -C - -# -o"]+ [Param "-f", Param "-L", Param "-C", Param "-", Param "-#", Param "-o"] {- Run wget in a temp directory because it has been buggy - and overwritten files in the current directory, even though@@ -263,7 +263,25 @@ {- Allows for spaces and other stuff in urls, properly escaping them. -} parseURIRelaxed :: URLString -> Maybe URI-parseURIRelaxed = parseURI . escapeURIString isAllowedInURI+parseURIRelaxed s = maybe (parseURIRelaxed' s) Just $+ parseURI $ escapeURIString isAllowedInURI s++{- Some characters like '[' are allowed in eg, the address of+ - an uri, but cannot appear unescaped further along in the uri.+ - This handles that, expensively, by successively escaping each character+ - from the back of the url until the url parses.+ -}+parseURIRelaxed' :: URLString -> Maybe URI+parseURIRelaxed' s = go [] (reverse s)+ where+ go back [] = parseURI back+ go back (c:cs) = case parseURI (escapeURIString isAllowedInURI (reverse (c:cs)) ++ back) of+ Just u -> Just u+ Nothing -> go (escapeURIChar escapemore c ++ back) cs++ escapemore '[' = False+ escapemore ']' = False+ escapemore c = isAllowedInURI c hAcceptEncoding :: CI.CI B.ByteString hAcceptEncoding = "Accept-Encoding"
− cabal.config
@@ -1,1069 +0,0 @@--- Stackage snapshot from: http://www.stackage.org/snapshot/lts-2.10--- Please place this file next to your .cabal file as cabal.config--- To only use tested packages, uncomment the following line:--- remote-repo: stackage-lts-2.10:http://www.stackage.org/snapshot/lts-2.10-constraints: abstract-deque ==0.3,- abstract-par ==0.3.3,- accelerate ==0.15.1.0,- ace ==0.6,- action-permutations ==0.0.0.1,- active ==0.1.0.19,- AC-Vector ==2.3.2,- ad ==4.2.2,- adjunctions ==4.2.1,- aeson ==0.8.0.2,- aeson-pretty ==0.7.2,- aeson-qq ==0.7.4,- aeson-utils ==0.3.0.1,- alarmclock ==0.2.0.6,- alex ==3.1.4,- amazonka ==0.3.4,- amazonka-autoscaling ==0.3.4,- amazonka-cloudformation ==0.3.4,- amazonka-cloudfront ==0.3.4,- amazonka-cloudhsm ==0.3.4,- amazonka-cloudsearch ==0.3.4,- amazonka-cloudsearch-domains ==0.3.4,- amazonka-cloudtrail ==0.3.4,- amazonka-cloudwatch ==0.3.4,- amazonka-cloudwatch-logs ==0.3.4,- amazonka-codedeploy ==0.3.4,- amazonka-cognito-identity ==0.3.4,- amazonka-cognito-sync ==0.3.4,- amazonka-config ==0.3.4,- amazonka-core ==0.3.4,- amazonka-datapipeline ==0.3.4,- amazonka-directconnect ==0.3.4,- amazonka-dynamodb ==0.3.4,- amazonka-ec2 ==0.3.4,- amazonka-ecs ==0.3.4,- amazonka-elasticache ==0.3.4,- amazonka-elasticbeanstalk ==0.3.4,- amazonka-elastictranscoder ==0.3.4,- amazonka-elb ==0.3.4,- amazonka-emr ==0.3.4,- amazonka-glacier ==0.3.4,- amazonka-iam ==0.3.4,- amazonka-importexport ==0.3.4,- amazonka-kinesis ==0.3.4,- amazonka-kms ==0.3.4,- amazonka-lambda ==0.3.4,- amazonka-opsworks ==0.3.4,- amazonka-rds ==0.3.4,- amazonka-redshift ==0.3.4,- amazonka-route53 ==0.3.4,- amazonka-route53-domains ==0.3.4,- amazonka-s3 ==0.3.4,- amazonka-sdb ==0.3.4,- amazonka-ses ==0.3.4,- amazonka-sns ==0.3.4,- amazonka-sqs ==0.3.4,- amazonka-ssm ==0.3.4,- amazonka-storagegateway ==0.3.4,- amazonka-sts ==0.3.4,- amazonka-support ==0.3.4,- amazonka-swf ==0.3.4,- amqp ==0.12.2,- ansi-terminal ==0.6.2.1,- ansi-wl-pprint ==0.6.7.2,- appar ==0.1.4,- applicative-quoters ==0.1.0.8,- approximate ==0.2.1.1,- arbtt ==0.9.0.2,- arithmoi ==0.4.1.2,- array installed,- arrow-list ==0.7,- asn1-data ==0.7.1,- asn1-encoding ==0.9.0,- asn1-parse ==0.9.1,- asn1-types ==0.3.0,- async ==2.0.2,- atto-lisp ==0.2.2,- attoparsec ==0.12.1.6,- attoparsec-enumerator ==0.3.4,- attoparsec-expr ==0.1.1.2,- authenticate ==1.3.2.11,- authenticate-oauth ==1.5.1.1,- auto-update ==0.1.2.1,- aws ==0.11.4,- bake ==0.2,- bank-holidays-england ==0.1.0.3,- base installed,- base16-bytestring ==0.1.1.6,- base64-bytestring ==1.0.0.1,- base64-string ==0.2,- base-compat ==0.6.0,- base-prelude ==0.1.19,- base-unicode-symbols ==0.2.2.4,- basic-prelude ==0.3.13,- bcrypt ==0.0.6,- bifunctors ==4.2.1,- binary installed,- binary-conduit ==1.2.3,- binary-list ==1.1.1.0,- bindings-DSL ==1.0.22,- bin-package-db installed,- bioace ==0.0.1,- bioalign ==0.0.5,- biocore ==0.3.1,- biofasta ==0.0.3,- biofastq ==0.1,- biophd ==0.0.7,- biopsl ==0.4,- biosff ==0.3.7.1,- bits ==0.4,- blank-canvas ==0.5,- BlastHTTP ==1.0.1,- blastxml ==0.3.2,- blaze-builder ==0.4.0.1,- blaze-builder-enumerator ==0.2.1.0,- blaze-html ==0.8.0.2,- blaze-markup ==0.7.0.2,- blaze-svg ==0.3.4.1,- blaze-textual ==0.2.0.9,- bloodhound ==0.5.0.1,- bmp ==1.2.5.2,- Boolean ==0.2.3,- boolsimplifier ==0.1.8,- bound ==1.0.5,- BoundedChan ==1.0.3.0,- broadcast-chan ==0.1.0,- bson ==0.3.1,- bumper ==0.6.0.3,- byteable ==0.1.1,- bytedump ==1.0,- byteorder ==1.0.4,- bytes ==0.15,- bytestring installed,- bytestring-builder ==0.10.6.0.0,- bytestring-conversion ==0.3.0,- bytestring-lexing ==0.4.3.2,- bytestring-mmap ==0.2.2,- bytestring-progress ==1.0.5,- bytestring-trie ==0.2.4.1,- bzlib ==0.5.0.5,- bzlib-conduit ==0.2.1.3,- c2hs ==0.25.2,- Cabal installed,- cabal-file-th ==0.2.3,- Cabal-ide-backend ==1.23.0.0,- cabal-install ==1.18.1.0,- cabal-rpm ==0.9.6,- cabal-src ==0.2.5.1,- cabal-test-quickcheck ==0.1.4,- cairo ==0.13.1.0,- cartel ==0.14.2.6,- case-insensitive ==1.2.0.4,- cases ==0.1.2.1,- cassava ==0.4.2.4,- cereal ==0.4.1.1,- cereal-conduit ==0.7.2.3,- certificate ==1.3.9,- charset ==0.3.7.1,- Chart ==1.3.3,- Chart-diagrams ==1.3.3,- ChasingBottoms ==1.3.0.12,- check-email ==1.0,- checkers ==0.4.3,- chell ==0.4.0.1,- chell-quickcheck ==0.2.5,- chunked-data ==0.1.0.1,- cipher-aes ==0.2.10,- cipher-aes128 ==0.6.4,- cipher-blowfish ==0.0.3,- cipher-camellia ==0.0.2,- cipher-des ==0.0.6,- cipher-rc4 ==0.1.4,- circle-packing ==0.1.0.4,- classy-prelude ==0.11.1.1,- classy-prelude-conduit ==0.11.1,- classy-prelude-yesod ==0.11.1,- clay ==0.10.1,- clientsession ==0.9.1.1,- clock ==0.4.6.0,- cmdargs ==0.10.13,- code-builder ==0.1.3,- colour ==2.3.3,- comonad ==4.2.6,- comonads-fd ==4.0,- comonad-transformers ==4.0,- compdata ==0.9,- compensated ==0.6.1,- composition ==1.0.1.1,- compressed ==3.10,- concatenative ==1.0.1,- concurrent-extra ==0.7.0.9,- concurrent-supply ==0.1.7.1,- cond ==0.4.1.1,- conduit ==1.2.4.2,- conduit-combinators ==0.3.1,- conduit-extra ==1.1.8,- configurator ==0.3.0.0,- connection ==0.2.4,- constraints ==0.4.1.3,- consul-haskell ==0.1,- containers installed,- containers-unicode-symbols ==0.3.1.1,- contravariant ==1.3.1.1,- control-monad-free ==0.6.1,- control-monad-loop ==0.1,- convertible ==1.1.1.0,- cookie ==0.4.1.5,- courier ==0.1.0.15,- cpphs ==1.19,- cprng-aes ==0.6.1,- cpu ==0.1.2,- criterion ==1.1.0.0,- crypto-api ==0.13.2,- crypto-api-tests ==0.3,- cryptocipher ==0.6.2,- crypto-cipher-tests ==0.0.11,- crypto-cipher-types ==0.0.9,- cryptohash ==0.11.6,- cryptohash-conduit ==0.1.1,- cryptohash-cryptoapi ==0.1.3,- cryptol ==2.2.2,- crypto-numbers ==0.2.7,- crypto-pubkey ==0.2.8,- crypto-pubkey-types ==0.4.3,- crypto-random ==0.0.9,- crypto-random-api ==0.2.0,- css-text ==0.1.2.1,- csv ==0.1.2,- csv-conduit ==0.6.6,- cubicspline ==0.1.1,- curl ==1.3.8,- data-accessor ==0.2.2.6,- data-accessor-mtl ==0.2.0.4,- data-binary-ieee754 ==0.4.4,- data-default ==0.5.3,- data-default-class ==0.0.1,- data-default-instances-base ==0.0.1,- data-default-instances-containers ==0.0.1,- data-default-instances-dlist ==0.0.1,- data-default-instances-old-locale ==0.0.1,- data-inttrie ==0.1.0,- data-lens-light ==0.1.2.1,- data-memocombinators ==0.5.1,- data-reify ==0.6.1,- DAV ==1.0.5,- Decimal ==0.4.2,- deepseq installed,- deepseq-generics ==0.1.1.2,- derive ==2.5.22,- descriptive ==0.9.3,- diagrams ==1.2,- diagrams-cairo ==1.2.0.7,- diagrams-canvas ==0.3.0.4,- diagrams-contrib ==1.1.2.6,- diagrams-core ==1.2.0.6,- diagrams-lib ==1.2.0.9,- diagrams-postscript ==1.1.0.5,- diagrams-rasterific ==0.1.0.8,- diagrams-svg ==1.1.0.5,- Diff ==0.3.2,- digest ==0.0.1.2,- digestive-functors ==0.7.1.5,- dimensional ==0.13.0.2,- directory installed,- directory-tree ==0.12.0,- direct-sqlite ==2.3.15,- distributed-process ==0.5.3,- distributed-process-async ==0.2.1,- distributed-process-client-server ==0.1.2,- distributed-process-execution ==0.1.1,- distributed-process-extras ==0.2.0,- distributed-process-simplelocalnet ==0.2.2.0,- distributed-process-supervisor ==0.1.2,- distributed-process-task ==0.1.1,- distributed-static ==0.3.1.0,- distributive ==0.4.4,- djinn-ghc ==0.0.2.3,- djinn-lib ==0.0.1.2,- dlist ==0.7.1.1,- dlist-instances ==0.1,- doctest ==0.9.13,- double-conversion ==2.0.1.0,- DRBG ==0.5.4,- dual-tree ==0.2.0.6,- easy-file ==0.2.1,- ede ==0.2.8.2,- edit-distance ==0.2.1.3,- effect-handlers ==0.1.0.6,- either ==4.3.4,- elm-core-sources ==1.0.0,- email-validate ==2.0.1,- enclosed-exceptions ==1.0.1.1,- entropy ==0.3.6,- enumerator ==0.4.20,- eq ==4.0.4,- erf ==2.0.0.0,- errorcall-eq-instance ==0.2.0.1,- errors ==1.4.7,- ersatz ==0.3,- esqueleto ==2.1.3,- exception-mtl ==0.3.0.5,- exceptions ==0.8.0.2,- exception-transformers ==0.3.0.4,- executable-hash ==0.2.0.0,- executable-path ==0.0.3,- extensible-exceptions ==0.1.1.4,- extra ==1.1,- fast-logger ==2.3.1,- fay ==0.23.1.4,- fay-base ==0.20.0.0,- fay-builder ==0.2.0.5,- fay-dom ==0.5.0.1,- fay-jquery ==0.6.0.3,- fay-text ==0.3.2.2,- fay-uri ==0.2.0.0,- fb ==1.0.10,- fb-persistent ==0.3.4,- fclabels ==2.0.2.2,- FenwickTree ==0.1.2.1,- fgl ==5.5.1.0,- file-embed ==0.0.8.2,- file-location ==0.4.7.1,- filemanip ==0.3.6.3,- filepath installed,- fingertree ==0.1.0.2,- fixed ==0.2.1.1,- fixed-list ==0.1.6,- fixed-vector ==0.7.0.3,- flexible-defaults ==0.0.1.1,- flock ==0.3.1.8,- fmlist ==0.9,- focus ==0.1.4,- foldl ==1.0.10,- FontyFruity ==0.5.1.1,- force-layout ==0.3.0.11,- foreign-store ==0.2,- formatting ==6.2.0,- free ==4.11,- freenect ==1.2,- frisby ==0.2,- fsnotify ==0.1.0.3,- fuzzcheck ==0.1.1,- gd ==3000.7.3,- generic-aeson ==0.2.0.5,- generic-deriving ==1.6.3,- GenericPretty ==1.2.1,- generics-sop ==0.1.1.2,- generic-xmlpickler ==0.1.0.2,- ghc installed,- ghc-heap-view ==0.5.3,- ghcid ==0.3.6,- ghc-mod ==5.2.1.2,- ghc-mtl ==1.2.1.0,- ghc-paths ==0.1.0.9,- ghc-prim installed,- ghc-syb-utils ==0.2.3,- gio ==0.13.1.0,- gipeda ==0.1.0.2,- git-embed ==0.1.0,- gitlib ==3.1.0.1,- gitlib-libgit2 ==3.1.0.4,- gitlib-test ==3.1.0.2,- gitrev ==1.0.0,- gitson ==0.5.1,- gl ==0.7.7,- glib ==0.13.1.0,- Glob ==0.7.5,- GLURaw ==1.5.0.1,- GLUT ==2.7.0.1,- graph-core ==0.2.2.0,- graphs ==0.6.0.1,- GraphSCC ==1.0.4,- graphviz ==2999.17.0.2,- gravatar ==0.8.0,- groundhog ==0.7.0.3,- groundhog-mysql ==0.7.0.1,- groundhog-postgresql ==0.7.0.2,- groundhog-sqlite ==0.7.0.1,- groundhog-th ==0.7.0.1,- groupoids ==4.0,- groups ==0.4.0.0,- gtk ==0.13.6,- gtk2hs-buildtools ==0.13.0.3,- gtk3 ==0.13.6,- hackage-mirror ==0.1.0.0,- haddock-api ==2.15.0.2,- haddock-library ==1.1.1,- hakyll ==4.6.9.0,- half ==0.2.0.1,- HandsomeSoup ==0.3.5,- happstack-server ==7.4.2,- happy ==1.19.5,- hashable ==1.2.3.2,- hashable-extras ==0.2.1,- hashmap ==1.3.0.1,- hashtables ==1.2.0.2,- haskeline installed,- haskell2010 installed,- haskell98 installed,- haskell-lexer ==1.0,- haskell-names ==0.5.2,- HaskellNet ==0.4.4,- haskell-packages ==0.2.4.4,- haskell-src ==1.0.2.0,- haskell-src-exts ==1.16.0.1,- haskell-src-meta ==0.6.0.9,- haskintex ==0.5.0.3,- hasql ==0.7.3.1,- hasql-backend ==0.4.1,- hasql-postgres ==0.10.3.1,- hastache ==0.6.1,- HaTeX ==3.16.1.1,- HaXml ==1.25.3,- haxr ==3000.10.4.2,- HCodecs ==0.5,- hdaemonize ==0.5.0.0,- hdevtools ==0.1.0.8,- hdocs ==0.4.1.3,- heap ==1.0.2,- heaps ==0.3.2.1,- hebrew-time ==0.1.1,- heist ==0.14.1,- here ==1.2.7,- heredoc ==0.2.0.0,- hexpat ==0.20.9,- hflags ==0.4,- highlighting-kate ==0.5.12,- hindent ==4.4.2,- hinotify ==0.3.7,- hint ==0.4.2.3,- histogram-fill ==0.8.4.1,- hit ==0.6.3,- hjsmin ==0.1.4.7,- hledger ==0.24.1,- hledger-lib ==0.24.1,- hledger-web ==0.24.1,- hlibgit2 ==0.18.0.14,- hlint ==1.9.20,- hmatrix ==0.16.1.5,- hmatrix-gsl ==0.16.0.3,- hmatrix-gsl-stats ==0.2.1,- hmatrix-repa ==0.1.2.1,- hoauth2 ==0.4.7,- holy-project ==0.1.1.1,- hoogle ==4.2.41,- hoopl installed,- hOpenPGP ==2.0,- hopenpgp-tools ==0.14.1,- hostname ==1.0,- hostname-validate ==1.0.0,- hourglass ==0.2.9,- hpc installed,- hpc-coveralls ==0.9.0,- hPDB ==1.2.0.3,- hPDB-examples ==1.2.0.2,- hs-bibutils ==5.5,- hscolour ==1.22,- hsdev ==0.1.3.4,- hse-cpp ==0.1,- hsignal ==0.2.7,- hslogger ==1.2.9,- hslua ==0.3.13,- HsOpenSSL ==0.11.1.1,- hspec ==2.1.7,- hspec-attoparsec ==0.1.0.2,- hspec-core ==2.1.7,- hspec-discover ==2.1.7,- hspec-expectations ==0.6.1.1,- hspec-meta ==2.1.7,- hspec-smallcheck ==0.3.0,- hspec-wai ==0.6.3,- hspec-wai-json ==0.6.0,- hstatistics ==0.2.5.2,- HStringTemplate ==0.8.3,- hsyslog ==2.0,- HTF ==0.12.2.4,- html ==1.0.1.2,- html-conduit ==1.1.1.2,- HTTP ==4000.2.19,- http-client ==0.4.11.2,- http-client-openssl ==0.2.0.1,- http-client-tls ==0.2.2,- http-conduit ==2.1.5,- http-date ==0.0.6.1,- http-media ==0.6.2,- http-reverse-proxy ==0.4.2,- http-types ==0.8.6,- HUnit ==1.2.5.2,- hweblib ==0.6.3,- hxt ==9.3.1.15,- hxt-charproperties ==9.2.0.1,- hxt-curl ==9.1.1.1,- hxt-expat ==9.1.1,- hxt-http ==9.1.5.2,- hxt-pickle-utils ==0.1.0.3,- hxt-regex-xmlschema ==9.2.0.2,- hxt-relaxng ==9.1.5.5,- hxt-tagsoup ==9.1.3,- hxt-unicode ==9.0.2.4,- hybrid-vectors ==0.1.2.1,- hyphenation ==0.4.2.1,- iconv ==0.4.1.2,- ide-backend ==0.9.0.9,- ide-backend-common ==0.9.1.1,- ide-backend-rts ==0.1.3.1,- idna ==0.3.0,- ieee754 ==0.7.6,- IfElse ==0.85,- imagesize-conduit ==1.1,- immortal ==0.2,- include-file ==0.1.0.2,- incremental-parser ==0.2.3.4,- indents ==0.3.3,- ini ==0.3.1,- integer-gmp installed,- integration ==0.2.1,- interpolate ==0.1.0,- interpolatedstring-perl6 ==0.9.0,- intervals ==0.7.1,- io-choice ==0.0.5,- io-manager ==0.1.0.2,- io-memoize ==1.1.1.0,- iproute ==1.3.2,- iterable ==3.0,- ixset ==1.0.6,- jmacro ==0.6.12,- jmacro-rpc ==0.3.2,- jmacro-rpc-happstack ==0.3.2,- jmacro-rpc-snap ==0.3,- jose-jwt ==0.4.2,- js-flot ==0.8.3,- js-jquery ==1.11.3,- json ==0.9.1,- json-autotype ==0.2.5.13,- json-schema ==0.7.3.5,- JuicyPixels ==3.2.4,- JuicyPixels-repa ==0.7,- kan-extensions ==4.2.2,- kansas-comet ==0.3.1,- kdt ==0.2.3,- keter ==1.3.10.1,- keys ==3.10.2,- kmeans ==0.1.3,- koofr-client ==1.0.0.3,- kure ==2.16.10,- language-c ==0.4.7,- language-c-quote ==0.10.2.1,- language-ecmascript ==0.17,- language-glsl ==0.1.1,- language-haskell-extract ==0.2.4,- language-java ==0.2.7,- language-javascript ==0.5.13.3,- lattices ==1.2.1.1,- lazy-csv ==0.5,- lca ==0.3,- lens ==4.7.0.1,- lens-action ==0.1.0.1,- lens-aeson ==1.0.0.4,- lens-family-core ==1.2.0,- lens-family-th ==0.4.1.0,- lhs2tex ==1.19,- libgit ==0.3.1,- libnotify ==0.1.1.0,- lifted-async ==0.7.0.1,- lifted-base ==0.2.3.6,- linear ==1.18.1.1,- linear-accelerate ==0.2,- List ==0.5.2,- ListLike ==4.2.0,- list-t ==0.4.5.1,- loch-th ==0.2.1,- log-domain ==0.10.0.1,- logict ==0.6.0.2,- loop ==0.2.0,- lrucache ==1.2.0.0,- lucid ==2.9.2,- lucid-svg ==0.4.0.4,- lzma-conduit ==1.1.3,- machines ==0.4.1,- machines-directory ==0.2.0.6,- machines-io ==0.2.0.6,- machines-process ==0.2.0.4,- mainland-pretty ==0.2.7.2,- managed ==1.0.0,- mandrill ==0.2.2.0,- map-syntax ==0.2,- markdown ==0.1.13.2,- markdown-unlit ==0.2.0.1,- math-functions ==0.1.5.2,- matrix ==0.3.4.3,- maximal-cliques ==0.1.1,- MaybeT ==0.1.2,- mbox ==0.3.1,- MemoTrie ==0.6.2,- mersenne-random-pure64 ==0.2.0.4,- messagepack ==0.3.0,- messagepack-rpc ==0.1.0.3,- MFlow ==0.4.5.9,- mime-mail ==0.4.8.2,- mime-mail-ses ==0.3.2.2,- mime-types ==0.1.0.6,- missing-foreign ==0.1.1,- MissingH ==1.3.0.1,- mmap ==0.5.9,- mmorph ==1.0.4,- MonadCatchIO-transformers ==0.3.1.3,- monad-control ==1.0.0.4,- monad-coroutine ==0.9.0.1,- monadcryptorandom ==0.6.1,- monadic-arrays ==0.2.1.4,- monad-journal ==0.7,- monadLib ==3.7.3,- monadloc ==0.7.1,- monad-logger ==0.3.13.1,- monad-logger-json ==0.1.0.0,- monad-logger-syslog ==0.1.1.1,- monad-loops ==0.4.2.1,- monad-par ==0.3.4.7,- monad-parallel ==0.7.1.4,- monad-par-extras ==0.3.3,- monad-primitive ==0.1,- monad-products ==4.0.0.1,- MonadPrompt ==1.0.0.5,- MonadRandom ==0.3.0.2,- monad-st ==0.2.4,- monads-tf ==0.1.0.2,- mongoDB ==2.0.5,- monoid-extras ==0.3.3.5,- monoid-subclasses ==0.4.0.4,- mono-traversable ==0.9.1,- mtl ==2.1.3.1,- mtl-compat ==0.2.1.1,- mtlparse ==0.1.4.0,- mtl-prelude ==1.0.3,- multiarg ==0.30.0.8,- multimap ==1.2.1,- multipart ==0.1.2,- MusicBrainz ==0.2.4,- mutable-containers ==0.3.0,- mwc-random ==0.13.3.2,- mysql ==0.1.1.8,- mysql-simple ==0.2.2.5,- nanospec ==0.2.1,- nats ==1,- neat-interpolation ==0.2.2.1,- nettle ==0.1.0,- network ==2.6.1.0,- network-anonymous-i2p ==0.10.0,- network-attoparsec ==0.12.2,- network-conduit ==1.1.0,- network-conduit-tls ==1.1.2,- network-info ==0.2.0.5,- network-multicast ==0.0.11,- network-simple ==0.4.0.4,- network-transport ==0.4.1.0,- network-transport-tcp ==0.4.1,- network-transport-tests ==0.2.2.0,- network-uri ==2.6.0.3,- newtype ==0.2,- nsis ==0.2.5,- numbers ==3000.2.0.1,- numeric-extras ==0.0.3,- NumInstances ==1.4,- numtype ==1.1,- ObjectName ==1.1.0.0,- Octree ==0.5.4.2,- old-locale installed,- old-time installed,- OneTuple ==0.2.1,- opaleye ==0.3.1.2,- OpenGL ==2.12.0.1,- OpenGLRaw ==2.4.1.0,- openpgp-asciiarmor ==0.1,- operational ==0.2.3.2,- options ==1.2.1.1,- optparse-applicative ==0.11.0.2,- optparse-simple ==0.0.2,- osdkeys ==0.0,- pagerduty ==0.0.3.1,- palette ==0.1.0.2,- pandoc ==1.13.2.1,- pandoc-citeproc ==0.6.0.1,- pandoc-types ==1.12.4.2,- pango ==0.13.1.0,- parallel ==3.2.0.6,- parallel-io ==0.3.3,- parseargs ==0.1.5.2,- parsec ==3.1.9,- parsers ==0.12.2.1,- partial-handler ==0.1.1,- path-pieces ==0.2.0,- patience ==0.1.1,- pcre-heavy ==0.2.2,- pcre-light ==0.4.0.3,- pdfinfo ==1.5.4,- pem ==0.2.2,- persistent ==2.1.5,- persistent-mongoDB ==2.1.2.2,- persistent-mysql ==2.1.3.1,- persistent-postgresql ==2.1.5.3,- persistent-sqlite ==2.1.4.2,- persistent-template ==2.1.3.1,- phantom-state ==0.2.0.2,- picoparsec ==0.1.2.2,- pipes ==4.1.5,- pipes-aeson ==0.4.1.3,- pipes-attoparsec ==0.5.1.2,- pipes-binary ==0.4.0.4,- pipes-bytestring ==2.1.1,- pipes-concurrency ==2.0.3,- pipes-group ==1.0.2,- pipes-network ==0.6.4,- pipes-parse ==3.0.2,- pipes-safe ==2.2.2,- placeholders ==0.1,- plot ==0.2.3.4,- plot-gtk ==0.2.0.2,- plot-gtk3 ==0.1,- pointed ==4.2.0.2,- polyparse ==1.11,- postgresql-binary ==0.5.2.1,- postgresql-libpq ==0.9.0.2,- postgresql-simple ==0.4.10.0,- post-mess-age ==0.1.0.0,- prednote ==0.32.0.6,- prefix-units ==0.1.0.2,- prelude-extras ==0.4,- presburger ==1.3.1,- present ==2.2,- pretty installed,- prettyclass ==1.0.0.0,- pretty-class ==1.0.1.1,- pretty-show ==1.6.8.2,- primes ==0.2.1.0,- primitive ==0.6,- process installed,- process-extras ==0.3.3.4,- product-profunctors ==0.6.1,- profunctor-extras ==4.0,- profunctors ==4.4.1,- project-template ==0.1.4.2,- PSQueue ==1.1,- publicsuffixlist ==0.1,- punycode ==2.0,- pure-io ==0.2.1,- pureMD5 ==2.1.2.1,- pwstore-fast ==2.4.4,- quandl-api ==0.2.1.0,- QuasiText ==0.1.2.5,- QuickCheck ==2.7.6,- quickcheck-assertions ==0.2.0,- quickcheck-instances ==0.3.11,- quickcheck-io ==0.1.1,- quickcheck-unicode ==1.0.0.1,- rainbow ==0.22.0.2,- random ==1.1,- random-fu ==0.2.6.2,- random-shuffle ==0.0.4,- random-source ==0.3.0.6,- rank1dynamic ==0.2.0.1,- Rasterific ==0.5.2.1,- rasterific-svg ==0.1.0.3,- raw-strings-qq ==1.0.2,- ReadArgs ==1.2.2,- reducers ==3.10.3.1,- reflection ==1.5.2.1,- RefSerialize ==0.3.1.4,- regex-applicative ==0.3.1,- regex-base ==0.93.2,- regex-compat ==0.95.1,- regex-pcre-builtin ==0.94.4.8.8.35,- regex-posix ==0.95.2,- regexpr ==0.5.4,- regex-tdfa ==1.2.0,- regex-tdfa-rc ==1.1.8.3,- regular ==0.3.4.4,- regular-xmlpickler ==0.2,- rematch ==0.2.0.0,- repa ==3.3.1.2,- repa-algorithms ==3.3.1.2,- repa-devil ==0.3.2.6,- repa-io ==3.3.1.2,- reroute ==0.2.3.0,- resource-pool ==0.2.3.2,- resourcet ==1.1.5,- rest-client ==0.5.0.3,- rest-core ==0.35.1,- rest-gen ==0.17.0.4,- rest-happstack ==0.2.10.8,- rest-snap ==0.1.17.18,- rest-stringmap ==0.2.0.4,- rest-types ==1.13.1,- rest-wai ==0.1.0.8,- rethinkdb-client-driver ==0.0.18,- retry ==0.6,- rev-state ==0.1,- rfc5051 ==0.1.0.3,- RSA ==2.1.0.1,- rts installed,- runmemo ==1.0.0.1,- rvar ==0.2.0.2,- safe ==0.3.9,- safecopy ==0.8.5,- sbv ==4.2,- scientific ==0.3.3.8,- scotty ==0.9.1,- scrobble ==0.2.1.1,- sdl2 ==1.3.1,- securemem ==0.1.7,- semigroupoid-extras ==4.0,- semigroupoids ==4.3,- semigroups ==0.16.2.2,- semver ==0.3.3.1,- sendfile ==0.7.9,- seqloc ==0.6.1.1,- servant ==0.2.2,- servant-client ==0.2.2,- servant-docs ==0.3.1,- servant-jquery ==0.2.2.1,- servant-server ==0.2.4,- setenv ==0.1.1.3,- set-monad ==0.2.0.0,- SHA ==1.6.4.2,- shake ==0.15.2,- shake-language-c ==0.6.4,- shakespeare ==2.0.5,- shakespeare-text ==1.1.0,- shell-conduit ==4.5.2,- shelltestrunner ==1.3.5,- shelly ==1.6.1.2,- silently ==1.2.4.1,- simple-reflect ==0.3.2,- simple-sendfile ==0.2.20,- singletons ==1.1.2,- siphash ==1.0.3,- skein ==1.0.9.3,- slave-thread ==0.1.6,- smallcheck ==1.1.1,- smoothie ==0.1.3,- smtLib ==1.0.7,- snap ==0.14.0.4,- snap-core ==0.9.7.0,- snaplet-fay ==0.3.3.11,- snap-server ==0.9.5.1,- snowflake ==0.1.1.1,- soap ==0.2.2.5,- soap-openssl ==0.1.0.2,- soap-tls ==0.1.1.2,- socks ==0.5.4,- sodium ==0.11.0.3,- sourcemap ==0.1.3.0,- speculation ==1.5.0.2,- sphinx ==0.6.0.1,- split ==0.2.2,- Spock ==0.7.9.0,- Spock-digestive ==0.1.0.0,- Spock-worker ==0.2.1.3,- spoon ==0.3.1,- sqlite-simple ==0.4.8.0,- srcloc ==0.4.1,- stackage ==0.7.2.0,- stackage-build-plan ==0.1.1.0,- stackage-cli ==0.1.0.2,- stackage-curator ==0.7.4,- stackage-install ==0.1.1.1,- stackage-types ==1.0.1.1,- stackage-update ==0.1.2,- stackage-upload ==0.1.0.5,- stateref ==0.3,- statestack ==0.2.0.4,- StateVar ==1.1.0.0,- statistics ==0.13.2.3,- statistics-linreg ==0.3,- stm ==2.4.4,- stm-chans ==3.0.0.3,- stm-conduit ==2.5.4,- stm-containers ==0.2.9,- stm-stats ==0.2.0.0,- storable-complex ==0.2.2,- storable-endian ==0.2.5,- streaming-commons ==0.1.12.1,- streams ==3.2,- strict ==0.3.2,- stringable ==0.1.3,- stringbuilder ==0.5.0,- string-conversions ==0.3.0.3,- stringprep ==1.0.0,- stringsearch ==0.3.6.6,- stylish-haskell ==0.5.13.0,- SVGFonts ==1.4.0.3,- svg-tree ==0.1.1,- syb ==0.4.4,- syb-with-class ==0.6.1.5,- symbol ==0.2.4,- system-canonicalpath ==0.3.2.0,- system-fileio ==0.3.16.3,- system-filepath ==0.4.13.4,- system-posix-redirect ==1.1.0.1,- tabular ==0.2.2.7,- tagged ==0.7.3,- tagshare ==0.0,- tagsoup ==0.13.3,- tagstream-conduit ==0.5.5.3,- tar ==0.4.1.0,- tardis ==0.3.0.0,- tasty ==0.10.1.2,- tasty-ant-xml ==1.0.1,- tasty-golden ==2.3.0.1,- tasty-hunit ==0.9.2,- tasty-kat ==0.0.3,- tasty-quickcheck ==0.8.3.2,- tasty-smallcheck ==0.8.0.1,- tasty-th ==0.1.3,- TCache ==0.12.0,- template-haskell installed,- temporary ==1.2.0.3,- temporary-rc ==1.2.0.3,- terminal-progress-bar ==0.0.1.4,- terminal-size ==0.3.0,- terminfo installed,- test-framework ==0.8.1.1,- test-framework-hunit ==0.3.0.1,- test-framework-quickcheck2 ==0.3.0.3,- test-framework-th ==0.2.4,- testing-feat ==0.4.0.2,- testpack ==2.1.3.0,- texmath ==0.8.2,- text ==1.2.0.6,- text-binary ==0.1.0,- text-format ==0.3.1.1,- text-icu ==0.7.0.1,- text-manipulate ==0.1.3.1,- tf-random ==0.5,- th-desugar ==1.5.3,- th-expand-syns ==0.3.0.6,- th-extras ==0.0.0.2,- th-lift ==0.7.2,- th-orphans ==0.11.1,- threads ==0.5.1.3,- th-reify-many ==0.1.3,- thyme ==0.3.5.5,- time installed,- time-compat ==0.1.0.3,- time-lens ==0.4.0.1,- time-locale-compat ==0.1.0.1,- timezone-olson ==0.1.7,- timezone-series ==0.1.5.1,- tls ==1.2.17,- tls-debug ==0.3.4,- tostring ==0.2.1.1,- transformers installed,- transformers-base ==0.4.4,- transformers-compat ==0.4.0.3,- traverse-with-class ==0.2.0.3,- tree-view ==0.4,- trifecta ==1.5.1.3,- tttool ==1.3,- tuple ==0.3.0.2,- turtle ==1.0.2,- type-eq ==0.5,- type-list ==0.0.0.1,- udbus ==0.2.1,- unbounded-delays ==0.1.0.9,- unbound-generics ==0.1.2.1,- union-find ==0.2,- uniplate ==1.6.12,- unix installed,- unix-compat ==0.4.1.4,- unix-time ==0.3.5,- unordered-containers ==0.2.5.1,- uri-encode ==1.5.0.4,- url ==2.1.3,- users ==0.1.0.0,- users-postgresql-simple ==0.1.0.1,- users-test ==0.1.0.0,- utf8-light ==0.4.2,- utf8-string ==1,- uuid ==1.3.10,- uuid-types ==1.0.1,- vault ==0.3.0.4,- vector ==0.10.12.3,- vector-algorithms ==0.6.0.4,- vector-binary-instances ==0.2.1.0,- vector-buffer ==0.4.1,- vector-instances ==3.3.0.1,- vector-space ==0.9,- vector-space-points ==0.2.1.1,- vector-th-unbox ==0.2.1.2,- vhd ==0.2.2,- void ==0.7,- wai ==3.0.2.3,- wai-app-static ==3.0.1.1,- wai-conduit ==3.0.0.2,- wai-eventsource ==3.0.0,- wai-extra ==3.0.7.1,- wai-handler-launch ==3.0.0.3,- wai-logger ==2.2.4,- wai-middleware-consul ==0.1.0.2,- wai-middleware-static ==0.6.0.1,- waitra ==0.0.3.0,- wai-websockets ==3.0.0.5,- warp ==3.0.13.1,- warp-tls ==3.0.3,- webdriver ==0.6.1,- web-fpco ==0.1.1.0,- websockets ==0.9.4.0,- wizards ==1.0.2,- wl-pprint ==1.1,- wl-pprint-extras ==3.5.0.4,- wl-pprint-terminfo ==3.7.1.3,- wl-pprint-text ==1.1.0.4,- word8 ==0.1.2,- wordpass ==1.0.0.3,- Workflow ==0.8.3,- wrap ==0.0.0,- wreq ==0.3.0.1,- X11 ==1.6.1.2,- x509 ==1.5.0.1,- x509-store ==1.5.0,- x509-system ==1.5.0,- x509-validation ==1.5.2,- xenstore ==0.1.1,- xhtml installed,- xml ==1.3.14,- xml-conduit ==1.2.6,- xml-conduit-writer ==0.1.1.1,- xmlgen ==0.6.2.1,- xml-hamlet ==0.4.0.11,- xmlhtml ==0.2.3.4,- xml-to-json ==2.0.1,- xml-to-json-fast ==2.0.0,- xml-types ==0.3.4,- xss-sanitize ==0.3.5.5,- yackage ==0.7.0.8,- yaml ==0.8.11,- Yampa ==0.9.7,- YampaSynth ==0.2,- yarr ==1.3.3.3,- yesod ==1.4.1.5,- yesod-auth ==1.4.5,- yesod-auth-deskcom ==1.4.0,- yesod-auth-fb ==1.6.6,- yesod-auth-hashdb ==1.4.2.1,- yesod-auth-oauth ==1.4.0.2,- yesod-auth-oauth2 ==0.0.12,- yesod-bin ==1.4.9.2,- yesod-core ==1.4.9.1,- yesod-eventsource ==1.4.0.1,- yesod-fay ==0.7.1,- yesod-fb ==0.3.4,- yesod-form ==1.4.4.1,- yesod-gitrepo ==0.1.1.0,- yesod-newsfeed ==1.4.0.1,- yesod-persistent ==1.4.0.2,- yesod-sitemap ==1.4.0.1,- yesod-static ==1.4.0.4,- yesod-test ==1.4.3.1,- yesod-text-markdown ==0.1.7,- yesod-websockets ==0.2.1.1,- zeromq4-haskell ==0.6.3,- zip-archive ==0.2.3.7,- zlib ==0.5.4.2,- zlib-bindings ==0.1.1.5,- zlib-enum ==0.2.3.1,- zlib-lens ==0.1.2
− debian/cabal-wrapper
@@ -1,20 +0,0 @@-#!/bin/sh-# It would be more usual to use:-# export CABAL=./Setup-# But Setup currently has a very bad dependency resolver, and very bad-# debugging output, and tends to eat all memory and die on small buildds.-#-# This should be revisited once Debian has a newer ghc than 7.6.3,-# and hopefully gets the improved dependency resolver from cabal.-set -e--# Avoid cabal writing to HOME, and avoid local cabal settings-# influencing the build.-HOME=$(mktemp -d)-export HOME--# Temporary workaround for #763078-PATH=/usr/lib/llvm-3.4/bin:$PATH-export PATH--cabal "$@"
debian/changelog view
@@ -1,3 +1,56 @@+git-annex (5.20150617) unstable; urgency=medium++ * Now supports git annex sync --all --content to sync all versions of all+ files with all repos that want them.+ * Added new "anything" preferred content expression, which matches all+ versions of all files.+ * Standard preferred content for client, backup, incremental backup,+ and unwanted groups have been adjusted to work better when used+ with git annex sync --all --content.+ * fromkey, registerurl: Improve handling of urls that happen to also+ be parsable as strange keys.+ * sync, remotedaemon: Pass configured ssh-options even when+ annex.sshcaching is disabled.+ * assistant: Consume systemd-networkd dbus events to learn about+ changes to network connections, as was already done with+ network-manager and wicd.+ Thanks to Sebastian Reuße for the patches.+ * get --incomplete: New option to resume any interrupted downloads.+ * dead --key: Can be used to mark a key as dead.+ * fsck: Ignore keys that are known to be dead when running in+ --all/--unused/--key mode or a in a bare repo. Closes: #753888+ Otherwise, still reports files with lost contents, even if the content+ is dead.+ * S3: Special remotes can be configured with public=yes to allow+ the public to access the bucket's content.+ * S3: Publically accessible buckets can be used without creds.+ * import --clean-duplicates: Fix bug that didn't count local or trusted+ repo's copy of a file as one of the necessary copies to allow removing+ it from the import location.+ * tahoe: Use ~/.tahoe-git-annex/ rather than ~/.tahoe/git-annex/+ when setting up a tahoe special remote to avoid old versions of+ tahoe create-client choking.+ * Fix bug that prevented enumerating locally present objects in repos+ tuned with annex.tune.objecthash1=true.+ Fixes: unused, object count in info, unannex.+ * Improve url parsing to handle some urls containing illegal []+ characters in their paths.+ * info: Added json output for "backend usage", "numcopies stats",+ "repositories containing these files", and "transfers in progress".+ * Fix incremental backup standard preferred content expression to match+ its documentation, which says it does not want files that have reached+ a backup repository.+ * Increased the default annex.bloomaccuracy from 1000 to 10000000.+ This makes git annex unused use up to 16 mb more memory than it did+ before, but the massive increase in accuracy makes this worthwhile+ for all but the smallest systems.+ * Build documentation with deterministic=1 for reproducible builds.+ (A new ikiwiki feature.) Closes: #785736+ * Re-remove dependency on obsolete hamlet package. Closes: #786659+ * debian/cabal-wrapper: Removed this hack which should not be needed anymore.++ -- Joey Hess <id@joeyh.name> Wed, 17 Jun 2015 13:50:35 -0400+ git-annex (5.20150528) unstable; urgency=medium * fromkey, registerurl: Allow urls to be specified instead of keys,
debian/control view
@@ -4,7 +4,6 @@ Build-Depends: debhelper (>= 9), ghc (>= 7.4),- cabal-install, libghc-mtl-dev (>= 2.1.1), libghc-missingh-dev, libghc-data-default-dev,@@ -38,8 +37,7 @@ libghc-yesod-form-dev (>= 1.3.15) [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el], libghc-yesod-static-dev (>= 1.2.4) [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el], libghc-yesod-default-dev (>= 1.2.0) [i386 amd64 armel armhf kfreebsd-amd64 powerpc ppc64el],- libghc-hamlet-dev [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el],- libghc-shakespeare-dev [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el],+ libghc-shakespeare-dev (>= 2.0.0) [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el], libghc-clientsession-dev [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el], libghc-warp-dev (>= 3.0.0.5) [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el], libghc-warp-tls-dev [i386 amd64 armel armhf kfreebsd-i386 kfreebsd-amd64 powerpc ppc64el],
debian/patches/standalone-build view
@@ -4,9 +4,11 @@ Origin: NeuroDebian Last-Update: 2015-04-20 ---- a/debian/control-+++ b/debian/control-@@ -87,15 +87,14 @@ Vcs-Git: git://git.kitenet.net/git-annex+Index: git-annex/debian/control+===================================================================+--- git-annex.orig/debian/control++++ git-annex/debian/control+@@ -86,15 +86,14 @@ Vcs-Git: git://git.kitenet.net/git-annex Homepage: http://git-annex.branchable.com/ XS-Testsuite: autopkgtest @@ -28,7 +30,7 @@ Recommends: lsof, gnupg,-@@ -110,7 +109,7 @@ Suggests:+@@ -109,7 +108,7 @@ Suggests: bup, tahoe-lafs, libnss-mdns,@@ -37,7 +39,7 @@ git-annex allows managing files with git, without checking the file contents into git. While that may seem paradoxical, it is useful when dealing with files larger than git can currently easily handle, whether due-@@ -128,3 +127,7 @@ Description: manage files with git, with+@@ -127,3 +126,7 @@ Description: manage files with git, with noticing when files are changed, and automatically committing them to git and transferring them to other computers. The git-annex webapp makes it easy to set up and use git-annex this way.@@ -45,15 +47,22 @@ + This package provides a standalone bundle build of git-annex, which + should be installable on any more or less recent Debian or Ubuntu + release.+Index: git-annex/debian/install+=================================================================== --- /dev/null-+++ b/debian/install++++ git-annex/debian/install @@ -0,0 +1 @@ +tmp/git-annex.linux usr/lib+Index: git-annex/debian/links+=================================================================== --- /dev/null-+++ b/debian/links-@@ -0,0 +1 @@++++ git-annex/debian/links+@@ -0,0 +1,2 @@ +/usr/lib/git-annex.linux/git-annex /usr/bin/git-annex++/usr/lib/git-annex.linux/git-annex-shell /usr/bin/git-annex-shell+Index: git-annex/debian/manpages+=================================================================== --- /dev/null-+++ b/debian/manpages++++ git-annex/debian/manpages @@ -0,0 +1 @@ +debian/git-annex-standalone/usr/lib/git-annex.linux/usr/share/man/man1/git-annex*
debian/rules view
@@ -1,6 +1,7 @@ #!/usr/bin/make -f -export CABAL=debian/cabal-wrapper+# Avoid using cabal, as it writes to $HOME+export CABAL=./Setup STANDALONE_BUILD=$(shell grep -qe '^Package: git-annex-standalone' debian/control \ && echo 1 || echo 0)
+ doc/bugs/Can__39__t_initialize_Tahoe_special_remote.mdwn view
@@ -0,0 +1,40 @@+### Please describe the problem.++I tried to add a Tahoe special remote as follows-+git annex initremote tahoe type=tahoe embedcreds=yes++However, this fails and gives me an error saying that tahoe create-client failed because .tahoe is not empty (even when .tahoe did not previously exist). It seems like git-annex is creating a .tahoe/git-annex directory (which is empty) and then trying to run tahoe create-client, which fails because the .tahoe directory was already created by git-annex.++### What steps will reproduce the problem?+1. Install tahoe and setup a plain git annex repo+2. export TAHOE_FURL=tahoe introducer url here+3. git annex initremote tahoe type=tahoe embedcreds=yes+++### What version of git-annex are you using? On what operating system?+5.20141024~bpo70+1 on Tails 1.2.1 (Debian Wheezy 32-bit)+++### 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 initremote tahoe type=tahoe embedcreds=yes+ +initremote tahoe The base directory '/home/amnesia/.tahoe' is not empty.+To avoid clobbering anything, I am going to quit now.+Please use a different directory, or empty this one.+git-annex: tahoe create-client failed ++# End of transcript or log.+"""]]++> So this was caused by an old version of tahoe-lafs. Might as+> well support older versions if we can easily, I suppose.+> +> I have gone ahead and changed git-annex to use ~/.tahoe-git-annex/+> instead of ~/.tahoe/git-annex/ when setting up new remotes.+> Existing remote's configs will be unchanged. +> +> So, [[fixed|done]] --[[Joey]]
+ doc/bugs/Corrupted_.git__47__annex__47__index_when_running_assistant.mdwn view
@@ -0,0 +1,658 @@+### Please describe the problem.+I’ve noticed a repo in which I’m running the assistant wouldn’t push updates to its remote anymore. Inspecting the assistant log revealed that there was a problem with the index used for the git-annex branch. After deleting the index file, the assistant could sync to the remote again. (Could deleting the annex index have introduced any inconsistencies into the git-annex branch?)++### What steps will reproduce the problem?+Uncertain. However, I made a copy of .git/annex/index and can reproduce the error by cloning my original repo, checking out the git-annex branch, copying in the backed-up index file and doing git write-tree, which then yields an invalid object error.++It looks like the respective object isn’t present in the git object store. The error is for b5f693aa67b6d185e6d967e0a45c3c57a4f4b4a8, but no directory .git/objects/b5 exists (even after unpacking packed objects).++I could supply you with the index file; do you need anything else? If I don’t clone from my repo, I obviously get an invalid object for everything; should I supply you with a git-bundle of the git-annex ref?++### What version of git-annex are you using? On what operating system?+git-annex 5.20150508-1+Linux 4.0.5++### Please provide any additional information below.++Below is the daemon.log* concatenated, starting with the earliest one. Grep for “invalid object” or “write tree”.++[[!format sh """+[2015-06-05 16:59:45 CEST] main: starting assistant version 5.20150508-g883d57f+[2015-06-05 16:59:45 CEST] Cronner: You should enable consistency checking to protect your data. +[2015-06-05 16:59:57 CEST] TransferScanner: Syncing with origin ++ No known network monitor available through dbus; falling back to polling+(scanning...) [2015-06-05 16:59:57 CEST] Watcher: Performing startup scan+(started...) [2015-06-05 16:59:58 CEST] RemoteControl: Syncing with origin +gpg: assuming signed data in '/tmp/git-annex.tmp.0/info'+gpg: Signature made Thu May 28 19:01:58 2015 CEST using DSA key ID 89C809CB+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>" [unknown]+gpg: WARNING: This key is not certified with a trusted signature!+gpg: There is no indication that the signature belongs to the owner.+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB+[2015-06-05 16:59:58 CEST] Upgrader: An upgrade of git-annex is available. (version 5.20150528)+[2015-06-05 16:59:59 CEST] Committer: Committing changes to git+[2015-06-05 16:59:59 CEST] Pusher: Syncing with origin +error: Unable to create '/home/seb/Annex/.git/refs/remotes/origin/master.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.+error: Cannot lock the ref 'refs/remotes/origin/master'.+From ssh://redacted.net/srv/git/seb/annex/annex+ ! d71a4e0..1f265ec master -> origin/master (unable to update local ref)+From ssh://redacted.net/srv/git/seb/annex/annex+ d71a4e0..1f265ec master -> origin/master+error: Unable to create '/home/seb/Annex/.git/refs/remotes/origin/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.+error: Cannot lock the ref 'refs/remotes/origin/git-annex'.+ ! 33446d6..973fbda git-annex -> origin/git-annex (unable to update local ref)+ 33446d6..973fbda git-annex -> origin/git-annex+error: Unable to create '/home/seb/Annex/.git/refs/remotes/origin/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.+error: Cannot lock the ref 'refs/remotes/origin/synced/git-annex'.+ ! 33446d6..973fbda synced/git-annex -> origin/synced/git-annex (unable to update local ref)+ d71a4e0..1f265ec synced/master -> origin/synced/master+ 33446d6..973fbda synced/git-annex -> origin/synced/git-annex+error: Ref refs/remotes/origin/synced/master is at 1f265ecc6288ead453681794551c527f64660f8c but expected d71a4e027cdd61c1323fbdc67103dde97f613192+error: Cannot lock the ref 'refs/remotes/origin/synced/master'.+ ! d71a4e0..1f265ec synced/master -> origin/synced/master (unable to update local ref)+Updating d71a4e0..1f265ec+Fast-forward+ org/software/software.org | 4 +++-+ org/software/theming.org | 7 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-)+Already up-to-date.+To ssh://redacted.net/srv/git/seb/annex/annex.git+ + 973fbda...33446d6 git-annex -> synced/git-annex (forced update)+ ! [rejected] master -> synced/master (non-fast-forward)+error: failed to push some refs to 'ssh://redacted.net/srv/git/seb/annex/annex.git'+hint: Updates were rejected because a pushed branch tip is behind its remote+hint: counterpart. Check out this branch and integrate the remote changes+hint: (e.g. 'git pull ...') before pushing again.+hint: See the 'Note about fast-forwards' in 'git push --help' for details.+[2015-06-05 17:00:00 CEST] Committer: Committing changes to git+To ssh://redacted.net/srv/git/seb/annex/annex.git+ 33446d6..973fbda git-annex -> synced/git-annex+Everything up-to-date+[2015-06-05 17:00:05 CEST] Pusher: Syncing with origin +Everything up-to-date+Connection to redacted.net closed by remote host.+ssh: connect to host redacted.nessh: connect to host redactedssh: connect to host redacted.n[2015-06-05 17:59:57 CEST] NetWatcherFallback: Syncing with origin +Everything up-to-date+[2015-06-05 18:51:33 CEST] Committer: Committing changes to git+[2015-06-05 18:51:33 CEST] Pusher: Syncing with origin +[2015-06-05 18:51:34 CEST] Committer: Committing changes to git+To ssh://redacted.net/srv/git/seb/annex/annex.git+ 1f265ec..1cee9eb master -> synced/master+[2015-06-05 18:51:37 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 19:00:01 CEST] NetWatcherFallback: Syncing with origin +Everything up-to-date+packet_write_wait: Connection to 37.221.198.119: Broken pipe+[2015-06-05 20:00:03 CEST] NetWatcherFallback: Syncing with origin +Everything up-to-date+[2015-06-05 20:13:01 CEST] main: starting assistant version 5.20150508-g883d57f+[2015-06-05 20:13:01 CEST] Cronner: You should enable consistency checking to protect your data. +[2015-06-05 20:13:12 CEST] TransferScanner: Syncing with origin ++ No known network monitor available through dbus; falling back to polling+(scanning...) [2015-06-05 20:13:12 CEST] Watcher: Performing startup scan+(started...) gpg: assuming signed data in '/tmp/git-annex.tmp.0/info'+gpg: Signature made Thu May 28 19:01:58 2015 CEST using DSA key ID 89C809CB+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>" [unknown]+gpg: WARNING: This key is not certified with a trusted signature!+gpg: There is no indication that the signature belongs to the owner.+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB+[2015-06-05 20:13:13 CEST] Upgrader: An upgrade of git-annex is available. (version 5.20150528)+Everything up-to-date+[2015-06-05 20:13:14 CEST] Committer: Committing changes to git+[2015-06-05 20:13:14 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 21:13:12 CEST] NetWatcherFallback: Syncing with origin +Everything up-to-date+[2015-06-05 22:13:14 CEST] NetWatcherFallback: Syncing with origin +Everything up-to-date+[2015-06-05 22:33:04 CEST] Committer: Committing changes to git+[2015-06-05 22:33:04 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 22:33:08 CEST] Committer: Committing changes to git+[2015-06-05 22:33:08 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 22:33:11 CEST] Committer: Committing changes to git+[2015-06-05 22:33:11 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 22:33:14 CEST] Committer: Committing changes to git+[2015-06-05 22:33:14 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 22:33:16 CEST] Committer: Committing changes to git+[2015-06-05 22:33:18 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 22:33:20 CEST] Committer: Committing changes to git+[2015-06-05 22:33:21 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 22:33:27 CEST] Committer: Committing changes to git+[2015-06-05 22:33:27 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 22:33:28 CEST] Committer: Committing changes to git+[2015-06-05 22:33:30 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 22:33:37 CEST] Committer: Committing changes to git+[2015-06-05 22:33:37 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 22:33:43 CEST] Committer: Committing changes to git+[2015-06-05 22:33:43 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 22:34:12 CEST] Committer: Committing changes to git+[2015-06-05 22:34:12 CEST] Pusher: Syncing with origin +[2015-06-05 22:34:13 CEST] Committer: Committing changes to git+To ssh://redacted.net/srv/git/seb/annex/annex.git+ 1cee9eb..46828df master -> synced/master+[2015-06-05 22:34:15 CEST] Pusher: Syncing with origin +To ssh://redacted.net/srv/git/seb/annex/annex.git+ 46828df..8e93c98 master -> synced/master+[2015-06-05 22:34:23 CEST] Committer: Committing changes to git+[2015-06-05 22:34:23 CEST] Pusher: Syncing with origin +To ssh://redacted.net/srv/git/seb/annex/annex.git+ 8e93c98..9bed0e6 master -> synced/master+[2015-06-05 22:34:24 CEST] Committer: Committing changes to git+[2015-06-05 22:34:27 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 23:04:49 CEST] Committer: Committing changes to git+[2015-06-05 23:04:49 CEST] Pusher: Syncing with origin +To ssh://redacted.net/srv/git/seb/annex/annex.git+ 9bed0e6..ec8f2c4 master -> synced/master+[2015-06-05 23:04:50 CEST] Committer: Committing changes to git+[2015-06-05 23:04:52 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 23:11:39 CEST] Committer: Committing changes to git+[2015-06-05 23:11:39 CEST] Pusher: Syncing with origin +To ssh://redacted.net/srv/git/seb/annex/annex.git+ ec8f2c4..14bc26a master -> synced/master+[2015-06-05 23:11:40 CEST] Committer: Committing changes to git+[2015-06-05 23:11:43 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 23:13:16 CEST] NetWatcherFallback: Syncing with origin +Everything up-to-date+[2015-06-05 23:33:28 CEST] Committer: Committing changes to git+[2015-06-05 23:33:28 CEST] Pusher: Syncing with origin +To ssh://redacted.net/srv/git/seb/annex/annex.git+ 14bc26a..bd150f5 master -> synced/master+[2015-06-05 23:33:29 CEST] Committer: Committing changes to git+[2015-06-05 23:33:32 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 23:34:09 CEST] Committer: Committing changes to git+[2015-06-05 23:34:09 CEST] Pusher: Syncing with origin +To ssh://redacted.net/srv/git/seb/annex/annex.git+ bd150f5..290c21c master -> synced/master+[2015-06-05 23:34:10 CEST] Committer: Committing changes to git+[2015-06-05 23:34:12 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 23:34:15 CEST] Committer: Committing changes to git+[2015-06-05 23:34:15 CEST] Pusher: Syncing with origin +[2015-06-05 23:34:16 CEST] Committer: Committing changes to git+To ssh://redacted.net/srv/git/seb/annex/annex.git+ 290c21c..a56091f master -> synced/master+[2015-06-05 23:34:19 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-05 23:35:17 CEST] Committer: Committing changes to git+[2015-06-05 23:35:17 CEST] Pusher: Syncing with origin +[2015-06-05 23:35:18 CEST] Committer: Committing changes to git+To ssh://redacted.net/srv/git/seb/annex/annex.git+ a56091f..2fb635b master -> synced/master+[2015-06-05 23:35:21 CEST] Pusher: Syncing with origin +Everything up-to-date++(recording state in git...)+(recording state in git...)+(recording state in git...)+(recording state in git...)+(recording state in git...)+(recording state in git...)+(recording state in git...)+(recording state in git...)+(recording state in git...)+(recording state in git...)+(recording state in git...)+(recording state in git...)+(recording state in git...)+(recording state in git...)+(recording state in git...)+(recording state in git...)+(recording state in git...)+(recording state in git...)+(recording state in git...)+(recording state in git...)++ lost dbus connection; falling back to polling (ClientError {clientErrorMessage = "Error reading message from socket: UnmarshalError \"Unexpected end of input while parsing message header.\"", clientErrorFatal = True})++ dbus failed; falling back to mtab polling (ClientError {clientErrorMessage = "Error reading message from socket: UnmarshalError \"Unexpected end of input while parsing message header.\"", clientErrorFatal = True})+[2015-06-06 07:17:17 CEST] main: starting assistant version 5.20150508-g883d57f+[2015-06-06 07:17:17 CEST] Cronner: You should enable consistency checking to protect your data. +[2015-06-06 07:17:25 CEST] TransferScanner: Syncing with origin ++ No known network monitor available through dbus; falling back to polling+(scanning...) [2015-06-06 07:17:30 CEST] Watcher: Performing startup scan+gpg: assuming signed data in '/tmp/git-annex.tmp.0/info'+gpg: Signature made Thu May 28 19:01:58 2015 CEST using DSA key ID 89C809CB+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>" [unknown]+gpg: WARNING: This key is not certified with a trusted signature!+gpg: There is no indication that the signature belongs to the owner.+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB+[2015-06-06 07:17:32 CEST] Upgrader: An upgrade of git-annex is available. (version 5.20150528)+Everything up-to-date+(started...) [2015-06-06 07:17:36 CEST] Committer: Committing changes to git+[2015-06-06 07:17:36 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-06 07:45:05 CEST] main: starting assistant version 5.20150508-g883d57f+[2015-06-06 07:45:05 CEST] Cronner: You should enable consistency checking to protect your data. +[2015-06-06 07:45:10 CEST] TransferScanner: Syncing with origin ++ No known network monitor available through dbus; falling back to polling+(scanning...) [2015-06-06 07:45:10 CEST] Watcher: Performing startup scan+(started...) /usr/lib/rsync/rrsync: SSH_ORIGINAL_COMMAND='git-annex-shell 'notifychanges' '/srv/git/seb/annex/annex.git' --uuid a2131774-31b2-47d2-9185-b2e344c16134' is not rsync+gpg: assuming signed data in '/tmp/git-annex.tmp.0/info'+gpg: Signature made Thu May 28 19:01:58 2015 CEST using DSA key ID 89C809CB+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>" [unknown]+gpg: WARNING: This key is not certified with a trusted signature!+gpg: There is no indication that the signature belongs to the owner.+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB+[2015-06-06 07:45:12 CEST] Upgrader: An upgrade of git-annex is available. (version 5.20150528)+[2015-06-06 07:45:12 CEST] Committer: Committing changes to git+[2015-06-06 07:45:12 CEST] Pusher: Syncing with origin +/usr/lib/rsync/rrsync: SSH_ORIGINAL_COMMAND='git-annex-shell 'notifychanges' '/srv/git/seb/annex/annex.git' --uuid a2131774-31b2-47d2-9185-b2e344c16134' is not rsync+Everything up-to-date+Everything up-to-date+/usr/lib/rsync/rrsync: SSH_ORIGINAL_COMMAND='git-annex-shell 'notifychanges' '/srv/git/seb/annex/annex.git' --uuid a2131774-31b2-47d2-9185-b2e344c16134' is not rsync+/usr/lib/rsync/rrsync: SSH_ORIGINAL_COMMAND='git-annex-shell 'notifychanges' '/srv/git/seb/annex/annex.git' --uuid a2131774-31b2-47d2-9185-b2e344c16134' is not rsync+/usr/lib/rsync/rrsync: SSH_ORIGINAL_COMMAND='git-annex-shell 'notifychanges' '/srv/git/seb/annex/annex.git' --uuid a2131774-31b2-47d2-9185-b2e344c16134' is not rsync+/usr/lib/rsync/rrsync: SSH_ORIGINAL_COMMAND='git-annex-shell 'notifychanges' '/srv/git/seb/annex/annex.git' --uuid a2131774-31b2-47d2-9185-b2e344c16134' is not rsync+/usr/lib/rsync/rrsync: SSH_ORIGINAL_COMMAND='git-annex-shell 'notifychanges' '/srv/git/seb/annex/annex.git' --uuid a2131774-31b2-47d2-9185-b2e344c16134' is not rsync++(recording state in git...)++ bugs/nouveau-bug/nouveau.log.8 still has writers, not adding+[2015-06-06 07:47:04 CEST] Committer: Adding nouveau.log.8+add bugs/nouveau-bug/nouveau.log.8 [2015-06-06 07:47:04 CEST] Committer: Committing changes to git+[2015-06-06 07:47:04 CEST] Pusher: Syncing with origin +error: invalid object 100644 b5f693aa67b6d185e6d967e0a45c3c57a4f4b4a8 for '88c/df4/SHA256E-s4644--eca6d831c0a94895a81296327bc21bdf417234c7ebfa3e93fd21a71523ac9da9.log.6.log'+fatal: git-write-tree: error building trees+Pusher crashed: failed to read sha from git write-tree+[2015-06-06 07:47:04 CEST] Pusher: warning Pusher crashed: failed to read sha from git write-tree+/usr/lib/rsync/rrsync: SSH_ORIGINAL_COMMAND='git-annex-shell 'recvkey' '/srv/git/seb/annex/annex.git' 'SHA256E-s4491--e35540a06d6839455b48ecd8f2a4c7714d420379bae55a7b383dc1a5dc60d8e0.log.8' --uuid a2131774-31b2-47d2-9185-b2e344c16134 '--' 'remoteuuid=1dda4b9a-1ff2-4a9b-aaf8-47dfdd02c8ae' 'direct=' 'associatedfile=bugs/nouveau-bug/nouveau.log.8' '--' dummy rsync --server -pe.Lsfx --log-format=X --inplace . .' is not rsync+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.1]+[2015-06-06 07:47:05 CEST] Committer: Committing changes to git+/usr/lib/rsync/rrsync: SSH_ORIGINAL_COMMAND='git-annex-shell 'recvkey' '/srv/git/seb/annex/annex.git' 'SHA256E-s4491--e35540a06d6839455b48ecd8f2a4c7714d420379bae55a7b383dc1a5dc60d8e0.log.8' --uuid a2131774-31b2-47d2-9185-b2e344c16134 '--' 'remoteuuid=1dda4b9a-1ff2-4a9b-aaf8-47dfdd02c8ae' 'direct=' 'associatedfile=bugs/nouveau-bug/nouveau.log.8' '--' dummy rsync --server -pe.Lsfx --log-format=X --inplace . .' is not rsync+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.1]+/usr/lib/rsync/rrsync: SSH_ORIGINAL_COMMAND='git-annex-shell 'notifychanges' '/srv/git/seb/annex/annex.git' --uuid a2131774-31b2-47d2-9185-b2e344c16134' is not rsync+/usr/lib/rsync/rrsync: SSH_ORIGINAL_COMMAND='git-annex-shell 'notifychanges' '/srv/git/seb/annex/annex.git' --uuid/usr/lib/rsync/rrsync: SSH_ORIGINAL_COMMAND='git-annex-shell 'notifychanges' '/srv/git/seb/annex/annex.git' --uuid a2131774-31b2-47d2-9185-b2e344c16134' is not rsync+/usr/lib/rsync/rrsync: SSH_ORIGINAL_COMMAND='git-annex-shell 'notifychanges' '/srv/git/seb/annex/annex.git' --uuid a2131774-31b2-47d2-9185-b2e344c16134' is not rsync+[2015-06-06 08:45:10 CEST] NetWatcherFallback: Syncing with origin +error: invalid object 100644 b5f693aa67b6d185e6d967e0a45c3c57a4f4b4a8 for '88c/df4/SHA256E-s4644--eca6d831c0a94895a81296327bc21bdf417234c7ebfa3e93fd21a71523ac9da9.log.6.log'+fatal: git-write-tree: error building trees+NetWatcherFallback crashed: failed to read sha from git write-tree+[2015-06-06 08:45:12 CEST] NetWatcherFallback: warning NetWatcherFallback crashed: failed to read sha from git write-tree+[2015-06-06 15:58:38 CEST] main: starting assistant version 5.20150508-g883d57f+[2015-06-06 15:58:38 CEST] Cronner: You should enable consistency checking to protect your data. +[2015-06-06 15:58:44 CEST] TransferScanner: Syncing with origin ++ No known network monitor available through dbus; falling back to polling+(scanning...) [2015-06-06 15:58:44 CEST] Watcher: Performing startup scan+(started...) gpg: assuming signed data in '/tmp/git-annex.tmp.0/info'+gpg: Signature made Thu May 28 19:01:58 2015 CEST using DSA key ID 89C809CB+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>" [unknown]+gpg: WARNING: This key is not certified with a trusted signature!+gpg: There is no indication that the signature belongs to the owner.+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB+[2015-06-06 15:58:45 CEST] Upgrader: An upgrade of git-annex is available. (version 5.20150528)+error: invalid object 100644 b5f693aa67b6d185e6d967e0a45c3c57a4f4b4a8 for '88c/df4/SHA256E-s4644--eca6d831c0a94895a81296327bc21bdf417234c7ebfa3e93fd21a71523ac9da9.log.6.log'+fatal: git-write-tree: error building trees+TransferScanner crashed: failed to read sha from git write-tree+[2015-06-06 15:58:45 CEST] TransferScanner: warning TransferScanner crashed: failed to read sha from git write-tree+[2015-06-06 15:58:46 CEST] Committer: Committing changes to git+[2015-06-06 15:58:46 CEST] Pusher: Syncing with origin +error: invalid object 100644 b5f693aa67b6d185e6d967e0a45c3c57a4f4b4a8 for '88c/df4/SHA256E-s4644--eca6d831c0a94895a81296327bc21bdf417234c7ebfa3e93fd21a71523ac9da9.log.6.log'+fatal: git-write-tree: error building trees+Pusher crashed: failed to read sha from git write-tree+[2015-06-06 15:58:46 CEST] Pusher: warning Pusher crashed: failed to read sha from git write-tree+[2015-06-06 16:58:44 CEST] NetWatcherFallback: Syncing with origin +error: invalid object 100644 b5f693aa67b6d185e6d967e0a45c3c57a4f4b4a8 for '88c/df4/SHA256E-s4644--eca6d831c0a94895a81296327bc21bdf417234c7ebfa3e93fd21a71523ac9da9.log.6.log'+fatal: git-write-tree: error building trees+NetWatcherFallback crashed: failed to read sha from git write-tree+[2015-06-06 16:58:47 CEST] NetWatcherFallback: warning NetWatcherFallback crashed: failed to read sha from git write-tree+[2015-06-06 18:10:24 CEST] Committer: Committing changes to git+[2015-06-06 18:10:25 CEST] Committer: Committing changes to git+[2015-06-06 20:01:34 CEST] Committer: Committing changes to git+[2015-06-06 20:01:35 CEST] Committer: Committing changes to git+[2015-06-06 22:42:41 CEST] main: starting assistant version 5.20150508-g883d57f+[2015-06-06 22:42:41 CEST] Cronner: You should enable consistency checking to protect your data. +[2015-06-06 22:42:47 CEST] TransferScanner: Syncing with origin ++ No known network monitor available through dbus; falling back to polling+(scanning...) [2015-06-06 22:42:47 CEST] Watcher: Performing startup scan+(started...) error: invalid object 100644 b5f693aa67b6d185e6d967e0a45c3c57a4f4b4a8 for '88c/df4/SHA256E-s4644--eca6d831c0a94895a81296327bc21bdf417234c7ebfa3e93fd21a71523ac9da9.log.6.log'+fatal: git-write-tree: error building trees+TransferScanner crashed: failed to read sha from git write-tree+[2015-06-06 22:42:48 CEST] TransferScanner: warning TransferScanner crashed: failed to read sha from git write-tree+gpg: assuming signed data in '/tmp/git-annex.tmp.0/info'+gpg: Signature made Thu May 28 19:01:58 2015 CEST using DSA key ID 89C809CB+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>" [unknown]+gpg: WARNING: This key is not certified with a trusted signature!+gpg: There is no indication that the signature belongs to the owner.+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB+[2015-06-06 22:42:48 CEST] Upgrader: An upgrade of git-annex is available. (version 5.20150528)+[2015-06-06 22:42:49 CEST] Committer: Committing changes to git+[2015-06-06 22:42:49 CEST] Pusher: Syncing with origin +error: invalid object 100644 b5f693aa67b6d185e6d967e0a45c3c57a4f4b4a8 for '88c/df4/SHA256E-s4644--eca6d831c0a94895a81296327bc21bdf417234c7ebfa3e93fd21a71523ac9da9.log.6.log'+fatal: git-write-tree: error building trees+Pusher crashed: failed to read sha from git write-tree+[2015-06-06 22:42:49 CEST] Pusher: warning Pusher crashed: failed to read sha from git write-tree++(recording state in git...)+(recording state in git...)+(recording state in git...)++ bugs/nouveau-bug/nouveau.log.9 still has writers, not adding+[2015-06-06 22:43:47 CEST] Committer: Adding nouveau.log.9+add bugs/nouveau-bug/nouveau.log.9 [2015-06-06 22:43:48 CEST] Committer: Committing changes to git++SHA256E-s4427--4e02ba661d0106ff4715a2cfda0fe39185865551bcb484539e618f2b64f9ec0c.log.9++ 4,427 100% 0.00kB/s 0:00:00 + 4,427 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)+[2015-06-06 22:43:48 CEST] Transferrer: Uploaded nouveau.log.9+[2015-06-06 22:43:49 CEST] Committer: Committing changes to git+ok+(recording state in git...)++ lost dbus connection; falling back to polling (ClientError {clientErrorMessage = "Error reading message from socket: UnmarshalError \"Unexpected end of input while parsing message header.\"", clientErrorFatal = True})+[2015-06-07 07:41:35 CEST] main: starting assistant version 5.20150508-g883d57f+[2015-06-07 07:41:35 CEST] Cronner: You should enable consistency checking to protect your data. +[2015-06-07 07:41:42 CEST] TransferScanner: Syncing with origin ++ No known network monitor available through dbus; falling back to polling+(scanning...) [2015-06-07 07:41:42 CEST] Watcher: Performing startup scan+(started...) error: invalid object 100644 b5f693aa67b6d185e6d967e0a45c3c57a4f4b4a8 for '88c/df4/SHA256E-s4644--eca6d831c0a94895a81296327bc21bdf417234c7ebfa3e93fd21a71523ac9da9.log.6.log'+fatal: git-write-tree: error building trees+TransferScanner crashed: failed to read sha from git write-tree+[2015-06-07 07:41:43 CEST] TransferScanner: warning TransferScanner crashed: failed to read sha from git write-tree+gpg: assuming signed data in '/tmp/git-annex.tmp.0/info'+gpg: Signature made Thu May 28 19:01:58 2015 CEST using DSA key ID 89C809CB+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>" [unknown]+gpg: WARNING: This key is not certified with a trusted signature!+gpg: There is no indication that the signature belongs to the owner.+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB+[2015-06-07 07:41:43 CEST] Upgrader: An upgrade of git-annex is available. (version 5.20150528)+[2015-06-07 07:41:44 CEST] Committer: Committing changes to git+[2015-06-07 07:41:44 CEST] Pusher: Syncing with origin +error: invalid object 100644 b5f693aa67b6d185e6d967e0a45c3c57a4f4b4a8 for '88c/df4/SHA256E-s4644--eca6d831c0a94895a81296327bc21bdf417234c7ebfa3e93fd21a71523ac9da9.log.6.log'+fatal: git-write-tree: error building trees+Pusher crashed: failed to read sha from git write-tree+[2015-06-07 07:41:44 CEST] Pusher: warning Pusher crashed: failed to read sha from git write-tree+[2015-06-07 08:41:42 CEST] NetWatcherFallback: Syncing with origin +error: invalid object 100644 b5f693aa67b6d185e6d967e0a45c3c57a4f4b4a8 for '88c/df4/SHA256E-s4644--eca6d831c0a94895a81296327bc21bdf417234c7ebfa3e93fd21a71523ac9da9.log.6.log'+fatal: git-write-tree: error building trees+NetWatcherFallback crashed: failed to read sha from git write-tree+[2015-06-07 08:41:43 CEST] NetWatcherFallback: warning NetWatcherFallback crashed: failed to read sha from git write-tree+[2015-06-07 09:21:46 CEST] main: starting assistant version 5.20150508-g883d57f+[2015-06-07 09:21:46 CEST] Cronner: You should enable consistency checking to protect your data. +[2015-06-07 09:21:49 CEST] main: starting assistant version 5.20150508-g883d57f+[2015-06-07 09:21:49 CEST] Cronner: You should enable consistency checking to protect your data. +[2015-06-07 09:21:54 CEST] TransferScanner: Syncing with origin ++ No known network monitor available through dbus; falling back to polling+(scanning...) [2015-06-07 09:21:55 CEST] Watcher: Performing startup scan+(started...) +(recording state in git...)+error: invalid object 100644 b5f693aa67b6d185e6d967e0a45c3c57a4f4b4a8 for '88c/df4/SHA256E-s4644--eca6d831c0a94895a81296327bc21bdf417234c7ebfa3e93fd21a71523ac9da9.log.6.log'+fatal: git-write-tree: error building trees+TransferScanner crashed: failed to read sha from git write-tree+[2015-06-07 09:21:55 CEST] TransferScanner: warning TransferScanner crashed: failed to read sha from git write-tree+gpg: assuming signed data in '/tmp/git-annex.tmp.0/info'+gpg: Signature made Thu May 28 19:01:58 2015 CEST using DSA key ID 89C809CB+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>" [unknown]+gpg: WARNING: This key is not certified with a trusted signature!+gpg: There is no indication that the signature belongs to the owner.+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB+[2015-06-07 09:21:56 CEST] Upgrader: An upgrade of git-annex is available. (version 5.20150528)+[2015-06-07 09:21:56 CEST] Committer: Committing changes to git+(recording state in git...)+[2015-06-07 09:21:56 CEST] Pusher: Syncing with origin +(recording state in git...)+error: invalid object 100644 b5f693aa67b6d185e6d967e0a45c3c57a4f4b4a8 for '88c/df4/SHA256E-s4644--eca6d831c0a94895a81296327bc21bdf417234c7ebfa3e93fd21a71523ac9da9.log.6.log'+fatal: git-write-tree: error building trees+Pusher crashed: failed to read sha from git write-tree+[2015-06-07 09:21:57 CEST] Pusher: warning Pusher crashed: failed to read sha from git write-tree+[2015-06-07 09:23:07 CEST] main: starting assistant version 5.20150508-g883d57f+[2015-06-07 09:23:07 CEST] Cronner: You should enable consistency checking to protect your data. +[2015-06-07 09:23:12 CEST] TransferScanner: Syncing with origin ++ No known network monitor available through dbus; falling back to polling+(scanning...) [2015-06-07 09:23:12 CEST] Watcher: Performing startup scan+(started...) +(recording state in git...)+gpg: assuming signed data in '/tmp/git-annex.tmp.0/info'+gpg: Signature made Thu May 28 19:01:58 2015 CEST using DSA key ID 89C809CB+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>" [unknown]+gpg: WARNING: This key is not certified with a trusted signature!+gpg: There is no indication that the signature belongs to the owner.+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB+[2015-06-07 09:23:13 CEST] Upgrader: An upgrade of git-annex is available. (version 5.20150528)+[2015-06-07 09:23:14 CEST] Committer: Committing changes to git+(recording state in git...)+[2015-06-07 09:23:14 CEST] Pusher: Syncing with origin ++SHA256E-s4491--e35540a06d6839455b48ecd8f2a4c7714d420379bae55a7b383dc1a5dc60d8e0.log.8++ 4,491 100% 0.00kB/s 0:00:00 + 4,491 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)+[2015-06-07 09:23:15 CEST] Transferrer: Uploaded nouveau.log.8+error: Unable to create '/srv/git/seb/annex/annex.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.+remote: error: Cannot lock the ref 'refs/heads/synced/git-annex'. +error: Unable to create '/srv/git/seb/annex/annex.git/refs/heads/synced/master.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.+remote: error: Cannot lock the ref 'refs/heads/synced/master'. +To ssh://redacted.net/srv/git/seb/annex/annex.git+ aec4d80..5cac670 master -> synced/master+ ! [remote rejected] git-annex -> synced/git-annex (failed to update ref)+To ssh://redacted.net/srv/git/seb/annex/annex.git+ 973fbda..118a888 git-annex -> synced/git-annex+ ! [remote rejected] master -> synced/master (failed to update ref)+error: failed to push some refs to 'ssh://redacted.net/srv/git/seb/annex/annex.git'+error: failed to push some refs to 'ssh://redacted.net/srv/git/seb/annex/annex.git'+error: Ref refs/remotes/origin/master is at 5cac670bc3d15a2d1a976ab02b2717078717ad48 but expected aec4d80548993b2b6e126124153fab9c93de8375+error: Cannot lock the ref 'refs/remotes/origin/master'.+From ssh://redacted.net/srv/git/seb/annex/annex+ ! aec4d80..5cac670 master -> origin/master (unable to update local ref)+error: Ref refs/remotes/origin/git-annex is at 118a888e0244e644c2ec6c0bf100e787d25a222d but expected 973fbdad6d8b549c4db0633ef11fa5a8f9ec0ed1+error: Cannot lock the ref 'refs/remotes/origin/git-annex'.+ ! 973fbda..118a888 git-annex -> origin/git-annex (unable to update local ref)+Everything up-to-date+Everything up-to-date+(recording state in git...)+[2015-06-07 09:23:20 CEST] main: starting assistant version 5.20150508-g883d57f+[2015-06-07 09:23:20 CEST] Cronner: You should enable consistency checking to protect your data. +[2015-06-07 09:23:25 CEST] TransferScanner: Syncing with origin ++ No known network monitor available through dbus; falling back to polling+(scanning...) [2015-06-07 09:23:25 CEST] Watcher: Performing startup scan+(started...) +From ssh://redacted.net/srv/git/seb/annex/annex+ 118a888..e058e35 git-annex -> origin/git-annex+(merging origin/git-annex into git-annex...)+(recording state in git...)+gpg: assuming signed data in '/tmp/git-annex.tmp.0/info'+gpg: Signature made Thu May 28 19:01:58 2015 CEST using DSA key ID 89C809CB+gpg: /tmp/git-annex-gpg.tmp.0/trustdb.gpg: trustdb created+gpg: Good signature from "git-annex distribution signing key (for Joey Hess) <id@joeyh.name>" [unknown]+gpg: WARNING: This key is not certified with a trusted signature!+gpg: There is no indication that the signature belongs to the owner.+Primary key fingerprint: 4005 5C6A FD2D 526B 2961 E78F 5EE1 DBA7 89C8 09CB+[2015-06-07 09:23:26 CEST] Upgrader: An upgrade of git-annex is available. (version 5.20150528)+To ssh://redacted.net/srv/git/seb/annex/annex.git+ 118a888..37bc288 git-annex -> synced/git-annex+[2015-06-07 09:23:27 CEST] Committer: Committing changes to git+(recording state in git...)+[2015-06-07 09:23:27 CEST] Pusher: Syncing with origin +Everything up-to-date+[2015-06-07 09:25:21 CEST] Committer: Adding daemon.log.4+add bugs/git-annex/daemon.log.4 ok+[2015-06-07 09:25:21 CEST] Committer: Committing changes to git+(recording state in git...)+[2015-06-07 09:25:21 CEST] Pusher: Syncing with origin +(recording state in git...)++SHA256E-s2383--66aa385819f9ba961c3b4701dd68b6d1450af08ae24428461d342be8b12784a2.log.4++ 2,383 100% 0.00kB/s 0:00:00 + 2,383 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)+[2015-06-07 09:25:21 CEST] Transferrer: Uploaded daemon.log.4+To ssh://redacted.net/srv/git/seb/annex/annex.git+ 37bc288..5c63092 git-annex -> synced/git-annex+ 5cac670..3a5e7d0 master -> synced/master+[2015-06-07 09:25:22 CEST] Committer: Committing changes to git+[2015-06-07 09:25:24 CEST] Pusher: Syncing with origin +(recording state in git...)+To ssh://redacted.net/srv/git/seb/annex/annex.git+ 5c63092..07a3e47 git-annex -> synced/git-annex+[2015-06-07 09:25:40 CEST] Committer: Adding index~+add bugs/git-annex/index~ ok+[2015-06-07 09:25:40 CEST] Committer: Committing changes to git+(recording state in git...)+[2015-06-07 09:25:40 CEST] Pusher: Syncing with origin +(recording state in git...)++SHA256E-s178074--cf093bacc4367a5e86a07cb8523b183dd0a5401805dde646cf0b2b0ddc8ee282++ 32,768 18% 0.00kB/s 0:00:00 + 178,074 100% 69.29MB/s 0:00:00 (xfr#1, to-chk=0/1)+[2015-06-07 09:25:41 CEST] Committer: Committing changes to git+[2015-06-07 09:25:41 CEST] Transferrer: Uploaded index~+To ssh://redacted.net/srv/git/seb/annex/annex.git+ 07a3e47..32d41fc git-annex -> synced/git-annex+ 3a5e7d0..20e6e3c master -> synced/master+[2015-06-07 09:25:44 CEST] Pusher: Syncing with origin +(recording state in git...)+To ssh://redacted.net/srv/git/seb/annex/annex.git+ 32d41fc..b61b73e git-annex -> synced/git-annex+[2015-06-07 09:44:47 CEST] Committer: Adding daemon.log daemon.log.1 daemon.log.10 daemon.log.2 daemon.log.3+add bugs/git-annex/daemon.log ok+add bugs/git-annex/daemon.log.1 ok+add bugs/git-annex/daemon.log.10 ok+add bugs/git-annex/daemon.log.2 ok+add bugs/git-annex/daemon.log.3 ok+[2015-06-07 09:44:47 CEST] Committer: Committing changes to git+(recording state in git...)+[2015-06-07 09:44:47 CEST] Pusher: Syncing with origin +(recording state in git...)++SHA256E-s3284--5784c99b359a5fdfb52f26e82165ffba54d62f9f5cd846fce25a3c6f694eb890.log++ 3,284 100% 0.00kB/s 0:00:00 + 3,284 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)+[2015-06-07 09:44:47 CEST] Transferrer: Uploaded daemon.log++SHA256E-s178--704e1850cab9a6b074ba2a77344199b866e9408541b83bf1ad6b3bbd23dfc54a.log.3++ 178 100% 0.00kB/s 0:00:00 + 178 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)+[2015-06-07 09:44:48 CEST] Transferrer: Uploaded daemon.log.3+To ssh://redacted.net/srv/git/seb/annex/annex.git+ b61b73e..854cbda git-annex -> synced/git-annex+ 20e6e3c..0d8b74a master -> synced/master++SHA256E-s1993--7f1bec5289ebe07306bf57fb91e0dec25b1d8f5cf1efd15297815503f1290477.log.2++ 1,993 100% 0.00kB/s 0:00:00 + 1,993 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)+[2015-06-07 09:44:48 CEST] Committer: Committing changes to git+(recording state in git...)+[2015-06-07 09:44:48 CEST] Transferrer: Uploaded daemon.log.2++SHA256E-s4969--ff59d2458e0b43a1965258bd0064626de1a0b7f911de693a02f34fc1bcb4959a.log.10++ 4,969 100% 0.00kB/s 0:00:00 + 4,969 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)+[2015-06-07 09:44:48 CEST] Transferrer: Uploaded daemon.log.10++SHA256E-s3385--0e7aef46d502f1d3a583b642239cf1272b2410d5976603b65a104fc866c02e70.log.1++ 3,385 100% 0.00kB/s 0:00:00 + 3,385 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)+[2015-06-07 09:44:49 CEST] Transferrer: Uploaded daemon.log.1+[2015-06-07 09:44:50 CEST] Committer: Adding daemon.log.5 daemon.log.6 daemon.log.7 daemon.log.8 daemon.log.9+add bugs/git-annex/daemon.log.5 ok+add bugs/git-annex/daemon.log.6 ok+add bugs/git-annex/daemon.log.7 ok+add bugs/git-annex/daemon.log.8 ok+add bugs/git-annex/daemon.log.9 ok+[2015-06-07 09:44:50 CEST] Committer: Committing changes to git+(recording state in git...)++SHA256E-s2792--313d72ecb598b18884602babaed667b71786a0f50edd291754bac0b70c666fa9.log.5++ 2,792 100% 0.00kB/s 0:00:00 + 2,792 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)+[2015-06-07 09:44:50 CEST] Transferrer: Uploaded daemon.log.5++SHA256E-s6792--8aaddbb316719160b93305bc7a6698df1b2d6b0e6f3366c0fa9f7d258cf12303.log.9++ 6,792 100% 0.00kB/s 0:00:00 + 6,792 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)+[2015-06-07 09:44:50 CEST] Transferrer: Uploaded daemon.log.9+[2015-06-07 09:44:50 CEST] Pusher: Syncing with origin ++SHA256E-s1183--12703bbab3cd4db78fc4449b5c3dddfb82da77c9b4a750d2b7a902f3eb63547b.log.8++ 1,183 100% 0.00kB/s 0:00:00 + 1,183 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)+(recording state in git...)+[2015-06-07 09:44:51 CEST] Transferrer: Uploaded daemon.log.8+[2015-06-07 09:44:51 CEST] Committer: Committing changes to git+(recording state in git...)++SHA256E-s5310--51d80ffdcfdeff4e035f740de0f18afa660404fb448a72421bd7af85ae87ae6f.log.7++ 5,310 100% 0.00kB/s 0:00:00 + 5,310 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)+[2015-06-07 09:44:51 CEST] Transferrer: Uploaded daemon.log.7++SHA256E-s2639--c7a0e874ae2dbc874732c000928a5c2a1a6c3d75dcb89b590fcb9e13415427cd.log.6++ 2,639 100% 0.00kB/s 0:00:00 + 2,639 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)+[2015-06-07 09:44:51 CEST] Transferrer: Uploaded daemon.log.6+To ssh://redacted.net/srv/git/seb/annex/annex.git+ 854cbda..c940c96 git-annex -> synced/git-annex+ 0d8b74a..3865343 master -> synced/master+[2015-06-07 09:44:54 CEST] Pusher: Syncing with origin +(recording state in git...)+To ssh://redacted.net/srv/git/seb/annex/annex.git+ c940c96..95a399f git-annex -> synced/git-annex+ 3865343..c04efc3 master -> synced/master++"""]]
doc/bugs/Stale_keys_not_forgotten_upon_git-annex_forget.mdwn view
@@ -29,3 +29,5 @@ git-annex 5.20150508 Linux 4.0.4 +> This can now be dealt with by providing the key to `git annex dead+> --key` [[done]] --[[Joey]]
+ doc/bugs/Support_non-default_storage_classes_with_Google_Cloud_Storage.mdwn view
@@ -0,0 +1,91 @@+### Please describe the problem.++The S3 remote does not support Google Cloud Storage buckets with the Durable Reduced Availability or Nearline storage classes. These are less-expensive alternatives to the Standard storage class, which would otherwise be a good fit for git-annex.++### What steps will reproduce the problem?++1. `git annex initremote cloud type=S3 encryption=none host=storage.googleapis.com bucket=storage-class-test storageclass=NEARLINE`+2. Observe that the bucket is created with Standard storage class.++or,++1. Use Cloud Storage web interface to create the `storage-class-test` bucket with Nearline storage class.+2. `git annex -d initremote cloud type=S3 encryption=none host=storage.googleapis.com bucket=storage-class-test storageclass=NEARLINE`+2. Observe failure shown below.++### What version of git-annex are you using? On what operating system?++5.20150528, Fedora 22++### Please provide any additional information below.++Google Cloud Storage applies the storage class per-bucket rather than per-object. As a result there are two separate problems:++1. If git-annex creates the bucket, there is no way to get it to pass the `StorageClass` XML element in the PUT Bucket operation (see e.g. [here](https://cloud.google.com/storage/docs/nearline#create), the "XML API" tab).+2. If the bucket is manually created by the user, subsequent PUT Object operations explicitly pass an `x-amz-storage-class` of `STANDARD` (or `REDUCED_REDUNDANCY`). Since this is incompatible with the storage class of the bucket, Google Cloud Storage returns `InvalidArgument`.++Example of the second problem:++[[!format sh """+$ git annex -d initremote cloud type=S3 encryption=none host=storage.googleapis.com bucket=storage-class-test storageclass=NEARLINE +[2015-05-31 17:38:21 EDT] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","git-annex"]+[2015-05-31 17:38:21 EDT] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--hash","refs/heads/git-annex"]+[2015-05-31 17:38:21 EDT] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","log","refs/heads/git-annex..417a5e8880eb22fa5288056f4f4e5d998e64a3e6","-n1","--pretty=%H"]+[2015-05-31 17:38:21 EDT] chat: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","cat-file","--batch"]+initremote cloud (checking bucket...) [2015-05-31 17:38:21 EDT] String to sign: "GET\n\n\nSun, 31 May 2015 21:38:21 GMT\n/storage-class-test/annex-uuid"+[2015-05-31 17:38:21 EDT] Host: "storage-class-test.storage.googleapis.com"+[2015-05-31 17:38:21 EDT] Path: "/annex-uuid"+[2015-05-31 17:38:21 EDT] Query string: ""+[2015-05-31 17:38:21 EDT] Response status: Status {statusCode = 404, statusMessage = "Not Found"}+[2015-05-31 17:38:21 EDT] Response header 'Content-Type': 'application/xml; charset=UTF-8'+[2015-05-31 17:38:21 EDT] Response header 'Content-Length': '127'+[2015-05-31 17:38:21 EDT] Response header 'Date': 'Sun, 31 May 2015 21:38:21 GMT'+[2015-05-31 17:38:21 EDT] Response header 'Expires': 'Sun, 31 May 2015 21:38:21 GMT'+[2015-05-31 17:38:21 EDT] Response header 'Cache-Control': 'private, max-age=0'+[2015-05-31 17:38:21 EDT] Response header 'Server': 'UploadServer ("Built on May 21 2015 09:31:47 (1432225907)")'+[2015-05-31 17:38:21 EDT] Response header 'Alternate-Protocol': '80:quic,p=0'+[2015-05-31 17:38:21 EDT] Response metadata: S3: request ID=<none>, x-amz-id-2=<none>+[2015-05-31 17:38:21 EDT] String to sign: "GET\n\n\nSun, 31 May 2015 21:38:21 GMT\n/storage-class-test/"+[2015-05-31 17:38:21 EDT] Host: "storage-class-test.storage.googleapis.com"+[2015-05-31 17:38:21 EDT] Path: "/"+[2015-05-31 17:38:21 EDT] Query string: ""+[2015-05-31 17:38:22 EDT] Response status: Status {statusCode = 200, statusMessage = "OK"}+[2015-05-31 17:38:22 EDT] Response header 'x-goog-metageneration': '1'+[2015-05-31 17:38:22 EDT] Response header 'Content-Type': 'application/xml; charset=UTF-8'+[2015-05-31 17:38:22 EDT] Response header 'Content-Length': '219'+[2015-05-31 17:38:22 EDT] Response header 'Date': 'Sun, 31 May 2015 21:38:21 GMT'+[2015-05-31 17:38:22 EDT] Response header 'Expires': 'Sun, 31 May 2015 21:38:21 GMT'+[2015-05-31 17:38:22 EDT] Response header 'Cache-Control': 'private, max-age=0'+[2015-05-31 17:38:22 EDT] Response header 'Server': 'UploadServer ("Built on May 21 2015 09:31:47 (1432225907)")'+[2015-05-31 17:38:22 EDT] Response header 'Alternate-Protocol': '80:quic,p=0'+[2015-05-31 17:38:22 EDT] Response metadata: S3: request ID=<none>, x-amz-id-2=<none>+[2015-05-31 17:38:22 EDT] String to sign: "GET\n\n\nSun, 31 May 2015 21:38:22 GMT\n/storage-class-test/annex-uuid"+[2015-05-31 17:38:22 EDT] Host: "storage-class-test.storage.googleapis.com"+[2015-05-31 17:38:22 EDT] Path: "/annex-uuid"+[2015-05-31 17:38:22 EDT] Query string: ""+[2015-05-31 17:38:22 EDT] Response status: Status {statusCode = 404, statusMessage = "Not Found"}+[2015-05-31 17:38:22 EDT] Response header 'Content-Type': 'application/xml; charset=UTF-8'+[2015-05-31 17:38:22 EDT] Response header 'Content-Length': '127'+[2015-05-31 17:38:22 EDT] Response header 'Date': 'Sun, 31 May 2015 21:38:22 GMT'+[2015-05-31 17:38:22 EDT] Response header 'Expires': 'Sun, 31 May 2015 21:38:22 GMT'+[2015-05-31 17:38:22 EDT] Response header 'Cache-Control': 'private, max-age=0'+[2015-05-31 17:38:22 EDT] Response header 'Server': 'UploadServer ("Built on May 21 2015 09:31:47 (1432225907)")'+[2015-05-31 17:38:22 EDT] Response header 'Alternate-Protocol': '80:quic,p=0'+[2015-05-31 17:38:22 EDT] Response metadata: S3: request ID=<none>, x-amz-id-2=<none>+[2015-05-31 17:38:22 EDT] String to sign: "PUT\n\n\nSun, 31 May 2015 21:38:22 GMT\nx-amz-storage-class:STANDARD\n/storage-class-test/annex-uuid"+[2015-05-31 17:38:22 EDT] Host: "storage-class-test.storage.googleapis.com"+[2015-05-31 17:38:22 EDT] Path: "/annex-uuid"+[2015-05-31 17:38:22 EDT] Query string: ""+[2015-05-31 17:38:22 EDT] Body: "6eb85d96-8f9b-456a-819c-1724d12d2ffd"+[2015-05-31 17:38:22 EDT] Response status: Status {statusCode = 400, statusMessage = "Bad Request"}+[2015-05-31 17:38:22 EDT] Response header 'Content-Type': 'application/xml; charset=UTF-8'+[2015-05-31 17:38:22 EDT] Response header 'Content-Length': '117'+[2015-05-31 17:38:22 EDT] Response header 'Vary': 'Origin'+[2015-05-31 17:38:22 EDT] Response header 'Date': 'Sun, 31 May 2015 21:38:22 GMT'+[2015-05-31 17:38:22 EDT] Response header 'Server': 'UploadServer ("Built on May 21 2015 09:31:47 (1432225907)")'+[2015-05-31 17:38:22 EDT] Response header 'Alternate-Protocol': '80:quic,p=0'+[2015-05-31 17:38:22 EDT] Response metadata: S3: request ID=<none>, x-amz-id-2=<none>+git-annex: S3Error {s3StatusCode = Status {statusCode = 400, statusMessage = "Bad Request"}, s3ErrorCode = "InvalidArgument", s3ErrorMessage = "Invalid argument.", s3ErrorResource = Nothing, s3ErrorHostId = Nothing, s3ErrorAccessKeyId = Nothing, s3ErrorStringToSign = Nothing}+"""]]++> This is a dup of [[todo/Nearline_support]] ; [[done]] --[[Joey]]
+ doc/bugs/__96__git_annex_add_.__96___fails_for_all_files_if_one_fails.mdwn view
@@ -0,0 +1,34 @@+### Please describe the problem.++I do `git annex add .` to add all new files. However I'm busy copying a big file. This file fails with "... changed while it was being added".+When the `add` ends, none of the files have been added.++I would expect all the files except the one that was changing to be added.++### What steps will reproduce the problem?++Add files while changing one.++### What version of git-annex are you using? On what operating system?++5.20140412ubuntu1++### 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+++# End of transcript or log.+"""]]++> I don't know if I would call this a bug, since you can just re-run the+> command to pick up where it left off. +> +> However, `git annex add` was actually changed in +> [[!commit efb37e7c789921f3f8705d8a5d42d41d9343a00d]] to not+> stop when it fails to add one file, and continue adding the rest.+> So, this is already [[done]]. You just need to get a +> version of git-annex from this April, rather than April 2014..+> --[[Joey]]
+ doc/bugs/clean-duplicates_doesn__39__t_delete_duplicates.mdwn view
@@ -0,0 +1,113 @@+This feels really sucky, seeing as I am the one that asked for these checks to be implemented..++### Please describe the problem.++--clean-duplicates now refuses to remove a file due to not being able to verify its presence in the local repo, even though it is present in the local repo and git-annex knows it is present (whereis and fsck on the keys complete correctly).++### What steps will reproduce the problem?++See transcript++### What version of git-annex are you using? On what operating system?++git-annex versions:+* 2015-05-08+* 2015-05-28++OS: Arch Linux++### 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++ #### gemma@spearmint (0) ~+ ## mkdir ~/tmp/annextest+ mkdir: created directory ?tmp/annextest?+ #### gemma@spearmint (0) ~+ ## cd ~/tmp/annextest+ #### gemma@spearmint (0) ~/tmp/annextest+ ## git init annex+ Initialized empty Git repository in /home/gemma/tmp/annextest/annex/.git/+ #### gemma@spearmint (0) ~/tmp/annextest+ ## cd annex/+ #### gemma@spearmint (0) ~/tmp/annextest/annex+ ## git annex init test+ init test ok+ (recording state in git...)+ #### gemma@spearmint (0) ~/tmp/annextest/annex+ ## echo a > a+ #### gemma@spearmint (0) ~/tmp/annextest/annex+ ## echo b > b+ #### gemma@spearmint (0) ~/tmp/annextest/annex+ ## git annex add *+ add a ok+ add b ok+ (recording state in git...)+ #### gemma@spearmint (0) ~/tmp/annextest/annex+ ## git commit -m "files"+ [master (root-commit) ce31ccf] files+ 2 files changed, 2 insertions(+)+ create mode 120000 a+ create mode 120000 b++ #### gemma@spearmint (0) ~/tmp/annextest/annex+ ## mkdir ../import+ mkdir: created directory ?import?+ #### gemma@spearmint (0) ~/tmp/annextest/annex+ ## cd ../import+ #### gemma@spearmint (0) ~/tmp/annextest/import+ ## echo b > b+ #### gemma@spearmint (0) ~/tmp/annextest/import+ ## echo a > a+ #### gemma@spearmint (0) ~/tmp/annextest/import+ ## cd ../annex+++ #### gemma@spearmint (0) ~/tmp/annextest/annex+ ## git annex import --clean-duplicates ../import/+ import import/b (duplicate of SHA256E-s2--0263829989b6fd954f72baaf2fc64bc2e2f01d692d4de72986ea808f6e99813f) (unsafe) + Could only verify the existence of 0 out of 1 necessary copies++ Could not verify that the content is still present in the annex; not removing from the import location.+ failed+ import import/a (duplicate of SHA256E-s2--87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7) (unsafe) + Could only verify the existence of 0 out of 1 necessary copies++ Could not verify that the content is still present in the annex; not removing from the import location.+ failed+ git-annex: import: 2 failed+++++ #### gemma@spearmint (1) ~/tmp/annextest/annex+ ## git annex whereis --key SHA256E-s2--0263829989b6fd954f72baaf2fc64bc2e2f01d692d4de72986ea808f6e99813f+ whereis SHA256E-s2--0263829989b6fd954f72baaf2fc64bc2e2f01d692d4de72986ea808f6e99813f (1 copy) + 8d91925d-f3d2-493b-a79b-1a18658060a1 -- test [here]+ ok++++ #### gemma@spearmint (0) ~/tmp/annextest/annex+ ## git annex fsck --key SHA256E-s2--0263829989b6fd954f72baaf2fc64bc2e2f01d692d4de72986ea808f6e99813f+ fsck SHA256E-s2--0263829989b6fd954f72baaf2fc64bc2e2f01d692d4de72986ea808f6e99813f (checksum...)+ ok+ (recording state in git...)++++ #### gemma@spearmint (0) ~/tmp/annextest/annex+ ## git annex import --clean-duplicates ../import/+ import import/b (duplicate of SHA256E-s2--0263829989b6fd954f72baaf2fc64bc2e2f01d692d4de72986ea808f6e99813f) (unsafe) + Could only verify the existence of 0 out of 1 necessary copies++ Could not verify that the content is still present in the annex; not removing from the import location.+ failed++# End of transcript or log.+"""]]++> Indeed, I seem to have broken it while refactoring. [[fixed|done]]+> --[[Joey]]
+ doc/bugs/file_not_found.mdwn view
@@ -0,0 +1,30 @@+### Please describe the problem.+Unable to use webapp after creating annex. Error `The file /annex/webapp.html does not exist.` is shown.+++### What steps will reproduce the problem?+Create annex, either using webapp or command line. Kill the webapp and attempt to relaunch.+++### What version of git-annex are you using? On what operating system?+git-annex version: 5.20150205++OS X Version: 10.10.3 (14D136)++Installed using homebrew++### Please provide any additional information below.+++It appears that git-annex is using an absolute path, rather than a relative path pointing to `.git/annex/webapp.html`.+Manually opening the file at `.git/annex/webapp.html` does however show the correct web interface.++[[!format sh """+ git-annex webapp+Launching web browser on file://.git/annex/webapp.html+The file /annex/webapp.html does not exist.+"""]]++> This is an old version of git-annex and there was known breakage around+> that time from the relative path conversion, since fixed, which IIRC+> would manifest this way. [[done]] --[[Joey]]
doc/bugs/fsck_reports_unsolvable_problem.mdwn view
@@ -18,3 +18,10 @@ 5.20140717 from Ubuntu utopic [[!tag confirmed]]++> [[done]] -- fsck --all or in a bare repo will skip over keys that have+> been marked dead, which can be done with `git annex dead --key`.+> +> Might go further later, and make `git annex drop --force`, when removing+> the last copy of a key, mark it as dead. But maybe that is too DWIM.+> --[[Joey]]
doc/bugs/git-annex-shell_doesn__39__t_work_as_expected.mdwn view
@@ -71,7 +71,7 @@ Note that moving the repository out of NFS doesn't fix the problem, i still get `git-annex: unknown command gitannex@cs.isuma.tv`. -How am i supposed to use `git-annex-shell`?+How am i supposed to use `git-annex-shell`? -- [[anarcat]] ### What version of git-annex are you using? On what operating system?
+ doc/bugs/git_annex_fsck_loops.mdwn view
@@ -0,0 +1,91 @@+### Please describe the problem.++It seems i have a somewhat corrupted git repository here, not sure how it happened. I was expecting the magic git annex fsck to recover from this, especially since this is a secondary repository and all objects should be available on the remotes...++### What steps will reproduce the problem?++I am really not sure, but i ended up with empty objects in my git repo.++### What version of git-annex are you using? On what operating system?++git-annex version: 5.20141125++### 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+anarcat@angela:films$ git annex addurl --fast https://www.youtube.com/watch?v=bS5P_LAqiVg+addurl KUNG_FURY_Official_Movie__HD_.mp4 error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+fatal: loose object bff9dc76b05081c33471b9a2bccdb8d86ab06c3b (stored in /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b) is corrupt+anarcat@angela:films$ git fsck+Vérification des répertoires d'objet: 100% (256/256), fait.+error: object file .git/objects/00/ef80c0eefb0ec6ad70c9270bd5780fa3b124b0 is empty+error: object file .git/objects/00/ef80c0eefb0ec6ad70c9270bd5780fa3b124b0 is empty+fatal: loose object 00ef80c0eefb0ec6ad70c9270bd5780fa3b124b0 (stored in .git/objects/00/ef80c0eefb0ec6ad70c9270bd5780fa3b124b0) is corrupt++anarcat@angela:films$ git annex fsck+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+fatal: loose object bff9dc76b05081c33471b9a2bccdb8d86ab06c3b (stored in /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b) is corrupt+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+fatal: loose object bff9dc76b05081c33471b9a2bccdb8d86ab06c3b (stored in /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b) is corrupt+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+fatal: loose object bff9dc76b05081c33471b9a2bccdb8d86ab06c3b (stored in /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b) is corrupt+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+fatal: loose object bff9dc76b05081c33471b9a2bccdb8d86ab06c3b (stored in /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b) is corrupt+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+fatal: loose object bff9dc76b05081c33471b9a2bccdb8d86ab06c3b (stored in /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b) is corrupt+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+fatal: loose object bff9dc76b05081c33471b9a2bccdb8d86ab06c3b (stored in /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b) is corrupt+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+fatal: loose object bff9dc76b05081c33471b9a2bccdb8d86ab06c3b (stored in /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b) is corrupt+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+fatal: loose object bff9dc76b05081c33471b9a2bccdb8d86ab06c3b (stored in /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b) is corrupt+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+fatal: loose object bff9dc76b05081c33471b9a2bccdb8d86ab06c3b (stored in /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b) is corrupt+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+fatal: loose object bff9dc76b05081c33471b9a2bccdb8d86ab06c3b (stored in /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b) is corrupt+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+fatal: loose object bff9dc76b05081c33471b9a2bccdb8d86ab06c3b (stored in /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b) is corrupt+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+fatal: loose object bff9dc76b05081c33471b9a2bccdb8d86ab06c3b (stored in /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b) is corrupt+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+fatal: loose object bff9dc76b05081c33471b9a2bccdb8d86ab06c3b (stored in /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b) is corrupt+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+fatal: loose object bff9dc76b05081c33471b9a2bccdb8d86ab06c3b (stored in /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b) is corrupt+error: object file /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b is empty+fatal: loose object bff9dc76b05081c33471b9a2bccdb8d86ab06c3b (stored in /home/anarcat/video/.git/objects/bf/f9dc76b05081c33471b9a2bccdb8d86ab06c3b) is corrupt++git-annex: fd:13: hGetLine: end of file+failed++git-annex: fd:12: hFlush: resource vanished (Broken pipe)+failed++[...]++git-annex: fd:12: hFlush: resource vanished (Broken pipe)+failed++git-annex: fd:12: commitBuffer: resource vanished (Broken pipe)+failed++git-annex: fd:12: commitBuffer: resource vanished (Broken pipe)+failed++[...]++git-annex: fd:12: commitBuffer: resource vanished (Broken pipe)+failed+^C+# End of transcript or log.+"""]]++--[[anarcat]]++Ah damnit, i confused [[git-annex-fsck]] and [[git-annex-repair]]... :/ Mabe one should run the other when it fails? :) sorry for the noise, [[done]].
+ doc/bugs/import_leaves_empty_directories_behind.mdwn view
@@ -0,0 +1,18 @@+### Please describe the problem.++git annex import leaves empties directories behind.++now maybe that's desired, but in this case, why are the *files* gone and not the directories?++### What steps will reproduce the problem?++<pre>+mkdir -p /tmp/foo/bar+touch /tmp/foo/bar/file+git annex import /tmp/foo+[ -d /tmp/foo/bar ] && echo 'fail: directory still there!'+</pre>++### What version of git-annex are you using? On what operating system?++5.20141125
+ doc/bugs/importfeed_can__39__t_deal_with_pycon_rss_feeds.mdwn view
@@ -0,0 +1,25 @@+### Please describe the problem.++[[git-annex-importfeed]] cannot reliably import feeds from <pyvideo.org/category/65/pycon-us-2015/rss>++### What steps will reproduce the problem?++ git annex importfeed pyvideo.org/category/65/pycon-us-2015/rss++### What version of git-annex are you using? On what operating system?++5.20141125++### Please provide any additional information below.++It seems related to the fact that the `enclosure` XML item links to the youtube page instead of the actual video, which sounds a little crazy... so maybe the feed is just wrong and this is invalid.++In [this pull request to the conference proceedings repo](https://github.com/RichiH/conference_proceedings/pull/42), i hacked around that problem with a [simple loop](https://github.com/anarcat/conference_proceedings/blob/pycon/PyCon/README.md):++ curl -s http://pyvideo.org/category/65/pycon-us-2015/rss | xmllint --xpath '//enclosure/@url' - | sed 's/url=/\n/g' | xargs git annex addurl --fast++xargs doesn't actually work so well because every once in a while, youtube will return a 403 and the whole pipeline crumbles to the ground. I found this to work better:++ curl -s http://pyvideo.org/category/65/pycon-us-2015/rss | xmllint --xpath '//enclosure/@url' - | sed 's/url="/\n/g;s/"//' | while read url ; do git annex addurl --fast $url ; done++but it's pretty ugly! --[[anarcat]]
+ doc/bugs/metadata_view_does_not_vpop_to_original_view.mdwn view
@@ -0,0 +1,41 @@+### Please describe the problem.++I added some metadata to my music repository and tried a metadata-driven view. ++ git annex view composer=* performer=++When I wanted to return to the original list of directories and files, that fails. I now only see a list of directories that contain files which are actually on my laptop, and the generated views.++When I did git annex vpop, I got the following:++ frederik@freo:~/Music$ git annex vpop+ vpop 1 + error: Your local changes to the following files would be overwritten by checkout:+ Mozart, Wolfgang Amadeus/Academy of St. Martin in the Fields/01. Wolfgang Amadeus Mozart - Serenade No. 10 in B-flat major, KV 361 _Gran Partita_ - Ia. Largo_%Wolfgang Amadeus Mozart - Serenade No. 10 in B-flat major, KV 361 _Gran Partita_ (Academy of St. Martin in the Fields feat. conductor - Sir Neville Marriner)%.flac+ Mozart, Wolfgang Amadeus/Academy of St. Martin in the Fields/02. Wolfgang Amadeus Mozart - Serenade No. 10 in B-flat major, KV 361 _Gran Partita_ - Ib. Allegro molto_%Wolfgang Amadeus Mozart - Serenade No. 10 in B-flat major, KV 361 _Gran Partita_ (Academy of St. Martin in the Fields feat. conductor - Sir Neville Marriner)%.flac++I had not actually altered any of these files. I merely cd'd into the directory and did an ls to see what it looked like.++The view is also not generated correctly, as re-running ++ git annex view composer=* performer=++gives me a list of directories with several directories that should not be present in the view.++So far, I'm unable to go back to the original state.++++### What version of git-annex are you using? On what operating system?++Debian/Jessie++git-annex version: 5.20141125+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify 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 tahoe glacier ddar hook external+local repository version: 5+supported repository version: 5+upgrade supported from repository versions: 0 1 2 4++
+ doc/bugs/s3_InternalIOException__63__.mdwn view
@@ -0,0 +1,28 @@+### Please describe the problem.++I got the following errors from the assistant, in `.git/annex/daemon.log`:++ InternalIOException send: resource vanished (Broken pipe)++Then subsequent transfers seem to fail with:++ InternalIOException send: resource vanished (Connection reset by peer)++Workaround: restart the assistant.++### What steps will reproduce the problem?++It's unclear. The assistant is trying to sync a lot of stuff to S3 right now, as files are regularly added into the repository and the assistant migrates them all there. The repository is setup as a "source" repository to make sure it doesn't keep files and send them all to s3.++### What version of git-annex are you using? On what operating system?++standalone tarball `5.20150508-g883d57f` on Ubuntu Precise.++### Please provide any additional information below.++here are the two latest log files, but all previous logfiles available are similar...++http://paste.ubuntu.com/11721025/+http://paste.ubuntu.com/11721028/++-- [[anarcat]]
@@ -0,0 +1,32 @@+### Please describe the problem.+As per [this note](https://git-annex.branchable.com/todo/sharedRepository_mode_not_supported_by_git-annex/), `sharedRepository=world` should be supported. However, it does not seem to work with git-annex 5.20150508. When copying files to the public remote, annexed objects’ permission are subject to the remote user’s umask. If it is 077, they will not be world-readable.+++### What steps will reproduce the problem?++[[!format sh """+# Remotely+git init --shared=world public+cd public+git config receive.denyCurrentBranch updateInstead+git annex init+"""]]++[[!format sh """+# Locally+git init local+cd local+git annex init+git remote add public $URL:public+echo abc > file+git annex add file+git commit -m init+git annex copy --to public file+git annex sync+# If remote user has umask 077, remote object winds up readable only by him+"""]]+++### What version of git-annex are you using? On what operating system?+git-annex 5.20150508+Linux 4.0.4
+ doc/bugs/symlinks_to_absent_files_remain_upon_switching_to_direct_mode.mdwn view
@@ -0,0 +1,72 @@+### Please describe the problem.++in direct mode files with absent content are promised to become regular files but empty... seems to be not a case for me. page describing direct mode has comments about past problems like that but they were told to be dealt with... so I decided to file a new issue++### What steps will reproduce the problem?++switch to direct mode++### What version of git-annex are you using? On what operating system?++5.20150519-geaf72fe++### 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 clone ~exppsy/pymvpa2-tutorialdata /tmp/pymvpa2-tutorialdata-clone +Cloning into '/tmp/pymvpa2-tutorialdata-clone'...+done.++$> cd /tmp/pymvpa2-tutorialdata-clone+debian/ freesurfer/ haxby2001/ hyperalignment_tutorial_data.hdf5.gz@ results/ suma_surfaces/++$> ls -l haxby2001/bold_mc.par hyperalignment_tutorial_data.hdf5.gz+lrwxrwxrwx 1 yoh yoh 199 May 29 15:42 haxby2001/bold_mc.par -> ../.git/annex/objects/KM/Jq/SHA256E-s106236--64972f56116ba575996a0b2fbd26a033dd3e8369e87fda503fec5a45dcd06f57.par/SHA256E-s106236--64972f56116ba575996a0b2fbd26a033dd3e8369e87fda503fec5a45dcd06f57.par+lrwxrwxrwx 1 yoh yoh 208 May 29 15:42 hyperalignment_tutorial_data.hdf5.gz -> .git/annex/objects/1g/M2/SHA256E-s15769613--d4b54133f873ff043df22c6250810c1cb9a177b5eb551ca97d98d664edf8ea3f.hdf5.gz/SHA256E-s15769613--d4b54133f873ff043df22c6250810c1cb9a177b5eb551ca97d98d664edf8ea3f.hdf5.gz++$> git annex enableremote data.pymvpa.org +(merging origin/git-annex into git-annex...)+(recording state in git...)+enableremote data.pymvpa.org ok+(recording state in git...)++$> git annex get hyperalignment_tutorial_data.hdf5.gz+/tmp/pymvpa2-tutorialdata-clone/.git/annex/tm 100%[==================================================================================================>] 15.04M 11.2MB/s in 1.3s +ok+(recording state in git...)++$> ls -l haxby2001/bold_mc.par hyperalignment_tutorial_data.hdf5.gz+lrwxrwxrwx 1 yoh yoh 199 May 29 15:42 haxby2001/bold_mc.par -> ../.git/annex/objects/KM/Jq/SHA256E-s106236--64972f56116ba575996a0b2fbd26a033dd3e8369e87fda503fec5a45dcd06f57.par/SHA256E-s106236--64972f56116ba575996a0b2fbd26a033dd3e8369e87fda503fec5a45dcd06f57.par+lrwxrwxrwx 1 yoh yoh 208 May 29 15:42 hyperalignment_tutorial_data.hdf5.gz -> .git/annex/objects/1g/M2/SHA256E-s15769613--d4b54133f873ff043df22c6250810c1cb9a177b5eb551ca97d98d664edf8ea3f.hdf5.gz/SHA256E-s15769613--d4b54133f873ff043df22c6250810c1cb9a177b5eb551ca97d98d664edf8ea3f.hdf5.gz++$> git annex direct+commit +On branch master+Your branch is up-to-date with 'origin/master'.+nothing to commit, working directory clean+ok+direct hyperalignment_tutorial_data.hdf5.gz ok+direct ok++$> ls -l haxby2001/bold_mc.par hyperalignment_tutorial_data.hdf5.gz+lrwxrwxrwx 1 yoh yoh 199 May 29 15:42 haxby2001/bold_mc.par -> ../.git/annex/objects/KM/Jq/SHA256E-s106236--64972f56116ba575996a0b2fbd26a033dd3e8369e87fda503fec5a45dcd06f57.par/SHA256E-s106236--64972f56116ba575996a0b2fbd26a033dd3e8369e87fda503fec5a45dcd06f57.par+-rw------- 1 yoh yoh 15769613 May 8 03:42 hyperalignment_tutorial_data.hdf5.gz+2 12569.....................................:Fri 29 May 2015 03:43:08 PM EDT:.++$> git annex version+git-annex version: 5.20150519-geaf72fe+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP DNS Feeds Quvi TDFA+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E MD5E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 MD5 WORM URL+remote types: git gcrypt S3 bup directory rsync web bittorrent webdav tahoe glacier ddar hook external+local repository version: 5+supported repository version: 5+upgrade supported from repository versions: 0 1 2 4+++# End of transcript or log.+"""]]++> This is behaving as it's intended to. [[done]] --[[Joey]]
doc/bugs/transfer_in_progress_not_present_in_json_output.mdwn view
@@ -26,3 +26,7 @@ """]] [[anarcat]]++> JSON output has to be implemented on a case by case basis for stat+> displays; I've now added it to this and more. [[done]]+> --[[Joey]]
+ doc/bugs/unannexed_files_are_immediately_re-annexed_by_assistant.mdwn view
@@ -0,0 +1,4 @@+### Please describe the problem.+When using “git annex unlock”, the assistant is clever enough not to immediately re-add the corresponding files. When using “git annex unannex”, however, the assistant goes on to re-add the files right away. It would be convenient if this case were also handled likewise.++git-annex 5.20150508
+ doc/bugs/unlock_with_absolute_path__63__.mdwn view
@@ -0,0 +1,44 @@+### Please describe the problem.++"git annex unlock" with an absolute path appears to do nothing. Is this a feature or a bug?++### What steps will reproduce the problem?++[[!format sh """+> mkdir git_annex_test && cd git_annex_test/+> git init+> git annex init "Local copy"+> touch foo.txt+> git annex add foo.txt+> git commit -m "Checkin"+> git annex unlock foo.txt (correct behavior)+> git annex lock --force foo.txt+> git annex unlock /absolute/path/to/git_annex_test/foo.txt (appears to do nothing)+"""]]++### What version of git-annex are you using? On what operating system?++Ubuntu 14.04.02 with git-annex from repo:++[[!format sh """+> git annex --version+git-annex version: 5.20140412ubuntu1+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify 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 tahoe glacier hook external+local repository version: 5+supported repository version: 5+upgrade supported from repository versions: 0 1 2 4+""" ]]++> Please upgrade to the current version of git-annex before filing bug+> reports.+>+> I don't know when this was fixed/changed, but sometime in the past 13+> months since the version you have, it was:+>++ joey@darkstar:~/tmp/x>git annex unlock `pwd`/me+ unlock me (copying...) ok++> [[done]] --[[Joey]]
doc/design/assistant/polls/prioritizing_special_remotes.mdwn view
@@ -6,7 +6,7 @@ Help me prioritize my work: What special remote would you most like to use with the git-annex assistant? -[[!poll open=yes 18 "Amazon S3 (done)" 13 "Amazon Glacier (done)" 10 "Box.com (done)" 74 "My phone (or MP3 player)" 25 "Tahoe-LAFS" 16 "OpenStack SWIFT" 36 "Google Drive"]]+[[!poll open=yes 18 "Amazon S3 (done)" 13 "Amazon Glacier (done)" 10 "Box.com (done)" 74 "My phone (or MP3 player)" 27 "Tahoe-LAFS" 16 "OpenStack SWIFT" 36 "Google Drive"]] This poll is ordered with the options I consider easiest to build listed first. Mostly because git-annex already supports them and they
doc/design/caching_database.mdwn view
@@ -26,11 +26,11 @@ ## implementation plan 1. Store incremental fsck info in db, on a branch, with sqlite. **done**-2. Make sure that builds on all platforms.-3. Implement for metadata, on a branch, with sqlite.-4. Add associated file mappings support. This is needed to fully- use the caching database to construct views.-5. Replace .map files with 3. for direct mode.+2. Make sure that builds on all platforms, and works reliably. **done**+3. Use sqlite db for associated files cache, and use in direct mode.+4. Also, use associated files db to construct views.+5. Use sqlite db for metadata cache.+6. Use sqlite db for list of keys present in local annex. ## sqlite or not?
+ doc/devblog/day_289__new_arm_autobuilder.mdwn view
@@ -0,0 +1,21 @@+On Friday I installed the CubieTruck that is the new autobuilder+for arm. This autobuilder is hosted at [WetKnee Books](http://www.wetknee.com/),+so its physical security includes a swamp. ++The hardware is not fast, but it's faster and far more stable than qemu arm+emulation. By Saturday I got the build environment all installed nicely,+including building libraries that use template haskell!++But, ghc crashed with an internal error building git-annex.+I upgraded to ghc 7.10.1 (which took another day), but it also crashed.+Was almost giving up, but I looked at the ghc parameters, and -j2 stuck+out in them. Removed the -j2, and the build works w/o crashing! \o/+(Filed [a bug report on ghc](https://ghc.haskell.org/trac/ghc/ticket/10469).)++----++Anarcat has been working on improving the man pages, including lots of+linking to related commands.++The [2015 Haskell Communities and Activities Report](http://www.haskell.org/communities/05-2015/html/report.html)+is out, and includes an entry for git-annex for the first time!
+ doc/devblog/day_290__.mdwn view
@@ -0,0 +1,23 @@+Worked thru some backlog. Currently stands at 152 messages.++Merged work from Sebastian Reuße to teach the assistant to listen for+systemd-networkd dbus events when the network connection changes.++Added `git annex get --incomplete`, which can be used to resume whatever it +was you were downloading earlier and interrupted, that you've forgotten+about. ;)++----++The [Isuma Media Players project](http://isuma-media-players.readthedocs.org/en/latest/index.html)+is using git-annex to "create a two-way, distributed content distribution+network for communities with poor connexions to the internet".+My understanding is this involves places [waaay up North](http://www.isuma.tv/did).++Reading over their [design docs](http://isuma-media-players.readthedocs.org/en/latest/design.html)+is quite interesting, both to see how they've leveraged things+like git-annex metadata and preferred content expressions and the assistant,+and areas where git-annex falls short.++Between DataLad, Isuma, Baobáxia, IA.BAK, and more, there are a lot of+projects being built on top of git-annex now!
+ doc/devblog/day_291__public_S3.mdwn view
@@ -0,0 +1,20 @@+Now git-annex can be used to set up a public S3 remote. If you've cloned a+repository that knows about such a remote, you can use the S3 remote+without needing any S3 credentials. Read-only of course.++This tip shows how to do it: [[tips/public_Amazon_S3_remote]]++One rather neat way to use this is to configure the remote with+`encryption=shared`. Then, the files stored in S3 will be encrypted, and+anyone with access to the git repository can get and decrypt the files.++This feature will work for at least AWS S3, and for the Internet Archive's+S3. It may work for other S3 services, that can be configured to publish+their files over unauthenticated http. There's a `publicurl` configuration+setting to allow specifying the url when using a service that git-annex+doesn't know the url for.++Actually, there was a hack for the IA before, that added the public url to+an item when it was uploaded to the IA. While that hack is now not+necessary, I've left it in place for now, to avoid breaking anything that+depended on it.
+ doc/devblog/day_292__dead_keys.mdwn view
@@ -0,0 +1,21 @@+Ever since `git annex fsck --all` was added, people +[have](http://bugs.debian.org/753888)+[[complained|bugs/fsck_reports_unsolvable_problem]] that+there's no way to stop it complaining about keys whose content is gone for+good. Well, there is now: `git annex dead --key` can be used when you know+that a key is no longer available and want fsck to stop complaining about+it.++Running fsck on a directory will intentionally still complain about files+in the directory with missing contents, even if the keys have been marked+dead.++The crucial part was finding a good way to store the information; luckily+location log files are parsed in a way that lets it be added there without+breaking backwards compatability. A bonus is that adding a key's content+back to the annex will automatically bring it back from the dead.++I'm pondering making `git annex drop --force` automatically mark a key as+dead when the last copy is dropped, but I don't know if it's too DWIM or+worth the complication. Another approach would be to let fsck mark keys as+dead, but that would certianly need an extra flag.
+ doc/devblog/day_293__last_push_before_summer_vacation.mdwn view
@@ -0,0 +1,26 @@+Well, not the literal last `push`, but I've caught up on as much backlog as+I can (142 messages remain) and spent today developing a few final features+before tomorrow's release.++Some of the newer things displayed by `git annex info` were not included in+the --json mode output. The json includes everything now.++`git annex sync --all --content` will make it consider all known annexed+objects, not only those in the current work tree. By default that syncs all+versions of all files, but of course preferred content can tune what+repositories want.++To make that work well with preferred content settings like+"include=*.mp3", it makes two passes. The first pass is over the work tree,+so preferred content expressions that match files by name will work. The+second pass is over all known keys, and preferred content expressions+that don't care about the filename can match those keys. ++Two passes feels a bit like a hack, but it's a lot better than `--all`+making nothing be synced when the a preferred content expression matches+against filenames... I actually had to resort to bloom filters to make the+two passes work.++This new feature led to some+[slightly tricky follow-on changes](http://source.git-annex.branchable.com/?p=source.git;a=commit;h=8268f7951e9c70760379bd084425b48df99250d6)+to the [[preferred_content/standard_groups]] preferred content expressions.
doc/download.mdwn view
@@ -18,14 +18,8 @@ The git repository has some branches: -* `ghc7.0` supports versions of ghc older than 7.4, which- had a major change to filename encoding.-* `old-monad-control` is for systems that don't have a newer monad-control- library.-* `no-ifelse` avoids using the IFelse library- (merge it into master if you need it)-* `no-bloom` avoids using bloom filters. (merge it into master if you need it)-* `no-s3` avoids using the S3 library (merge it into master if you need it)+* `ghc7.0` is a by now very out of date branch that can be built with+ ghc 7.0. * `debian-*-backport` contains the latest backport of git-annex. * `tweak-fetch` adds support for the git tweak-fetch hook, which has been proposed and implemented but not yet accepted into git.
+ doc/forum/Always_sync_all_content_to_remote.mdwn view
@@ -0,0 +1,5 @@+I am trying to set up two repositories, one on my laptop and one on my server, and then have "git annex sync" always push everything on the laptop to the server.++So far, I have created repositories on the laptop and on the server and then added the server as an ssh remote on the laptop. At the root of the repository on the server, I ran "git annex group . backup" and "git annex wanted . standard". At the root of the repository on the laptop, I ran "git annex group . manual" and "git annex wanted . standard". When I run "git annex sync" or "git annex sync --content" on the laptop now, it seems to only copy the symlink information to the server but not the actual data. When I go to the server and run git annex sync, it updates the working tree symlinks but does not have the content data they point to. If I use "git annex copy file --to server" then the symlink created when I ran "git annex sync" on the server points to the correct file. Do I not have the correct content preferences set up? Or do I need to alias "git annex sync --content" to "git annex sync --content && git annex copy . --to server" on the laptop?++I want to be able to drop large amounts of data from the laptop and get it back if needed but always have it available on the server any way without having to push it explicitly. I would think that this would be a fairly common use case. Maybe I have missed something in the documentation? I have not set up the laptop as a remote on the server (I'd prefer not to -- I only plan to push/pull from the laptop, not push/pull from the server).
+ doc/forum/Does_the_windows_version_install_iStartSurf_malware__63__.mdwn view
@@ -0,0 +1,3 @@+Hi, since I installed git-annex-windows through the link from the homepage I got iStartSurf, a really anoying malware. Could somebody ack the existence of iStartSurf in windows version? I use my windows seldom, usualy start only to receive updates. (and of coures to try out git-annex)++Zsolt
+ doc/forum/Handling_a_large_number_of_files.mdwn view
@@ -0,0 +1,3 @@+I have noticed performance getting really slow when adding files (git annex add . ) to a directory already containing several hundred thousand files. When using git annex, is it more recommended to split large numbers of files into multiple directories containing fewer files? Is there a particular recommended way of handling large numbers of files (say getting into the millions) in git annex? ++Thanks
+ doc/forum/Speed_up_remote_transfers.mdwn view
@@ -0,0 +1,5 @@+I am currently trying to transfer git-annex managed files to my server.++I am getting them with `git annex /path`. However, these are very many small files, and git annex seems to take a tiny break in between them, so the process takes considerably longer than uploading a single file of the same size would.++Do you have any suggestions for improving my transfer speed in this case?
+ doc/forum/__96__git_annex_sync__96___hangs.mdwn view
@@ -0,0 +1,113 @@+I am on a direct remote. I just deleted a directory, and would like to commit that change.++After I run `git annex sync` I see a line which says `commit`, and that is all. I tried to wait it out a few hours, but nothing. Why does git annex hang?++Here is the output of `strace git annex sync`:++```+chymera@zenbookhost /run/media/chymera/data3 $ strace git annex sync+execve("/usr/bin/git", ["git", "annex", "sync"], [/* 78 vars */]) = 0+brk(0) = 0x1afa000+mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f17d12c4000+access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)+open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3+fstat(3, {st_mode=S_IFREG|0644, st_size=207886, ...}) = 0+mmap(NULL, 207886, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f17d1291000+close(3) = 0+open("/lib64/libpcre.so.1", O_RDONLY|O_CLOEXEC) = 3+read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\27\0\0\0\0\0\0"..., 832) = 832+fstat(3, {st_mode=S_IFREG|0755, st_size=452672, ...}) = 0+mmap(NULL, 2548328, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f17d0e36000+mprotect(0x7f17d0ea4000, 2093056, PROT_NONE) = 0+mmap(0x7f17d10a3000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6d000) = 0x7f17d10a3000+close(3) = 0+open("/lib64/libz.so.1", O_RDONLY|O_CLOEXEC) = 3+read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`#\0\0\0\0\0\0"..., 832) = 832+fstat(3, {st_mode=S_IFREG|0755, st_size=88456, ...}) = 0+mmap(NULL, 2183720, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f17d0c20000+mprotect(0x7f17d0c35000, 2093056, PROT_NONE) = 0+mmap(0x7f17d0e34000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14000) = 0x7f17d0e34000+close(3) = 0+open("/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3+read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@p\0\0\0\0\0\0"..., 832) = 832+fstat(3, {st_mode=S_IFREG|0755, st_size=125536, ...}) = 0+mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f17d1290000+mmap(NULL, 2204816, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f17d0a05000+mprotect(0x7f17d0a1b000, 2093056, PROT_NONE) = 0+mmap(0x7f17d0c1a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15000) = 0x7f17d0c1a000+mmap(0x7f17d0c1c000, 13456, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f17d0c1c000+close(3) = 0+open("/lib64/librt.so.1", O_RDONLY|O_CLOEXEC) = 3+read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`#\0\0\0\0\0\0"..., 832) = 832+fstat(3, {st_mode=S_IFREG|0755, st_size=31536, ...}) = 0+mmap(NULL, 2128920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f17d07fd000+mprotect(0x7f17d0804000, 2093056, PROT_NONE) = 0+mmap(0x7f17d0a03000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7f17d0a03000+close(3) = 0+open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3+read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300\33\2\0\0\0\0\0"..., 832) = 832+fstat(3, {st_mode=S_IFREG|0755, st_size=1660320, ...}) = 0+mmap(NULL, 3766680, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f17d0465000+mprotect(0x7f17d05f3000, 2097152, PROT_NONE) = 0+mmap(0x7f17d07f3000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18e000) = 0x7f17d07f3000+mmap(0x7f17d07f9000, 14744, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f17d07f9000+close(3) = 0+mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f17d128f000+mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f17d128e000+mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f17d128d000+arch_prctl(ARCH_SET_FS, 0x7f17d128e700) = 0+mprotect(0x7f17d07f3000, 16384, PROT_READ) = 0+mprotect(0x7f17d0c1a000, 4096, PROT_READ) = 0+mprotect(0x7f17d0a03000, 4096, PROT_READ) = 0+mprotect(0x7f17d0e34000, 4096, PROT_READ) = 0+mprotect(0x7f17d10a3000, 4096, PROT_READ) = 0+mprotect(0x79b000, 4096, PROT_READ) = 0+mprotect(0x7f17d12c5000, 4096, PROT_READ) = 0+munmap(0x7f17d1291000, 207886) = 0+set_tid_address(0x7f17d128e9d0) = 2218+set_robust_list(0x7f17d128e9e0, 24) = 0+rt_sigaction(SIGRTMIN, {0x7f17d0a0bb10, [], SA_RESTORER|SA_SIGINFO, 0x7f17d0a14d20}, NULL, 8) = 0+rt_sigaction(SIGRT_1, {0x7f17d0a0bba0, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x7f17d0a14d20}, NULL, 8) = 0+rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0+getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0+open("/dev/null", O_RDWR) = 3+close(3) = 0+rt_sigprocmask(SIG_UNBLOCK, [PIPE], NULL, 8) = 0+rt_sigaction(SIGPIPE, {SIG_DFL, [PIPE], SA_RESTORER|SA_RESTART, 0x7f17d0499ee0}, {SIG_DFL, [], 0}, 8) = 0+brk(0) = 0x1afa000+brk(0x1b1b000) = 0x1b1b000+open("/usr/lib64/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3+fstat(3, {st_mode=S_IFREG|0644, st_size=106086208, ...}) = 0+mmap(NULL, 106086208, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f17c9f39000+close(3) = 0+stat(".git", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0+access("/etc/gitconfig", R_OK) = -1 ENOENT (No such file or directory)+access("/home/chymera/.config/git/config", R_OK) = -1 ENOENT (No such file or directory)+access("/home/chymera/.gitconfig", R_OK) = 0+open("/home/chymera/.gitconfig", O_RDONLY) = 3+fstat(3, {st_mode=S_IFREG|0644, st_size=147, ...}) = 0+mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f17d12c3000+read(3, "[user]\n\temail = h.chr@mail.ru\n\tn"..., 4096) = 147+read(3, "", 4096) = 0+close(3) = 0+munmap(0x7f17d12c3000, 4096) = 0+access(".git/config", R_OK) = 0+open(".git/config", O_RDONLY) = 3+fstat(3, {st_mode=S_IFREG|0644, st_size=335, ...}) = 0+mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f17d12c3000+read(3, "[core]\n\trepositoryformatversion "..., 4096) = 335+read(3, "", 4096) = 0+close(3) = 0+munmap(0x7f17d12c3000, 4096) = 0+pipe([3, 4]) = 0+clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f17d128e9d0) = 2219+rt_sigaction(SIGINT, {0x4f4d70, [INT], SA_RESTORER|SA_RESTART, 0x7f17d0499ee0}, {SIG_DFL, [], 0}, 8) = 0+rt_sigaction(SIGHUP, {0x4f4d70, [HUP], SA_RESTORER|SA_RESTART, 0x7f17d0499ee0}, {SIG_DFL, [], 0}, 8) = 0+rt_sigaction(SIGTERM, {0x4f4d70, [TERM], SA_RESTORER|SA_RESTART, 0x7f17d0499ee0}, {SIG_DFL, [], 0}, 8) = 0+rt_sigaction(SIGQUIT, {0x4f4d70, [QUIT], SA_RESTORER|SA_RESTART, 0x7f17d0499ee0}, {SIG_DFL, [], 0}, 8) = 0+rt_sigaction(SIGPIPE, {0x4f4d70, [PIPE], SA_RESTORER|SA_RESTART, 0x7f17d0499ee0}, {SIG_DFL, [PIPE], SA_RESTORER|SA_RESTART, 0x7f17d0499ee0}, 8) = 0+close(4) = 0+read(3, "", 1) = 0+close(3) = 0+wait4(2219, commit +```
+ doc/forum/assistant_periodical_unused_moves.mdwn view
@@ -0,0 +1,11 @@+I am trying a setup to move files from/to work using a usb key that also has a acopy of the whole repository (if I have to access it from somewhere else without git-annex).++At home there's a direct client repository, the usb is an indirect incrementalbackup and at work I have a indirect backup and a direct client repositories.+++What I am trying to obtain is to have a lightweight repository at home that doesn't hold backups, and the usb key to also move the unused files from home to work as a backup.+I am trying to make the assistant do it for me and as far as I could read the assistant should periodically move unused files out of repositories of the group client to the (incremental)backup ones.+++Having the assistant running on home repository and the two work repositories should do the trick? considering that the usb key doesn't spend much time connected to a computer I have no idea how the assistant would do the periodcal move.+Also i hope i got it right but files from incrementalbackup should be moved to backup repositories when they can be synchronized, but again, I don't know if a 5 minutes mount with the assistant running on the backup repository will actually do it.
+ doc/forum/build_from_source_on_Linux_fails___40__out_of_memory__41__.mdwn view
@@ -0,0 +1,74 @@+Hi++When trying to do "make" in Linux x64_64, the process fails with an out-of-memory error. "top" shows that memory consumption reached 16GB during build.++Grateful for any recommendations.++Ciaron++ which: no ikiwiki in <snip>+ if [ "cabal " = ./Setup ]; then ghc --make Setup; fi+ cabal configure+ Resolving dependencies...+ [ 1 of 31] Compiling Utility.FileSize ( Utility/FileSize.hs, dist/setup/Utility/FileSize.o )+ [ 2 of 31] Compiling Utility.PosixFiles ( Utility/PosixFiles.hs, dist/setup/Utility/PosixFiles.o )+ [ 3 of 31] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, dist/setup/Utility/FileSystemEncoding.o )+ [ 4 of 31] Compiling Utility.Applicative ( Utility/Applicative.hs, dist/setup/Utility/Applicative.o )+ [ 5 of 31] Compiling Utility.Data ( Utility/Data.hs, dist/setup/Utility/Data.o )+ [ 6 of 31] Compiling Utility.Monad ( Utility/Monad.hs, dist/setup/Utility/Monad.o )+ [ 7 of 31] Compiling Utility.Exception ( Utility/Exception.hs, dist/setup/Utility/Exception.o )+ [ 8 of 31] Compiling Utility.Misc ( Utility/Misc.hs, dist/setup/Utility/Misc.o )+ [ 9 of 31] Compiling Utility.Tmp ( Utility/Tmp.hs, dist/setup/Utility/Tmp.o )+ [10 of 31] Compiling Utility.Env ( Utility/Env.hs, dist/setup/Utility/Env.o )+ [11 of 31] Compiling Utility.UserInfo ( Utility/UserInfo.hs, dist/setup/Utility/UserInfo.o )+ [12 of 31] Compiling Utility.Path ( Utility/Path.hs, dist/setup/Utility/Path.o )+ [13 of 31] Compiling Utility.OSX ( Utility/OSX.hs, dist/setup/Utility/OSX.o )+ [14 of 31] Compiling Utility.Process ( Utility/Process.hs, dist/setup/Utility/Process.o )+ [15 of 31] Compiling Utility.SafeCommand ( Utility/SafeCommand.hs, dist/setup/Utility/SafeCommand.o )+ [16 of 31] Compiling Utility.Directory ( Utility/Directory.hs, dist/setup/Utility/Directory.o )+ [17 of 31] Compiling Utility.ExternalSHA ( Utility/ExternalSHA.hs, dist/setup/Utility/ExternalSHA.o )+ [18 of 31] Compiling Utility.Network ( Utility/Network.hs, dist/setup/Utility/Network.o )+ [19 of 31] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, dist/setup/Utility/PartialPrelude.o )+ [20 of 31] Compiling Common ( Common.hs, dist/setup/Common.o )+ [21 of 31] Compiling Utility.DottedVersion ( Utility/DottedVersion.hs, dist/setup/Utility/DottedVersion.o )+ [22 of 31] Compiling Git.Version ( Git/Version.hs, dist/setup/Git/Version.o )+ [23 of 31] Compiling Utility.FreeDesktop ( Utility/FreeDesktop.hs, dist/setup/Utility/FreeDesktop.o )+ [24 of 31] Compiling Config.Files ( Config/Files.hs, dist/setup/Config/Files.o )+ [25 of 31] Compiling Assistant.Install.AutoStart ( Assistant/Install/AutoStart.hs, dist/setup/Assistant/Install/AutoStart.o )+ [26 of 31] Compiling Assistant.Install.Menu ( Assistant/Install/Menu.hs, dist/setup/Assistant/Install/Menu.o )+ [27 of 31] Compiling Build.Version ( Build/Version.hs, dist/setup/Build/Version.o )+ [28 of 31] Compiling Build.TestConfig ( Build/TestConfig.hs, dist/setup/Build/TestConfig.o )+ [29 of 31] Compiling Build.Configure ( Build/Configure.hs, dist/setup/Build/Configure.o )+ [30 of 31] Compiling Build.DesktopFile ( Build/DesktopFile.hs, dist/setup/Build/DesktopFile.o )+ [31 of 31] Compiling Main ( dist/setup/setup.hs, dist/setup/Main.o )+ Linking ./dist/setup/setup ...+ checking version... 5.20150612-gf176464+ checking UPGRADE_LOCATION... not available+ checking git... yes+ checking git version... 1.7.9+ checking cp -a... yes+ checking cp -p... yes+ checking cp --preserve=timestamps... yes+ checking cp --reflink=auto... no+ checking xargs -0... yes+ checking rsync... yes+ checking curl... yes+ checking wget... yes+ checking wget supports -q --show-progress... no+ checking bup... no+ checking nice... yes+ checking ionice... yes+ checking nocache... no+ checking gpg... gpg+ checking lsof... lsof+ checking git-remote-gcrypt... not available+ checking ssh connection caching... no+ checking sha1... sha1sum+ checking sha256... sha256sum+ checking sha512... sha512sum+ checking sha224... sha224sum+ checking sha384... sha384sum+ Configuring git-annex-5.20150528...+ setup: out of memory (requested 1048576 bytes)+ make: *** [Build/SysConfig.hs] Error 1+
+ doc/forum/cannot_sync___39__unused__39___files.mdwn view
@@ -0,0 +1,45 @@+Hi,++I have setup a remote git-annex repository (ssh into some machine in our local network) which I will call "common_repo". Multiple contributors will then be cloning this repo into their laptops (I will call "client_repos").++When these client_repos change and do a "git annex sync <common_repo> --content", all the files from their laptops are successfully synchronised. The problem arises when:++<ol>+ <li>CLIENT_A creates somefile.csv</li>+ <li>CLIENT_A commits somefile.csv+ <br/>i.e.:+ <br/> git annex add somefile.csv+ <br/> git commit -a -m "uploaded somefile.csv"+ </li>+ <li>CLIENT_A modifies somefile.csv</li>+ <li> CLIENT_A commits modified somefile.csv+ <br/>i.e.:+ <br/> git add somefile.csv+ <br/> git commit -a -m "updated somefile.csv"+ </li>+ <li>CLIENT_A synchronises with common_repo+ <br/>i.e.: git annex sync <common_repo> --content+ </li>+</ol>++If I check the .git/annex/objects of common_repo, I can't seem to find a copy of the unmodified somefile.csv. It only has a copy of the latest somefile.csv.++This is problematic if one client tries to checkout a revision of the project that uses the original somefile.csv.++I learned that I can change the preferred content of git-annex. So, the appropriate preset for common_repo seemed to be "backup". After running the commands in common_repo:+<blockquote>+git annex wanted . standard<br/>+git annex group . backup+</blockquote>++I've done another test of the scenario above, and common_repo is still missing the previous revision of the file!! The preferred file content of common_repo should be "include=* or unused". In my case, the previous version of somefile.csv will probably fall in the "unused" category. But I still cannot find it.++A workaround is using two commands from the client(s):+<blockquote>+git annex copy --to <common_repo> --all<br/>+git annex sync <common_repo> --content+</blockquote>++But I can imagine my users forgetting to run 'copy' and my repo will go to shit over time.++Any ideas why I can't synchronise 'unused' files?
+ doc/forum/downloading_mp4_by_default_with_importfeed.mdwn view
@@ -0,0 +1,1 @@+Is it possible to download youtube videos in mp4 format by default with importfeed. Without any options git annex often downloads the webm format.
+ doc/forum/files_only_visible_in_.git_annex.mdwn view
@@ -0,0 +1,15 @@+Dear all, ++I'm a beginner in using git annex and got the following strange situation:++On my PC I have stored all the data and put them to git annex (don' know the standard nomenclature used here, but I guess its called setting up a repository)++On my Laptop I have now also git-annex and can have access to my stored data by git-annex get (so far so good thats git-annex)++Now comes the strange thing: +On my laptop, I can see all the links to my data (where it shows me a path like ../../.git/annex/objects/...) but at my PC, where all the data should have been stored, the folder is empty. When I follow the link which is shown on the laptop, on my PC, I get access to the data. Some somehow, the data is still on my PC but not stored in its original folders but in .git/annex/objects/...++How can I get back my original folder from the .git/annex/objects on my PC?++Thank you very much for your help+Stefan
+ doc/forum/renaming_directories_not_supported__63__.mdwn view
@@ -0,0 +1,45 @@+I have an annex repository with several of my CDs. They were ripped using MusicBrainz data, causing some directory names to be in Russian. This is something I wanted to change.++I have cloned this repository on my laptop, where I wanted to implement the change.++When I do a git mv Пётр_Ильич_Чайковский P_I_Tchaikovsky on my laptop, I can commit the change. git annex sync also doesn't object++However, the original directory remains on the origin repository, and the renamed directory is not present.++Am I doing something wrong?++++ [master e112a02] Renamed Tchaikovsky directory.+ 9 files changed, 0 insertions(+), 0 deletions(-)+ rename "\320\237\321\221\321\202\321\200_\320\230\320\273\321\214\320\270\321\207_\320\247\320\260\320\271\320\272\320\276\320\262\321\201\320\272\320\270\320\271/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/04 Variations on a Rococo Theme, Op. 33_ Moderato quasi Andante.flac" => "P_I_Tchaikovsky/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/04 Variations on a Rococo Theme, Op. 33_ Moderato quasi Andante.flac" (100%)+ rename "\320\237\321\221\321\202\321\200_\320\230\320\273\321\214\320\270\321\207_\320\247\320\260\320\271\320\272\320\276\320\262\321\201\320\272\320\270\320\271/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/05 Variations on a Rococo Theme, Op. 33_ Tema. Moderato semplice.flac" => "P_I_Tchaikovsky/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/05 Variations on a Rococo Theme, Op. 33_ Tema. Moderato semplice.flac" (100%)+ rename "\320\237\321\221\321\202\321\200_\320\230\320\273\321\214\320\270\321\207_\320\247\320\260\320\271\320\272\320\276\320\262\321\201\320\272\320\270\320\271/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/06 Variations on a Rococo Theme, Op. 33_ Variazione I. Tempo del Tema.flac" => "P_I_Tchaikovsky/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/06 Variations on a Rococo Theme, Op. 33_ Variazione I. Tempo del Tema.flac" (100%)+ rename "\320\237\321\221\321\202\321\200_\320\230\320\273\321\214\320\270\321\207_\320\247\320\260\320\271\320\272\320\276\320\262\321\201\320\272\320\270\320\271/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/07 Variations on a Rococo Theme, Op. 33_ Variazione II. Tempo del Tema.flac" => "P_I_Tchaikovsky/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/07 Variations on a Rococo Theme, Op. 33_ Variazione II. Tempo del Tema.flac" (100%)+ rename "\320\237\321\221\321\202\321\200_\320\230\320\273\321\214\320\270\321\207_\320\247\320\260\320\271\320\272\320\276\320\262\321\201\320\272\320\270\320\271/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/08 Variations on a Rococo Theme, Op. 33_ Variazione III. Andante sostenuto.flac" => "P_I_Tchaikovsky/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/08 Variations on a Rococo Theme, Op. 33_ Variazione III. Andante sostenuto.flac" (100%)+ rename "\320\237\321\221\321\202\321\200_\320\230\320\273\321\214\320\270\321\207_\320\247\320\260\320\271\320\272\320\276\320\262\321\201\320\272\320\270\320\271/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/09 Variations on a Rococo Theme, Op. 33_ Variazione IV. Andante grazioso.flac" => "P_I_Tchaikovsky/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/09 Variations on a Rococo Theme, Op. 33_ Variazione IV. Andante grazioso.flac" (100%)+ rename "\320\237\321\221\321\202\321\200_\320\230\320\273\321\214\320\270\321\207_\320\247\320\260\320\271\320\272\320\276\320\262\321\201\320\272\320\270\320\271/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/10 Variations on a Rococo Theme, Op.,33_ Variazione V. Allegro moderato.flac" => "P_I_Tchaikovsky/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/10 Variations on a Rococo Theme, Op.,33_ Variazione V. Allegro moderato.flac" (100%)+ rename "\320\237\321\221\321\202\321\200_\320\230\320\273\321\214\320\270\321\207_\320\247\320\260\320\271\320\272\320\276\320\262\321\201\320\272\320\270\320\271/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/11 Variations on a Rococo Theme, Op. 33_ Variazione VI. Andante.flac" => "P_I_Tchaikovsky/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/11 Variations on a Rococo Theme, Op. 33_ Variazione VI. Andante.flac" (100%)+ rename "\320\237\321\221\321\202\321\200_\320\230\320\273\321\214\320\270\321\207_\320\247\320\260\320\271\320\272\320\276\320\262\321\201\320\272\320\270\320\271/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/12 Variations on a Rococo Theme, Op. 33_ Variazione VII e Coda. Allegro vivo.flac" => "P_I_Tchaikovsky/Dvo\305\231\303\241k_ Cellokonzert _ Tschaikowsky_ Rokoko-Variationen/12 Variations on a Rococo Theme, Op. 33_ Variazione VII e Coda. Allegro vivo.flac" (100%)+ frederik@freo:~/Music$ git annex sync+ commit ok+ pull A20 + remote: Counting objects: 83, done.+ remote: Compressing objects: 100% (74/74), done.+ remote: Total 83 (delta 2), reused 0 (delta 0)+ Unpacking objects: 100% (83/83), done.+ From ssh://A20:/mnt/usb1/Music+ 5c0bae2..72eb235 git-annex -> A20/git-annex+ ok+ (merging A20/git-annex into git-annex...)+ (Recording state in git...)+ push A20 + Counting objects: 284, done.+ Delta compression using up to 4 threads.+ Compressing objects: 100% (257/257), done.+ Writing objects: 100% (284/284), 21.06 KiB | 0 bytes/s, done.+ Total 284 (delta 153), reused 0 (delta 0)+ To ssh://A20:/mnt/usb1/Music+ 0a391ea..ad7251c git-annex -> synced/git-annex+ 4af0061..e112a02 master -> synced/master+ ok
+ doc/forum/s3_bandwidth_limitations_and_next_release.mdwn view
@@ -0,0 +1,7 @@+Is there a way to set bandwidth limits for [[special_remotes/s3]]?++From what i can see in the [[todo/credentials-less_access_to_s3]] patch, the `downloadUrl` function is used, does that mean that the `annex.web-download-command` is used? If that's the case, it's great because it means we can use the `--bwlimit` parameter in `wget` to limit transfers.++But what about uploads? Are there limits there as well?++I'll also abuse this forum to see if/when it will be possible to have a shiny new release to ship that amazing new feature? There seems to be sufficient stuff piled up in the unreleased changelog to warrant a release, no? :) --[[anarcat]]
doc/git-annex-add.mdwn view
@@ -44,6 +44,18 @@ [[git-annex]](1) +[[git-annex-unlock]](1)++[[git-annex-lock]](1)++[[git-annex-undo]](1)++[[git-annex-import]](1)++[[git-annex-unannex]](1)++[[git-annex-reinject]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-addunused.mdwn view
@@ -17,6 +17,10 @@ [[git-annex]](1) +[[git-annex-add]](1)++[[git-annex-unused]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-addurl.mdwn view
@@ -59,6 +59,12 @@ [[git-annex]](1) +[[git-annex-rmurl]](1)++[[git-annex-registerurl]](1)++[[git-annex-importfeed]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-assistant.mdwn view
@@ -11,9 +11,6 @@ Watches for changes to files in the current directory and its subdirectories, and automatically syncs them to other remotes. -For more details about the git-annex assistant, see-<https://git-annex.branchable.com/assistant/>- # OPTIONS * `--autostart`@@ -44,6 +41,13 @@ # SEE ALSO [[git-annex]](1)++[[git-annex-watch]](1)++[[git-annex-schedule]](1)++For more details about the git-annex assistant, see+<https://git-annex.branchable.com/assistant/> # AUTHOR
doc/git-annex-copy.mdwn view
@@ -68,6 +68,12 @@ [[git-annex]](1) +[[git-annex-get]](1)++[[git-annex-move]](1)++[[git-annex-drop]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-dead.mdwn view
@@ -1,22 +1,41 @@ # NAME -git-annex trust - hide a lost repository+git-annex dead - hide a lost repository or key # SYNOPSIS -git annex dead `[repository ...]`+git annex dead `[repository ...] [--key key]` # DESCRIPTION -Indicates that the repository has been irretrievably lost.-(To undo, use semitrust.)+This command exists to deal with situations where data has been lost,+and you know it has, and you want to stop being reminded of that fact. +When a repository is specified, indicates that the repository has+been irretrievably lost, so it will not be listed in eg, `git annex info`. Repositories can be specified using their remote name, their-description, or their UUID.+description, or their UUID. (To undo, use `git-annex semitrust`.) +When a key is specified, indicates that the content of that key has been+irretrievably lost. This prevents `git annex fsck --all` from complaining+about it. (To undo, add the key's content back to the repository,+by using eg, `git-annex reinject`.)+ # SEE ALSO [[git-annex]](1)++[[git-annex-trust]](1)++[[git-annex-semitrust]](1)++[[git-annex-untrust]](1)++[[git-annex-expire]](1)++[[git-annex-fsck]](1)++[[git-annex-reinject]](1) # AUTHOR
doc/git-annex-describe.mdwn view
@@ -22,6 +22,8 @@ [[git-annex]](1) +[[git-annex-init]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-direct.mdwn view
@@ -21,6 +21,8 @@ [[git-annex]](1) +[[git-annex-indirect]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
+ doc/git-annex-direct/comment_1_5d6f9e9393e534e027ddcd555861196b._comment view
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="tomekwi"+ subject="direct mode within a directory?"+ date="2015-06-13T13:03:33Z"+ content="""+Hi, is it possible to enable direct mode only on a single directory?++I can’t use symlinks on a part of my repo because of interoperability with http://tagspaces.org . And I don’t want to have all of my repo in direct mode.+"""]]
+ doc/git-annex-direct/comment_2_ef8ac748470549776c1ee299b062add2._comment view
@@ -0,0 +1,7 @@+[[!comment format=mdwn+ username="tomekwi"+ subject="…"+ date="2015-06-13T13:07:49Z"+ content="""+Using submodules to split the repo doesn’t work cleanly for me, by the way.+"""]]
doc/git-annex-drop.mdwn view
@@ -19,7 +19,7 @@ * `--from=remote` Rather than dropping the content of files in the local repository,- this option can specifiy a remote from which the files'+ this option can specify a remote from which the files' contents should be removed. * `--auto`@@ -58,6 +58,12 @@ # SEE ALSO [[git-annex]](1)++[[git-annex-get]](1)++[[git-annex-move]](1)++[[git-annex-copy]](1) # AUTHOR
doc/git-annex-dropunused.mdwn view
@@ -32,6 +32,8 @@ [[git-annex]](1) +[[git-annex-unused]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-enableremote.mdwn view
@@ -49,6 +49,8 @@ [[git-annex]](1) +[[git-annex-initremote]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-find.mdwn view
@@ -58,6 +58,10 @@ [[git-annex]](1) +[[git-annex-whereis]](1)++[[git-annex-list]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-fix.mdwn view
@@ -25,6 +25,8 @@ [[git-annex]](1) +[[git-annex-fsck]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-fsck.mdwn view
@@ -86,6 +86,10 @@ [[git-annex]](1) +[[git-annex-repair]](1)++[[git-annex-expire]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-get.mdwn view
@@ -32,6 +32,19 @@ Enables parallel download with up to the specified number of jobs running at once. For example: `-J10` +* `--incomplete`++ Resume any incomplete downloads of files that were started and+ interrupted at some point previously. Useful to pick up where you left+ off ... when you don't quite remember where that was.++ These incomplete files are the same ones that are+ listed as unused temp files by [[git-annex-unused]](1).++ Note that the git-annex key will be displayed when downloading,+ as git-annex does not know the associated file, and the associated file+ may not even be in the current git working directory.+ * `--all` Rather than specifying a filename or path to get, this option can be@@ -57,6 +70,10 @@ [[git-annex]](1) [[git-annex-drop]](1)++[[git-annex-copy]](1)++[[git-annex-move]](1) # AUTHOR
doc/git-annex-group.mdwn view
@@ -22,6 +22,12 @@ [[git-annex]](1) +[[git-annex-ungroup]](1)++[[git-annex-preferred-content]](1)++[[git-annex-wanted]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-groupwanted.mdwn view
@@ -25,6 +25,12 @@ [[git-annex]](1) +[[git-annex-group]](1)++[[git-annex-wanted]](1)++[[git-annex-preferred-content]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-import.mdwn view
@@ -75,6 +75,8 @@ [[git-annex]](1) +[[git-annex-add]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-importfeed.mdwn view
@@ -24,7 +24,7 @@ * `--force` - Force downoading items it's seen before.+ Force downloading items it's seen before. * `--template` @@ -41,6 +41,8 @@ # SEE ALSO [[git-annex]](1)++[[git-annex-addurl]](1) # AUTHOR
doc/git-annex-indirect.mdwn view
@@ -19,6 +19,8 @@ [[git-annex]](1) +[[git-annex-direct]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-init.mdwn view
@@ -20,6 +20,12 @@ [[git-annex]](1) +[[git-annex-describe]](1)++[[git-annex-reinit]](1)++git-init(1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-initremote.mdwn view
@@ -50,6 +50,8 @@ [[git-annex]](1) +[[git-annex-enableremote]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-list.mdwn view
@@ -27,6 +27,10 @@ [[git-annex]](1) +[[git-annex-find]](1)++[[git-annex-whereis]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-lock.mdwn view
@@ -22,6 +22,10 @@ [[git-annex]](1) +[[git-annex-add]](1)++[[git-annex-unlock]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-lookupkey.mdwn view
@@ -20,7 +20,7 @@ Enable batch mode, in which a line containing the filename is read from stdin, the key is output to stdout (with a trailing newline), and repeat. - Note that is there is no key corresponding to the file, an empty line is+ Note that if there is no key corresponding to the file, an empty line is output to stdout instead. # SEE ALSO
doc/git-annex-merge.mdwn view
@@ -20,6 +20,8 @@ [[git-annex]](1) +[[git-annex-sync]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-metadata.mdwn view
@@ -89,6 +89,8 @@ [[git-annex]](1) +[[git-annex-view]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-migrate.mdwn view
@@ -41,6 +41,8 @@ [[git-annex]](1) +[[git-annex-upgrade]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-mirror.mdwn view
@@ -17,7 +17,7 @@ when the numcopies setting allows. Note that mirror does not sync the git repository, but only the file-contents.+contents. Use [[git-annex-sync]](1) for that. # OPTIONS @@ -54,6 +54,8 @@ # SEE ALSO [[git-annex]](1)++[[git-annex-sync]](1) # AUTHOR
doc/git-annex-move.mdwn view
@@ -51,6 +51,12 @@ [[git-annex]](1) +[[git-annex-get]](1)++[[git-annex-copy]](1)++[[git-annex-drop]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-registerurl.mdwn view
@@ -25,6 +25,8 @@ [[git-annex]](1) +[[git-annex-addurl]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-reinit.mdwn view
@@ -21,6 +21,8 @@ [[git-annex]](1) +[[git-annex-init]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-reinject.mdwn view
@@ -25,6 +25,10 @@ [[git-annex]](1) +[[git-annex-add]](1)++[[git-annex-fsck]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-repair.mdwn view
@@ -48,6 +48,8 @@ [[git-annex]](1) +[[git-annex-fsck]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-required.mdwn view
@@ -9,7 +9,7 @@ # DESCRIPTION When run with an expression, configures the content that is required-to be held in the archive. See [[git-annex-preferred-content]](1)+to be held in the archive. For example: @@ -18,9 +18,19 @@ Without an expression, displays the current required content setting of the repository. +While [[git-annex-wanted]] is just a preference,+[[git-annex-required]] designates content that should really not be+removed. For example a file that is `wanted` can be removed with `git+annex drop`, but if that file is `required`, it would need to be+removed with `git annex drop --force`.+ # SEE ALSO [[git-annex]](1)++[[git-annex-wanted]](1)++[[git-annex-preferred-content]](1) # AUTHOR
doc/git-annex-rmurl.mdwn view
@@ -14,6 +14,8 @@ [[git-annex]](1) +[[git-annex-addurl]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-schedule.mdwn view
@@ -40,6 +40,10 @@ [[git-annex]](1) +[[git-annex-assistant]](1)++[[git-annex-expire]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-semitrust.mdwn view
@@ -17,6 +17,14 @@ [[git-annex]](1) +[[git-annex-trust]](1)++[[git-annex-untrust]](1)++[[git-annex-dead]](1)++[[git-annex-expire]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-shell.mdwn view
@@ -38,7 +38,7 @@ This checks if all specified keys are present in the annex, and exits zero if so. - Exits 1 if the key is certianly not present in the annex.+ Exits 1 if the key is certainly not present in the annex. Exits 100 if it's unable to tell (perhaps the key is in the process of being removed from the annex).
doc/git-annex-status.mdwn view
@@ -25,6 +25,8 @@ [[git-annex]](1) +git-status(1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-sync.mdwn view
@@ -21,6 +21,9 @@ commands to do each of those steps by hand, or if you don't want to worry about the details, you can use sync. +The content of annexed objects is not synced by default, but the --content+option (see below) can make that also be synchronized.+ Merge conflicts are automatically handled by sync. When two conflicting versions of a file have been committed, both will be added to the tree, under different filenames. For example, file "foo" would be replaced@@ -31,9 +34,12 @@ are pushed to the remote, so they can be merged into its working tree by running "git annex sync" on the remote. - # OPTIONS +* `--message=msg`++ Use this option to specify a commit message.+ * `--fast` Only sync with the remotes with the lowest annex-cost value configured.@@ -41,21 +47,29 @@ * `--content` Normally, syncing does not transfer the contents of annexed files.- This option causes the file contents to also be uploaded and downloaded- as necessary. + This option causes the content of files in the work tree+ to also be uploaded and downloaded as necessary. - By default, this tries to get each annexed file that the local repository - does not yet have, and then copies each file to every remote that it is- syncing with. This behavior can be overridden by configuring the preferred- content of a repository. See [git-annex-preferred-content](1)+ By default, this tries to get each annexed file in the work tree+ that the local repository does not yet have, and then copies each+ file in the work tree to every remote that it is syncing with.+ This behavior can be overridden by configuring the preferred content+ of a repository. See [[git-annex-preferred-content]](1). -* `--message=msg`+* `--all` - Use this option to specify a commit message.+ This option, when combined with `--content`, makes all available versions+ of all files be synced, when preferred content settings allow. + Note that preferred content settings that use `include=` or `exclude=`+ will only match the version of files currently in the work tree, but not+ past versions of files.+ # SEE ALSO [[git-annex]](1)++[[git-annex-preferred-content]](1) # AUTHOR
doc/git-annex-trust.mdwn view
@@ -18,6 +18,12 @@ [[git-annex]](1) +[[git-annex-semitrust]](1)++[[git-annex-untrust]](1)++[[git-annex-dead]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-undo.mdwn view
@@ -26,6 +26,8 @@ [[git-annex]](1) +[[git-annex-add]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-ungroup.mdwn view
@@ -14,6 +14,8 @@ [[git-annex]](1) +[[git-annex-group]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-uninit.mdwn view
@@ -18,6 +18,8 @@ [[git-annex-unannex]](1) +[[git-annex-init]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-unlock.mdwn view
@@ -25,6 +25,12 @@ [[git-annex]](1) +[[git-annex-edit]](1)++[[git-annex-add]](1)++[[git-annex-lock]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-untrust.mdwn view
@@ -18,6 +18,12 @@ [[git-annex]](1) +[[git-annex-trust]](1)++[[git-annex-semitrust]](1)++[[git-annex-dead]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-unused.mdwn view
@@ -65,6 +65,10 @@ [[git-annex]](1) +[[git-annex-dropunused]](1)++[[git-annex-addunused]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-upgrade.mdwn view
@@ -25,6 +25,12 @@ [[git-annex]](1) +[[git-annex-migrate]](1)++Upgrades procedures and history: <http://git-annex.branchable.com/upgrades>++News and release notes: <http://git-annex.branchable.com/news/>+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-vadd.mdwn view
@@ -21,6 +21,8 @@ [[git-annex]](1) +[[git-annex-metadata]](1)+ [[git-annex-view]](1) [[git-annex-vpop]](1)
doc/git-annex-vcycle.mdwn view
@@ -17,6 +17,8 @@ [[git-annex]](1) +[[git-annex-metadata]](1)+ [[git-annex-view]](1) [[git-annex-vpop]](1)
doc/git-annex-vfilter.mdwn view
@@ -15,6 +15,8 @@ [[git-annex]](1) +[[git-annex-metadata]](1)+ [[git-annex-view]](1) [[git-annex-vpop]](1)
doc/git-annex-vpop.mdwn view
@@ -17,6 +17,8 @@ [[git-annex]](1) +[[git-annex-metadata]](1)+ [[git-annex-view]](1) [[git-annex-vfilter]](1)
doc/git-annex-wanted.mdwn view
@@ -22,6 +22,12 @@ [[git-annex]](1) +[[git-annex-required]](1)++[[git-annex-preferred-content]](1)++[[git-annex-groupwanted]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-watch.mdwn view
@@ -36,6 +36,8 @@ [[git-annex]](1) +[[git-annex-assistant]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-webapp.mdwn view
@@ -42,6 +42,8 @@ [[git-annex]](1) +[[git-annex-assistant]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex-whereis.mdwn view
@@ -49,6 +49,10 @@ [[git-annex]](1) +[[git-annex-find]](1)++[[git-annex-list]](1)+ # AUTHOR Joey Hess <id@joeyh.name>
doc/git-annex.mdwn view
@@ -238,12 +238,6 @@ See [[git-annex-semitrust]](1) for details. -* `dead [repository ...]`-- Indicates that the repository has been irretrievably lost.- - See [[git-annex-dead]](1) for details.- * `group repository groupname` Add a repository to a group.@@ -315,6 +309,8 @@ Expires repositories that have not recently performed an activity (such as a fsck). + See [[git-annex-expire]](1) for details.+ * `unused` Checks the annex for data that does not correspond to any files present@@ -354,6 +350,12 @@ See [[git-annex-upgrade]](1) for details. +* `dead [repository ...] [--key key]`++ Indicates that a repository or a single key has been irretrievably lost.+ + See [[git-annex-dead]](1) for details.+ * `forget` Causes the git-annex branch to be rewritten, throwing away historical@@ -498,7 +500,7 @@ De-initialize git-annex and clean out repository. - See [[git-annex-unannex]](1) for details.+ See [[git-annex-uninit]](1) for details. * `reinit uuid|description` @@ -828,20 +830,22 @@ * `annex.bloomcapacity` - The `git annex unused` command uses a bloom filter to determine- what data is no longer used. The default bloom filter is sized to handle- up to 500000 keys. If your repository is larger than that,- you can adjust this to avoid `git annex unused` not noticing some unused- data files. Increasing this will make `git-annex unused` consume more memory;+ The `git annex unused` and `git annex sync --content` commands use+ a bloom filter to determine what files are present in eg, the work tree.+ The default bloom filter is sized to handle+ up to 500000 files. If your repository is larger than that,+ you should increase this value. Larger values will+ make `git-annex unused` and `git annex sync --content` consume more memory; run `git annex info` for memory usage numbers. * `annex.bloomaccuracy` Adjusts the accuracy of the bloom filter used by- `git annex unused`. The default accuracy is 1000 --- 1 unused file out of 1000 will be missed by `git annex unused`. Increasing- the accuracy will make `git annex unused` consume more memory;- run `git annex info` for memory usage numbers.+ `git annex unused` and `git annex sync --content`. + The default accuracy is 10000000 -- 1 unused file out of 10000000+ will be missed by `git annex unused`. Increasing the accuracy will make+ `git annex unused` consume more memory; run `git annex info`+ for memory usage numbers. * `annex.sshcaching`
doc/install.mdwn view
@@ -19,6 +19,8 @@ [[Windows]] | [download installer](https://downloads.kitenet.net/git-annex/windows/current/) **beta** """]] +Note: [[todo/git-annex_in_debian_sid]] is somewhat outdated, which makes the above Debian and Ubuntu release not quite up to date. The [NeuroDebian team](http://neuro.debian.net/) provides a [standalone build package](http://neuro.debian.net/pkgs/git-annex-standalone.html) that is regularly updated and that should work across all releases of Ubuntu and Debian. See [[todo/git-annex-standalone_Debian_package/]] for more information.+ All the download links above use https for security. For added security, see [[verifying_downloads]]. @@ -30,5 +32,5 @@ ## See also --[[autobuild overview|builds]]+ * [[autobuild overview|builds]]+ * [[upgrades]]
doc/install/Docker.mdwn view
@@ -4,39 +4,3 @@ For example: docker run -i -t joeyh/debian-unstable apt-get install git-annex--# containers for autobuilders--The git-annex Linux autobuilds are built using Docker containers.-Most of these are not published, but you can build your own. (See below.)--Since the Android autobuilder container can take quite a lot of work to get-built, it is published. `docker pull joeyh/git-annex-android-builder`--So's the armel autobuilder container. -`docker pull joeyh/git-annex-armel-builder`, and its companion container-`docker pull joeyh/git-annex-armel-companion`--# building autobuilder containers using Propellor--The Docker containers are built using-[Propellor](http://joeyh.name/code/propellor). To generate your own image,-Just install Propellor and add this to its `config.hs`:--[[!format haskell """-import qualified Propellor.Property.SiteSpecific.GitAnnexBuilder as GitAnnexBuilder-- , host "your.machine.net"- & Docker.configured- & Docker.docked (GitAnnexBuilder.standardAutoBuilderContainer dockerImage "amd64" 15 "2h")-"""]]--This will autobuild every hour at :15, and the autobuilt image will be-left inside the container in /home/builder/gitbuilder/out/--# container for backport building--For building the Debian stable backport, the container-`joeyh/git-annex-wheezy-backport` is used. This is nothing special, it-just has the right versions of build dependencies installed from Debian-stable and backports.
doc/install/Linux_standalone.mdwn view
@@ -26,11 +26,14 @@ ## autobuilds -A daily build is also available, thanks to Mesar Hameed and the University+An hourly autobuild is also available, thanks to Mesar Hameed and the University of Bath CS department. * x86-32: [download tarball](https://downloads.kitenet.net/git-annex/autobuild/i386/git-annex-standalone-i386.tar.gz) ([build logs](https://downloads.kitenet.net/git-annex/autobuild/i386/)) * x86-64: [download tarball](https://downloads.kitenet.net/git-annex/autobuild/amd64/git-annex-standalone-amd64.tar.gz) ([build logs](https://downloads.kitenet.net/git-annex/autobuild/amd64/))++The arm autobuilder runs daily, and is hosted at [WetKnee Books](http://www.wetknee.com/).+ * arm: [download tarball](https://downloads.kitenet.net/git-annex/autobuild/armel/git-annex-standalone-armel.tar.gz) ([build logs](https://downloads.kitenet.net/git-annex/autobuild/armel/)) ## technical details
doc/internals.mdwn view
@@ -53,13 +53,17 @@ ### `.git/annex/ssh/` -ssh connection caching files are written in here.+ssh connection caching files are written in here. It is safe to delete+these files. ### `.git/annex/index` This is a git index file which git-annex uses to stage files-when preparing commits to the git-annex branch. +when preparing commits to the git-annex branch. +It's pretty safe to delete this file if git-annex is not currently running.+It will be re-created as necessary.+ ### `.git/annex/journal/` git-annex uses this to journal changes to the git-annex branch,@@ -171,8 +175,8 @@ for hashing. See [[hashing]] for details. The name of the key is the filename, and the content-consists of a timestamp, either 1 (present) or 0 (not present), and-the UUID of the repository that has or lacks the file content.+consists of a timestamp, either 1 (present) or 0 (not present) or X (dead),+and the UUID of the repository that has or lacks the file content. Example:
+ doc/internals/comment_4_81293b180fb09105ec158fdfef73d249._comment view
@@ -0,0 +1,7 @@+[[!comment format=mdwn+ username="https://id.koumbit.net/anarcat"+ subject=".git/annex/tmp third-party use?"+ date="2015-06-09T20:21:39Z"+ content="""+can `.git/annex/tmp` be used by third party software to import stuff in git-annex? the idea here would be to accept uploads from a web form in `.git/annex/tmp` then move it into place in the proper location once the upload is complete (then do a git-annex-add or let the assistant import it). --[[anarcat]]+"""]]
+ doc/internals/comment_5_354012b6a9ac11160eb926234d38051f._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 1"""+ date="2015-06-09T20:25:03Z"+ content="""+It's ok to put files in .git/annex/tmp if they're formatted as git-annex+key filenames. Of course, you should avoid overwriting the content of files+already there.++Files not formatted as keys should be kept out of .git/annex/tmp; it's ok+to put them in .git/annex/misctmp.+"""]]
− doc/news/version_5.20150409.mdwn
@@ -1,23 +0,0 @@-git-annex 5.20150409 released with [[!toggle text="these changes"]]-[[!toggleable text="""- * This fixes a bug in the assistant introduced by the literal pathspec- changes in version 5.20150406.- * --quiet now suppresses progress displays from eg, rsync.- (Second time's the charm..)- * fromkey, registerurl: When reading from stdin, allow the- filename and url, respectively, to contain whitespace.- * add: If annex.largefiles is set and does not match a file that's being- added, the file will be checked into git rather than being added to the- annex. Previously, git annex add skipped over such files; this new- behavior is more useful in direct mode.- * proxy: Made it work when run in a new repository before initial- commit.- * info: Display repository mode: bare when in a bare (non-direct mode)- repo.- * importfeed: Fix feed download when curl is used.- * importfeed: Error out when passed a non-url.- * webapp: When adding another local repository, and combining it- with the current repository, the new repository's remote path- was set to "." rather than the path to the current repository.- This was a reversion caused by the relative path changes in 5.20150113.- * contentlocationn: New plumbing command."""]]
− doc/news/version_5.20150420.mdwn
@@ -1,33 +0,0 @@-git-annex 5.20150420 released with [[!toggle text="these changes"]]-[[!toggleable text="""- * Fix activity log parsing, which caused the log to not retain- activity from other uuids.- * Union merge could fall over if there was a file in the repository- with the same name as a git ref. Now fixed.- * info dir: Added information about repositories that- contain files in the specified directory.- * info: Added --bytes option.- * bittorrent: Fix handling of magnet links.- * When a key's size is unknown, still check the annex.diskreserve,- and avoid getting content if the disk is too full.- * Fix fsck --from a git remote in a local directory, and from- a directory special remote.- This was a reversion caused by the relative path changes in 5.20150113.- * fsck --from remote: When bad content is found in the remote,- and the local repo does not have a copy of the content, preserve- the bad content in .git/annex/bad/ to avoid further data loss.- * fsck --from remote: Avoid downloading a key if it would go over- the annex.diskreserve limit.- * required: New command, like wanted, but for required content.- * Removed dependency on haskell SHA library,- instead using cryptohash >= 0.11.0.- * Make repo init more robust.- * New debian/rules build-standalone target, which generates a- git-annex-standalone.deb that should work on many old Debian etc- systems. Thanks, Yaroslav Halchenko.- * Windows: Renamed start menu file to avoid loop in some versions- of Windows where the menu file is treated as a git-annex program.- * Windows: Fixed support of remotes on other drives.- (A reversion introduced in version 5.20150113.)- * Windows: Bundled versions of rsync, wget, ssh, and gpg from- cygwin all updated. Thanks, Yury V. Zaytsev."""]]
+ doc/news/version_5.20150617.mdwn view
@@ -0,0 +1,50 @@+git-annex 5.20150617 released with [[!toggle text="these changes"]]+[[!toggleable text="""+ * Now supports git annex sync --all --content to sync all versions of all+ files with all repos that want them.+ * Added new "anything" preferred content expression, which matches all+ versions of all files.+ * Standard preferred content for client, backup, incremental backup,+ and unwanted groups have been adjusted to work better when used+ with git annex sync --all --content.+ * fromkey, registerurl: Improve handling of urls that happen to also+ be parsable as strange keys.+ * sync, remotedaemon: Pass configured ssh-options even when+ annex.sshcaching is disabled.+ * assistant: Consume systemd-networkd dbus events to learn about+ changes to network connections, as was already done with+ network-manager and wicd.+ Thanks to Sebastian Reuße for the patches.+ * get --incomplete: New option to resume any interrupted downloads.+ * dead --key: Can be used to mark a key as dead.+ * fsck: Ignore keys that are known to be dead when running in+ --all/--unused/--key mode or a in a bare repo. Closes: #[753888](http://bugs.debian.org/753888)+ Otherwise, still reports files with lost contents, even if the content+ is dead.+ * S3: Special remotes can be configured with public=yes to allow+ the public to access the bucket's content.+ * S3: Publically accessible buckets can be used without creds.+ * import --clean-duplicates: Fix bug that didn't count local or trusted+ repo's copy of a file as one of the necessary copies to allow removing+ it from the import location.+ * tahoe: Use ~/.tahoe-git-annex/ rather than ~/.tahoe/git-annex/+ when setting up a tahoe special remote to avoid old versions of+ tahoe create-client choking.+ * Fix bug that prevented enumerating locally present objects in repos+ tuned with annex.tune.objecthash1=true.+ Fixes: unused, object count in info, unannex.+ * Improve url parsing to handle some urls containing illegal []+ characters in their paths.+ * info: Added json output for "backend usage", "numcopies stats",+ "repositories containing these files", and "transfers in progress".+ * Fix incremental backup standard preferred content expression to match+ its documentation, which says it does not want files that have reached+ a backup repository.+ * Increased the default annex.bloomaccuracy from 1000 to 10000000.+ This makes git annex unused use up to 16 mb more memory than it did+ before, but the massive increase in accuracy makes this worthwhile+ for all but the smallest systems.+ * Build documentation with deterministic=1 for reproducible builds.+ (A new ikiwiki feature.) Closes: #[785736](http://bugs.debian.org/785736)+ * Re-remove dependency on obsolete hamlet package. Closes: #[786659](http://bugs.debian.org/786659)+ * debian/cabal-wrapper: Removed this hack which should not be needed anymore."""]]
doc/preferred_content.mdwn view
@@ -13,23 +13,13 @@ try to honor those settings when interacting with it. (So there's no local `.git/config` for preferred content settings.) -[[!template id=note text="""-### [[quickstart|standard_groups]]--Rather than writing your own preferred content expression, you can use-several standard ones included in git-annex that are tuned to cover different-common use cases.--You do this by putting a repository in a group,-and simply setting its preferred content to "standard" to match whatever-is standard for that group. See [[standard_groups]] for a list.-"""]]- The idea is that you write an expression that files are matched against. If a file matches, the repository wants to store its content. If it doesn't, the repository wants to drop its content (if there are enough copies elsewhere to allow removing it). +## finding preferred content+ To check at the command line which files are matched by preferred content settings, you can use the --want-get and --want-drop options. @@ -38,9 +28,24 @@ --want-drop --in .` will find all the files that `git annex drop --auto` will want to drop. +## writing expressions++[[!template id=note text="""+### [[quickstart|standard_groups]]++Rather than writing your own preferred content expression, you can use+several standard ones included in git-annex that are tuned to cover different+common use cases.++You do this by putting a repository in a group,+and simply setting its preferred content to "standard" to match whatever+is standard for that group. See [[standard_groups]] for a list.+"""]]++ The expressions are very similar to the matching options documented-on the [[git-annex]] man page. At the command line, you can use those-options in commands like this:+on the [[git-annex-matching-options]] man page.+At the command line, you can use those options in commands like this: git annex get --include='*.mp3' --and -'(' --not --largerthan=100mb -')' @@ -48,142 +53,204 @@ include=*.mp3 and (not largerthan=100mb) -So, just remove the dashes, basically. However, there are some differences-from the command line options to keep in mind:+So, just remove the dashes, basically. But, there are some differences+between the command line options and expressions, so see the documentation+below to get the full story. -### difference: file matching+* `include=glob` and `exclude=glob` -While --include and --exclude match files relative to the current-directory, preferred content expressions always match files relative to the-top of the git repository. Perhaps you put files into `archive` directories-when you're done with them. Then you could configure your laptop to prefer-to not retain those files, like this:+ Match files to include, or exclude. - exclude=*/archive/*+ While --include=glob and --exclude=glob match files relative to the current+ directory, preferred content expressions always match files relative to the+ top of the git repository. -### difference: no "in="+ For example, suppose you put files into `archive` directories+ when you're done with them. Then you could configure your laptop to prefer+ to not retain those files, like this: `exclude=*/archive/*` -Preferred content expressions have no direct equivalent to `--in`.+* `copies=number` -Often, it's best to add repositories to groups, and match against-the groups in a preferred content expression. So rather than-`--in=usbdrive`, put all the USB drives into a "transfer" group,-and use "copies=transfer:1"+ Matches only files that git-annex believes to have the specified number+ of copies, or more. Note that it does not check remotes to verify that+ the copies still exist. -### difference: dropping+ To decide if content should be dropped, git-annex evaluates the preferred+ content expression under the assumption that the content has *already* been+ dropped. If the content would not be wanted then, the drop can be done.+ So, for example, `copies=2` in a preferred content expression lets+ content be dropped only when there are currently 3 copies of it, including+ the repo it's being dropped from. This is different than running `git annex+ drop --copies=2`, which will drop files that currently have 2 copies. -To decide if content should be dropped, git-annex evaluates the preferred-content expression under the assumption that the content has *already* been-dropped. If the content would not be wanted then, the drop can be done.-So, for example, `copies=2` in a preferred content expression lets-content be dropped only when there are currently 3 copies of it, including-the repo it's being dropped from. This is different than running `git annex-drop --copies=2`, which will drop files that currently have 2 copies.+* `copies=trustlevel:number` -### difference: "present"+ Matches only files that git-annex believes have the specified number+ copies, on remotes with the specified trust level. For example,+ `copies=trusted:2` -There's a special "present" keyword you can use in a preferred content-expression. This means that content is wanted if it's present,-and not otherwise. This leaves it up to you to use git-annex manually-to move content around. You can use this to avoid preferred content-settings from affecting a subdirectory. For example:+ To match any trust level at or higher than a given level,+ use `trustlevel+`. For example, `--copies=semitrusted+:2` - auto/* or (include=ad-hoc/* and present)+* `copies=groupname:number` -Note that `not present` is a very bad thing to put in a preferred content -expression. It'll make it want to get content that's not present, and-drop content that is present! Don't go there..+ Matches only files that git-annex believes have the specified number of+ copies, on remotes in the specified group. For example,+ `copies=archive:2` -### difference: "inpreferreddir"+ Preferred content expressions have no equivilant to the `--in`+ option, but groups can accomplish similar things. You can add+ repositories to groups, and match against the groups in a+ preferred content expression. So rather than `--in=usbdrive`,+ put all the USB drives into a "transfer" group, and use+ `copies=transfer:1` -There's a special "inpreferreddir" keyword you can use in a-preferred content expression of a special remote. This means that the-content is preferred if it's in a directory (located anywhere in the tree)-with a special name.+* `lackingcopies=number` -The name of the directory can be configured using -`git annex enableremote $remote preferreddir=$dirname`+ Matches only files that git-annex believes need the specified number or+ more additional copies to be made in order to satisfy their numcopies+ settings. -(If no directory name is configured, it uses "public" by default.)+* `approxlackingcopies=number` -### difference: "standard"+ Like lackingcopies, but does not look at .gitattributes annex.numcopies+ settings. This makes it significantly faster. -git-annex comes with some built-in preferred content expressions, that-can be used with repositories that are in some [[standard_groups]].+* `inbackend=name` -When a repository is in exactly one such group, you can use the "standard"-keyword in its preferred content expression, to match whatever content-the group's expression matches.-(If a repository is put into multiple standard-groups, "standard" will match anything.. so don't do that!)+ Matches only files whose content is stored using the specified key-value+ backend. -Most often, the whole preferred content expression is simply "standard".-But, you can do more complicated things, for example:-"`standard or include=otherdir/*`"+* `inallgroup=groupname` -### difference: "groupwanted"+ Matches only files that git-annex believes are present in all repositories+ in the specified group. -The "groupwanted" keyword can be used to refer to a preferred content-expression that is associated with a group. This is like the "standard"-keyword, but you can configure the preferred content expressions-using `git annex groupwanted`.+* `smallerthan=size` and `largerthan=size` -Note that when writing a groupwanted preferred content expression,-you can use all of the keywords listed above, including "standard".-(But not "groupwanted".)+ Matches only files whose content is smaller than, or larger than the+ specified size. -For example, to make a variant of the standard client preferred content-expression that does not want files in the "out" directory, you-could run: `git annex groupwanted client "standard and exclude=out/*"`+ The size can be specified with any commonly used units, for example,+ "0.5 gb" or "100 KiloBytes" -Then repositories that are in the client group and have their preferred-content expression set to "groupwanted" will use that, while-other client repositories that have their preferred content expression-set to "standard" will use the standard expression.+* `metadata=field=glob` -Or, you could make a new group, with your own custom preferred content-expression tuned for your needs, and every repository you put in this-group and make its preferred content be "groupwanted" will use it.+ Matches only files that have a metadata field attached with a value that+ matches the glob. The values of metadata fields are matched case+ insensitively. -For example, the archive group only wants to archive 1 copy of each file,-spread among every repository in the group.-Here's how to configure a group named redundantarchive, that instead-wants to contain 3 copies of each file:+ To match a tag "done", use `metadata=tag=done` + To match author metadata, use `metadata=author=* Smith`++* `present`++ Makes content be wanted if it's present, but not otherwise.++ This leaves it up to you to use git-annex manually+ to move content around. You can use this to avoid preferred content+ settings from affecting a subdirectory. For example:+ `auto/* or (include=ad-hoc/* and present)`++ Note that `not present` is a very bad thing to put in a preferred content + expression. It'll make it want to get content that's not present, and+ drop content that is present! Don't go there..++* `inpreferreddir`++ Makes content be preferred if it's in a directory (located anywhere+ in the tree) with a particular name. ++ The name of the directory can be configured using + `git annex enableremote $remote preferreddir=$dirname`++ (If no directory name is configured, it uses "public" by default.)++* `standard`++ git-annex comes with some built-in preferred content expressions, that+ can be used with repositories that are in some [[standard_groups]].++ When a repository is in exactly one such group, you can use the "standard"+ keyword in its preferred content expression, to match whatever content+ the group's expression matches.+ (If a repository is put into multiple standard+ groups, "standard" will match anything.. so don't do that!)++ Most often, the whole preferred content expression is simply "standard".+ But, you can do more complicated things, for example:+ `standard or include=otherdir/*`++* `groupwanted`++ The "groupwanted" keyword can be used to refer to a preferred content+ expression that is associated with a group. This is like the "standard"+ keyword, but you can configure the preferred content expressions+ using `git annex groupwanted`.++ Note that when writing a groupwanted preferred content expression,+ you can use all of the keywords listed above, including "standard".+ (But not "groupwanted".)++ For example, to make a variant of the standard client preferred content+ expression that does not want files in the "out" directory, you+ could run: `git annex groupwanted client "standard and exclude=out/*"`++ Then repositories that are in the client group and have their preferred+ content expression set to "groupwanted" will use that, while+ other client repositories that have their preferred content expression+ set to "standard" will use the standard expression.++ Or, you could make a new group, with your own custom preferred content+ expression tuned for your needs, and every repository you put in this+ group and make its preferred content be "groupwanted" will use it.++ For example, the archive group only wants to archive 1 copy of each file,+ spread among every repository in the group.+ Here's how to configure a group named redundantarchive, that instead+ wants to contain 3 copies of each file:+ git annex groupwanted redundantarchive "not (copies=redundantarchive:3)" for repo in foo bar baz; do git annex group $repo redundantarchive git annex wanted $repo groupwanted done -### difference: metadata matching+* `unused` -This:+ Matches only keys that `git annex unused` has determined to be unused. - git annex get --metadata tag=done+ This is related the the --unused option.+ However, putting `unused` in a preferred content expression + doesn't make git-annex consider those unused keys. So when git-annex is+ only checking preferred content expressions against files in the+ repository (which are obviously used), `unused` in a preferred+ content expression won't match anything. -becomes+ So when is `unused` useful in a preferred content expression? - metadata=tag=done+ 1. Using `git annex sync --content --all` will operate on all files,+ including unused ones, and take `unused` in preferred content expressions+ into account.+ 2. The git-annex assistant periodically scans for unused files, and+ moves them to some repository whose preferred content expression+ says it wants them. (Or, if annex.expireunused is set, it may just delete+ them.) -### difference: unused+* `anything` -The --unused option makes git-annex operate on every key that `git annex-unused` has determined to be unused. The corresponding `unused` keyword-in a preferred content expression also matches those keys. + Matches any version of any file. -However, the latter doesn't make git-annex consider those keys. So-when git-annex is only checking preferred content expressions against files-in the repository (which are obviously used), `unused` in a preferred-content expression won't match anything.+* `not expression` -So when is `unused` useful in a preferred content expression?+ Inverts what the expression matches. For example, `not include=archive/*`+ is the same as `exclude=archive/*` -The git-annex assistant periodically scans for unused files, and-moves them to some repository whose preferred content expression-matches "unused". (Or, if annex.expireunused is set, it may just delete-them.)+* `and` / `or` / `( expression )` + These can be used to build up more complicated expressions.+ ## upgrades It's important that all clones of a repository can understand one-another's@@ -200,6 +267,7 @@ Here are recent changes to preferred content expressions, and the version they were added in. +* "anything" 5.20150616 * "standard" 5.20140314 (only when used in a more complicated expression; "standard" by itself has been supported for a long time)
doc/preferred_content/comment_7_c4acaa237bf1a8512c5e8ea4cdbd11b9._comment view
@@ -4,5 +4,7 @@ subject="comment 7" date="2013-01-10T03:51:38Z" content="""-Sorry, there's not. The expressions used for \"standard\" are built in.+The expressions used for \"standard\" are built in.++But, you can use \"groupwanted\" instead, see documentation above. """]]
− doc/preferred_content/comment_8_ff2a2dc9c566ebd9f570bdfcd7bfc030._comment
@@ -1,27 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q"- nickname="Andrew"- subject="comment 8"- date="2013-01-10T10:24:28Z"- content="""-By way of a feature request: Maybe the way to do this is to have an additional keyword like \"config\" or \"repo\" that allows you to use vicfg and/or git config to set alternative rules and even additional group names.--In git config:-- annex.groups.<groupname> = present and exclude=*/archive/* and exclude=archive/*--in vicfg:-- # (for passport)- #trust A0637025-ED47-4F95-A887-346121F1B4A0 = semitrusted- - # (for passport)- group A0637025-ED47-4F95-A887-346121F1B4A0 = transfer- - # (for passport)- preferred-content A0637025-ED47-4F95-A887-346121F1B4A0 = repo- - # (for transfer)- group-content transfer = present and exclude=*/archive/* and exclude=archive/*--"""]]
doc/preferred_content/standard_groups.mdwn view
@@ -19,10 +19,10 @@ ### client -All content is wanted, unless it's for a file in a "archive" directory,-which has reached an archive repository, or is unused.+All content in the current working tree is wanted, unless it's for a+file in a "archive" directory, which has reached an archive repository. -`(((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and not unused) or approxlackingcopies=1`+`(include=* and ((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1)))) or approxlackingcopies=1` ### transfer @@ -49,14 +49,14 @@ All content is wanted. Even content of old/deleted files. -`include=* or unused`+`anything` ### incremental backup Only wants content that's not already backed up to another backup or incremental backup repository. -`((include=* or unused) and (not copies=backup:1) and (not copies=incrementalbackup:1)) or approxlackingcopies=1`+`((not copies=backup:1) and (not copies=incrementalbackup:1)) or approxlackingcopies=1` ### small archive @@ -114,6 +114,8 @@ will be published. (The directory can be located anywhere in the repository.) +`inpreferreddir`+ The name of the directory can be configured using `git annex enableremote $remote preferreddir=$dirname` @@ -123,4 +125,4 @@ in any content on them being moved away to other repositories. (Works best when the unwanted repository is also marked as untrusted or dead.) -`exclude=*`+`not anything`
doc/publicrepos.mdwn view
@@ -28,5 +28,10 @@ * [gst-integration-testsuites](http://cgit.freedesktop.org/gstreamer/gst-integration-testsuites) GStreamer integration testsuite media assets management +* [ccc-media-annex](https://github.com/ntnn/ccc-media-annex) + `git clone https://github.com/ntnn/ccc-media-annex` + git-annex repository using [the CDN](http://media.ccc.de/) of the german [CCC](http://www.ccc.de/). + Contains a lot of talks (mostly in german) held on events from the CCC as well as other stuff.+ This is a wiki -- add your own public repository to the list! See [[tips/centralized_git_repository_tutorial]].
@@ -3,23 +3,36 @@ * The [[git-annex assistant|assistant]] is included in git-annex, and extends its use cases into new territory.+ * [gitlab-shell](https://gitlab.com/gitlab-org/gitlab-shell) supports git-annex. So git-annex can be used with repositories served by GitLab, including gitlab.com, or deploy your own. [See GitLab's announcement](https://about.gitlab.com/2015/02/17/gitlab-annex-solves-the-problem-of-versioning-large-binaries-with-git/)+ * Emacs Org mode can auto-commit attached files to git-annex.+ * [git annex darktable integration](https://github.com/xxv/darktable-git-annex)+ * [Magit](http://github.com/magit/magit), an Emacs mode for Git, has [an extension](https://github.com/magit/magit-annex) for git annex.+ * [DataLad](http://datalad.org/) uses git-annex to provide access to scientific data available from various sources.+ * The [Baobáxia](https://github.com/RedeMocambos/baobaxia) project built by the Brazilian [Mocambos network](http://www.mocambos.net/) is [using git-annex to connect isolated communities](http://www.modspil.dk/itpolitik/baob_xia.html). Repositories sync over satellite internet and/or sneakernet.++* The [Isuma Media Players project](http://isuma-media-players.readthedocs.org/en/latest/index.html)+ uses git-annex to "create a two-way, distributed content distribution+ network for communities with poor connexions to the internet".+ * [[forum/gadu_-_git-annex_disk_usage]] is a du like utility that is git-annex aware.+ * [sizes](http://hackage.haskell.org/package/sizes) is another du-like utility, with a `-A` switch that enables git-annex support.+ * [git-annex-watcher](https://github.com/rubiojr/git-annex-watcher) is a status icon for your desktop.
doc/special_remotes/S3.mdwn view
@@ -48,6 +48,15 @@ so by default, a bucket name is chosen based on the remote name and UUID. This can be specified to pick a bucket name. +* `public` - Set to "yes" to allow public read access to files sent+ to the S3 remote. This is accomplished by setting an ACL when each + file is uploaded to the remote. So, changes to this setting will+ only affect subseqent uploads.++* `publicurl` - Configure the URL that is used to download files+ from the bucket when they are available publically.+ (This is automatically configured for Amazon S3 and the Internet Archive.)+ * `partsize` - Amazon S3 only accepts uploads up to a certian file size, and storing larger files requires a multipart upload process.
doc/special_remotes/bittorrent.mdwn view
@@ -10,8 +10,8 @@ git-annex uses [aria2](http://aria2.sourceforge.net/) to download torrents. If git-annex is not built using the haskell torrent library to parse-torrents, it also needs the needs the `btshowmetainfo` program, from-either bittornado or the original BitTorrent client.+torrents, it also needs the `btshowmetainfo` program, from either+bittornado or the original BitTorrent client. ## notes
+ doc/tips/Repositories_with_large_number_of_files.mdwn view
@@ -0,0 +1,48 @@+Just as git does not scale well with large files, it can also become painful to work with when you have a large *number* of files. Below are things I have found to minimise the pain.++# Using version 4 index files++During operations which affect the index, git writes an entirely new index out to index.lck and then replaces .git/index with it. With a large number of files, this index file can be quite large and take several seconds to write every time you manipulate the index!++This can be mitigated by changing it to version 4 which uses path compression to reduce the filesize:++ git update-index --index-version 4++*NOTE: The git documentation warns that this version may not be supported by other git implementations like JGit and libgit2.*++Personally, I saw a reduction from 516MB to 206MB (*40% of original size*) and got a much more responsive git!++It may also be worth doing the same to git-annex's index:++ GIT_INDEX_FILE=.git/annex/index git update-index --index-version 4++Though I didn't gain as much here with 89MB to 86MB (96% of original size).++# Packing++As I have gc disabled:++ git config gc.auto 0++so I control when it is run, I ended up with a lot of loose objects which also cause slowness in git. Using++ git count-objects++to tell me how many loose objects I have, when I reach a threshold (~25000), I pack those loose objects and clean things up:++ git repack -d+ git gc+ git prune++# File count per directory++If it takes a long time to list the files in a directory, naturally, git(-annex) will be affected by this bottleneck.++You can avoid this by keeping the number of files in a directory to between 5000 and 20000 (depends on the filesystem and its settings).++[fpart](http://contribs.martymac.org/fpart/) can be a very useful tool to achieve this.++## Topics discussing this sort of usage++* [[forum/Handling_a_large_number_of_files]]+* [[forum/__34__git_annex_sync__34___synced_after_8_hours]]
doc/tips/automatically_adding_metadata/pre-commit-annex view
@@ -52,6 +52,7 @@ process () { if [ -e "$f" ]; then+ echo "adding metadata for $f" for l in $(extract "$f" | egrep "$want"); do field="${l%% - *}" value="${l#* - }"
+ doc/tips/disabling_a_special_remote.mdwn view
@@ -0,0 +1,35 @@+In our quest to find dumb replacements for [[todo/wishlist: 'get' queue and schedule.]] (and a more complete [[git-annex-schedule]]), we have setup a cronjob that would start and stop the assistant during certain time windows, to ensure that it would not download during prime bandwidth time.++But that isn't exactly what we're looking for: we would like the assistant to continue doing its usual thing of adding and removing files, and even syncing the git branches. Just not get/move files around.++One way I thought of doing this was to disable a remote locally. [[git-annex-dead]] of course comes to mind, but that applies to all repositories, so it's not an option. If the remote was in git, i could just `git remote rm origin` and `git remote add origin` and be done with it, but this is the *web* remote, so it doesn't even show up in `git remote -v`.++But this doesn't work with [[special remotes]]. Another solution is+simply to use the `remote.name.annex-ignore` configuration documented+in the main [[git-annex]] manpage. For example, to disable the web+remote, you would use:++ git config remote.web.annex-ignore false++The result would be:++ joey@darkstar:~/tmp/a>git annex addurl --fast http://localhost+ addurl localhost ok+ (recording state in git...)+ joey@darkstar:~/tmp/a>git config remote.web.annex-ignore true+ joey@darkstar:~/tmp/a>git annex get localhost+ get localhost (not available) + Try making some of these repositories available:+ 00000000-0000-0000-0000-000000000001 -- web+ + (Note that these git remotes have annex-ignore set: web)+ failed+ git-annex: get: 1 failed+ joey@darkstar:~/tmp/a>git config remote.web.annex-ignore false+ joey@darkstar:~/tmp/a>git annex get localhost+ get localhost (from web...) + /home/joey/tmp/a/.g 100%[=====================>] 10 --.-KB/s in 0s + ok++The assistant (probably?) needs to be restarted for those changes to+take effect. --[[anarcat]] and [[joeyh]].
+ doc/tips/public_Amazon_S3_remote.mdwn view
@@ -0,0 +1,57 @@+Here's how to create a Amazon [[S3 special remote|special_remotes/S3]] that+can be read by anyone who gets a clone of your git-annex repository,+without them needing Amazon AWS credentials.++Note: Bear in mind that Amazon will charge the owner of the bucket+for public downloads from that bucket.++## create public remote++First, export your Amazon AWS credentials:++ # export AWS_ACCESS_KEY_ID="08TJMT99S3511WOZEP91"+ # export AWS_SECRET_ACCESS_KEY="s3kr1t"++Now, create the remote:++ # git annex initremote pubs3 type=S3 encryption=none public=yes+ initremote pubs3 (checking bucket) (creating bucket in US) ok++The public=yes is the crtical part; this lets the public read the contents+of the bucket.++In the above example, no encryption was used, but it will also work+if you enable encryption=shared. Then files will be encrypted on S3, and+anyone with a clone of the git repository will be able to download and+decrypt them.++It's also ok to enable chunking when setting up the remote.++Now, copy some files to the remote, in the usual way, and push your+git repository to someplace where someone else can access it.++## use public remote++Once the S3 remote is set up, anyone who can clone the git repositry+can get files from the remote, without needing any Amazon AWS credentials.++Start by checking out the git repository. ++In the checkout, enable the S3 remote:++ # git annex enableremote pubs3+ enableremote pubs3 ok++Now, git-annex can be used as usual to download files from that remote.++## sharing urls++You can also share urls to files stored in a public S3 remote to people+who are not using git-annex. To find the url, use `git annex whereis`.++----++See [[special_remotes/S3]] for details about configuring S3 remotes.++See [[publishing_your_files_to_the_public]] for other ways to use a public+S3 bucket.
doc/tips/publishing_your_files_to_the_public.mdwn view
@@ -2,28 +2,19 @@ (In this example, I'll assume you'll be creating a bucket in S3 named **public-annex** and a special remote in git-annex, which will store its files in the previous bucket, named **public-s3**, but change these names if you are going to do the thing for real) -First, in the AWS dashboard, go to (or create) the bucket you will use at S3 and add a public get policy to it:-- {- "Version": "2008-10-17",- "Statement": [- {- "Sid": "AllowPublicRead",- "Effect": "Allow",- "Principal": {- "AWS": "*"- },- "Action": "s3:GetObject",- "Resource": "arn:aws:s3:::public-annex/*"- }- ]- }+Set up your special [S3](http://git-annex.branchable.com/special_remotes/S3/) remote with (at least) these options: -Then set up your special [S3](http://git-annex.branchable.com/special_remotes/S3/) remote with (at least) these options:+ git annex initremote public-s3 type=s3 encryption=none bucket=public-annex chunk=0 public=yes - git annex initremote public-s3 type=s3 encryption=none bucket=public-annex chunk=0+This way git-annex will upload the files to this repo, (when you call `git+annex copy [FILES...] --to public-s3`) without encrypting them and without+chunking them. And, thanks to the public=yes, they will be+accessible by anyone with the link. -This way git-annex will upload the files to this repo, (when you call `git annex copy [FILES...] --to public-s3`) without encrypting them and without chunking them, and, because of the policy of the bucket, they will be accessible by anyone with the link.+(Note that public=yes was added in git-annex version 5.20150605.+If you have an older version, it will be silently ignored, and you+will instead need to use the AWS dashboard to configure a public get policy+for the bucket.) Following the example, the files will be accessible at `http://public-annex.s3.amazonaws.com/KEY` where `KEY` is the file key created by git-annex and which you can discover running @@ -31,8 +22,6 @@ This way you can share a link to each file you have at your S3 remote. -___________________- ## Sharing all links in a folder To share all the links in a given folder, for example, you can go to that folder and run (this is an example with the _fish_ shell, but I'm sure you can do the same in _bash_, I just don't know exactly):@@ -73,4 +62,27 @@ done | git annex registerurl </pre> -`registerurl` was introduced in `5.20150317`. There's a todo open to ensure we don't have to do this by hand: [[todo/credentials-less access to s3]].+`registerurl` was introduced in `5.20150317`.++## Manually configuring a public get policy++Here is how to manually configure a public get policy+for a bucket, in the AWS dashboard.++ {+ "Version": "2008-10-17",+ "Statement": [+ {+ "Sid": "AllowPublicRead",+ "Effect": "Allow",+ "Principal": {+ "AWS": "*"+ },+ "Action": "s3:GetObject",+ "Resource": "arn:aws:s3:::public-annex/*"+ }+ ]+ }++This should not be necessary if using a new enough version+of git-annex, which can instead be configured with public=yet.
doc/tips/using_Amazon_S3.mdwn view
@@ -22,16 +22,17 @@ The configuration for the S3 remote is stored in git. So to make another repository use the same S3 remote is easy: - # cd /media/usb/annex+ # export AWS_ACCESS_KEY_ID="08TJMT99S3511WOZEP91"+ # export AWS_SECRET_ACCESS_KEY="s3kr1t" # git pull laptop # git annex enableremote cloud enableremote cloud (gpg) (checking bucket) ok -Now the remote can be used like any other remote.+Notice that to enable an existing S3 remote, you have to provide the Amazon+AWS credentials because they were not stored in the repository. (It is+possible to configure git-annex to do that, but not the default.) - # git annex copy my_cool_big_file --to cloud- copy my_cool_big_file (gpg) (checking cloud...) (to cloud...) ok- # git annex move video/hackity_hack_and_kaxxt.mov --to cloud- move video/hackity_hack_and_kaxxt.mov (checking cloud...) (to cloud...) ok+See [[public_Amazon_S3_remote]] for how to set up a Amazon S3 remote that+can be used by the public, without them needing AWS credentials. -See [[special_remotes/S3]] for details.+See [[special_remotes/S3]] for details about configuring S3 remotes.
doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync.mdwn view
@@ -7,3 +7,5 @@ Anyway thanks for hearing. I'm looking forward to know more about git-annex. Thank you for that sw. =-<>-= > [[design/assistant/telehash]] --[[Joey]] ++> > telehash has been mostly put aside for now, but there are interesting alternatives, including an [[special_remotes/ipfs]] special remote available. see [[todo/Bittorrent-like_features]] for followup on the discussion. so i'm marking this as a [[duplicate|done]]. --[[anarcat]]
doc/todo/Bittorrent-like_features.mdwn view
@@ -29,7 +29,18 @@ This was originally posted [[as a forum post|forum/Wishlist:_Bittorrent-like_transfers]] by [[users/GLITTAH]]. -Update: note how [[design/assistant/telehash/]] may be able to answer this specific use case.+Update: there are multiple projects trying to solve this problem space outside of git-annex, which git-annex should reuse.++ * [[design/assistant/telehash/]] support is still not complete, as the upstream spec and implementation (particularly Haskell bits), need to mature+ * [[special_remotes/ipfs/]] is now a special remote that does respond to some of the requirements (but [duplicates files around](https://github.com/ipfs/go-ipfs/issues/875) even more and is [kind of](https://github.com/ipfs/go-ipfs/issues/872) [slow](https://github.com/ipfs/go-ipfs/issues/898))+ * [Maidsafe](http://maidsafe.net/) is another option, which provides storage and uses crypto-currency incentives+ * [Storj](http://storj.io/) is similar+ * [camlistore](https://camlistore.org/) is yet another option+ * [syncthing](https://syncthing.net/) looks like a btsync replacement, and could also be interesting, see the [[todo/syncthing_special_remote]] discussion+ * [gittorrent](http://blog.printf.net/articles/2015/05/29/announcing-gittorrent-a-decentralized-github/) allows for decentralised sharing of the git objects, which could replace pairing between repositories, except it [doesn't support push yet](https://github.com/cjb/GitTorrent/issues/3)+ * [gitocalypse](https://github.com/SeekingFor/gitocalypse) is similar to gittorrent, except it uses Freenet and HG (Mercurial?!) instead of the bittorrent DHT++joeyh's approach for now is to [[wait and see what will emerge|devblog/day_219__catching_up_and_looking_back/]], but of course people are welcome to implement their own [[special_remotes]] to fix this problem! Using an external client (addurl torrent support) =================================================
doc/todo/Nearline_support.mdwn view
@@ -2,5 +2,3 @@ * [Announcement](http://googlecloudplatform.blogspot.in/2015/03/introducing-Google-Cloud-Storage-Nearline-near-online-data-at-an-offline-price.html) * <https://cloud.google.com/storage/docs/nearline-storage>--> [[dup|done]] --[[Joey]]
+ doc/todo/S3_fsck_support.mdwn view
@@ -0,0 +1,55 @@+I have (i think?) noticed that the s3 remote doesn't really do an fsck:++http://source.git-annex.branchable.com/?p=source.git;a=blob;f=Remote/S3.hs;hb=HEAD#l86++Besides, unless S3 does something magic and amazingly fast, the checksum is just too slow for it to be really operational:++<pre>+$ time git annex fsck -f s3 video/original/quartet_for_deafblind_h264kbs18000_24.mov+fsck video/original/quartet_for_deafblind_h264kbs18000_24.mov (checking s3...) ok+(recording state in git...)++real 0m1.188s+user 0m0.444s+sys 0m0.324s+$ time git annex fsck video/original/quartet_for_deafblind_h264kbs18000_24.mov+fsck video/original/quartet_for_deafblind_h264kbs18000_24.mov (checksum...)+ok+(recording state in git...)++real 3m14.478s+user 1m55.679s+sys 0m8.325s+</pre>++1s is barely the time for git-annex to do an HTTP request to amazon, and what is returned doesn't seem to have a checksum of any kind:++<pre>+fsck video/original/quartet_for_deafblind_h264kbs18000_24.mov (checking s3...) [2015-06-16 00:31:46 UTC] String to sign: "HEAD\n\n\nTue, 16 Jun 2015 00:31:46 GMT\n/isuma-files/SHA256E-s11855411701--ba268f1c401321db08d4cb149d73a51a10f02968687cb41f06051943b4720465.mov"+[2015-06-16 00:31:46 UTC] Host: "isuma-files.s3.amazonaws.com"+[2015-06-16 00:31:46 UTC] Response header 'x-amz-request-id': '9BF7B64EB5A619F3'+[2015-06-16 00:31:46 UTC] Response header 'x-amz-id-2': '84ZO7IZ0dqJeEghADjt7hTGKGqGAWwbwwaCFVft3ama+oDOVJrvpiFjqn8EY3Z0R'+[2015-06-16 00:31:46 UTC] Response header 'Content-Type': 'application/xml'+[2015-06-16 00:31:46 UTC] Response header 'Transfer-Encoding': 'chunked'+[2015-06-16 00:31:46 UTC] Response header 'Date': 'Tue, 16 Jun 2015 00:32:10 GMT'+[2015-06-16 00:31:46 UTC] Response header 'Server': 'AmazonS3'+[2015-06-16 00:31:46 UTC] Response metadata: S3: request ID=<none>, x-amz-id-2=<none>+ok+</pre>++did i miss something? are there fsck checks for s3 remotes?++if not, i think it would be useful to leverage the "md5summing" functionality that the S3 API provides. there are two relevant stackoverflow responses here:++http://stackoverflow.com/questions/1775816/how-to-get-the-md5sum-of-a-file-on-amazons-s3+http://stackoverflow.com/questions/8618218/amazon-s3-checksum++... to paraphrase: when a file is `PUT` on S3, one can provide a `Content-MD5` header that S3 will check against the uploaded file content for corruption, when doing the upload. then there is some talk about how the `ETag` header *may* hold the MD5, but that seems inconclusive. There's a specific API call for getting the MD5 sum:++https://docs.aws.amazon.com/AWSAndroidSDK/latest/javadoc/com/amazonaws/services/s3/model/ObjectMetadata.html#getContentMD5()++the android client also happens to check with that API on downloads:++https://github.com/aws/aws-sdk-android/blob/4de3a3146d66d9ab5684eb5e71d5a2cef9f4dec9/aws-android-sdk-s3/src/main/java/com/amazonaws/services/s3/AmazonS3Client.java#L1302++now of course MD5 is a pile of dung nowadays, but having that checksum beats not having any checksum at all. *and* it is at no cost on the client side... --[[anarcat]]
+ doc/todo/S3_fsck_support/comment_1_9317598723ea38ae9432ad50e0de666d._comment view
@@ -0,0 +1,26 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 1"""+ date="2015-06-16T17:50:56Z"+ content="""+You're incorrect; `git-annex fsck --from remote` works to fsck *any*+remote. For remotes like S3, it has to download the content to check it+locally, which is why `remoteFsck` is not provided.++Since you passed -f (--fast) to fsck, it avoids checksuming the content,+so avoids downloading it, and only verifies that S3 still says it has+the content. As documented on the git-annex fsck man page.++AFAICS, the Content-MD5 is only used by S3 to check that the data uploaded+to S3 didn't get corrupted over the wire. I assume that S3 implements its+own checksums to detect when data already stored on it gets corrupted, so+it seems redundant and complicating for git-annex to query it for md5sums.+It would work just as well for git-annex to verify a key after downloading+it, using the key's own hash, per [[todo/ checksum verification on transfer]].++It **might** be worth filling in the `poContentMD5` field with the md5 of+the file when uploading it to S3. Of course, this requires hashing the file+locally. And when storing an encrypted object on S3, it would require+buffering the whole encrypted object to disk first, in order to hash it+(but that's currently done anyway).+"""]]
+ doc/todo/S3_fsck_support/comment_2_7a1ce64d362b8f75adf22709771a7787._comment view
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="anarcat"+ subject="comment 2"+ date="2015-06-16T20:10:50Z"+ content="""+understood: i thought `-f` was `--from`... hence my confusion.++as for `remoteFsck`, i guess what i am saying is exactly that: there *does* seem to be a way to do a remote checksum of the file *without* downloading it. it seems to be a critical advantage over having to download the whole repository to check it... maybe `--fast` could use that technique and `non--fast` would download?++as for the on-wire MD5 stuff, that does seem to be overkill...+"""]]
+ doc/todo/Support_dbus_monitor_for_networkd.mdwn view
@@ -0,0 +1,5 @@+As of late, systemd-networkd supports a network monitor via dbus under “org.freedesktop.network1“. It would be convenient if the assistant supported this.++Cf. this [commit](http://cgit.freedesktop.org/systemd/systemd/commit/?id=e331e24649213f2e093e16e4d3d64ee823dfc375).++> patches! Awesome! merged [[done]] --[[Joey]]
+ doc/todo/add_--quiet_option_to_fsck.mdwn view
@@ -0,0 +1,7 @@+ATM it floods the screen with ok for every file (in non-interactive session even split across 2 lines). As such it is just a pure noise if I care to check if entire repo is ok -- a single summary line, possibly preceeded with reports about broken files would be much better imho.++Cheers!++> I jumped in a time machine, popped out in 2010 and implemented it+> them, to ensure the bug is already fixed on your computer. [[done]]+> --[[Joey]]
+ doc/todo/cloning_direct_mode_repo_over_http.mdwn view
@@ -0,0 +1,35 @@+Indirect mode repos can be cloned over http, and just work. But, direct+mode repos don't currently work; while git can clone them ok, git-annex get+doesn't know where to get the file contents from.++To support this, git-annex would have to check if the remote is in direct+mode, and when it is, it would need to download the direct mode mapping+file, to find out which file has the content of a key. Then, after+downloading the a file, it would need to make sure to checksum it, since+nothing prevents a direct mode file from being modified at the same time+it's downloaded.++All seems doable. However.. [[design/caching_database]] wants to switch the+direct mode mapping files from simple flat text files to a sqlite database.+Which would complicate this a lot. Can sqlite databases be accessed over+http, or would the whole, possibly large database need to be downloaded?+If so, what to do when the database changes? Re-downloading a possibly+large db is not good.++---++Alternatively, the direct mode mapping files of the remote could be+bypassed. Instead, look at what the remote HEAD branch is, and look at that+branch locally. Create local direct mode mappings for the remote HEAD+branch, and use them when downloading.++This approach would mean that, if the remote's HEAD changes and we haven't+noticed, we might download the wrong file (that has eg, been moved).+checksumming would detect this, but it does make it more fragile.++Also, creating the direct mode mappings for a remote HEAD would currently+be pretty slow. Probably implementing the caching database for direct mode+mappings would lead to faster code. So, this feature seems best blocked on+the direct mode database either way!++--[[Joey]]
doc/todo/credentials-less_access_to_s3.mdwn view
@@ -9,3 +9,5 @@ How hard would it be to fix that in the s3 remote? Thanks! --[[anarcat]]++> [[done]], see [[tips/public_Amazon_S3_remote/]] --[[Joey]]
doc/todo/get_--incomplete.mdwn view
@@ -4,3 +4,5 @@ `git annex get --incomplete` could do this. (With or without --from to specify which remote to get from.) --[[Joey]]++> [[done]] --[[Joey]]
+ doc/todo/git-annex_in_debian_sid.mdwn view
@@ -0,0 +1,6 @@+git-annex in debian sid is still at version 5.20141125: [https://tracker.debian.org/pkg/git-annex](https://tracker.debian.org/pkg/git-annex)++Any chance that it gets updated soon?++> Let's track this in the Debian bts, it can't be fixed here. [[done]]+> --[[Joey]]
+ doc/todo/git-annex_metadata_extractor_progress_bar.mdwn view
@@ -0,0 +1,7 @@+it can take a significant amount of time for the [[automatic metadata script|tips/automatically_adding_metadata/]] to run on commit. it would be nice to have some progress, otherwise it just looks like the command is hanging.++here it's been processing my photos for more than three hours, and it's probably not even halfway done, according to ps... [[anarcat]]++> Well, I added an echo of each file as it's processed. More complex+> progress could be done, patches accepted. But I suppose a file list is+> good enough; it's good enough for git-annex itself. [[done]] --[[Joey]]
+ doc/todo/git-hook_to_sanity-check_git-annex_branch_pushes.mdwn view
@@ -0,0 +1,41 @@+IA.BAK and another project both need a way to let untrusted clients push+git-annex branch changes to a central server. It's desired to only+let a client make non-malicious pushes; a malicious client could screw+up a lot of info in the branch.++I propose adding a git-annex command that can be used in a git pre-receive+hook to do this. --[[Joey]]++There are two levels of checking it seems such a command could do:++1. Only allow certain files to be changed. For example, maybe clients are only+ expected to change location tracking files, and the activity.log+ file, but not others like trust.log.++2. Only allow modifications of data about a specific UUID. The UUID+ would be provided to the command (and could be determined based on a+ per-client ssh key or etc).++ The changes to the branch would be checked, so this needs centralized+ knowledge about the format of each file on the branch. I think this+ mostly exists already in Logs.hs.++Of these the second seems more likely to be useful, but the first would+be by far the easier to add. So, do both?++This might be too limiting for some situations:++* If someone has 2 clients, that are talking with one-another,+ then a push would include changes involving the UUIDs of both clients.+ The command could be given multiple UUIDs to allow, to allow+ for these kinds of setups.++* A client might add a special remote somewhere, but this would need+ changes to remote.log, which the first level of checking would not allow.+ And, it would add another UUID, which the second level of checking would+ need to be configured to allow.++Python implementation+---------------------++I started doing an implementation of this in Python here. For technical reasons the git repo is not publicly available, but here's a [dump](http://paste.debian.net/232563/) of the code. I went through what seems to be a rather convoluted process with libgit there because I wanted to have some proper unit tests and generating git commands by hand in a shell script is rather painful.Also, it currently adopts a "blocking" approach, ie. it blocks known problems, but maybe it should be based on an "allow" approach, that is: only allow certain things to go through. So far it only forbids removals and changes to trust.log. A bunch of stuff is still missing like parameters (to allow changing the list of protected files) and checking the log tracking info. Feedback welcome. --[[anarcat]]
+ doc/todo/git_annex_grep.mdwn view
@@ -0,0 +1,19 @@+### Please describe the problem.++inability to quickly grep locally present files++### What steps will reproduce the problem?++run "git annex grep"++> i don't understand this request. just running `grep` will grep all the locally present files: sure there will be warnings, but you can use `2>/dev/null` to silence those. as for the suggested solution in comment, that greps for the filenames. please clarify the feature request here or this is [[invalid|done]]. --[[anarcat]]++>> The reason `git grep` exists is partly speed (git objects can+>> sometimes be read more efficiently than traversing the fileststem),+>> and partly the ability to grep a whole tree of source code, but+>> avoid grepping build artifacts, etc. The former reason doesn't apply+>> with git-annex. The latter reason applies somewhat, but it's much less+>> common to want to grep large binary files than it is to want to grep a+>> source tree. `git annex find` can be fed to `grep` when one wants to do+>> that. So I don't see a compelling case to add this to git-annex.+>> --[[Joey]]
+ doc/todo/git_annex_grep/comment_1_890b3ecb679b941f9c0075ed360b203e._comment view
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="CandyAngel"+ subject="comment 1"+ date="2015-06-04T12:31:32Z"+ content="""+You can do this:++ git annex find --in here | grep+"""]]
+ doc/todo/shorten_git-annex_manpage.mdwn view
@@ -0,0 +1,38 @@+the [[git-annex]] manpage is still pretty long. i wonder if work shouldn't be done to shorten it further.++what i'm thinking of is that this entry, for example, takes up three lines where it could take two, reducing the size by 30% since most commands have only one line explaining it:++<pre>+ * undo `[filename|directory] ...`++ Undo last change to a file or directory.++ See [[git-annex-undo]](1) for details.+</pre>++the `git(1)` manpage resolves this by putting the reference in the first line:++<pre>+ git-init(1)+ Create an empty Git repository or reinitialize an existing one.+</pre>++So i would think there are two options here:++1. do like git, but preserving the usage:++<pre>+ * [[git-annex-undo]](1) `[filename|directory]`++ Undo last change to a file or directory.+</pre>++2. Put the reference on the same line:++<pre>+ * undo `[filename|directory] ...`++ Undo last change to a file or directory. See [[git-annex-undo]](1) for details.+</pre>++Opinions? --[[anarcat]]
+ doc/todo/syncthing_special_remote.mdwn view
@@ -0,0 +1,108 @@+Among all possible [[todo/Bittorrent-like_features]] implementations,+i think [Syncthing][] is one of the most interesting ones.++First off, it is already [packaged for Debian][] with an [ITP+underway][]. Second, it seems to use a fairly simple protocol, the+[Block Exchange Protocol][]. It doesn't try to do everything under the+sun and keeps things simple: NAT transversal, reuse TLS primitives and+TCP, etc. It also seems to scale pretty well, if we are to believe the+[usage statistics][].++ [Syncthing]: https://syncthing.net/+ [packaged for Debian]: http://apt.syncthing.net/+ [ITP underway]: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=749887+ [Block Exchange Protocol]: https://github.com/syncthing/specs/blob/master/BEPv1.md+ [usage statistics]: https://data.syncthing.net/++It does require the syncthing daemon to be running in order to+transfer files so it could have similar problems than the+[[special_remotes/ipfs]] remote which is that files get locally copied+between the git-annex repository and the special remote.++Furthermore, one of the main problems with this remote is that [public+shares are not supported][], that is, in order to share with another+remote, both remotes need to explicitely add each other, in syncthing!+That makes pairing a little more difficult that it needs to.++ [public shares are not supported]: https://forum.syncthing.net/t/implementing-public-shares/1186++[[!toc levels=2]]++Possible implementations+========================++I can think of a few different ways of implementing such a remote:++ 1. share the `.git/annex/objects` directory through syncthing+ 2. copy objects to the `~/Sync` directory (or elsewhere)+ 3. interoperate with syncthing through the API+ 4. reimplement the [Block Exchange Protocol][] natively++Sharing the objects+-------------------++This is the easiest, but maybe the most dangerous: start syncthing and+expose the `.git/annex/objects` directory to other peers.++This of course has the downside that syncthing could technically start+destroying objects without git-annex's knowledge, which is really+bad. Hopefully, the readonly permissions on files could keep that from+happening, but it still seems pretty unsafe.++There is a way to mark a folder as "master" which makes it ignore+changes from other nodes, but then that breaks the peer to peer nature+of the protocol, which is hardly what we want. Marking the repo as+untrusted would also be an important requirement here.++Copying objects+---------------++Copying objects is the safest and easiest way to implement this. Add a+new key? You just copy it to the sync directory. Remove a key? Just+remove the file, and syncthing picks up the change.++The main problem with this approach is of course the duplication of+data, doubling the disk usage of all objects stored in the syncthing+remote locally.++There's also the problem that we do not reflect the fact that the+git-annex objects are (potentially) in multiple syncthing remotes, and+thus changing the number of copies. Even worse, once a file is dropped+on one syncthing remote, it gets dropped everywhere. The solution for+this of course is simply treat syncthing as a single copy of the+objects. Note that this also applies to the shared objects method+above.++This can be easily implemented with the [[special_remotes/directory]]+special remote:++ git annex initremote syncthing type=directory directory=$HOME/Sync/ encryption=none+ git annex describe syncthing "default syncthing directory"+ git annex untrust syncthing++Note that the last step isn't necessary if the syncthing folder is+marked as "master".++Communicate with the API+------------------------++Another way would be to talk directly to the [REST API][] (there's+also a separate [event API][] for GUIs). Currently, this doesn't seem+to hold much promise because the APIs are mostly read-only and don't+allow adding objects at all, for example.++ [REST API]: http://docs.syncthing.net/dev/rest.html+ [event API]: http://docs.syncthing.net/dev/events.html++Reimplement the protocol+------------------------++This would involve writing a syncthing client using the+[Block Exchange Protocol][] specification. This would allow more+complete control over the distribution of objects and so on,+respecting git-annex's wanted/required content policies while at the+same time sharing the data with other syncthing endpoints. It would+also allow for tracking the number of copies of the objects and so on.++Of course, this is a major undertaking and probably the hardest+approach, but also the one potentially giving the most benefits.
doc/tuning.mdwn view
@@ -41,6 +41,6 @@ Use just one level of hash directories in the git-annex branch, instead of the default two levels. -Note that git-annex will automatically propigate these setting to+Note that git-annex will automatically propagate these settings to `.git/config` for tuned repositories. You should never directly change these settings in `.git/config`
doc/upgrades.mdwn view
@@ -1,3 +1,15 @@+[[!toc levels=3]]++# Software upgrades++Upgrading the code base of git-annex will be done differently depending on your [[install]] method. For most distribution-based packages, it is handled by the package management software.++For the standalone distribution, the [[git-annex-webapp]](1) will ask the user for confirmation when it detects a new version. Once that is confirmed, or if `annex.autoupgrade` is enabled (see the [[git-annex]](1) manpage) the assistant will start the upgrade. The upgrade process is fairly simple: the assistant will move the `git-annex.linux` directory out of the way and replace it with the new version, then re-execute itself. It therefore needs write access to the parent directory of the `git-annex.linux` directory.++Note that "upgrading" from a distribution-based package to the [[install/Linux_standalone/]] version may cause weird problems, as an unexpected version of git-annex (e.g. the old one from packages) may be ran, see [[bugs/git-annex-shell_doesn__39__t_work_as_expected/]] for a full discussion.++# Repository upgrades+ Occasionally improvements are made to how git-annex stores its data, that require an upgrade process to convert repositories made with an older version to be used by a newer version. It's annoying, it should happen@@ -16,9 +28,9 @@ Upgrading a repository with conflicts is not recommended; resolve the conflicts first before upgrading git-annex. -## Upgrade events, so far+The upgrade events, so far: -### v4 -> v5 (git-annex version 5.x)+## v4 -> v5 (git-annex version 5.x) The upgrade from v4 to v5 is handled automatically, and only affects [[direct mode]] repositories.@@ -26,12 +38,12 @@ This upgrade involves changing direct mode repositories to operate with core.bare=true. -### v3 -> v4 (git-annex version 4.x)+## v3 -> v4 (git-annex version 4.x) v4 was only used for [[direct_mode]], to ensure that a version of git-annex that understands direct mode was used with a direct mode repository. -### v2 -> v3 (git-annex version 3.x)+## v2 -> v3 (git-annex version 3.x) Involved moving the .git-annex/ directory into a separate git-annex branch. @@ -52,7 +64,7 @@ git commit -m "upgrade v2 to v3" git gc -### v1 -> v2 (git-annex version 0.20110316)+## v1 -> v2 (git-annex version 0.20110316) Involved adding hashing to .git/annex/ and changing the names of all keys. Symlinks changed.@@ -94,7 +106,7 @@ git annex upgrade ... -### v0 -> v1 (git-annex version 0.04)+## v0 -> v1 (git-annex version 0.04) Involved a reorganisation of the layout of .git/annex/. Symlinks changed.
+ doc/users/candyangel.mdwn view
@@ -0,0 +1,10 @@+I hang out in #git-annex on OFTC (come and chat/ask for help).++[Getting mentioned by Joey](http://git-annex.branchable.com/devblog/day_277__thanks/) is definitely a (if not **the**) highlight of my involvement in the git-annex community. That really made my month!++Things that I am (or plan to) work on related to git-annex (in some way):+* FUSE filesystem for dynamic get/drop of content+* FUSE filesystem for metadata change/views (like tagsistant)+* Patchset for ikiwiki which allows it to be used with perlbrew libs+* Support for modifying git-annex metadata in my file sorting app+* Support for git-annex in my VR environment
+ doc/users/frederik.mdwn view
@@ -0,0 +1,1 @@+Hi, I am Frederik Vanrenterghem. I use git annex to manage my documents (mainly to have a backup and easy access) and my collection of ripped audio CDs (mainly to be able to save space on my laptop).
git-annex.cabal view
@@ -1,5 +1,5 @@ Name: git-annex-Version: 5.20150528+Version: 5.20150617 Cabal-Version: >= 1.8 License: GPL-3 Maintainer: Joey Hess <id@joeyh.name>@@ -227,9 +227,9 @@ warp (>= 3.0.0.5), warp-tls, wai, wai-extra,- blaze-builder, crypto-api, hamlet, clientsession,+ blaze-builder, crypto-api, clientsession, template-haskell, aeson,- shakespeare+ shakespeare (>= 2.0.0) CPP-Options: -DWITH_WEBAPP if flag(Webapp) && flag (Webapp-secure)
man/git-annex-add.1 view
@@ -37,6 +37,18 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-unlock(1)+.PP+git-annex\-lock(1)+.PP+git-annex\-undo(1)+.PP+git-annex\-import(1)+.PP+git-annex\-unannex(1)+.PP+git-annex\-reinject(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-addunused.1 view
@@ -14,6 +14,10 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-add(1)+.PP+git-annex\-unused(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-addurl.1 view
@@ -51,6 +51,12 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-rmurl(1)+.PP+git-annex\-registerurl(1)+.PP+git-annex\-importfeed(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-assistant.1 view
@@ -9,9 +9,6 @@ Watches for changes to files in the current directory and its subdirectories, and automatically syncs them to other remotes. .PP-For more details about the git-annex assistant, see-<https://git-annex.branchable.com/assistant/>-.PP .SH OPTIONS .IP "\fB\-\-autostart\fP" .IP@@ -36,6 +33,13 @@ .IP .SH SEE ALSO git-annex(1)+.PP+git-annex\-watch(1)+.PP+git-annex\-schedule(1)+.PP+For more details about the git-annex assistant, see+<https://git-annex.branchable.com/assistant/> .PP .SH AUTHOR Joey Hess <id@joeyh.name>
man/git-annex-copy.1 view
@@ -55,6 +55,12 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-get(1)+.PP+git-annex\-move(1)+.PP+git-annex\-drop(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-dead.1 view
@@ -1,19 +1,38 @@ .TH git-annex-dead 1 .SH NAME-git-annex-trust \- hide a lost repository+git-annex-dead \- hide a lost repository or key .PP .SH SYNOPSIS-git annex dead \fB[repository ...]\fP+git annex dead \fB[repository ...] [\-\-key key]\fP .PP .SH DESCRIPTION-Indicates that the repository has been irretrievably lost.-(To undo, use semitrust.)+This command exists to deal with situations where data has been lost,+and you know it has, and you want to stop being reminded of that fact. .PP+When a repository is specified, indicates that the repository has+been irretrievably lost, so it will not be listed in eg, \fBgit annex info\fP. Repositories can be specified using their remote name, their-description, or their UUID.+description, or their UUID. (To undo, use \fBgit-annex semitrust\fP.) .PP+When a key is specified, indicates that the content of that key has been+irretrievably lost. This prevents \fBgit annex fsck \-\-all\fP from complaining+about it. (To undo, add the key's content back to the repository,+by using eg, \fBgit-annex reinject\fP.)+.PP .SH SEE ALSO git-annex(1)+.PP+git-annex\-trust(1)+.PP+git-annex\-semitrust(1)+.PP+git-annex\-untrust(1)+.PP+git-annex\-expire(1)+.PP+git-annex\-fsck(1)+.PP+git-annex\-reinject(1) .PP .SH AUTHOR Joey Hess <id@joeyh.name>
man/git-annex-describe.1 view
@@ -19,6 +19,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-init(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-direct.1 view
@@ -18,6 +18,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-indirect(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-drop.1 view
@@ -16,7 +16,7 @@ .IP "\fB\-\-from=remote\fP" .IP Rather than dropping the content of files in the local repository,-this option can specifiy a remote from which the files'+this option can specify a remote from which the files' contents should be removed. .IP .IP "\fB\-\-auto\fP"@@ -48,6 +48,12 @@ .IP .SH SEE ALSO git-annex(1)+.PP+git-annex\-get(1)+.PP+git-annex\-move(1)+.PP+git-annex\-copy(1) .PP .SH AUTHOR Joey Hess <id@joeyh.name>
man/git-annex-dropunused.1 view
@@ -27,6 +27,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-unused(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-enableremote.1 view
@@ -46,6 +46,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-initremote(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-find.1 view
@@ -51,6 +51,10 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-whereis(1)+.PP+git-annex\-list(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-fix.1 view
@@ -21,6 +21,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-fsck(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-fsck.1 view
@@ -72,6 +72,10 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-repair(1)+.PP+git-annex\-expire(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-get.1 view
@@ -27,6 +27,18 @@ Enables parallel download with up to the specified number of jobs running at once. For example: \fB\-J10\fP .IP+.IP "\fB\-\-incomplete\fP"+Resume any incomplete downloads of files that were started and+interrupted at some point previously. Useful to pick up where you left+off ... when you don't quite remember where that was.+.IP+These incomplete files are the same ones that are+listed as unused temp files by git-annex\-unused(1).+.IP+Note that the git-annex key will be displayed when downloading,+as git-annex does not know the associated file, and the associated file+may not even be in the current git working directory.+.IP .IP "\fB\-\-all\fP" Rather than specifying a filename or path to get, this option can be used to get all available versions of all files.@@ -47,6 +59,10 @@ git-annex(1) .PP git-annex\-drop(1)+.PP+git-annex\-copy(1)+.PP+git-annex\-move(1) .PP .SH AUTHOR Joey Hess <id@joeyh.name>
man/git-annex-group.1 view
@@ -19,6 +19,12 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-ungroup(1)+.PP+git-annex\-preferred\-content(1)+.PP+git-annex\-wanted(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-groupwanted.1 view
@@ -22,6 +22,12 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-group(1)+.PP+git-annex\-wanted(1)+.PP+git-annex\-preferred\-content(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-import.1 view
@@ -65,6 +65,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-add(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-importfeed.1 view
@@ -21,7 +21,7 @@ .SH OPTIONS .IP "\fB\-\-force\fP" .IP-Force downoading items it's seen before.+Force downloading items it's seen before. .IP .IP "\fB\-\-template\fP" Controls where the files are stored.@@ -35,6 +35,8 @@ .IP .SH SEE ALSO git-annex(1)+.PP+git-annex\-addurl(1) .PP .SH AUTHOR Joey Hess <id@joeyh.name>
man/git-annex-indirect.1 view
@@ -16,6 +16,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-direct(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-init.1 view
@@ -17,6 +17,12 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-describe(1)+.PP+git-annex\-reinit(1)+.PP+git\-init(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-initremote.1 view
@@ -46,6 +46,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-enableremote(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-list.1 view
@@ -22,6 +22,10 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-find(1)+.PP+git-annex\-whereis(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-lock.1 view
@@ -18,6 +18,10 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-add(1)+.PP+git-annex\-unlock(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-lookupkey.1 view
@@ -17,7 +17,7 @@ Enable batch mode, in which a line containing the filename is read from stdin, the key is output to stdout (with a trailing newline), and repeat. .IP-Note that is there is no key corresponding to the file, an empty line is+Note that if there is no key corresponding to the file, an empty line is output to stdout instead. .IP .SH SEE ALSO
man/git-annex-merge.1 view
@@ -17,6 +17,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-sync(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-metadata.1 view
@@ -72,6 +72,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-view(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-migrate.1 view
@@ -35,6 +35,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-upgrade(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-mirror.1 view
@@ -15,7 +15,7 @@ when the numcopies setting allows. .PP Note that mirror does not sync the git repository, but only the file-contents.+contents. Use git-annex\-sync(1) for that. .PP .SH OPTIONS .IP "\fB\-\-to=remote\fP"@@ -46,6 +46,8 @@ .IP .SH SEE ALSO git-annex(1)+.PP+git-annex\-sync(1) .PP .SH AUTHOR Joey Hess <id@joeyh.name>
man/git-annex-move.1 view
@@ -41,6 +41,12 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-get(1)+.PP+git-annex\-copy(1)+.PP+git-annex\-drop(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-registerurl.1 view
@@ -22,6 +22,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-addurl(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-reinit.1 view
@@ -18,6 +18,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-init(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-reinject.1 view
@@ -22,6 +22,10 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-add(1)+.PP+git-annex\-fsck(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-repair.1 view
@@ -44,6 +44,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-fsck(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-required.1 view
@@ -7,7 +7,7 @@ .PP .SH DESCRIPTION When run with an expression, configures the content that is required-to be held in the archive. See git-annex\-preferred\-content(1)+to be held in the archive. .PP For example: .PP@@ -16,8 +16,18 @@ Without an expression, displays the current required content setting of the repository. .PP+While git-annex\-wanted is just a preference,+git-annex\-required designates content that should really not be+removed. For example a file that is \fBwanted\fP can be removed with git+annex drop\fB, but if that file is \fPrequired, it would need to be+removed with \fBgit annex drop \-\-force\fP.+.PP .SH SEE ALSO git-annex(1)+.PP+git-annex\-wanted(1)+.PP+git-annex\-preferred\-content(1) .PP .SH AUTHOR Joey Hess <id@joeyh.name>
man/git-annex-rmurl.1 view
@@ -11,6 +11,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-addurl(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-schedule.1 view
@@ -36,6 +36,10 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-assistant(1)+.PP+git-annex\-expire(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-semitrust.1 view
@@ -14,6 +14,14 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-trust(1)+.PP+git-annex\-untrust(1)+.PP+git-annex\-dead(1)+.PP+git-annex\-expire(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-shell.1 view
@@ -33,7 +33,7 @@ This checks if all specified keys are present in the annex, and exits zero if so. .IP-Exits 1 if the key is certianly not present in the annex.+Exits 1 if the key is certainly not present in the annex. Exits 100 if it's unable to tell (perhaps the key is in the process of being removed from the annex). .IP
man/git-annex-status.1 view
@@ -21,6 +21,8 @@ .SH SEE ALSO git-annex(1) .PP+git\-status(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-sync.1 view
@@ -19,6 +19,9 @@ commands to do each of those steps by hand, or if you don't want to worry about the details, you can use sync. .PP+The content of annexed objects is not synced by default, but the \-\-content+option (see below) can make that also be synchronized.+.PP Merge conflicts are automatically handled by sync. When two conflicting versions of a file have been committed, both will be added to the tree, under different filenames. For example, file "foo" would be replaced@@ -30,25 +33,36 @@ by running "git annex sync" on the remote. .PP .SH OPTIONS-.IP "\fB\-\-fast\fP"+.IP "\fB\-\-message=msg\fP" .IP+Use this option to specify a commit message.+.IP+.IP "\fB\-\-fast\fP" Only sync with the remotes with the lowest annex\-cost value configured. .IP .IP "\fB\-\-content\fP" Normally, syncing does not transfer the contents of annexed files.-This option causes the file contents to also be uploaded and downloaded-as necessary. +This option causes the content of files in the work tree+to also be uploaded and downloaded as necessary. .IP-By default, this tries to get each annexed file that the local repository -does not yet have, and then copies each file to every remote that it is-syncing with. This behavior can be overridden by configuring the preferred-content of a repository. See [git-annex\-preferred\-content](1)+By default, this tries to get each annexed file in the work tree+that the local repository does not yet have, and then copies each+file in the work tree to every remote that it is syncing with.+This behavior can be overridden by configuring the preferred content+of a repository. See git-annex\-preferred\-content(1). .IP-.IP "\fB\-\-message=msg\fP"-Use this option to specify a commit message.+.IP "\fB\-\-all\fP"+This option, when combined with \fB\-\-content\fP, makes all available versions+of all files be synced, when preferred content settings allow. .IP+Note that preferred content settings that use \fBinclude=\fP or \fBexclude=\fP+will only match the version of files currently in the work tree, but not+past versions of files.+.IP .SH SEE ALSO git-annex(1)+.PP+git-annex\-preferred\-content(1) .PP .SH AUTHOR Joey Hess <id@joeyh.name>
man/git-annex-trust.1 view
@@ -15,6 +15,12 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-semitrust(1)+.PP+git-annex\-untrust(1)+.PP+git-annex\-dead(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-undo.1 view
@@ -23,6 +23,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-add(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-ungroup.1 view
@@ -11,6 +11,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-group(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-uninit.1 view
@@ -15,6 +15,8 @@ .PP git-annex\-unannex(1) .PP+git-annex\-init(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-unlock.1 view
@@ -21,6 +21,12 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-edit(1)+.PP+git-annex\-add(1)+.PP+git-annex\-lock(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-untrust.1 view
@@ -15,6 +15,12 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-trust(1)+.PP+git-annex\-semitrust(1)+.PP+git-annex\-dead(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-unused.1 view
@@ -58,6 +58,10 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-dropunused(1)+.PP+git-annex\-addunused(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-upgrade.1 view
@@ -22,6 +22,12 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-migrate(1)+.PP+Upgrades procedures and history: <http://git-annex.branchable.com/upgrades>+.PP+News and release notes: <http://git-annex.branchable.com/news/>+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-vadd.1 view
@@ -18,6 +18,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-metadata(1)+.PP git-annex\-view(1) .PP git-annex\-vpop(1)
man/git-annex-vcycle.1 view
@@ -14,6 +14,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-metadata(1)+.PP git-annex\-view(1) .PP git-annex\-vpop(1)
man/git-annex-vfilter.1 view
@@ -12,6 +12,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-metadata(1)+.PP git-annex\-view(1) .PP git-annex\-vpop(1)
man/git-annex-vpop.1 view
@@ -14,6 +14,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-metadata(1)+.PP git-annex\-view(1) .PP git-annex\-vfilter(1)
man/git-annex-wanted.1 view
@@ -19,6 +19,12 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-required(1)+.PP+git-annex\-preferred\-content(1)+.PP+git-annex\-groupwanted(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-watch.1 view
@@ -31,6 +31,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-assistant(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-webapp.1 view
@@ -37,6 +37,8 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-assistant(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex-whereis.1 view
@@ -40,6 +40,10 @@ .SH SEE ALSO git-annex(1) .PP+git-annex\-find(1)+.PP+git-annex\-list(1)+.PP .SH AUTHOR Joey Hess <id@joeyh.name> .PP
man/git-annex.1 view
@@ -206,11 +206,6 @@ .IP See git-annex\-semitrust(1) for details. .IP-.IP "\fBdead [repository ...]\fP"-Indicates that the repository has been irretrievably lost.-.IP-See git-annex\-dead(1) for details.-.IP .IP "\fBgroup repository groupname\fP" Add a repository to a group. .IP@@ -271,6 +266,8 @@ Expires repositories that have not recently performed an activity (such as a fsck). .IP+See git-annex\-expire(1) for details.+.IP .IP "\fBunused\fP" Checks the annex for data that does not correspond to any files present in any tag or branch, and prints a numbered list of the data.@@ -304,6 +301,11 @@ .IP See git-annex\-upgrade(1) for details. .IP+.IP "\fBdead [repository ...] [\-\-key key]\fP"+Indicates that a repository or a single key has been irretrievably lost.+.IP+See git-annex\-dead(1) for details.+.IP .IP "\fBforget\fP" Causes the git-annex branch to be rewritten, throwing away historical data about past locations of files.@@ -429,7 +431,7 @@ .IP "\fBuninit\fP" De\-initialize git-annex and clean out repository. .IP-See git-annex\-unannex(1) for details.+See git-annex\-uninit(1) for details. .IP .IP "\fBreinit uuid|description\fP" Initialize repository, reusing old UUID.@@ -710,19 +712,21 @@ the queue size can speed it up. .IP .IP "\fBannex.bloomcapacity\fP"-The \fBgit annex unused\fP command uses a bloom filter to determine-what data is no longer used. The default bloom filter is sized to handle-up to 500000 keys. If your repository is larger than that,-you can adjust this to avoid \fBgit annex unused\fP not noticing some unused-data files. Increasing this will make \fBgit-annex unused\fP consume more memory;+The \fBgit annex unused\fP and \fBgit annex sync \-\-content\fP commands use+a bloom filter to determine what files are present in eg, the work tree.+The default bloom filter is sized to handle+up to 500000 files. If your repository is larger than that,+you should increase this value. Larger values will+make \fBgit-annex unused\fP and \fBgit annex sync \-\-content\fP consume more memory; run \fBgit annex info\fP for memory usage numbers. .IP .IP "\fBannex.bloomaccuracy\fP" Adjusts the accuracy of the bloom filter used by-\fBgit annex unused\fP. The default accuracy is 1000 \-\--1 unused file out of 1000 will be missed by \fBgit annex unused\fP. Increasing-the accuracy will make \fBgit annex unused\fP consume more memory;-run \fBgit annex info\fP for memory usage numbers.+\fBgit annex unused\fP and \fBgit annex sync \-\-content\fP. +The default accuracy is 10000000 \-\- 1 unused file out of 10000000+will be missed by \fBgit annex unused\fP. Increasing the accuracy will make+\fBgit annex unused\fP consume more memory; run \fBgit annex info\fP+for memory usage numbers. .IP .IP "\fBannex.sshcaching\fP" By default, git-annex caches ssh connections using ssh's
standalone/android/install-haskell-packages view
@@ -107,7 +107,6 @@ patched shakespeare-css patched shakespeare-js patched yesod-routes- patched hamlet patched yesod-core patched yesod-persistent patched yesod-form
standalone/linux/cabal.config view
@@ -1,207 +1,1069 @@-constraints: Crypto ==4.2.5.1,- DAV ==1.0.3,- HTTP ==4000.2.17,- HUnit ==1.2.5.2,- IfElse ==0.85,- MissingH ==1.2.1.0,- MonadRandom ==0.1.13,- QuickCheck ==2.7.6,- SafeSemaphore ==0.10.1,- aeson ==0.7.0.6,- ansi-terminal ==0.6.1.1,- ansi-wl-pprint ==0.6.7.1,- appar ==0.1.4,- asn1-encoding ==0.8.1.3,- asn1-parse ==0.8.1,- asn1-types ==0.2.3,- async ==2.0.1.5,- attoparsec ==0.11.3.4,- attoparsec-conduit ==1.1.0,- authenticate ==1.3.2.10,- base-unicode-symbols ==0.2.2.4,- base16-bytestring ==0.1.1.6,- base64-bytestring ==1.0.0.1,- bifunctors ==4.1.1.1,- bloomfilter ==2.0.0.0,- byteable ==0.1.1,- byteorder ==1.0.4,- case-insensitive ==1.2.0.1,- cereal ==0.4.0.1,- cipher-aes ==0.2.8,- cipher-des ==0.0.6,- cipher-rc4 ==0.1.4,- clientsession ==0.9.0.3,- comonad ==4.2,- conduit ==1.1.6,- conduit-extra ==1.1.3,- connection ==0.2.3,- contravariant ==0.6.1.1,- cookie ==0.4.1.2,- cprng-aes ==0.5.2,- crypto-api ==0.13.2,- crypto-cipher-types ==0.0.9,- crypto-numbers ==0.2.3,- crypto-pubkey ==0.2.4,- crypto-pubkey-types ==0.4.2.2,- crypto-random ==0.0.7,- cryptohash ==0.11.6,- cryptohash-conduit ==0.1.1,- css-text ==0.1.2.1,- shakespeare-text ==1.0.2,- data-default ==0.5.3,- data-default-class ==0.0.1,- data-default-instances-base ==0.0.1,- data-default-instances-containers ==0.0.1,- data-default-instances-dlist ==0.0.1,- data-default-instances-old-locale ==0.0.1,- dataenc ==0.14.0.7,- dbus ==0.10.8,- distributive ==0.4.4,- dlist ==0.7.0.1,- dns ==1.3.0,- edit-distance ==0.2.1.2,- either ==4.3,- email-validate ==1.0.0,- entropy ==0.2.1,- errors ==1.4.7,- exceptions ==0.6.1,- failure ==0.2.0.3,- fast-logger ==2.1.5,- fdo-notify ==0.3.1,- feed ==0.3.9.2,- file-embed ==0.0.6,- fingertree ==0.1.0.0,- free ==4.9,- gnuidn ==0.2,- gnutls ==0.1.4,- gsasl ==0.3.5,- hS3 ==0.5.7,- hamlet ==1.1.9.2,- hashable ==1.2.1.0,- hinotify ==0.3.5,- hjsmin ==0.1.4.7,- hslogger ==1.2.1,- http-client ==0.4.11.1,- http-client-tls ==0.2.2,- http-conduit ==2.1.5,- http-date ==0.0.2,- http-types ==0.8.5,- hxt ==9.3.1.4,- hxt-charproperties ==9.1.1.1,- hxt-regex-xmlschema ==9.0.4,- hxt-unicode ==9.0.2.2,- idna ==0.2,- iproute ==1.2.11,- json ==0.5,- keys ==3.10.1,- language-javascript ==0.5.13,- lens ==4.4.0.2,- libxml-sax ==0.7.5,- mime-mail ==0.4.1.2,- mime-types ==0.1.0.4,- mmorph ==1.0.3,- monad-control ==0.3.2.2,- monad-logger ==0.3.6.1,- monad-loops ==0.4.2.1,- monads-tf ==0.1.0.2,- mtl ==2.1.2,- nats ==0.1.2,- network ==2.4.1.2,- network-conduit ==1.1.0,- network-info ==0.2.0.5,- network-multicast ==0.0.10,- network-protocol-xmpp ==0.4.6,- network-uri ==2.6.0.1,- optparse-applicative ==0.10.0,- parallel ==3.2.0.4,- path-pieces ==0.1.4,- pem ==0.2.2,- persistent ==1.3.3,- persistent-template ==1.3.2.2,- pointed ==4.0,- prelude-extras ==0.4,- profunctors ==4.0.4,- publicsuffixlist ==0.1,- punycode ==2.0,- random ==1.0.1.1,- ranges ==0.2.4,- reducers ==3.10.2.1,- reflection ==1.2.0.1,- regex-base ==0.93.2,- regex-compat ==0.95.1,- regex-posix ==0.95.2,- regex-tdfa ==1.2.0,- resource-pool ==0.2.1.1,- resourcet ==1.1.2.3,- safe ==0.3.8,- securemem ==0.1.3,- semigroupoids ==4.2,- semigroups ==0.15.3,- shakespeare ==1.2.1.1,- shakespeare-css ==1.0.7.4,- shakespeare-i18n ==1.0.0.5,- shakespeare-js ==1.2.0.4,- silently ==1.2.4.1,- simple-sendfile ==0.2.14,- skein ==1.0.9,- socks ==0.5.4,- split ==0.2.2,- stm ==2.4.2,- stm-chans ==3.0.0.2,- streaming-commons ==0.1.4.1,- stringprep ==0.1.5,- stringsearch ==0.3.6.5,- syb ==0.4.0,- system-fileio ==0.3.14,- system-filepath ==0.4.12,- tagged ==0.7.2,- tagsoup ==0.13.1,- tagstream-conduit ==0.5.5.1,- tasty ==0.10,- tasty-hunit ==0.9,- tasty-quickcheck ==0.8.1,- tasty-rerun ==1.1.3,- text ==1.1.1.0,- text-icu ==0.6.3.7,- tf-random ==0.5,- tls ==1.2.9,- transformers ==0.3.0.0,- transformers-base ==0.4.1,- transformers-compat ==0.3.3.3,- unbounded-delays ==0.1.0.8,- unix-compat ==0.4.1.3,- unix-time ==0.2.2,- unordered-containers ==0.2.5.0,- utf8-string ==0.3.7,- uuid ==1.3.3,- vault ==0.3.0.3,- vector ==0.10.0.1,- void ==0.6.1,- wai ==3.0.1.1,- wai-app-static ==3.0.0.1,- wai-extra ==3.0.1.2,- wai-logger ==2.1.1,- warp ==3.0.0.5,- warp-tls ==3.0.0,- word8 ==0.1.1,- x509 ==1.4.11,- x509-store ==1.4.4,- x509-system ==1.4.5,- x509-validation ==1.5.0,- xml ==1.3.13,- xml-conduit ==1.2.1,- xml-hamlet ==0.4.0.9,- xml-types ==0.3.4,- xss-sanitize ==0.3.5.2,- yaml ==0.8.9.3,- yesod ==1.2.6.1,- yesod-auth ==1.3.4.6,- yesod-core ==1.2.20.1,- yesod-default ==1.2.0,- yesod-form ==1.3.16,- yesod-persistent ==1.2.3.1,- yesod-routes ==1.2.0.7,- yesod-static ==1.2.4,- zlib ==0.5.4.1,- bytestring ==0.10.4.0,- scientific ==0.3.3.1+-- Stackage snapshot from: http://www.stackage.org/snapshot/lts-2.10+-- Please place this file next to your .cabal file as cabal.config+-- To only use tested packages, uncomment the following line:+-- remote-repo: stackage-lts-2.10:http://www.stackage.org/snapshot/lts-2.10+constraints: abstract-deque ==0.3,+ abstract-par ==0.3.3,+ accelerate ==0.15.1.0,+ ace ==0.6,+ action-permutations ==0.0.0.1,+ active ==0.1.0.19,+ AC-Vector ==2.3.2,+ ad ==4.2.2,+ adjunctions ==4.2.1,+ aeson ==0.8.0.2,+ aeson-pretty ==0.7.2,+ aeson-qq ==0.7.4,+ aeson-utils ==0.3.0.1,+ alarmclock ==0.2.0.6,+ alex ==3.1.4,+ amazonka ==0.3.4,+ amazonka-autoscaling ==0.3.4,+ amazonka-cloudformation ==0.3.4,+ amazonka-cloudfront ==0.3.4,+ amazonka-cloudhsm ==0.3.4,+ amazonka-cloudsearch ==0.3.4,+ amazonka-cloudsearch-domains ==0.3.4,+ amazonka-cloudtrail ==0.3.4,+ amazonka-cloudwatch ==0.3.4,+ amazonka-cloudwatch-logs ==0.3.4,+ amazonka-codedeploy ==0.3.4,+ amazonka-cognito-identity ==0.3.4,+ amazonka-cognito-sync ==0.3.4,+ amazonka-config ==0.3.4,+ amazonka-core ==0.3.4,+ amazonka-datapipeline ==0.3.4,+ amazonka-directconnect ==0.3.4,+ amazonka-dynamodb ==0.3.4,+ amazonka-ec2 ==0.3.4,+ amazonka-ecs ==0.3.4,+ amazonka-elasticache ==0.3.4,+ amazonka-elasticbeanstalk ==0.3.4,+ amazonka-elastictranscoder ==0.3.4,+ amazonka-elb ==0.3.4,+ amazonka-emr ==0.3.4,+ amazonka-glacier ==0.3.4,+ amazonka-iam ==0.3.4,+ amazonka-importexport ==0.3.4,+ amazonka-kinesis ==0.3.4,+ amazonka-kms ==0.3.4,+ amazonka-lambda ==0.3.4,+ amazonka-opsworks ==0.3.4,+ amazonka-rds ==0.3.4,+ amazonka-redshift ==0.3.4,+ amazonka-route53 ==0.3.4,+ amazonka-route53-domains ==0.3.4,+ amazonka-s3 ==0.3.4,+ amazonka-sdb ==0.3.4,+ amazonka-ses ==0.3.4,+ amazonka-sns ==0.3.4,+ amazonka-sqs ==0.3.4,+ amazonka-ssm ==0.3.4,+ amazonka-storagegateway ==0.3.4,+ amazonka-sts ==0.3.4,+ amazonka-support ==0.3.4,+ amazonka-swf ==0.3.4,+ amqp ==0.12.2,+ ansi-terminal ==0.6.2.1,+ ansi-wl-pprint ==0.6.7.2,+ appar ==0.1.4,+ applicative-quoters ==0.1.0.8,+ approximate ==0.2.1.1,+ arbtt ==0.9.0.2,+ arithmoi ==0.4.1.2,+ array installed,+ arrow-list ==0.7,+ asn1-data ==0.7.1,+ asn1-encoding ==0.9.0,+ asn1-parse ==0.9.1,+ asn1-types ==0.3.0,+ async ==2.0.2,+ atto-lisp ==0.2.2,+ attoparsec ==0.12.1.6,+ attoparsec-enumerator ==0.3.4,+ attoparsec-expr ==0.1.1.2,+ authenticate ==1.3.2.11,+ authenticate-oauth ==1.5.1.1,+ auto-update ==0.1.2.1,+ aws ==0.11.4,+ bake ==0.2,+ bank-holidays-england ==0.1.0.3,+ base installed,+ base16-bytestring ==0.1.1.6,+ base64-bytestring ==1.0.0.1,+ base64-string ==0.2,+ base-compat ==0.6.0,+ base-prelude ==0.1.19,+ base-unicode-symbols ==0.2.2.4,+ basic-prelude ==0.3.13,+ bcrypt ==0.0.6,+ bifunctors ==4.2.1,+ binary installed,+ binary-conduit ==1.2.3,+ binary-list ==1.1.1.0,+ bindings-DSL ==1.0.22,+ bin-package-db installed,+ bioace ==0.0.1,+ bioalign ==0.0.5,+ biocore ==0.3.1,+ biofasta ==0.0.3,+ biofastq ==0.1,+ biophd ==0.0.7,+ biopsl ==0.4,+ biosff ==0.3.7.1,+ bits ==0.4,+ blank-canvas ==0.5,+ BlastHTTP ==1.0.1,+ blastxml ==0.3.2,+ blaze-builder ==0.4.0.1,+ blaze-builder-enumerator ==0.2.1.0,+ blaze-html ==0.8.0.2,+ blaze-markup ==0.7.0.2,+ blaze-svg ==0.3.4.1,+ blaze-textual ==0.2.0.9,+ bloodhound ==0.5.0.1,+ bmp ==1.2.5.2,+ Boolean ==0.2.3,+ boolsimplifier ==0.1.8,+ bound ==1.0.5,+ BoundedChan ==1.0.3.0,+ broadcast-chan ==0.1.0,+ bson ==0.3.1,+ bumper ==0.6.0.3,+ byteable ==0.1.1,+ bytedump ==1.0,+ byteorder ==1.0.4,+ bytes ==0.15,+ bytestring installed,+ bytestring-builder ==0.10.6.0.0,+ bytestring-conversion ==0.3.0,+ bytestring-lexing ==0.4.3.2,+ bytestring-mmap ==0.2.2,+ bytestring-progress ==1.0.5,+ bytestring-trie ==0.2.4.1,+ bzlib ==0.5.0.5,+ bzlib-conduit ==0.2.1.3,+ c2hs ==0.25.2,+ Cabal installed,+ cabal-file-th ==0.2.3,+ Cabal-ide-backend ==1.23.0.0,+ cabal-install ==1.18.1.0,+ cabal-rpm ==0.9.6,+ cabal-src ==0.2.5.1,+ cabal-test-quickcheck ==0.1.4,+ cairo ==0.13.1.0,+ cartel ==0.14.2.6,+ case-insensitive ==1.2.0.4,+ cases ==0.1.2.1,+ cassava ==0.4.2.4,+ cereal ==0.4.1.1,+ cereal-conduit ==0.7.2.3,+ certificate ==1.3.9,+ charset ==0.3.7.1,+ Chart ==1.3.3,+ Chart-diagrams ==1.3.3,+ ChasingBottoms ==1.3.0.12,+ check-email ==1.0,+ checkers ==0.4.3,+ chell ==0.4.0.1,+ chell-quickcheck ==0.2.5,+ chunked-data ==0.1.0.1,+ cipher-aes ==0.2.10,+ cipher-aes128 ==0.6.4,+ cipher-blowfish ==0.0.3,+ cipher-camellia ==0.0.2,+ cipher-des ==0.0.6,+ cipher-rc4 ==0.1.4,+ circle-packing ==0.1.0.4,+ classy-prelude ==0.11.1.1,+ classy-prelude-conduit ==0.11.1,+ classy-prelude-yesod ==0.11.1,+ clay ==0.10.1,+ clientsession ==0.9.1.1,+ clock ==0.4.6.0,+ cmdargs ==0.10.13,+ code-builder ==0.1.3,+ colour ==2.3.3,+ comonad ==4.2.6,+ comonads-fd ==4.0,+ comonad-transformers ==4.0,+ compdata ==0.9,+ compensated ==0.6.1,+ composition ==1.0.1.1,+ compressed ==3.10,+ concatenative ==1.0.1,+ concurrent-extra ==0.7.0.9,+ concurrent-supply ==0.1.7.1,+ cond ==0.4.1.1,+ conduit ==1.2.4.2,+ conduit-combinators ==0.3.1,+ conduit-extra ==1.1.8,+ configurator ==0.3.0.0,+ connection ==0.2.4,+ constraints ==0.4.1.3,+ consul-haskell ==0.1,+ containers installed,+ containers-unicode-symbols ==0.3.1.1,+ contravariant ==1.3.1.1,+ control-monad-free ==0.6.1,+ control-monad-loop ==0.1,+ convertible ==1.1.1.0,+ cookie ==0.4.1.5,+ courier ==0.1.0.15,+ cpphs ==1.19,+ cprng-aes ==0.6.1,+ cpu ==0.1.2,+ criterion ==1.1.0.0,+ crypto-api ==0.13.2,+ crypto-api-tests ==0.3,+ cryptocipher ==0.6.2,+ crypto-cipher-tests ==0.0.11,+ crypto-cipher-types ==0.0.9,+ cryptohash ==0.11.6,+ cryptohash-conduit ==0.1.1,+ cryptohash-cryptoapi ==0.1.3,+ cryptol ==2.2.2,+ crypto-numbers ==0.2.7,+ crypto-pubkey ==0.2.8,+ crypto-pubkey-types ==0.4.3,+ crypto-random ==0.0.9,+ crypto-random-api ==0.2.0,+ css-text ==0.1.2.1,+ csv ==0.1.2,+ csv-conduit ==0.6.6,+ cubicspline ==0.1.1,+ curl ==1.3.8,+ data-accessor ==0.2.2.6,+ data-accessor-mtl ==0.2.0.4,+ data-binary-ieee754 ==0.4.4,+ data-default ==0.5.3,+ data-default-class ==0.0.1,+ data-default-instances-base ==0.0.1,+ data-default-instances-containers ==0.0.1,+ data-default-instances-dlist ==0.0.1,+ data-default-instances-old-locale ==0.0.1,+ data-inttrie ==0.1.0,+ data-lens-light ==0.1.2.1,+ data-memocombinators ==0.5.1,+ data-reify ==0.6.1,+ DAV ==1.0.5,+ Decimal ==0.4.2,+ deepseq installed,+ deepseq-generics ==0.1.1.2,+ derive ==2.5.22,+ descriptive ==0.9.3,+ diagrams ==1.2,+ diagrams-cairo ==1.2.0.7,+ diagrams-canvas ==0.3.0.4,+ diagrams-contrib ==1.1.2.6,+ diagrams-core ==1.2.0.6,+ diagrams-lib ==1.2.0.9,+ diagrams-postscript ==1.1.0.5,+ diagrams-rasterific ==0.1.0.8,+ diagrams-svg ==1.1.0.5,+ Diff ==0.3.2,+ digest ==0.0.1.2,+ digestive-functors ==0.7.1.5,+ dimensional ==0.13.0.2,+ directory installed,+ directory-tree ==0.12.0,+ direct-sqlite ==2.3.15,+ distributed-process ==0.5.3,+ distributed-process-async ==0.2.1,+ distributed-process-client-server ==0.1.2,+ distributed-process-execution ==0.1.1,+ distributed-process-extras ==0.2.0,+ distributed-process-simplelocalnet ==0.2.2.0,+ distributed-process-supervisor ==0.1.2,+ distributed-process-task ==0.1.1,+ distributed-static ==0.3.1.0,+ distributive ==0.4.4,+ djinn-ghc ==0.0.2.3,+ djinn-lib ==0.0.1.2,+ dlist ==0.7.1.1,+ dlist-instances ==0.1,+ doctest ==0.9.13,+ double-conversion ==2.0.1.0,+ DRBG ==0.5.4,+ dual-tree ==0.2.0.6,+ easy-file ==0.2.1,+ ede ==0.2.8.2,+ edit-distance ==0.2.1.3,+ effect-handlers ==0.1.0.6,+ either ==4.3.4,+ elm-core-sources ==1.0.0,+ email-validate ==2.0.1,+ enclosed-exceptions ==1.0.1.1,+ entropy ==0.3.6,+ enumerator ==0.4.20,+ eq ==4.0.4,+ erf ==2.0.0.0,+ errorcall-eq-instance ==0.2.0.1,+ errors ==1.4.7,+ ersatz ==0.3,+ esqueleto ==2.1.3,+ exception-mtl ==0.3.0.5,+ exceptions ==0.8.0.2,+ exception-transformers ==0.3.0.4,+ executable-hash ==0.2.0.0,+ executable-path ==0.0.3,+ extensible-exceptions ==0.1.1.4,+ extra ==1.1,+ fast-logger ==2.3.1,+ fay ==0.23.1.4,+ fay-base ==0.20.0.0,+ fay-builder ==0.2.0.5,+ fay-dom ==0.5.0.1,+ fay-jquery ==0.6.0.3,+ fay-text ==0.3.2.2,+ fay-uri ==0.2.0.0,+ fb ==1.0.10,+ fb-persistent ==0.3.4,+ fclabels ==2.0.2.2,+ FenwickTree ==0.1.2.1,+ fgl ==5.5.1.0,+ file-embed ==0.0.8.2,+ file-location ==0.4.7.1,+ filemanip ==0.3.6.3,+ filepath installed,+ fingertree ==0.1.0.2,+ fixed ==0.2.1.1,+ fixed-list ==0.1.6,+ fixed-vector ==0.7.0.3,+ flexible-defaults ==0.0.1.1,+ flock ==0.3.1.8,+ fmlist ==0.9,+ focus ==0.1.4,+ foldl ==1.0.10,+ FontyFruity ==0.5.1.1,+ force-layout ==0.3.0.11,+ foreign-store ==0.2,+ formatting ==6.2.0,+ free ==4.11,+ freenect ==1.2,+ frisby ==0.2,+ fsnotify ==0.1.0.3,+ fuzzcheck ==0.1.1,+ gd ==3000.7.3,+ generic-aeson ==0.2.0.5,+ generic-deriving ==1.6.3,+ GenericPretty ==1.2.1,+ generics-sop ==0.1.1.2,+ generic-xmlpickler ==0.1.0.2,+ ghc installed,+ ghc-heap-view ==0.5.3,+ ghcid ==0.3.6,+ ghc-mod ==5.2.1.2,+ ghc-mtl ==1.2.1.0,+ ghc-paths ==0.1.0.9,+ ghc-prim installed,+ ghc-syb-utils ==0.2.3,+ gio ==0.13.1.0,+ gipeda ==0.1.0.2,+ git-embed ==0.1.0,+ gitlib ==3.1.0.1,+ gitlib-libgit2 ==3.1.0.4,+ gitlib-test ==3.1.0.2,+ gitrev ==1.0.0,+ gitson ==0.5.1,+ gl ==0.7.7,+ glib ==0.13.1.0,+ Glob ==0.7.5,+ GLURaw ==1.5.0.1,+ GLUT ==2.7.0.1,+ graph-core ==0.2.2.0,+ graphs ==0.6.0.1,+ GraphSCC ==1.0.4,+ graphviz ==2999.17.0.2,+ gravatar ==0.8.0,+ groundhog ==0.7.0.3,+ groundhog-mysql ==0.7.0.1,+ groundhog-postgresql ==0.7.0.2,+ groundhog-sqlite ==0.7.0.1,+ groundhog-th ==0.7.0.1,+ groupoids ==4.0,+ groups ==0.4.0.0,+ gtk ==0.13.6,+ gtk2hs-buildtools ==0.13.0.3,+ gtk3 ==0.13.6,+ hackage-mirror ==0.1.0.0,+ haddock-api ==2.15.0.2,+ haddock-library ==1.1.1,+ hakyll ==4.6.9.0,+ half ==0.2.0.1,+ HandsomeSoup ==0.3.5,+ happstack-server ==7.4.2,+ happy ==1.19.5,+ hashable ==1.2.3.2,+ hashable-extras ==0.2.1,+ hashmap ==1.3.0.1,+ hashtables ==1.2.0.2,+ haskeline installed,+ haskell2010 installed,+ haskell98 installed,+ haskell-lexer ==1.0,+ haskell-names ==0.5.2,+ HaskellNet ==0.4.4,+ haskell-packages ==0.2.4.4,+ haskell-src ==1.0.2.0,+ haskell-src-exts ==1.16.0.1,+ haskell-src-meta ==0.6.0.9,+ haskintex ==0.5.0.3,+ hasql ==0.7.3.1,+ hasql-backend ==0.4.1,+ hasql-postgres ==0.10.3.1,+ hastache ==0.6.1,+ HaTeX ==3.16.1.1,+ HaXml ==1.25.3,+ haxr ==3000.10.4.2,+ HCodecs ==0.5,+ hdaemonize ==0.5.0.0,+ hdevtools ==0.1.0.8,+ hdocs ==0.4.1.3,+ heap ==1.0.2,+ heaps ==0.3.2.1,+ hebrew-time ==0.1.1,+ heist ==0.14.1,+ here ==1.2.7,+ heredoc ==0.2.0.0,+ hexpat ==0.20.9,+ hflags ==0.4,+ highlighting-kate ==0.5.12,+ hindent ==4.4.2,+ hinotify ==0.3.7,+ hint ==0.4.2.3,+ histogram-fill ==0.8.4.1,+ hit ==0.6.3,+ hjsmin ==0.1.4.7,+ hledger ==0.24.1,+ hledger-lib ==0.24.1,+ hledger-web ==0.24.1,+ hlibgit2 ==0.18.0.14,+ hlint ==1.9.20,+ hmatrix ==0.16.1.5,+ hmatrix-gsl ==0.16.0.3,+ hmatrix-gsl-stats ==0.2.1,+ hmatrix-repa ==0.1.2.1,+ hoauth2 ==0.4.7,+ holy-project ==0.1.1.1,+ hoogle ==4.2.41,+ hoopl installed,+ hOpenPGP ==2.0,+ hopenpgp-tools ==0.14.1,+ hostname ==1.0,+ hostname-validate ==1.0.0,+ hourglass ==0.2.9,+ hpc installed,+ hpc-coveralls ==0.9.0,+ hPDB ==1.2.0.3,+ hPDB-examples ==1.2.0.2,+ hs-bibutils ==5.5,+ hscolour ==1.22,+ hsdev ==0.1.3.4,+ hse-cpp ==0.1,+ hsignal ==0.2.7,+ hslogger ==1.2.9,+ hslua ==0.3.13,+ HsOpenSSL ==0.11.1.1,+ hspec ==2.1.7,+ hspec-attoparsec ==0.1.0.2,+ hspec-core ==2.1.7,+ hspec-discover ==2.1.7,+ hspec-expectations ==0.6.1.1,+ hspec-meta ==2.1.7,+ hspec-smallcheck ==0.3.0,+ hspec-wai ==0.6.3,+ hspec-wai-json ==0.6.0,+ hstatistics ==0.2.5.2,+ HStringTemplate ==0.8.3,+ hsyslog ==2.0,+ HTF ==0.12.2.4,+ html ==1.0.1.2,+ html-conduit ==1.1.1.2,+ HTTP ==4000.2.19,+ http-client ==0.4.11.2,+ http-client-openssl ==0.2.0.1,+ http-client-tls ==0.2.2,+ http-conduit ==2.1.5,+ http-date ==0.0.6.1,+ http-media ==0.6.2,+ http-reverse-proxy ==0.4.2,+ http-types ==0.8.6,+ HUnit ==1.2.5.2,+ hweblib ==0.6.3,+ hxt ==9.3.1.15,+ hxt-charproperties ==9.2.0.1,+ hxt-curl ==9.1.1.1,+ hxt-expat ==9.1.1,+ hxt-http ==9.1.5.2,+ hxt-pickle-utils ==0.1.0.3,+ hxt-regex-xmlschema ==9.2.0.2,+ hxt-relaxng ==9.1.5.5,+ hxt-tagsoup ==9.1.3,+ hxt-unicode ==9.0.2.4,+ hybrid-vectors ==0.1.2.1,+ hyphenation ==0.4.2.1,+ iconv ==0.4.1.2,+ ide-backend ==0.9.0.9,+ ide-backend-common ==0.9.1.1,+ ide-backend-rts ==0.1.3.1,+ idna ==0.3.0,+ ieee754 ==0.7.6,+ IfElse ==0.85,+ imagesize-conduit ==1.1,+ immortal ==0.2,+ include-file ==0.1.0.2,+ incremental-parser ==0.2.3.4,+ indents ==0.3.3,+ ini ==0.3.1,+ integer-gmp installed,+ integration ==0.2.1,+ interpolate ==0.1.0,+ interpolatedstring-perl6 ==0.9.0,+ intervals ==0.7.1,+ io-choice ==0.0.5,+ io-manager ==0.1.0.2,+ io-memoize ==1.1.1.0,+ iproute ==1.3.2,+ iterable ==3.0,+ ixset ==1.0.6,+ jmacro ==0.6.12,+ jmacro-rpc ==0.3.2,+ jmacro-rpc-happstack ==0.3.2,+ jmacro-rpc-snap ==0.3,+ jose-jwt ==0.4.2,+ js-flot ==0.8.3,+ js-jquery ==1.11.3,+ json ==0.9.1,+ json-autotype ==0.2.5.13,+ json-schema ==0.7.3.5,+ JuicyPixels ==3.2.4,+ JuicyPixels-repa ==0.7,+ kan-extensions ==4.2.2,+ kansas-comet ==0.3.1,+ kdt ==0.2.3,+ keter ==1.3.10.1,+ keys ==3.10.2,+ kmeans ==0.1.3,+ koofr-client ==1.0.0.3,+ kure ==2.16.10,+ language-c ==0.4.7,+ language-c-quote ==0.10.2.1,+ language-ecmascript ==0.17,+ language-glsl ==0.1.1,+ language-haskell-extract ==0.2.4,+ language-java ==0.2.7,+ language-javascript ==0.5.13.3,+ lattices ==1.2.1.1,+ lazy-csv ==0.5,+ lca ==0.3,+ lens ==4.7.0.1,+ lens-action ==0.1.0.1,+ lens-aeson ==1.0.0.4,+ lens-family-core ==1.2.0,+ lens-family-th ==0.4.1.0,+ lhs2tex ==1.19,+ libgit ==0.3.1,+ libnotify ==0.1.1.0,+ lifted-async ==0.7.0.1,+ lifted-base ==0.2.3.6,+ linear ==1.18.1.1,+ linear-accelerate ==0.2,+ List ==0.5.2,+ ListLike ==4.2.0,+ list-t ==0.4.5.1,+ loch-th ==0.2.1,+ log-domain ==0.10.0.1,+ logict ==0.6.0.2,+ loop ==0.2.0,+ lrucache ==1.2.0.0,+ lucid ==2.9.2,+ lucid-svg ==0.4.0.4,+ lzma-conduit ==1.1.3,+ machines ==0.4.1,+ machines-directory ==0.2.0.6,+ machines-io ==0.2.0.6,+ machines-process ==0.2.0.4,+ mainland-pretty ==0.2.7.2,+ managed ==1.0.0,+ mandrill ==0.2.2.0,+ map-syntax ==0.2,+ markdown ==0.1.13.2,+ markdown-unlit ==0.2.0.1,+ math-functions ==0.1.5.2,+ matrix ==0.3.4.3,+ maximal-cliques ==0.1.1,+ MaybeT ==0.1.2,+ mbox ==0.3.1,+ MemoTrie ==0.6.2,+ mersenne-random-pure64 ==0.2.0.4,+ messagepack ==0.3.0,+ messagepack-rpc ==0.1.0.3,+ MFlow ==0.4.5.9,+ mime-mail ==0.4.8.2,+ mime-mail-ses ==0.3.2.2,+ mime-types ==0.1.0.6,+ missing-foreign ==0.1.1,+ MissingH ==1.3.0.1,+ mmap ==0.5.9,+ mmorph ==1.0.4,+ MonadCatchIO-transformers ==0.3.1.3,+ monad-control ==1.0.0.4,+ monad-coroutine ==0.9.0.1,+ monadcryptorandom ==0.6.1,+ monadic-arrays ==0.2.1.4,+ monad-journal ==0.7,+ monadLib ==3.7.3,+ monadloc ==0.7.1,+ monad-logger ==0.3.13.1,+ monad-logger-json ==0.1.0.0,+ monad-logger-syslog ==0.1.1.1,+ monad-loops ==0.4.2.1,+ monad-par ==0.3.4.7,+ monad-parallel ==0.7.1.4,+ monad-par-extras ==0.3.3,+ monad-primitive ==0.1,+ monad-products ==4.0.0.1,+ MonadPrompt ==1.0.0.5,+ MonadRandom ==0.3.0.2,+ monad-st ==0.2.4,+ monads-tf ==0.1.0.2,+ mongoDB ==2.0.5,+ monoid-extras ==0.3.3.5,+ monoid-subclasses ==0.4.0.4,+ mono-traversable ==0.9.1,+ mtl ==2.1.3.1,+ mtl-compat ==0.2.1.1,+ mtlparse ==0.1.4.0,+ mtl-prelude ==1.0.3,+ multiarg ==0.30.0.8,+ multimap ==1.2.1,+ multipart ==0.1.2,+ MusicBrainz ==0.2.4,+ mutable-containers ==0.3.0,+ mwc-random ==0.13.3.2,+ mysql ==0.1.1.8,+ mysql-simple ==0.2.2.5,+ nanospec ==0.2.1,+ nats ==1,+ neat-interpolation ==0.2.2.1,+ nettle ==0.1.0,+ network ==2.6.1.0,+ network-anonymous-i2p ==0.10.0,+ network-attoparsec ==0.12.2,+ network-conduit ==1.1.0,+ network-conduit-tls ==1.1.2,+ network-info ==0.2.0.5,+ network-multicast ==0.0.11,+ network-simple ==0.4.0.4,+ network-transport ==0.4.1.0,+ network-transport-tcp ==0.4.1,+ network-transport-tests ==0.2.2.0,+ network-uri ==2.6.0.3,+ newtype ==0.2,+ nsis ==0.2.5,+ numbers ==3000.2.0.1,+ numeric-extras ==0.0.3,+ NumInstances ==1.4,+ numtype ==1.1,+ ObjectName ==1.1.0.0,+ Octree ==0.5.4.2,+ old-locale installed,+ old-time installed,+ OneTuple ==0.2.1,+ opaleye ==0.3.1.2,+ OpenGL ==2.12.0.1,+ OpenGLRaw ==2.4.1.0,+ openpgp-asciiarmor ==0.1,+ operational ==0.2.3.2,+ options ==1.2.1.1,+ optparse-applicative ==0.11.0.2,+ optparse-simple ==0.0.2,+ osdkeys ==0.0,+ pagerduty ==0.0.3.1,+ palette ==0.1.0.2,+ pandoc ==1.13.2.1,+ pandoc-citeproc ==0.6.0.1,+ pandoc-types ==1.12.4.2,+ pango ==0.13.1.0,+ parallel ==3.2.0.6,+ parallel-io ==0.3.3,+ parseargs ==0.1.5.2,+ parsec ==3.1.9,+ parsers ==0.12.2.1,+ partial-handler ==0.1.1,+ path-pieces ==0.2.0,+ patience ==0.1.1,+ pcre-heavy ==0.2.2,+ pcre-light ==0.4.0.3,+ pdfinfo ==1.5.4,+ pem ==0.2.2,+ persistent ==2.1.5,+ persistent-mongoDB ==2.1.2.2,+ persistent-mysql ==2.1.3.1,+ persistent-postgresql ==2.1.5.3,+ persistent-sqlite ==2.1.4.2,+ persistent-template ==2.1.3.1,+ phantom-state ==0.2.0.2,+ picoparsec ==0.1.2.2,+ pipes ==4.1.5,+ pipes-aeson ==0.4.1.3,+ pipes-attoparsec ==0.5.1.2,+ pipes-binary ==0.4.0.4,+ pipes-bytestring ==2.1.1,+ pipes-concurrency ==2.0.3,+ pipes-group ==1.0.2,+ pipes-network ==0.6.4,+ pipes-parse ==3.0.2,+ pipes-safe ==2.2.2,+ placeholders ==0.1,+ plot ==0.2.3.4,+ plot-gtk ==0.2.0.2,+ plot-gtk3 ==0.1,+ pointed ==4.2.0.2,+ polyparse ==1.11,+ postgresql-binary ==0.5.2.1,+ postgresql-libpq ==0.9.0.2,+ postgresql-simple ==0.4.10.0,+ post-mess-age ==0.1.0.0,+ prednote ==0.32.0.6,+ prefix-units ==0.1.0.2,+ prelude-extras ==0.4,+ presburger ==1.3.1,+ present ==2.2,+ pretty installed,+ prettyclass ==1.0.0.0,+ pretty-class ==1.0.1.1,+ pretty-show ==1.6.8.2,+ primes ==0.2.1.0,+ primitive ==0.6,+ process installed,+ process-extras ==0.3.3.4,+ product-profunctors ==0.6.1,+ profunctor-extras ==4.0,+ profunctors ==4.4.1,+ project-template ==0.1.4.2,+ PSQueue ==1.1,+ publicsuffixlist ==0.1,+ punycode ==2.0,+ pure-io ==0.2.1,+ pureMD5 ==2.1.2.1,+ pwstore-fast ==2.4.4,+ quandl-api ==0.2.1.0,+ QuasiText ==0.1.2.5,+ QuickCheck ==2.7.6,+ quickcheck-assertions ==0.2.0,+ quickcheck-instances ==0.3.11,+ quickcheck-io ==0.1.1,+ quickcheck-unicode ==1.0.0.1,+ rainbow ==0.22.0.2,+ random ==1.1,+ random-fu ==0.2.6.2,+ random-shuffle ==0.0.4,+ random-source ==0.3.0.6,+ rank1dynamic ==0.2.0.1,+ Rasterific ==0.5.2.1,+ rasterific-svg ==0.1.0.3,+ raw-strings-qq ==1.0.2,+ ReadArgs ==1.2.2,+ reducers ==3.10.3.1,+ reflection ==1.5.2.1,+ RefSerialize ==0.3.1.4,+ regex-applicative ==0.3.1,+ regex-base ==0.93.2,+ regex-compat ==0.95.1,+ regex-pcre-builtin ==0.94.4.8.8.35,+ regex-posix ==0.95.2,+ regexpr ==0.5.4,+ regex-tdfa ==1.2.0,+ regex-tdfa-rc ==1.1.8.3,+ regular ==0.3.4.4,+ regular-xmlpickler ==0.2,+ rematch ==0.2.0.0,+ repa ==3.3.1.2,+ repa-algorithms ==3.3.1.2,+ repa-devil ==0.3.2.6,+ repa-io ==3.3.1.2,+ reroute ==0.2.3.0,+ resource-pool ==0.2.3.2,+ resourcet ==1.1.5,+ rest-client ==0.5.0.3,+ rest-core ==0.35.1,+ rest-gen ==0.17.0.4,+ rest-happstack ==0.2.10.8,+ rest-snap ==0.1.17.18,+ rest-stringmap ==0.2.0.4,+ rest-types ==1.13.1,+ rest-wai ==0.1.0.8,+ rethinkdb-client-driver ==0.0.18,+ retry ==0.6,+ rev-state ==0.1,+ rfc5051 ==0.1.0.3,+ RSA ==2.1.0.1,+ rts installed,+ runmemo ==1.0.0.1,+ rvar ==0.2.0.2,+ safe ==0.3.9,+ safecopy ==0.8.5,+ sbv ==4.2,+ scientific ==0.3.3.8,+ scotty ==0.9.1,+ scrobble ==0.2.1.1,+ sdl2 ==1.3.1,+ securemem ==0.1.7,+ semigroupoid-extras ==4.0,+ semigroupoids ==4.3,+ semigroups ==0.16.2.2,+ semver ==0.3.3.1,+ sendfile ==0.7.9,+ seqloc ==0.6.1.1,+ servant ==0.2.2,+ servant-client ==0.2.2,+ servant-docs ==0.3.1,+ servant-jquery ==0.2.2.1,+ servant-server ==0.2.4,+ setenv ==0.1.1.3,+ set-monad ==0.2.0.0,+ SHA ==1.6.4.2,+ shake ==0.15.2,+ shake-language-c ==0.6.4,+ shakespeare ==2.0.5,+ shakespeare-text ==1.1.0,+ shell-conduit ==4.5.2,+ shelltestrunner ==1.3.5,+ shelly ==1.6.1.2,+ silently ==1.2.4.1,+ simple-reflect ==0.3.2,+ simple-sendfile ==0.2.20,+ singletons ==1.1.2,+ siphash ==1.0.3,+ skein ==1.0.9.3,+ slave-thread ==0.1.6,+ smallcheck ==1.1.1,+ smoothie ==0.1.3,+ smtLib ==1.0.7,+ snap ==0.14.0.4,+ snap-core ==0.9.7.0,+ snaplet-fay ==0.3.3.11,+ snap-server ==0.9.5.1,+ snowflake ==0.1.1.1,+ soap ==0.2.2.5,+ soap-openssl ==0.1.0.2,+ soap-tls ==0.1.1.2,+ socks ==0.5.4,+ sodium ==0.11.0.3,+ sourcemap ==0.1.3.0,+ speculation ==1.5.0.2,+ sphinx ==0.6.0.1,+ split ==0.2.2,+ Spock ==0.7.9.0,+ Spock-digestive ==0.1.0.0,+ Spock-worker ==0.2.1.3,+ spoon ==0.3.1,+ sqlite-simple ==0.4.8.0,+ srcloc ==0.4.1,+ stackage ==0.7.2.0,+ stackage-build-plan ==0.1.1.0,+ stackage-cli ==0.1.0.2,+ stackage-curator ==0.7.4,+ stackage-install ==0.1.1.1,+ stackage-types ==1.0.1.1,+ stackage-update ==0.1.2,+ stackage-upload ==0.1.0.5,+ stateref ==0.3,+ statestack ==0.2.0.4,+ StateVar ==1.1.0.0,+ statistics ==0.13.2.3,+ statistics-linreg ==0.3,+ stm ==2.4.4,+ stm-chans ==3.0.0.3,+ stm-conduit ==2.5.4,+ stm-containers ==0.2.9,+ stm-stats ==0.2.0.0,+ storable-complex ==0.2.2,+ storable-endian ==0.2.5,+ streaming-commons ==0.1.12.1,+ streams ==3.2,+ strict ==0.3.2,+ stringable ==0.1.3,+ stringbuilder ==0.5.0,+ string-conversions ==0.3.0.3,+ stringprep ==1.0.0,+ stringsearch ==0.3.6.6,+ stylish-haskell ==0.5.13.0,+ SVGFonts ==1.4.0.3,+ svg-tree ==0.1.1,+ syb ==0.4.4,+ syb-with-class ==0.6.1.5,+ symbol ==0.2.4,+ system-canonicalpath ==0.3.2.0,+ system-fileio ==0.3.16.3,+ system-filepath ==0.4.13.4,+ system-posix-redirect ==1.1.0.1,+ tabular ==0.2.2.7,+ tagged ==0.7.3,+ tagshare ==0.0,+ tagsoup ==0.13.3,+ tagstream-conduit ==0.5.5.3,+ tar ==0.4.1.0,+ tardis ==0.3.0.0,+ tasty ==0.10.1.2,+ tasty-ant-xml ==1.0.1,+ tasty-golden ==2.3.0.1,+ tasty-hunit ==0.9.2,+ tasty-kat ==0.0.3,+ tasty-quickcheck ==0.8.3.2,+ tasty-smallcheck ==0.8.0.1,+ tasty-th ==0.1.3,+ TCache ==0.12.0,+ template-haskell installed,+ temporary ==1.2.0.3,+ temporary-rc ==1.2.0.3,+ terminal-progress-bar ==0.0.1.4,+ terminal-size ==0.3.0,+ terminfo installed,+ test-framework ==0.8.1.1,+ test-framework-hunit ==0.3.0.1,+ test-framework-quickcheck2 ==0.3.0.3,+ test-framework-th ==0.2.4,+ testing-feat ==0.4.0.2,+ testpack ==2.1.3.0,+ texmath ==0.8.2,+ text ==1.2.0.6,+ text-binary ==0.1.0,+ text-format ==0.3.1.1,+ text-icu ==0.7.0.1,+ text-manipulate ==0.1.3.1,+ tf-random ==0.5,+ th-desugar ==1.5.3,+ th-expand-syns ==0.3.0.6,+ th-extras ==0.0.0.2,+ th-lift ==0.7.2,+ th-orphans ==0.11.1,+ threads ==0.5.1.3,+ th-reify-many ==0.1.3,+ thyme ==0.3.5.5,+ time installed,+ time-compat ==0.1.0.3,+ time-lens ==0.4.0.1,+ time-locale-compat ==0.1.0.1,+ timezone-olson ==0.1.7,+ timezone-series ==0.1.5.1,+ tls ==1.2.17,+ tls-debug ==0.3.4,+ tostring ==0.2.1.1,+ transformers installed,+ transformers-base ==0.4.4,+ transformers-compat ==0.4.0.3,+ traverse-with-class ==0.2.0.3,+ tree-view ==0.4,+ trifecta ==1.5.1.3,+ tttool ==1.3,+ tuple ==0.3.0.2,+ turtle ==1.0.2,+ type-eq ==0.5,+ type-list ==0.0.0.1,+ udbus ==0.2.1,+ unbounded-delays ==0.1.0.9,+ unbound-generics ==0.1.2.1,+ union-find ==0.2,+ uniplate ==1.6.12,+ unix installed,+ unix-compat ==0.4.1.4,+ unix-time ==0.3.5,+ unordered-containers ==0.2.5.1,+ uri-encode ==1.5.0.4,+ url ==2.1.3,+ users ==0.1.0.0,+ users-postgresql-simple ==0.1.0.1,+ users-test ==0.1.0.0,+ utf8-light ==0.4.2,+ utf8-string ==1,+ uuid ==1.3.10,+ uuid-types ==1.0.1,+ vault ==0.3.0.4,+ vector ==0.10.12.3,+ vector-algorithms ==0.6.0.4,+ vector-binary-instances ==0.2.1.0,+ vector-buffer ==0.4.1,+ vector-instances ==3.3.0.1,+ vector-space ==0.9,+ vector-space-points ==0.2.1.1,+ vector-th-unbox ==0.2.1.2,+ vhd ==0.2.2,+ void ==0.7,+ wai ==3.0.2.3,+ wai-app-static ==3.0.1.1,+ wai-conduit ==3.0.0.2,+ wai-eventsource ==3.0.0,+ wai-extra ==3.0.7.1,+ wai-handler-launch ==3.0.0.3,+ wai-logger ==2.2.4,+ wai-middleware-consul ==0.1.0.2,+ wai-middleware-static ==0.6.0.1,+ waitra ==0.0.3.0,+ wai-websockets ==3.0.0.5,+ warp ==3.0.13.1,+ warp-tls ==3.0.3,+ webdriver ==0.6.1,+ web-fpco ==0.1.1.0,+ websockets ==0.9.4.0,+ wizards ==1.0.2,+ wl-pprint ==1.1,+ wl-pprint-extras ==3.5.0.4,+ wl-pprint-terminfo ==3.7.1.3,+ wl-pprint-text ==1.1.0.4,+ word8 ==0.1.2,+ wordpass ==1.0.0.3,+ Workflow ==0.8.3,+ wrap ==0.0.0,+ wreq ==0.3.0.1,+ X11 ==1.6.1.2,+ x509 ==1.5.0.1,+ x509-store ==1.5.0,+ x509-system ==1.5.0,+ x509-validation ==1.5.2,+ xenstore ==0.1.1,+ xhtml installed,+ xml ==1.3.14,+ xml-conduit ==1.2.6,+ xml-conduit-writer ==0.1.1.1,+ xmlgen ==0.6.2.1,+ xml-hamlet ==0.4.0.11,+ xmlhtml ==0.2.3.4,+ xml-to-json ==2.0.1,+ xml-to-json-fast ==2.0.0,+ xml-types ==0.3.4,+ xss-sanitize ==0.3.5.5,+ yackage ==0.7.0.8,+ yaml ==0.8.11,+ Yampa ==0.9.7,+ YampaSynth ==0.2,+ yarr ==1.3.3.3,+ yesod ==1.4.1.5,+ yesod-auth ==1.4.5,+ yesod-auth-deskcom ==1.4.0,+ yesod-auth-fb ==1.6.6,+ yesod-auth-hashdb ==1.4.2.1,+ yesod-auth-oauth ==1.4.0.2,+ yesod-auth-oauth2 ==0.0.12,+ yesod-bin ==1.4.9.2,+ yesod-core ==1.4.9.1,+ yesod-eventsource ==1.4.0.1,+ yesod-fay ==0.7.1,+ yesod-fb ==0.3.4,+ yesod-form ==1.4.4.1,+ yesod-gitrepo ==0.1.1.0,+ yesod-newsfeed ==1.4.0.1,+ yesod-persistent ==1.4.0.2,+ yesod-sitemap ==1.4.0.1,+ yesod-static ==1.4.0.4,+ yesod-test ==1.4.3.1,+ yesod-text-markdown ==0.1.7,+ yesod-websockets ==0.2.1.1,+ zeromq4-haskell ==0.6.3,+ zip-archive ==0.2.3.7,+ zlib ==0.5.4.2,+ zlib-bindings ==0.1.1.5,+ zlib-enum ==0.2.3.1,+ zlib-lens ==0.1.2
standalone/linux/install-haskell-packages view
@@ -1,7 +1,7 @@ #!/bin/bash # Bootstraps from an empty cabal (plus apt-get build-dep git-annex)-# to all the necessary haskell packages being installed, with the-# necessary patches to work on architectures that lack template haskell.+# to all the necessary haskell packages being installed.+# Some packages are patched for wider portability. # # The cabal.config is used to pin the haskell packages to the last # versions that have been gotten working. To update, delete the@@ -58,8 +58,6 @@ installgitannexdeps () { pushd ../.. ln -sf standalone/linux/cabal.config- echo "cabal install QuickCheck -f-templateHaskell"- cabal install -j1 QuickCheck -f-templateHaskell echo cabal install --only-dependencies "$@" cabal install -j1 --only-dependencies "$@" rm -f cabal.config@@ -72,31 +70,6 @@ cd tmp patched network- patched wai-app-static- patched vector- patched aeson- patched shakespeare- patched yesod-routes- patched monad-logger- patched skein- patched shakespeare-js- patched hamlet- patched yesod-core- patched persistent- patched persistent-template- patched file-embed- patched process-conduit- patched yesod-static- patched yesod-persistent- patched yesod-form- patched yesod-auth- patched yesod- patched generic-deriving- patched profunctors- patched reflection- patched lens- patched xml-hamlet- patched DAV cd ..
− standalone/no-th/haskell-patches/hamlet_hack_TH.patch
@@ -1,205 +0,0 @@-From 0509d4383c328c20be61cf3e3bbc98a0a1161588 Mon Sep 17 00:00:00 2001-From: dummy <dummy@example.com>-Date: Thu, 16 Oct 2014 02:21:17 +0000-Subject: [PATCH] hack TH------ Text/Hamlet.hs | 86 +++++++++++++++++------------------------------------ Text/Hamlet/Parse.hs | 3 +-- 2 files changed, 29 insertions(+), 60 deletions(-)--diff --git a/Text/Hamlet.hs b/Text/Hamlet.hs-index 9500ecb..ec8471a 100644---- a/Text/Hamlet.hs-+++ b/Text/Hamlet.hs-@@ -11,36 +11,36 @@- module Text.Hamlet- ( -- * Plain HTML- Html-- , shamlet-- , shamletFile-- , xshamlet-- , xshamletFile-+ --, shamlet-+ --, shamletFile-+ --, xshamlet-+ --, xshamletFile- -- * Hamlet- , HtmlUrl-- , hamlet-- , hamletFile-- , hamletFileReload-- , ihamletFileReload-- , xhamlet-- , xhamletFile-+ --, hamlet-+ --, hamletFile-+ --, hamletFileReload-+ --, ihamletFileReload-+ --, xhamlet-+ --, xhamletFile- -- * I18N Hamlet- , HtmlUrlI18n-- , ihamlet-- , ihamletFile-+ --, ihamlet-+ --, ihamletFile- -- * Type classes- , ToAttributes (..)- -- * Internal, for making more- , HamletSettings (..)- , NewlineStyle (..)-- , hamletWithSettings-- , hamletFileWithSettings-+ --, hamletWithSettings-+ --, hamletFileWithSettings- , defaultHamletSettings- , xhtmlHamletSettings-- , Env (..)-- , HamletRules (..)-- , hamletRules-- , ihamletRules-- , htmlRules-+ --, Env (..)-+ --, HamletRules (..)-+ --, hamletRules-+ --, ihamletRules-+ --, htmlRules- , CloseStyle (..)- -- * Used by generated code- , condH-@@ -110,47 +110,9 @@ type HtmlUrl url = Render url -> Html- -- | A function generating an 'Html' given a message translator and a URL rendering function.- type HtmlUrlI18n msg url = Translate msg -> Render url -> Html- --docsToExp :: Env -> HamletRules -> Scope -> [Doc] -> Q Exp--docsToExp env hr scope docs = do-- exps <- mapM (docToExp env hr scope) docs-- case exps of-- [] -> [|return ()|]-- [x] -> return x-- _ -> return $ DoE $ map NoBindS exps--- unIdent :: Ident -> String- unIdent (Ident s) = s- --bindingPattern :: Binding -> Q (Pat, [(Ident, Exp)])--bindingPattern (BindAs i@(Ident s) b) = do-- name <- newName s-- (pattern, scope) <- bindingPattern b-- return (AsP name pattern, (i, VarE name):scope)--bindingPattern (BindVar i@(Ident s))-- | all isDigit s = do-- return (LitP $ IntegerL $ read s, [])-- | otherwise = do-- name <- newName s-- return (VarP name, [(i, VarE name)])--bindingPattern (BindTuple is) = do-- (patterns, scopes) <- fmap unzip $ mapM bindingPattern is-- return (TupP patterns, concat scopes)--bindingPattern (BindList is) = do-- (patterns, scopes) <- fmap unzip $ mapM bindingPattern is-- return (ListP patterns, concat scopes)--bindingPattern (BindConstr con is) = do-- (patterns, scopes) <- fmap unzip $ mapM bindingPattern is-- return (ConP (mkConName con) patterns, concat scopes)--bindingPattern (BindRecord con fields wild) = do-- let f (Ident field,b) =-- do (p,s) <- bindingPattern b-- return ((mkName field,p),s)-- (patterns, scopes) <- fmap unzip $ mapM f fields-- (patterns1, scopes1) <- if wild-- then bindWildFields con $ map fst fields-- else return ([],[])-- return (RecP (mkConName con) (patterns++patterns1), concat scopes ++ scopes1)--- mkConName :: DataConstr -> Name- mkConName = mkName . conToStr- -@@ -158,6 +120,7 @@ conToStr :: DataConstr -> String- conToStr (DCUnqualified (Ident x)) = x- conToStr (DCQualified (Module xs) (Ident x)) = intercalate "." $ xs ++ [x]- -+{-- -- Wildcards bind all of the unbound fields to variables whose name- -- matches the field name.- ---@@ -296,10 +259,12 @@ hamlet = hamletWithSettings hamletRules defaultHamletSettings- - xhamlet :: QuasiQuoter- xhamlet = hamletWithSettings hamletRules xhtmlHamletSettings-+-}- - asHtmlUrl :: HtmlUrl url -> HtmlUrl url- asHtmlUrl = id- -+{-- hamletRules :: Q HamletRules- hamletRules = do- i <- [|id|]-@@ -360,6 +325,7 @@ hamletFromString :: Q HamletRules -> HamletSettings -> String -> Q Exp- hamletFromString qhr set s = do- hr <- qhr- hrWithEnv hr $ \env -> docsToExp env hr [] $ docFromString set s-+-}- - docFromString :: HamletSettings -> String -> [Doc]- docFromString set s =-@@ -367,6 +333,7 @@ docFromString set s =- Error s' -> error s'- Ok (_, d) -> d- -+{-- hamletFileWithSettings :: Q HamletRules -> HamletSettings -> FilePath -> Q Exp- hamletFileWithSettings qhr set fp = do- #ifdef GHC_7_4-@@ -408,6 +375,7 @@ strToExp s@(c:_)- | isUpper c = ConE $ mkName s- | otherwise = VarE $ mkName s- strToExp "" = error "strToExp on empty string"-+-}- - -- | Checks for truth in the left value in each pair in the first argument. If- -- a true exists, then the corresponding right action is performed. Only the-@@ -452,7 +420,7 @@ hamletUsedIdentifiers settings =- data HamletRuntimeRules = HamletRuntimeRules {- hrrI18n :: Bool- }---+{-- hamletFileReloadWithSettings :: HamletRuntimeRules- -> HamletSettings -> FilePath -> Q Exp- hamletFileReloadWithSettings hrr settings fp = do-@@ -479,7 +447,7 @@ hamletFileReloadWithSettings hrr settings fp = do- c VTUrlParam = [|EUrlParam|]- c VTMixin = [|\r -> EMixin $ \c -> r c|]- c VTMsg = [|EMsg|]---+-}- -- move to Shakespeare.Base?- readFileUtf8 :: FilePath -> IO String- readFileUtf8 fp = fmap TL.unpack $ readUtf8File fp-diff --git a/Text/Hamlet/Parse.hs b/Text/Hamlet/Parse.hs-index b7e2954..1f14946 100644---- a/Text/Hamlet/Parse.hs-+++ b/Text/Hamlet/Parse.hs-@@ -616,6 +616,7 @@ data NewlineStyle = NoNewlines -- ^ never add newlines- | DefaultNewlineStyle- deriving Show- -+{-- instance Lift NewlineStyle where- lift NoNewlines = [|NoNewlines|]- lift NewlinesText = [|NewlinesText|]-@@ -627,7 +628,7 @@ instance Lift (String -> CloseStyle) where- - instance Lift HamletSettings where- lift (HamletSettings a b c d) = [|HamletSettings $(lift a) $(lift b) $(lift c) $(lift d)|]---+-}- - htmlEmptyTags :: Set String- htmlEmptyTags = Set.fromAscList--- -2.1.1-
− test
file too large to diff