git-annex 6.20180719 → 6.20180807
raw patch · 25 files changed
+221/−81 lines, 25 files
Files
- Annex/Branch.hs +26/−11
- Annex/Content.hs +1/−1
- Annex/MakeRepo.hs +1/−1
- Annex/Transfer.hs +1/−1
- Assistant/Sync.hs +1/−1
- Assistant/TransferQueue.hs +1/−1
- Assistant/WebApp/Configurators/Fsck.hs +1/−1
- CHANGELOG +18/−0
- CmdLine/GitAnnex/Options.hs +8/−1
- Command/AddUrl.hs +13/−3
- Command/Commit.hs +1/−1
- Command/Merge.hs +1/−1
- Command/Sync.hs +3/−3
- Limit.hs +17/−6
- Logs/Web.hs +1/−1
- Remote.hs +10/−2
- Remote/Git.hs +1/−1
- Remote/S3.hs +69/−41
- Types/GitConfig.hs +4/−0
- Types/Remote.hs +6/−1
- Utility/Android.hs +2/−0
- Utility/Url.hs +2/−2
- doc/git-annex-matching-options.mdwn +14/−0
- doc/git-annex.mdwn +18/−0
- git-annex.cabal +1/−1
Annex/Branch.hs view
@@ -1,6 +1,6 @@ {- management of the git-annex branch -- - Copyright 2011-2017 Joey Hess <id@joeyh.name>+ - Copyright 2011-2018 Joey Hess <id@joeyh.name> - - Licensed under the GNU GPL version 3 or higher. -}@@ -19,6 +19,7 @@ getHistorical, change, maybeChange,+ commitMessage, commit, forceCommit, getBranch,@@ -51,7 +52,7 @@ import Git.LsTree (lsTreeParams) import qualified Git.HashObject import Annex.HashObject-import Git.Types+import Git.Types (Ref(..), fromRef, RefDate, TreeItemType(..)) import Git.FilePath import Annex.CatFile import Annex.Perms@@ -177,9 +178,9 @@ go branchref dirty tomerge jl = withIndex $ do let (refs, branches) = unzip tomerge cleanjournal <- if dirty then stageJournal jl else return noop- let merge_desc = if null tomerge- then "update"- else "merging " +++ merge_desc <- if null tomerge+ then commitMessage+ else return $ "merging " ++ unwords (map Git.Ref.describe branches) ++ " into " ++ fromRef name localtransitions <- parseTransitionsStrictly "local"@@ -222,10 +223,15 @@ getLocal file = go =<< getJournalFileStale file where go (Just journalcontent) = return journalcontent- go Nothing = getRaw file+ go Nothing = getRef fullname file -getRaw :: FilePath -> Annex String-getRaw = getRef fullname+{- Gets the content of a file as staged in the branch's index. -}+getStaged :: FilePath -> Annex String+getStaged = getRef indexref+ where+ -- This makes git cat-file be run with ":file",+ -- so it looks at the index.+ indexref = Ref "" getHistorical :: RefDate -> FilePath -> Annex String getHistorical date file =@@ -259,6 +265,11 @@ set :: JournalLocked -> FilePath -> String -> Annex () set = setJournalFile +{- Commit message used when making a commit of whatever data has changed+ - to the git-annex brach. -}+commitMessage :: Annex String+commitMessage = fromMaybe "update" . annexCommitMessage <$> Annex.getGitConfig+ {- Stages the journal, and commits staged changes to the branch. -} commit :: String -> Annex () commit = whenM journalDirty . forceCommit@@ -527,6 +538,10 @@ -- update the git-annex branch, while it usually holds changes -- for the head branch. Flush any such changes. Annex.Queue.flush+ -- Stop any running git cat-files, to ensure that the+ -- getStaged calls below use the current index, and not some older+ -- one.+ catFileStop withIndex $ do prepareModifyIndex jl run $ mapMaybe getTransitionCalculator tlist@@ -551,15 +566,15 @@ - to hold changes to every file in the branch at once.) - - When a file in the branch is changed by transition code,- - that value is remembered and fed into the code for subsequent+ - its new content is remembered and fed into the code for subsequent - transitions. -} run [] = noop run changers = do- trustmap <- calcTrustMap <$> getRaw trustLog+ trustmap <- calcTrustMap <$> getStaged trustLog fs <- branchFiles forM_ fs $ \f -> do- content <- getRaw f+ content <- getStaged f apply changers f content trustmap apply [] _ _ _ = return () apply (changer:rest) file content trustmap =
Annex/Content.hs view
@@ -975,7 +975,7 @@ Annex.Queue.flush unless nocommit $ whenM (annexAlwaysCommit <$> Annex.getGitConfig) $- Annex.Branch.commit "update"+ Annex.Branch.commit =<< Annex.Branch.commitMessage {- Downloads content from any of a list of urls. -} downloadUrl :: Key -> MeterUpdate -> [Url.URLString] -> FilePath -> Annex Bool
Annex/MakeRepo.hs view
@@ -82,7 +82,7 @@ maybe noop (defaultStandardGroup u) mgroup {- Ensure branch gets committed right away so it is - available for merging immediately. -}- Annex.Branch.commit "update"+ Annex.Branch.commit =<< Annex.Branch.commitMessage {- Checks if a git repo exists at a location. -} probeRepoExists :: FilePath -> IO Bool
Annex/Transfer.hs view
@@ -279,4 +279,4 @@ lessActiveFirst :: M.Map Remote Integer -> Remote -> Remote -> Ordering lessActiveFirst active a b | Remote.cost a == Remote.cost b = comparing (`M.lookup` active) a b- | otherwise = compare a b+ | otherwise = comparing Remote.cost a b
Assistant/Sync.hs view
@@ -124,7 +124,7 @@ pushToRemotes' :: UTCTime -> [Remote] -> Assistant [Remote] pushToRemotes' now remotes = do (g, branch, u) <- liftAnnex $ do- Annex.Branch.commit "update"+ Annex.Branch.commit =<< Annex.Branch.commitMessage (,,) <$> gitRepo <*> join Command.Sync.getCurrBranch
Assistant/TransferQueue.hs view
@@ -92,7 +92,7 @@ filter (\r -> not (inset s r || Remote.readonly r)) (syncDataRemotes st) where- locs = S.fromList <$> Remote.keyLocations k+ locs = S.fromList . map Remote.uuid <$> Remote.keyPossibilities k inset s r = S.member (Remote.uuid r) s gentransfer r = Transfer { transferDirection = direction
Assistant/WebApp/Configurators/Fsck.hs view
@@ -138,7 +138,7 @@ changeSchedule :: Handler () -> Handler Html changeSchedule a = do a- liftAnnex $ Annex.Branch.commit "update"+ liftAnnex $ Annex.Branch.commit =<< Annex.Branch.commitMessage redirect ConfigFsckR getRemoveActivityR :: UUID -> ScheduledActivity -> Handler Html
CHANGELOG view
@@ -1,3 +1,21 @@+git-annex (6.20180807) upstream; urgency=medium++ * S3: Support credential-less download from remotes configured+ with public=yes exporttree=yes.+ * Fix reversion in display of http 404 errors.+ * Added remote.name.annex-speculate-present config that can be used to+ make cache remotes.+ * Added --accessedwithin matching option.+ * Added annex.commitmessage config that can specify a commit message+ for the git-annex branch instead of the usual "update".+ * Fix wrong sorting of remotes when using -J, it was sorting by uuid,+ rather than cost.+ * addurl: Include filename in --json-progress output.+ * Fix git-annex branch data loss that could occur after+ git-annex forget --drop-dead.++ -- Joey Hess <id@joeyh.name> Tue, 07 Aug 2018 16:22:05 -0400+ git-annex (6.20180719) upstream; urgency=medium * Support working trees set up by git-worktree.
CmdLine/GitAnnex/Options.hs view
@@ -38,6 +38,7 @@ import CmdLine.GlobalSetter import qualified Backend import qualified Types.Backend as Backend+import Utility.HumanTime -- Global options that are accepted by all git-annex sub-commands, -- although not always used.@@ -275,6 +276,12 @@ <> help "match files the repository wants to drop" <> hidden )+ , globalSetter Limit.addAccessedWithin $ option (str >>= parseDuration)+ ( long "accessedwithin"+ <> metavar paramTime+ <> help "match files accessed within a time interval"+ <> hidden+ ) ] -- Options to match files which may not yet be annexed.@@ -371,7 +378,7 @@ timeLimitOption :: [GlobalOption] timeLimitOption = - [ globalSetter Limit.addTimeLimit $ strOption+ [ globalSetter Limit.addTimeLimit $ option (str >>= parseDuration) ( long "time-limit" <> short 'T' <> metavar paramTime <> help "stop after the specified amount of time" <> hidden
Command/AddUrl.hs view
@@ -126,7 +126,7 @@ where go _ (Left e) = void $ commandAction $ do- showStart' "addurl" (Just u)+ showStartAddUrl u o warning (show e) next $ next $ return False go deffile (Right (UrlContents sz mf)) = do@@ -148,7 +148,7 @@ startRemote r o file uri sz = do pathmax <- liftIO $ fileNameLengthLimit "." let file' = joinPath $ map (truncateFilePath pathmax) $ splitDirectories file- showStart' "addurl" (Just uri)+ showStartAddUrl uri o showNote $ "from " ++ Remote.name r showDestinationFile file' next $ performRemote r o uri file' sz@@ -192,7 +192,7 @@ bad = fromMaybe (giveup $ "bad url " ++ urlstring) $ Url.parseURIRelaxed $ urlstring go url = do- showStart' "addurl" (Just urlstring)+ showStartAddUrl urlstring o pathmax <- liftIO $ fileNameLengthLimit "." urlinfo <- if relaxedOption (downloadOptions o) then pure Url.assumeUrlExists@@ -310,6 +310,16 @@ else do warning $ dest ++ " already exists; not overwriting" return Nothing++{- The destination file is not known at start time unless the user provided+ - a filename. It's not displayed then for output consistency, + - but is added to the json when available. -}+showStartAddUrl :: URLString -> AddUrlOptions -> Annex ()+showStartAddUrl url o = do+ showStart' "addurl" (Just url)+ case fileOption (downloadOptions o) of+ Nothing -> noop+ Just file -> maybeShowJSON $ JSONChunk [("file", file)] showDestinationFile :: FilePath -> Annex () showDestinationFile file = do
Command/Commit.hs view
@@ -21,7 +21,7 @@ start :: CommandStart start = next $ next $ do- Annex.Branch.commit "update"+ Annex.Branch.commit =<< Annex.Branch.commitMessage _ <- runhook <=< inRepo $ Git.hookPath "annex-content" return True where
Command/Merge.hs view
@@ -27,7 +27,7 @@ next $ do Annex.Branch.update -- commit explicitly, in case no remote branches were merged- Annex.Branch.commit "update"+ Annex.Branch.commit =<< Annex.Branch.commitMessage next $ return True mergeSynced :: CommandStart
Command/Sync.hs view
@@ -301,7 +301,7 @@ commit o = stopUnless shouldcommit $ next $ next $ do commitmessage <- maybe commitMsg return (messageOption o) showStart' "commit" Nothing- Annex.Branch.commit "update"+ Annex.Branch.commit =<< Annex.Branch.commitMessage ifM isDirect ( do void stageDirect@@ -544,7 +544,7 @@ commitAnnex :: CommandStart commitAnnex = do- Annex.Branch.commit "update"+ Annex.Branch.commit =<< Annex.Branch.commitMessage stop mergeAnnex :: CommandStart@@ -616,7 +616,7 @@ -} syncFile :: Either (Maybe (Bloom Key)) (Key -> Annex ()) -> [Remote] -> AssociatedFile -> Key -> Annex Bool syncFile ebloom rs af k = onlyActionOn' k $ do- locs <- Remote.keyLocations k+ locs <- map Remote.uuid <$> Remote.keyPossibilities k let (have, lack) = partition (\r -> Remote.uuid r `elem` locs) rs got <- anyM id =<< handleget have
Limit.hs view
@@ -298,20 +298,31 @@ . S.filter matching . metaDataValues f <$> getCurrentMetaData k -addTimeLimit :: String -> Annex ()-addTimeLimit s = do- let seconds = maybe (giveup "bad time-limit") durationToPOSIXTime $- parseDuration s+addTimeLimit :: Duration -> Annex ()+addTimeLimit duration = do start <- liftIO getPOSIXTime- let cutoff = start + seconds+ let cutoff = start + durationToPOSIXTime duration addLimit $ Right $ const $ const $ do now <- liftIO getPOSIXTime if now > cutoff then do- warning $ "Time limit (" ++ s ++ ") reached!"+ warning $ "Time limit (" ++ fromDuration duration ++ ") reached!" shutdown True liftIO $ exitWith $ ExitFailure 101 else return True++addAccessedWithin :: Duration -> Annex ()+addAccessedWithin duration = do+ now <- liftIO getPOSIXTime+ addLimit $ Right $ const $ checkKey $ check now+ where+ check now k = inAnnexCheck k $ \f ->+ liftIO $ catchDefaultIO False $ do+ s <- getFileStatus f+ let accessed = realToFrac (accessTime s)+ let delta = now - accessed+ return $ delta <= secs+ secs = fromIntegral (durationSeconds duration) lookupFileKey :: FileInfo -> Annex (Maybe Key) lookupFileKey = lookupFile . currFile
Logs/Web.hs view
@@ -78,7 +78,7 @@ - any journaled changes are reflected in it, since we're going - to query its index directly. -} Annex.Branch.update- Annex.Branch.commit "update"+ Annex.Branch.commit =<< Annex.Branch.commitMessage Annex.Branch.withIndex $ do top <- fromRepo Git.repoPath (l, cleanup) <- inRepo $ Git.LsFiles.stagedDetails [top]
Remote.hs view
@@ -1,6 +1,6 @@ {- git-annex remotes -- - Copyright 2011 Joey Hess <id@joeyh.name>+ - Copyright 2011-2018 Joey Hess <id@joeyh.name> - - Licensed under the GNU GPL version 3 or higher. -}@@ -278,13 +278,21 @@ {- Cost ordered lists of remotes that the location log indicates - may have a key.+ -+ - Also includes remotes with remoteAnnexSpeculatePresent set. -} keyPossibilities :: Key -> Annex [Remote] keyPossibilities key = do u <- getUUID -- uuids of all remotes that are recorded to have the key locations <- filter (/= u) <$> keyLocations key- fst <$> remoteLocations locations []+ speclocations <- map uuid+ . filter (remoteAnnexSpeculatePresent . gitconfig)+ <$> remoteList+ -- there are unlikely to be many speclocations, so building a Set+ -- is not worth the expense+ let locations' = speclocations ++ filter (`notElem` speclocations) locations+ fst <$> remoteLocations locations' [] {- Given a list of locations of a key, and a list of all - trusted repositories, generates a cost-ordered list of
Remote/Git.hs view
@@ -728,7 +728,7 @@ cleanup | not $ Git.repoIsUrl repo = onLocalFast repo r $ doQuietSideAction $- Annex.Branch.commit "update"+ Annex.Branch.commit =<< Annex.Branch.commitMessage | otherwise = void $ do Just (shellcmd, shellparams) <- Ssh.git_annex_shell NoConsumeStdin
Remote/S3.hs view
@@ -46,7 +46,7 @@ import Annex.UUID import Logs.Web import Utility.Metered-import qualified Utility.Url as Url+import qualified Annex.Url as Url import Utility.DataUnits import Utility.FileSystemEncoding import Annex.Content@@ -54,6 +54,7 @@ import Utility.Url (checkBoth, UrlOptions(..)) type BucketName = String+type BucketObject = String remote :: RemoteType remote = RemoteType@@ -91,15 +92,15 @@ , lockContent = Nothing , checkPresent = checkPresentDummy , checkPresentCheap = False- , exportActions = withS3Handle c gc u $ \h -> + , exportActions = withS3HandleMaybe c gc u $ \mh -> return $ ExportActions- { storeExport = storeExportS3 info h- , retrieveExport = retrieveExportS3 info h- , removeExport = removeExportS3 info h- , checkPresentExport = checkPresentExportS3 info h+ { storeExport = storeExportS3 u info mh+ , retrieveExport = retrieveExportS3 u info mh+ , removeExport = removeExportS3 u info mh+ , checkPresentExport = checkPresentExportS3 u info mh -- S3 does not have directories. , removeExportDirectory = Nothing- , renameExport = renameExportS3 info h+ , renameExport = renameExportS3 u info mh } , whereisKey = Just (getWebUrls info c) , remoteFsck = Nothing@@ -188,7 +189,7 @@ storeHelper info h f (T.pack $ bucketObject info k) p -- Store public URL to item in Internet Archive. when (isIA info && not (isChunkKey k)) $- setUrlPresent webUUID k (iaPublicKeyUrl info k)+ setUrlPresent webUUID k (iaPublicUrl info (bucketObject info k)) return True storeHelper :: S3Info -> S3Handle -> FilePath -> S3.Object -> MeterUpdate -> Annex ()@@ -254,10 +255,10 @@ retrieveHelper info h (T.pack $ bucketObject info k) f p retrieve r info Nothing = case getpublicurl info of Nothing -> \_ _ _ -> do- warnMissingCredPairFor "S3" (AWS.creds $ uuid r)+ needS3Creds (uuid r) return False Just geturl -> fileRetriever $ \f k p ->- unlessM (downloadUrl k p [geturl k] f) $+ unlessM (downloadUrl k p [geturl $ bucketObject info k] f) $ giveup "failed to download content" retrieveHelper :: S3Info -> S3Handle -> S3.Object -> FilePath -> MeterUpdate -> Annex ()@@ -281,11 +282,12 @@ checkKey :: Remote -> S3Info -> Maybe S3Handle -> CheckPresent checkKey r info Nothing k = case getpublicurl info of Nothing -> do- warnMissingCredPairFor "S3" (AWS.creds $ uuid r)+ needS3Creds (uuid r) giveup "No S3 credentials configured" Just geturl -> do showChecking r- withUrlOptions $ liftIO . checkBoth (geturl k) (keySize k)+ withUrlOptions $ liftIO . + checkBoth (geturl $ bucketObject info k) (keySize k) checkKey r info (Just h) k = do showChecking r checkKeyHelper info h (T.pack $ bucketObject info k)@@ -316,38 +318,58 @@ | otherwise = Nothing #endif -storeExportS3 :: S3Info -> S3Handle -> FilePath -> Key -> ExportLocation -> MeterUpdate -> Annex Bool-storeExportS3 info h f _k loc p = +storeExportS3 :: UUID -> S3Info -> Maybe S3Handle -> FilePath -> Key -> ExportLocation -> MeterUpdate -> Annex Bool+storeExportS3 _u info (Just h) f _k loc p = catchNonAsync go (\e -> warning (show e) >> return False) where go = do storeHelper info h f (T.pack $ bucketExportLocation info loc) p return True+storeExportS3 u _ Nothing _ _ _ _ = do+ needS3Creds u+ return False -retrieveExportS3 :: S3Info -> S3Handle -> Key -> ExportLocation -> FilePath -> MeterUpdate -> Annex Bool-retrieveExportS3 info h _k loc f p =+retrieveExportS3 :: UUID -> S3Info -> Maybe S3Handle -> Key -> ExportLocation -> FilePath -> MeterUpdate -> Annex Bool+retrieveExportS3 u info mh _k loc f p = catchNonAsync go (\e -> warning (show e) >> return False) where- go = do- retrieveHelper info h (T.pack $ bucketExportLocation info loc) f p- return True+ go = case mh of+ Just h -> do+ retrieveHelper info h (T.pack exporturl) f p+ return True+ Nothing -> case getpublicurl info of+ Nothing -> do+ needS3Creds u+ return False+ Just geturl -> Url.withUrlOptions $ + liftIO . Url.download p (geturl exporturl) f+ exporturl = bucketExportLocation info loc -removeExportS3 :: S3Info -> S3Handle -> Key -> ExportLocation -> Annex Bool-removeExportS3 info h _k loc = +removeExportS3 :: UUID -> S3Info -> Maybe S3Handle -> Key -> ExportLocation -> Annex Bool+removeExportS3 _u info (Just h) _k loc = catchNonAsync go (\e -> warning (show e) >> return False) where go = do res <- tryNonAsync $ sendS3Handle h $ S3.DeleteObject (T.pack $ bucketExportLocation info loc) (bucket info) return $ either (const False) (const True) res+removeExportS3 u _ Nothing _ _ = do+ needS3Creds u+ return False -checkPresentExportS3 :: S3Info -> S3Handle -> Key -> ExportLocation -> Annex Bool-checkPresentExportS3 info h _k loc =+checkPresentExportS3 :: UUID -> S3Info -> Maybe S3Handle -> Key -> ExportLocation -> Annex Bool+checkPresentExportS3 _u info (Just h) _k loc = checkKeyHelper info h (T.pack $ bucketExportLocation info loc)+checkPresentExportS3 u info Nothing k loc = case getpublicurl info of+ Nothing -> do+ needS3Creds u+ giveup "No S3 credentials configured"+ Just geturl -> withUrlOptions $ liftIO . + checkBoth (geturl $ bucketExportLocation info loc) (keySize k) -- S3 has no move primitive; copy and delete.-renameExportS3 :: S3Info -> S3Handle -> Key -> ExportLocation -> ExportLocation -> Annex Bool-renameExportS3 info h _k src dest = catchNonAsync go (\_ -> return False)+renameExportS3 :: UUID -> S3Info -> Maybe S3Handle -> Key -> ExportLocation -> ExportLocation -> Annex Bool+renameExportS3 _u info (Just h) _k src dest = catchNonAsync go (\_ -> return False) where go = do let co = S3.copyObject (bucket info) dstobject@@ -359,6 +381,9 @@ return True srcobject = T.pack $ bucketExportLocation info src dstobject = T.pack $ bucketExportLocation info dest+renameExportS3 u _ Nothing _ _ _ = do+ needS3Creds u+ return False {- Generate the bucket if it does not already exist, including creating the - UUID file within the bucket.@@ -477,7 +502,7 @@ withS3Handle c gc u a = withS3HandleMaybe c gc u $ \mh -> case mh of Just h -> a h Nothing -> do- warnMissingCredPairFor "S3" (AWS.creds u)+ needS3Creds u giveup "No S3 credentials configured" withS3HandleMaybe :: RemoteConfig -> RemoteGitConfig -> UUID -> (Maybe S3Handle -> Annex a) -> Annex a@@ -496,6 +521,9 @@ where s3cfg = s3Configuration c +needS3Creds :: UUID -> Annex ()+needS3Creds u = warnMissingCredPairFor "S3" (AWS.creds u)+ s3Configuration :: RemoteConfig -> S3.S3Configuration AWS.NormalQuery s3Configuration c = cfg { S3.s3Port = port@@ -525,13 +553,13 @@ data S3Info = S3Info { bucket :: S3.Bucket , storageClass :: S3.StorageClass- , bucketObject :: Key -> String- , bucketExportLocation :: ExportLocation -> String+ , bucketObject :: Key -> BucketObject+ , bucketExportLocation :: ExportLocation -> BucketObject , metaHeaders :: [(T.Text, T.Text)] , partSize :: Maybe Integer , isIA :: Bool , public :: Bool- , getpublicurl :: Maybe (Key -> URLString)+ , getpublicurl :: Maybe (BucketObject -> URLString) } extractS3Info :: RemoteConfig -> Annex S3Info@@ -552,13 +580,13 @@ Just "yes" -> True _ -> False , getpublicurl = case M.lookup "publicurl" c of- Just u -> Just $ genericPublicKeyUrl info u+ Just u -> Just $ \p -> genericPublicUrl p u Nothing -> case M.lookup "host" c of Just h | h == AWS.s3DefaultHost ->- Just $ awsPublicKeyUrl info+ Just (awsPublicUrl info) | isIAHost h ->- Just $ iaPublicKeyUrl info+ Just (iaPublicUrl info) _ -> Nothing } return info@@ -601,14 +629,14 @@ getFilePrefix :: RemoteConfig -> String getFilePrefix = M.findWithDefault "" "fileprefix" -getBucketObject :: RemoteConfig -> Key -> FilePath+getBucketObject :: RemoteConfig -> Key -> BucketObject getBucketObject c = munge . key2file where munge s = case M.lookup "mungekeys" c of Just "ia" -> iaMunge $ getFilePrefix c ++ s _ -> getFilePrefix c ++ s -getBucketExportLocation :: RemoteConfig -> ExportLocation -> FilePath+getBucketExportLocation :: RemoteConfig -> ExportLocation -> BucketObject getBucketExportLocation c loc = getFilePrefix c ++ fromExportLocation loc {- Internet Archive documentation limits filenames to a subset of ascii.@@ -636,16 +664,16 @@ iaItemUrl :: BucketName -> URLString iaItemUrl b = "http://archive.org/details/" ++ b -iaPublicKeyUrl :: S3Info -> Key -> URLString-iaPublicKeyUrl info = genericPublicKeyUrl info $+iaPublicUrl :: S3Info -> BucketObject -> URLString+iaPublicUrl info p = genericPublicUrl p $ "http://archive.org/download/" ++ T.unpack (bucket info) ++ "/" -awsPublicKeyUrl :: S3Info -> Key -> URLString-awsPublicKeyUrl info = genericPublicKeyUrl info $ +awsPublicUrl :: S3Info -> BucketObject -> URLString+awsPublicUrl info p = genericPublicUrl p $ "https://" ++ T.unpack (bucket info) ++ ".s3.amazonaws.com/" -genericPublicKeyUrl :: S3Info -> URLString -> Key -> URLString-genericPublicKeyUrl info baseurl k = baseurl ++ bucketObject info k+genericPublicUrl :: BucketObject -> URLString -> URLString+genericPublicUrl p baseurl = baseurl ++ p genCredentials :: CredPair -> IO AWS.Credentials genCredentials (keyid, secret) = AWS.Credentials@@ -690,6 +718,6 @@ getWebUrls info c k | exportTree c = return [] | otherwise = case (public info, getpublicurl info) of- (True, Just geturl) -> return [geturl k]+ (True, Just geturl) -> return [geturl $ bucketObject info k] _ -> return []
Types/GitConfig.hs view
@@ -62,6 +62,7 @@ , annexBloomAccuracy :: Maybe Int , annexSshCaching :: Maybe Bool , annexAlwaysCommit :: Bool+ , annexCommitMessage :: Maybe String , annexMergeAnnexBranches :: Bool , annexDelayAdd :: Maybe Int , annexHttpHeaders :: [String]@@ -123,6 +124,7 @@ , annexBloomAccuracy = getmayberead (annex "bloomaccuracy") , annexSshCaching = getmaybebool (annex "sshcaching") , annexAlwaysCommit = getbool (annex "alwayscommit") True+ , annexCommitMessage = getmaybe (annex "commitmessage") , annexMergeAnnexBranches = getbool (annex "merge-annex-branches") True , annexDelayAdd = getmayberead (annex "delayadd") , annexHttpHeaders = getlist (annex "http-headers")@@ -226,6 +228,7 @@ , remoteAnnexStartCommand :: Maybe String , remoteAnnexStopCommand :: Maybe String , remoteAnnexAvailability :: Maybe Availability+ , remoteAnnexSpeculatePresent :: Bool , remoteAnnexBare :: Maybe Bool , remoteAnnexRetry :: Maybe Integer , remoteAnnexRetryDelay :: Maybe Seconds@@ -281,6 +284,7 @@ , remoteAnnexStartCommand = notempty $ getmaybe "start-command" , remoteAnnexStopCommand = notempty $ getmaybe "stop-command" , remoteAnnexAvailability = getmayberead "availability"+ , remoteAnnexSpeculatePresent = getbool "speculate-present" False , remoteAnnexBare = getmaybebool "bare" , remoteAnnexRetry = getmayberead "retry" , remoteAnnexRetryDelay = Seconds
Types/Remote.hs view
@@ -146,8 +146,13 @@ instance Eq (RemoteA a) where x == y = uuid x == uuid y +-- Order by cost since that is the important order of remotes+-- when deciding which to use. But since remotes often have the same cost+-- and Ord must be total, do a secondary ordering by uuid. instance Ord (RemoteA a) where- compare = comparing uuid+ compare a b+ | cost a == cost b = comparing uuid a b+ | otherwise = comparing cost a b instance ToUUID (RemoteA a) where toUUID = uuid
Utility/Android.hs view
@@ -9,7 +9,9 @@ module Utility.Android where +#ifdef linux_HOST_OS import Common+#endif -- Detect when the Linux build is running on Android, eg in termux. --
Utility/Url.hs view
@@ -362,8 +362,8 @@ showhttpexception he = do #if MIN_VERSION_http_client(0,5,0) let msg = case he of- HttpExceptionRequest _ (StatusCodeException _ msgb) ->- B8.toString msgb+ HttpExceptionRequest _ (StatusCodeException r _) ->+ B8.toString $ statusMessage $ responseStatus r HttpExceptionRequest _ (InternalException ie) -> case fromException ie of Nothing -> show ie
doc/git-annex-matching-options.mdwn view
@@ -145,6 +145,20 @@ Note that this will not match anything when using --all or --unused. +* `--accessedwithin=interval`++ Matches files that were accessed recently, within the specified time+ interval.+ + The interval can be in the form "5m" or "1h" or "2d" or "1y", or a+ combination such as "1h5m".++ So for example, `--accessedwithin=1d` matches files that have been+ accessed within the past day.++ If the OS or filesystem does not support access times, this will not+ match any files.+ * `--not` Inverts the next matching option. For example, to only act on
doc/git-annex.mdwn view
@@ -974,6 +974,17 @@ since it could garbage collect objects that are staged in git-annex's index but not yet committed. +* `annex.commitmessage`++ When git-annex updates the git-annex branch, it usually makes up+ its own commit message ("update"), since users rarely look at or+ care about changes to that branch. If you do care, you can+ specify this setting by running commands with+ `-c annex.commitmessage=whatever`++ This works well in combination with annex.alwayscommit=false,+ to gather up a set of changes and commit them with a message you specify.+ * `annex.merge-annex-branches` By default, git-annex branches that have been pulled from remotes@@ -1282,6 +1293,13 @@ Can be used to tell git-annex whether a remote is LocallyAvailable or GloballyAvailable. Normally, git-annex determines this automatically.++* `remote.<name>.annex-speculate-present`++ Make git-annex speculate that this remote may contain the content of any+ file, even though its normal location tracking does not indicate that it+ does. This will cause git-annex to try to get all file contents from the+ remote. Can be useful in setting up a caching remote. * `remote.<name>.annex-bare`
git-annex.cabal view
@@ -1,5 +1,5 @@ Name: git-annex-Version: 6.20180719+Version: 6.20180807 Cabal-Version: >= 1.8 License: GPL-3 Maintainer: Joey Hess <id@joeyh.name>