1diff -ru orig/Git/S3.hs new/Git/S3.hs
2--- orig/Git/S3.hs 2014-04-06 09:02:47.247789820 +0300
3+++ new/Git/S3.hs 2014-04-06 09:02:47.000000000 +0300
5 import Control.Monad.Trans.Resource
10 import Data.Binary as Bin
11 import Data.ByteString (ByteString)
14 deriving (Eq, Show, Generic)
16-type MonadS3 m = (Failure Git.GitException m,
17+type MonadS3 m = (MonadThrow m,
18 MonadIO m, MonadBaseControl IO m, MonadLogger m)
20 data BackendCallbacks = BackendCallbacks
22 -> ResourceT m (Response (ResponseMetadata a) a)
23 awsRetry cfg svcfg mgr r =
24 transResourceT liftIO $
25- retrying def (isFailure . responseResult) $ aws cfg svcfg mgr r
26+ retrying def (isLeft . responseResult) $ aws cfg svcfg mgr r
29+ isLeft Right{} = False
31 listBucketS3 :: MonadS3 m => OdbS3Details -> ResourceT m [Text]
32 listBucketS3 dets = do
35 modifyIORef mshas (sha:)
37- checkResult r "lgForEachObject failed"
38+ either throwM return $ checkResult r "lgForEachObject failed"
40 -- Update the known objects map with the fact that we've got a local cache
43 ++ show (Prelude.length shas) ++ " objects"
46-catalogPackFile :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
47+catalogPackFile :: (MonadS3 m, MonadThrow m)
48 => OdbS3Details -> Text -> FilePath -> m [SHA]
49 catalogPackFile dets packSha idxPath = do
50 -- Load the pack file, and iterate over the objects within it to determine
52 lgDebug $ "cacheUpdateEntry " ++ show (shaToText sha) ++ " " ++ show ce
53 liftIO $ atomically $ modifyTVar (knownObjects dets) $ M.insert sha ce
55-cacheLoadObject :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
56+cacheLoadObject :: (MonadS3 m, MonadThrow m)
57 => OdbS3Details -> SHA -> CacheEntry -> Bool
58 -> m (Maybe ObjectInfo)
59 cacheLoadObject dets sha ce metadataOnly = do
61 remoteStoreObject _ _ _ =
62 throw (Git.BackendError "remoteStoreObject was not given any data")
64-remoteCatalogContents :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
65+remoteCatalogContents :: (MonadS3 m, MonadThrow m)
66 => OdbS3Details -> ResourceT m ()
67 remoteCatalogContents dets = do
68 lgDebug "remoteCatalogContents"
71 | otherwise -> return ()
73-accessObject :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
74+accessObject :: (MonadS3 m, MonadThrow m)
75 => OdbS3Details -> SHA -> Bool -> m (Maybe CacheEntry)
76 accessObject dets sha checkRemote = do
77 mentry <- cacheLookupEntry dets sha
78@@ -1032,19 +1034,19 @@
79 -- cache and with the callback interface. This is to avoid recataloging
82-objectExists :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
83+objectExists :: (MonadS3 m, MonadThrow m)
84 => OdbS3Details -> SHA -> Bool -> m CacheEntry
85 objectExists dets sha checkRemote = do
86 mce <- accessObject dets sha checkRemote
87 return $ fromMaybe DoesNotExist mce
89-readObject :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
90+readObject :: (MonadS3 m, MonadThrow m)
91 => OdbS3Details -> SHA -> Bool -> m (Maybe ObjectInfo)
92 readObject dets sha metadataOnly = do
93 ce <- objectExists dets sha True
94 cacheLoadObject dets sha ce metadataOnly `orElse` return Nothing
96-readObjectMetadata :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
97+readObjectMetadata :: (MonadS3 m, MonadThrow m)
98 => OdbS3Details -> SHA -> m (Maybe ObjectInfo)
99 readObjectMetadata dets sha = readObject dets sha True
102 callbackRegisterObject dets sha info
103 cacheStoreObject dets sha info
105-writePackFile :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
106+writePackFile :: (MonadS3 m, MonadThrow m)
107 => OdbS3Details -> BL.ByteString -> m ()
108 writePackFile dets bytes = do
109 let dir = tempDirectory dets
111 shas <- catalogPackFile dets packSha idxPath
112 callbackRegisterPackFile dets packSha shas
114-readCallback :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
115+readCallback :: (MonadS3 m, MonadThrow m)
120 BU.unsafeUseAsCString chunk $ copyBytes p ?? len
121 return $ p `plusPtr` len
123-readPrefixCallback :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
124+readPrefixCallback :: (MonadS3 m, MonadThrow m)
130 | otherwise = return Nothing
132-readHeaderCallback :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
133+readHeaderCallback :: (MonadS3 m, MonadThrow m)
136 -> Ptr C'git_odb_backend
138 poke len_p (toLength len)
139 poke type_p (toType typ)
141-writeCallback :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
142+writeCallback :: (MonadS3 m, MonadThrow m)
144 -> Ptr C'git_odb_backend
147 (ObjectInfo (fromLength len) (fromType obj_type)
148 Nothing (Just (BL.fromChunks [bytes])))
150-existsCallback :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
151+existsCallback :: (MonadS3 m, MonadThrow m)
152 => Ptr C'git_odb_backend -> Ptr C'git_oid -> CInt -> m CInt
153 existsCallback be oid confirmNotExists = do
154 (dets, sha) <- liftIO $ unpackDetails be oid
155@@ -1194,18 +1196,18 @@
156 return $ if ce == DoesNotExist then 0 else 1)
159-refreshCallback :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
160+refreshCallback :: (MonadS3 m, MonadThrow m)
161 => Ptr C'git_odb_backend -> m CInt
163 return c'GIT_OK -- do nothing
165-foreachCallback :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
166+foreachCallback :: (MonadS3 m, MonadThrow m)
167 => Ptr C'git_odb_backend -> C'git_odb_foreach_cb -> Ptr ()
169 foreachCallback _be _callback _payload =
170 return c'GIT_ERROR -- fallback to standard method
172-writePackCallback :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
173+writePackCallback :: (MonadS3 m, MonadThrow m)
174 => Ptr (Ptr C'git_odb_writepack)
175 -> Ptr C'git_odb_backend
176 -> C'git_transfer_progress_callback
178 foreign import ccall "&freeCallback"
179 freeCallbackPtr :: FunPtr F'git_odb_backend_free_callback
181-packAddCallback :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
182+packAddCallback :: (MonadS3 m, MonadThrow m)
183 => Ptr C'git_odb_writepack
187 (castPtr dataPtr) (fromIntegral len)
188 writePackFile dets (BL.fromChunks [bytes])
190-packCommitCallback :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
191+packCommitCallback :: (MonadS3 m, MonadThrow m)
192 => Ptr C'git_odb_writepack -> Ptr C'git_transfer_progress
194 packCommitCallback _wp _progress =
196 liftIO $ writeIORef result res
199-odbS3Backend :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
200+odbS3Backend :: (MonadS3 m, MonadThrow m)
201 => Aws.S3Configuration NormalQuery
206 -- | Given a repository object obtained from Libgit2, add an S3 backend to it,
207 -- making it the primary store for objects associated with that repository.
208-addS3Backend :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
209+addS3Backend :: (MonadS3 m, MonadThrow m)
214 void $ liftIO $ odbBackendAdd repo odbS3 100
217-s3Factory :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
218+s3Factory :: (MonadS3 m, MonadThrow m)
219 => Maybe Text -> Text -> Text -> FilePath -> BackendCallbacks
220 -> Git.RepositoryFactory (ReaderT LgRepo (NoLoggingT m)) m LgRepo
221 s3Factory bucket accessKey secretKey dir callbacks = lgFactory
226-s3FactoryLogger :: (MonadS3 m, MonadUnsafeIO m, MonadThrow m)
227+s3FactoryLogger :: (MonadS3 m, MonadThrow m)
228 => Maybe Text -> Text -> Text -> FilePath -> BackendCallbacks
229 -> Git.RepositoryFactory (ReaderT LgRepo m) m LgRepo
230 s3FactoryLogger bucket accessKey secretKey dir callbacks = lgFactoryLogger
231diff -ru orig/gitlib-s3.cabal new/gitlib-s3.cabal
232--- orig/gitlib-s3.cabal 2014-04-06 09:02:47.247789820 +0300
233+++ new/gitlib-s3.cabal 2014-04-06 09:02:47.000000000 +0300
235 , hspec-expectations >= 0.3
236 , data-default >= 0.5.1
237 , directory >= 1.1.0.2
238- , failure >= 0.2.0.1
240 , monad-logger >= 0.3.1.1
244 , hlibgit2 >= 0.18.0.11
248 , bifunctors >= 3.2.0.1
250 , bytestring >= 0.9.2.1
253 , data-default >= 0.5.1
254 , directory >= 1.1.0.2
256diff -ru orig/test/Smoke.hs new/test/Smoke.hs
257--- orig/test/Smoke.hs 2014-04-06 09:02:47.247789820 +0300
258+++ new/test/Smoke.hs 2014-04-06 09:02:47.000000000 +0300
262 import Control.Applicative
263-import Control.Failure
264 import Control.Monad.IO.Class
265 import Control.Monad.Logger
266 import Control.Monad.Trans.Reader
268 import Test.Hspec.Runner
271- :: (Failure Git.GitException m, MonadIO m, MonadBaseControl IO m,
272- MonadUnsafeIO m, MonadThrow m)
273+ :: (MonadThrow m, MonadIO m, MonadBaseControl IO m)
274 => Git.RepositoryFactory (ReaderT Lg.LgRepo (NoLoggingT m)) m Lg.LgRepo
275 s3Factory = Lg.lgFactory
276 { Git.runRepository = \ctxt m ->
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list