packages feed

gitlib-libgit2 3.1.1 → 3.1.2

raw patch · 4 files changed

+117/−101 lines, 4 filesdep +unliftiodep +unliftio-coredep −lifted-asyncdep −lifted-basedep −monad-controldep ~gitlib-libgit2dep ~hlibgit2PVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: unliftio, unliftio-core

Dependencies removed: lifted-async, lifted-base, monad-control

Dependency ranges changed: gitlib-libgit2, hlibgit2

API changes (from Hackage documentation)

- Git.Libgit2: getOid :: OidPtr -> ForeignPtr C'git_oid
- Git.Libgit2: getOidLen :: OidPtr -> Int
- Git.Libgit2: instance (Applicative m, MonadExcept m, MonadBaseControl IO m, MonadIO m) => MonadGit LgRepo (ReaderT LgRepo m)
- Git.Libgit2: instance Eq ListFlags
- Git.Libgit2: instance Eq OidPtr
- Git.Libgit2: instance IsOid OidPtr
- Git.Libgit2: instance Ord OidPtr
- Git.Libgit2: instance Show ListFlags
- Git.Libgit2: instance Show OidPtr
- Git.Libgit2: repoExcTrap :: LgRepo -> IORef (Maybe GitException)
- Git.Libgit2: repoObj :: LgRepo -> ForeignPtr C'git_repository
- Git.Libgit2: repoOptions :: LgRepo -> RepositoryOptions
- Git.Libgit2.Trace: instance Storable TraceBackend
- Git.Libgit2.Trace: traceNext :: TraceBackend -> Ptr C'git_odb_backend
- Git.Libgit2.Trace: traceParent :: TraceBackend -> C'git_odb_backend
- Git.Libgit2.Types: repoExcTrap :: LgRepo -> IORef (Maybe GitException)
- Git.Libgit2.Types: repoObj :: LgRepo -> ForeignPtr C'git_repository
- Git.Libgit2.Types: repoOptions :: LgRepo -> RepositoryOptions
+ Git.Libgit2: [getOidLen] :: OidPtr -> Int
+ Git.Libgit2: [getOid] :: OidPtr -> ForeignPtr C'git_oid
+ Git.Libgit2: [repoExcTrap] :: LgRepo -> IORef (Maybe GitException)
+ Git.Libgit2: [repoObj] :: LgRepo -> ForeignPtr C'git_repository
+ Git.Libgit2: [repoOptions] :: LgRepo -> RepositoryOptions
+ Git.Libgit2: class HasLgRepo m
+ Git.Libgit2: getRepository :: HasLgRepo m => m LgRepo
+ Git.Libgit2: instance (GHC.Base.Applicative m, Git.Libgit2.Types.MonadExcept m, Control.Monad.IO.Unlift.MonadUnliftIO m, Git.Libgit2.HasLgRepo m) => Git.Types.MonadGit Git.Libgit2.Types.LgRepo m
+ Git.Libgit2: instance GHC.Base.Monad m => Git.Libgit2.HasLgRepo (Control.Monad.Trans.Reader.ReaderT Git.Libgit2.Types.LgRepo m)
+ Git.Libgit2: instance GHC.Classes.Eq Git.Libgit2.ListFlags
+ Git.Libgit2: instance GHC.Classes.Eq Git.Libgit2.OidPtr
+ Git.Libgit2: instance GHC.Classes.Ord Git.Libgit2.OidPtr
+ Git.Libgit2: instance GHC.Show.Show Git.Libgit2.ListFlags
+ Git.Libgit2: instance GHC.Show.Show Git.Libgit2.OidPtr
+ Git.Libgit2: instance Git.Types.IsOid Git.Libgit2.OidPtr
+ Git.Libgit2.Trace: [traceNext] :: TraceBackend -> Ptr C'git_odb_backend
+ Git.Libgit2.Trace: [traceParent] :: TraceBackend -> C'git_odb_backend
+ Git.Libgit2.Trace: instance Foreign.Storable.Storable Git.Libgit2.Trace.TraceBackend
+ Git.Libgit2.Types: [repoExcTrap] :: LgRepo -> IORef (Maybe GitException)
+ Git.Libgit2.Types: [repoObj] :: LgRepo -> ForeignPtr C'git_repository
+ Git.Libgit2.Types: [repoOptions] :: LgRepo -> RepositoryOptions
- Git.Libgit2: lgBuildPackIndex :: (MonadIO m, MonadBaseControl IO m) => FilePath -> ByteString -> m (Text, FilePath, FilePath)
+ Git.Libgit2: lgBuildPackIndex :: MonadUnliftIO m => FilePath -> ByteString -> m (Text, FilePath, FilePath)
- Git.Libgit2: lgClosePackFile :: (MonadBaseControl IO m, MonadIO m, MonadExcept m) => Ptr C'git_odb -> m ()
+ Git.Libgit2: lgClosePackFile :: (MonadIO m, MonadExcept m) => Ptr C'git_odb -> m ()
- Git.Libgit2: lgExcTrap :: MonadLg m => ReaderT LgRepo m (IORef (Maybe GitException))
+ Git.Libgit2: lgExcTrap :: (MonadLg m, HasLgRepo m) => m (IORef (Maybe GitException))
- Git.Libgit2: lgFactory :: MonadIO m => RepositoryFactory (ReaderT LgRepo m) m LgRepo
+ Git.Libgit2: lgFactory :: (MonadIO m, MonadMask m) => RepositoryFactory (ReaderT LgRepo m) m LgRepo
- Git.Libgit2: lgOpenPackFile :: (MonadBaseControl IO m, MonadIO m, MonadExcept m) => FilePath -> m (Ptr C'git_odb)
+ Git.Libgit2: lgOpenPackFile :: (MonadExcept m, MonadUnliftIO m) => FilePath -> m (Ptr C'git_odb)
- Git.Libgit2: lgReadFromPack :: (MonadBaseControl IO m, MonadIO m, MonadExcept m) => Ptr C'git_odb -> SHA -> Bool -> m (Maybe (C'git_otype, CSize, ByteString))
+ Git.Libgit2: lgReadFromPack :: (MonadIO m, MonadExcept m) => Ptr C'git_odb -> SHA -> Bool -> m (Maybe (C'git_otype, CSize, ByteString))
- Git.Libgit2: lgWithPackFile :: (MonadBaseControl IO m, MonadIO m, MonadExcept m) => FilePath -> (Ptr C'git_odb -> m a) -> m a
+ Git.Libgit2: lgWithPackFile :: (MonadExcept m, MonadUnliftIO m) => FilePath -> (Ptr C'git_odb -> m a) -> m a
- Git.Libgit2: lgWrap :: MonadLg m => ReaderT LgRepo m a -> ReaderT LgRepo m a
+ Git.Libgit2: lgWrap :: (MonadLg m, HasLgRepo m) => m a -> m a
- Git.Libgit2: openLgRepository :: MonadIO m => RepositoryOptions -> m LgRepo
+ Git.Libgit2: openLgRepository :: (MonadIO m, MonadMask m) => RepositoryOptions -> m LgRepo
- Git.Libgit2: type MonadLg m = (Applicative m, MonadExcept m, MonadIO m, MonadBaseControl IO m)
+ Git.Libgit2: type MonadLg m = (Applicative m, MonadExcept m, MonadUnliftIO m)
- Git.Libgit2.Internal: lookupObject' :: (MonadGit LgRepo m, MonadBaseControl IO m) => ForeignPtr C'git_oid -> Int -> (Ptr (Ptr a) -> Ptr C'git_repository -> Ptr C'git_oid -> IO CInt) -> (Ptr (Ptr a) -> Ptr C'git_repository -> Ptr C'git_oid -> CSize -> IO CInt) -> (ForeignPtr C'git_oid -> ForeignPtr a -> Ptr a -> m b) -> m b
+ Git.Libgit2.Internal: lookupObject' :: (MonadGit LgRepo m, MonadUnliftIO m) => ForeignPtr C'git_oid -> Int -> (Ptr (Ptr a) -> Ptr C'git_repository -> Ptr C'git_oid -> IO CInt) -> (Ptr (Ptr a) -> Ptr C'git_repository -> Ptr C'git_oid -> CSize -> IO CInt) -> (ForeignPtr C'git_oid -> ForeignPtr a -> Ptr a -> m b) -> m b
- Git.Libgit2.Types: type MonadLg m = (Applicative m, MonadExcept m, MonadIO m, MonadBaseControl IO m)
+ Git.Libgit2.Types: type MonadLg m = (Applicative m, MonadExcept m, MonadUnliftIO m)

Files

Git/Libgit2.hs view
@@ -21,6 +21,7 @@ --   queried as needed. module Git.Libgit2        ( MonadLg+       , HasLgRepo(..)        , LgRepo(..)        , BlobOid()        , Commit()@@ -58,16 +59,15 @@ import           Conduit import           Control.Applicative import           Control.Concurrent (threadDelay)-import           Control.Concurrent.Async.Lifted import           Control.Concurrent.STM---import           Control.Exception.Lifted+import           UnliftIO.Async import           Control.Monad hiding (forM, forM_, mapM, mapM_, sequence) import           Control.Monad.Catch import           Control.Monad.Loops import           Control.Monad.Reader.Class-import           Control.Monad.Trans.Control import           Control.Monad.Trans.Reader (ReaderT, runReaderT) import           Control.Monad.Trans.Resource+import           Control.Monad.IO.Unlift import           Data.Bits ((.|.), (.&.)) import           Data.ByteString (ByteString) import qualified Data.ByteString as B@@ -174,10 +174,15 @@  instance Eq OidPtr where     oid1 == oid2 = oid1 `compare` oid2 == EQ--instance (Applicative m, MonadExcept m,-          MonadBaseControl IO m, MonadIO m)-         => Git.MonadGit LgRepo (ReaderT LgRepo m) where++class HasLgRepo m where+  getRepository :: m LgRepo++instance Monad m => HasLgRepo (ReaderT LgRepo m) where+  getRepository = ask++instance (Applicative m, MonadExcept m, MonadUnliftIO m, HasLgRepo m)+         => Git.MonadGit LgRepo m where     type Oid LgRepo = OidPtr     data Tree LgRepo =         LgTree { lgTreePtr :: Maybe (ForeignPtr C'git_tree) }@@ -185,7 +190,7 @@      facts = return Git.RepositoryFacts { Git.hasSymbolicReferences = True } -    getRepository    = ask+    getRepository    = getRepository     closeRepository  = return ()     deleteRepository =         Git.getRepository >>= liftIO . removeDirectoryRecursive . lgRepoPath@@ -202,6 +207,7 @@     lookupBlob        = lgLookupBlob     lookupTag         = error "Not implemented: LgRepository.lookupTag"     readIndex         = lgReadIndex+    writeIndex        = error "Not implemented: LgRepository.writeIndex"     lookupObject      = lgLookupObject     existsObject      = lgExistsObject     sourceObjects     = lgSourceObjects@@ -223,19 +229,20 @@      -- remoteFetch     = lgRemoteFetch -lgExcTrap :: MonadLg m => ReaderT LgRepo m (IORef (Maybe Git.GitException))-lgExcTrap = repoExcTrap `liftM` Git.getRepository+lgExcTrap :: (MonadLg m, HasLgRepo m)+          => m (IORef (Maybe Git.GitException))+lgExcTrap = repoExcTrap `liftM` getRepository -lgWrap :: MonadLg m => ReaderT LgRepo m a -> ReaderT LgRepo m a+lgWrap :: (MonadLg m, HasLgRepo m) => m a -> m a lgWrap f = f `catch` \e -> do     etrap <- lgExcTrap     mexc  <- liftIO $ readIORef etrap     liftIO $ writeIORef etrap Nothing     maybe (throwM (e :: SomeException)) throwM mexc -lgHashContents :: MonadLg m-               => Git.BlobContents (ReaderT LgRepo m)-               -> ReaderT LgRepo m BlobOid+lgHashContents :: (MonadLg m, HasLgRepo m)+               => Git.BlobContents m+               -> m BlobOid lgHashContents b = do     ptr <- liftIO mallocForeignPtr     r   <- Git.blobContentsToByteString b >>= \bs ->@@ -250,11 +257,11 @@ -- --   Note that since empty blobs cannot exist in Git, no means is provided for --   creating one; if the given string is 'empty', it is an error.-lgCreateBlob :: MonadLg m-             => Git.BlobContents (ReaderT LgRepo m)-             -> ReaderT LgRepo m BlobOid+lgCreateBlob :: (MonadLg m, HasLgRepo m)+             => Git.BlobContents m+             -> m BlobOid lgCreateBlob b = do-    repo <- Git.getRepository+    repo <- getRepository     ptr  <- liftIO mallocForeignPtr -- freed automatically if GC'd     r <- case b of         Git.BlobString bs         -> createBlob repo ptr bs@@ -305,7 +312,7 @@ lgObjToBlob :: MonadLg m             => BlobOid             -> ForeignPtr C'git_blob-            -> ReaderT LgRepo m (Git.Blob LgRepo (ReaderT LgRepo m))+            -> m (Git.Blob LgRepo m) lgObjToBlob oid fptr = do     bs <- liftIO $ withForeignPtr fptr $ \ptr -> do         size <- c'git_blob_rawsize ptr@@ -313,16 +320,16 @@         B.packCStringLen (castPtr buf, fromIntegral size)     return $ Git.Blob oid $ Git.BlobString bs -lgLookupBlob :: MonadLg m+lgLookupBlob :: (MonadLg m, HasLgRepo m)              => BlobOid-             -> ReaderT LgRepo m (Git.Blob LgRepo (ReaderT LgRepo m))+             -> m (Git.Blob LgRepo m) lgLookupBlob oid =     lookupObject' (getOid (untag oid)) (getOidLen (untag oid))         c'git_blob_lookup c'git_blob_lookup_prefix         $ \boid obj _ -> lgObjToBlob (Tagged (mkOid boid)) obj -lgTreeEntry :: MonadLg m-            => Tree -> Git.TreeFilePath -> ReaderT LgRepo m (Maybe TreeEntry)+lgTreeEntry :: (MonadLg m, HasLgRepo m)+            => Tree -> Git.TreeFilePath -> m (Maybe TreeEntry) lgTreeEntry (LgTree Nothing) _ = return Nothing lgTreeEntry (LgTree (Just tree)) fp = liftIO $ alloca $ \entryPtr ->     withFilePath fp $ \pathStr ->@@ -332,7 +339,7 @@                 then return Nothing                 else Just <$> (entryToTreeEntry =<< peek entryPtr) -lgTreeOid :: MonadLg m => Tree -> ReaderT LgRepo m TreeOid+lgTreeOid :: (MonadLg m, HasLgRepo m) => Tree -> m TreeOid lgTreeOid (LgTree Nothing) =     liftIO $ Tagged . fromJust <$> lgParseOidIO Git.emptyTreeId 40 lgTreeOid (LgTree (Just tree)) = liftIO $ do@@ -340,14 +347,14 @@     ftoid <- coidPtrToOid toid     return $ Tagged (mkOid ftoid) -gatherFrom' :: (MonadIO m, MonadBaseControl IO m, MonadExcept m)+gatherFrom' :: (MonadExcept m, MonadUnliftIO m)            => Int                -- ^ Size of the queue to create            -> (TBQueue o -> m ()) -- ^ Action that generates output values            -> Producer m o gatherFrom' size scatter = do     chan   <- liftIO $ newTBQueueIO size     worker <- lift $ async (scatter chan)-    lift . restoreM =<< gather worker chan+    gather worker chan   where     gather worker chan = do         (xs, mres) <- liftIO $ atomically $ do@@ -361,9 +368,9 @@             Nothing        -> gather worker chan  lgSourceTreeEntries-    :: MonadLg m+    :: (MonadLg m, HasLgRepo m)     => Tree-    -> Producer (ReaderT LgRepo m) (Git.TreeFilePath, TreeEntry)+    -> Producer m (Git.TreeFilePath, TreeEntry) lgSourceTreeEntries (LgTree Nothing) = return () lgSourceTreeEntries (LgTree (Just tree)) = gatherFrom' 16 $ \queue -> do     liftIO $ withForeignPtr tree $ \tr -> do@@ -383,8 +390,8 @@             writeTBQueue queue $ name `seq` entry `seq` (name,entry)         return 0 -lgMakeBuilder :: MonadLg m-              => ForeignPtr C'git_treebuilder -> TreeBuilder (ReaderT LgRepo m)+lgMakeBuilder :: (MonadLg m, HasLgRepo m)+              => ForeignPtr C'git_treebuilder -> TreeBuilder m lgMakeBuilder builder = Git.TreeBuilder     { Git.mtbBaseTreeOid    = Nothing     , Git.mtbPendingUpdates = mempty@@ -403,9 +410,9 @@ -- --   Since empty trees cannot exist in Git, attempting to write out an empty --   tree is a no-op.-lgNewTreeBuilder :: MonadLg m+lgNewTreeBuilder :: (MonadLg m, HasLgRepo m)                  => Maybe Tree-                 -> ReaderT LgRepo m (TreeBuilder (ReaderT LgRepo m))+                 -> m (TreeBuilder m) lgNewTreeBuilder mtree = do     mfptr <- liftIO $ alloca $ \pptr -> do         r <- case mtree of@@ -431,7 +438,7 @@  lgPutEntry :: MonadLg m            => ForeignPtr C'git_treebuilder -> Git.TreeFilePath -> TreeEntry-           -> ReaderT LgRepo m ()+           -> m () lgPutEntry builder key (treeEntryToOid -> (oid, mode)) = do     r2 <- liftIO $ withForeignPtr (getOid oid) $ \coid ->         withForeignPtr builder $ \ptr ->@@ -453,7 +460,7 @@  lgDropEntry :: MonadLg m             => ForeignPtr C'git_treebuilder -> Git.TreeFilePath-            -> ReaderT LgRepo m ()+            -> m () lgDropEntry builder key =     void $ liftIO $ withForeignPtr builder $ \ptr ->         withFilePath key $ c'git_treebuilder_remove ptr@@ -461,7 +468,7 @@ lgLookupBuilderEntry :: MonadLg m                      => ForeignPtr C'git_treebuilder                      -> Git.TreeFilePath-                     -> ReaderT LgRepo m (Maybe TreeEntry)+                     -> m (Maybe TreeEntry) lgLookupBuilderEntry builderPtr name = do     entry <- liftIO $ withForeignPtr builderPtr $ \builder ->         withFilePath name $ c'git_treebuilder_get builder@@ -470,7 +477,7 @@         else Just <$> liftIO (entryToTreeEntry entry)  lgBuilderEntryCount :: MonadLg m-                    => ForeignPtr C'git_treebuilder -> ReaderT LgRepo m Int+                    => ForeignPtr C'git_treebuilder -> m Int lgBuilderEntryCount tb =     fromIntegral <$> liftIO (withForeignPtr tb c'git_treebuilder_entrycount) @@ -479,10 +486,10 @@ lgTreeEntryCount (LgTree (Just tree)) =     fromIntegral <$> liftIO (withForeignPtr tree c'git_tree_entrycount) -lgWriteBuilder :: MonadLg m-               => ForeignPtr C'git_treebuilder -> ReaderT LgRepo m TreeOid+lgWriteBuilder :: (MonadLg m, HasLgRepo m)+               => ForeignPtr C'git_treebuilder -> m TreeOid lgWriteBuilder tb = do-    repo <- Git.getRepository+    repo <- getRepository     (r3,coid) <- liftIO $ do         coid <- mallocForeignPtr         withForeignPtr coid $ \coid' ->@@ -522,7 +529,7 @@             throwM (Git.BackendError "Could not insert entry in treebuilder")         return 0 -lgLookupTree :: MonadLg m => TreeOid -> ReaderT LgRepo m Tree+lgLookupTree :: (MonadLg m, HasLgRepo m) => TreeOid -> m Tree lgLookupTree (untag -> oid)     | show oid == unpack Git.emptyTreeId = return $ LgTree Nothing     | otherwise = do@@ -586,16 +593,16 @@         , Git.commitEncoding  = "utf-8"         } -lgLookupCommit :: MonadLg m => CommitOid -> ReaderT LgRepo m Commit+lgLookupCommit :: (MonadLg m, HasLgRepo m) => CommitOid -> m Commit lgLookupCommit oid =   lookupObject' (getOid (untag oid)) (getOidLen (untag oid))       c'git_commit_lookup c'git_commit_lookup_prefix       $ \coid obj _ -> liftIO $ withForeignPtr obj $           lgObjToCommit (Tagged (mkOid coid)) -lgReadIndex :: MonadLg m => Git.TreeT LgRepo (ReaderT LgRepo m) ()+lgReadIndex :: (MonadLg m, HasLgRepo m) => Git.TreeT LgRepo m () lgReadIndex = do-  repo <- lift Git.getRepository+  repo <- lift getRepository   xs <- liftIO $ withForeignPtr (repoObj repo) $ \repoPtr ->     alloca $ \indexPp -> do       r <- c'git_repository_index indexPp repoPtr@@ -634,10 +641,11 @@                | CommitPtr (ForeignPtr C'git_commit)                | TagPtr (ForeignPtr C'git_tag) -lgLookupObject :: MonadLg m+lgLookupObject :: (MonadLg m, HasLgRepo m)                => Oid-               -> ReaderT LgRepo m (Git.Object LgRepo (ReaderT LgRepo m))+               -> m (Git.Object LgRepo m) lgLookupObject oid = do+    repo <- getRepository     (oid', typ, fptr) <-         lookupObject' (getOid oid) (getOidLen oid)             (\x y z   -> c'git_object_lookup x y z c'GIT_OBJ_ANY)@@ -656,12 +664,22 @@                 Git.CommitObj <$>                 liftIO (withForeignPtr fptr $ \y ->                          lgObjToCommit (Tagged oid') (castPtr y))-           | typ == c'GIT_OBJ_TAG -> error "jww (2013-07-08): NYI"+           | typ == c'GIT_OBJ_TAG -> do+                commit <- liftIO (withForeignPtr (repoObj repo) $ \repoPtr ->+                     liftIO (withForeignPtr fptr $ \y ->+                           do oid'' <- c'git_tag_target_id (castPtr y)+                              alloca $ \pptr -> do+                                  _ <- c'git_commit_lookup pptr repoPtr oid''+                                  ptr <- peek pptr+                                  coid <- coidPtrToOid oid''+                                  lgObjToCommit (Tagged . mkOid $ coid) ptr+                        ))+                Git.CommitObj <$> (pure commit)            | otherwise -> error $ "Unknown object type: " ++ show typ -lgExistsObject :: MonadLg m => Oid -> ReaderT LgRepo m Bool+lgExistsObject :: (MonadLg m, HasLgRepo m) => Oid -> m Bool lgExistsObject oid = do-    repo <- Git.getRepository+    repo <- getRepository     result <- liftIO $ withForeignPtr (repoObj repo) $ \repoPtr ->         alloca $ \pptr -> do             r <- c'git_repository_odb pptr repoPtr@@ -687,11 +705,11 @@         freeHaskellFunPtr         (flip (c'git_odb_foreach odbPtr) payload) -lgSourceObjects :: MonadLg m+lgSourceObjects :: (MonadLg m, HasLgRepo m)                 => Maybe CommitOid -> CommitOid -> Bool-                -> Producer (ReaderT LgRepo m) ObjectOid+                -> Producer m ObjectOid lgSourceObjects mhave need alsoTrees = do-    repo   <- lift Git.getRepository+    repo   <- lift getRepository     walker <- liftIO $ alloca $ \pptr -> do         r <- withForeignPtr (repoObj repo) $ \repoPtr ->                 c'git_revwalk_new pptr repoPtr@@ -735,16 +753,16 @@  -- | Write out a commit to its repository.  If it has already been written, --   nothing will happen.-lgCreateCommit :: MonadLg m+lgCreateCommit :: (MonadLg m, HasLgRepo m)                => [CommitOid]                -> TreeOid                -> Git.Signature                -> Git.Signature                -> Git.CommitMessage                -> Maybe Git.RefName-               -> ReaderT LgRepo m Commit+               -> m Commit lgCreateCommit pptrs tree author committer logText ref = do-    repo <- Git.getRepository+    repo <- getRepository     let toid  = getOid . untag $ tree     coid <- liftIO $ withForeignPtr (repoObj repo) $ \repoPtr -> do         coid <- mallocForeignPtr@@ -791,9 +809,9 @@     mapM_ touchForeignPtr fos     return r -lgLookupRef :: MonadLg m => Git.RefName -> ReaderT LgRepo m (Maybe RefTarget)+lgLookupRef :: (MonadLg m, HasLgRepo m) => Git.RefName -> m (Maybe RefTarget) lgLookupRef name = do-    repo <- Git.getRepository+    repo <- getRepository     liftIO $ alloca $ \ptr -> do         r <- withForeignPtr (repoObj repo) $ \repoPtr ->               withCString (unpack name) $ \namePtr ->@@ -813,10 +831,10 @@             c'git_reference_free ref             return (Just targ) -lgUpdateRef :: MonadLg m-            => Git.RefName -> Git.RefTarget LgRepo -> ReaderT LgRepo m ()+lgUpdateRef :: (MonadLg m, HasLgRepo m)+            => Git.RefName -> Git.RefTarget LgRepo -> m () lgUpdateRef name refTarg = do-    repo <- Git.getRepository+    repo <- getRepository     r <- liftIO $ alloca $ \ptr ->         withForeignPtr (repoObj repo) $ \repoPtr ->         withCString (unpack name) $ \namePtr ->@@ -837,7 +855,7 @@  lgResolveRef :: MonadLg m => Git.RefName -> ReaderT LgRepo m (Maybe CommitOid) lgResolveRef name = do-    repo <- Git.getRepository+    repo <- getRepository     oid <- liftIO $ alloca $ \ptr ->         withCString (unpack name) $ \namePtr ->         withForeignPtr (repoObj repo) $ \repoPtr -> do@@ -852,9 +870,9 @@  --renameRef = c'git_reference_rename -lgDeleteRef :: MonadLg m => Git.RefName -> ReaderT LgRepo m ()+lgDeleteRef :: (MonadLg m, HasLgRepo m) => Git.RefName -> m () lgDeleteRef name = do-    repo <- Git.getRepository+    repo <- getRepository     r <- liftIO $ alloca $ \ptr ->         withCString (unpack name) $ \namePtr ->         withForeignPtr (repoObj repo) $ \repoPtr -> do@@ -920,10 +938,11 @@                  + (if listFlagPacked flags   then 4 else 0)                  + (if listFlagHasPeel flags  then 8 else 0) -lgSourceRefs :: MonadLg m => Producer (ReaderT LgRepo m) Git.RefName++lgSourceRefs :: (MonadLg m, HasLgRepo m) => Producer m Git.RefName lgSourceRefs =     gatherFrom' 16 $ \queue -> do-        repo <- Git.getRepository+        repo <- getRepository         r <- liftIO $ bracket             (mk'git_reference_foreach_cb (callback queue))             freeHaskellFunPtr@@ -1022,7 +1041,7 @@         Git.DiffTreeToIndexFailed "Cannot diff against an empty tree"  lgDiffContentsWithTree contents tree = do-    repo <- lift Git.getRepository+    repo <- lift getRepository     gatherFrom' 16 $ generateDiff repo   where     -- generateDiff :: MonadLg m => LgRepo -> TBQueue ByteString -> m ()@@ -1223,7 +1242,7 @@                 => FilePath -> [Either CommitOid TreeOid]                 -> ReaderT LgRepo m FilePath lgBuildPackFile dir oids = do-    repo <- Git.getRepository+    repo <- getRepository     liftIO $ do         (filePath, fHandle) <- openBinaryTempFile dir "pack"         hClose fHandle@@ -1273,14 +1292,14 @@ lift_ :: (Monad m, Functor (t m), MonadTrans t) => m a -> t m () lift_ = void . lift -lgBuildPackIndex :: (MonadIO m, MonadBaseControl IO m)+lgBuildPackIndex :: MonadUnliftIO m                  => FilePath -> BL.ByteString -> m (Text, FilePath, FilePath) lgBuildPackIndex dir bytes = do     sha <- go dir bytes     return (sha, dir </> ("pack-" <> unpack sha <> ".pack"),                  dir </> ("pack-" <> unpack sha <> ".idx"))   where-    go dir bytes = control $ \run -> alloca $ \idxPtrPtr -> runResourceT $ do+    go dir bytes = withRunInIO $ \run -> alloca $ \idxPtrPtr -> runResourceT $ do         lift_ . run $ lgDebug "Allocate a new indexer stream"         (_,idxPtr) <- flip allocate c'git_indexer_stream_free $             withCString dir $ \dirStr -> do@@ -1342,8 +1361,8 @@     -- yet because it only calls into the Libgit2 backend, which doesn't know     -- anything about the S3 backend.  As far as Libgit2 is concerned, the S3     -- backend is just a black box with no special properties.-    repo <- Git.getRepository-    control $ \run -> withForeignPtr (repoObj repo) $ \repoPtr ->+    repo <- getRepository+    withRunInIO $ \run -> withForeignPtr (repoObj repo) $ \repoPtr ->         alloca $ \odbPtrPtr ->         alloca $ \statsPtr ->         alloca $ \writepackPtrPtr -> do@@ -1385,7 +1404,7 @@         checkResult r "c'git_odb_writepack'commit failed"  lgLoadPackFileInMemory-    :: (MonadBaseControl IO m, MonadIO m, MonadExcept m)+    :: (MonadIO m, MonadExcept m)     => FilePath     -> Ptr (Ptr C'git_odb_backend)     -> Ptr (Ptr C'git_odb)@@ -1416,22 +1435,22 @@      return odbPtr -lgOpenPackFile :: (MonadBaseControl IO m, MonadIO m, MonadExcept m)+lgOpenPackFile :: (MonadExcept m, MonadUnliftIO m)                => FilePath -> m (Ptr C'git_odb)-lgOpenPackFile idxPath = control $ \run ->+lgOpenPackFile idxPath = withRunInIO $ \run ->     alloca $ \odbPtrPtr ->     alloca $ \backendPtrPtr -> run $         lgLoadPackFileInMemory idxPath backendPtrPtr odbPtrPtr -lgClosePackFile :: (MonadBaseControl IO m, MonadIO m, MonadExcept m)+lgClosePackFile :: (MonadIO m, MonadExcept m)                => Ptr C'git_odb -> m () lgClosePackFile = liftIO . c'git_odb_free -lgWithPackFile :: (MonadBaseControl IO m, MonadIO m, MonadExcept m)+lgWithPackFile :: (MonadExcept m, MonadUnliftIO m)                => FilePath -> (Ptr C'git_odb -> m a) -> m a lgWithPackFile idxPath = bracket (lgOpenPackFile idxPath) lgClosePackFile -lgReadFromPack :: (MonadBaseControl IO m, MonadIO m, MonadExcept m)+lgReadFromPack :: (MonadIO m, MonadExcept m)                => Ptr C'git_odb -> Git.SHA -> Bool                -> m (Maybe (C'git_otype, CSize, ByteString)) lgReadFromPack odbPtr sha metadataOnly = liftIO $ do@@ -1472,7 +1491,7 @@  lgRemoteFetch :: MonadLg m => Text -> Text -> ReaderT LgRepo m () lgRemoteFetch uri fetchSpec = do-    xferRepo <- Git.getRepository+    xferRepo <- getRepository     liftIO $ withForeignPtr (repoObj xferRepo) $ \repoPtr ->         withCString (unpack uri) $ \uriStr ->         withCString (unpack fetchSpec) $ \fetchStr ->@@ -1492,7 +1511,7 @@         r2 <- liftIO $ c'git_remote_download remotePtr nullFunPtr nullPtr         checkResult r2 "c'git_remote_download failed" -lgFactory :: MonadIO m+lgFactory :: (MonadIO m, MonadMask m)           => Git.RepositoryFactory (ReaderT LgRepo m) m LgRepo lgFactory = Git.RepositoryFactory     { Git.openRepository = openLgRepository@@ -1502,26 +1521,25 @@ runLgRepository :: LgRepo -> ReaderT LgRepo m a -> m a runLgRepository = flip runReaderT -openLgRepository :: MonadIO m => Git.RepositoryOptions -> m LgRepo+openLgRepository :: (MonadIO m, MonadMask m) => Git.RepositoryOptions -> m LgRepo openLgRepository opts = do     startupLgBackend     let path = Git.repoPath opts     p <- liftIO $ doesDirectoryExist path-    liftIO $ openRepositoryWith path $+    openRepositoryWith path $         if not (Git.repoAutoCreate opts) || p         then c'git_repository_open         else \x y -> c'git_repository_init x y                          (fromBool (Git.repoIsBare opts))   where     openRepositoryWith path fn = do-        fptr <- alloca $ \ptr ->-            withCString path $ \str -> do-                r <- fn ptr str-                when (r < 0) $-                    error $ "Could not open repository " ++ show path-                ptr' <- peek ptr-                FC.newForeignPtr ptr' (c'git_repository_free ptr')-        excTrap <- newIORef Nothing+        ptr <- liftIO malloc+        r <- liftIO $ withCString path $ fn ptr+        when (r < 0) $ lgThrow Git.RepositoryCannotAccess+        excTrap <- liftIO $ newIORef Nothing+        fptr <- liftIO $ do+            ptr' <- peek ptr+            FC.newForeignPtr ptr' (c'git_repository_free ptr')         return LgRepo             { repoOptions = opts             , repoObj     = fptr
Git/Libgit2/Internal.hs view
@@ -10,7 +10,7 @@ import           Control.Applicative import           Control.Monad import           Control.Monad.Catch-import           Control.Monad.Trans.Control+import           Control.Monad.IO.Unlift import           Data.ByteString import qualified Data.Text as T import qualified Data.Text.ICU.Convert as U@@ -51,7 +51,7 @@     return fptr  lookupObject'-  :: (Git.MonadGit LgRepo m, MonadBaseControl IO m)+  :: (Git.MonadGit LgRepo m, MonadUnliftIO m)   => ForeignPtr C'git_oid -> Int   -> (Ptr (Ptr a) -> Ptr C'git_repository -> Ptr C'git_oid -> IO CInt)   -> (Ptr (Ptr a) -> Ptr C'git_repository -> Ptr C'git_oid -> CSize -> IO CInt)@@ -59,7 +59,7 @@   -> m b lookupObject' oid len lookupFn lookupPrefixFn createFn = do     repo <- Git.getRepository-    result <- liftBaseWith $ \run -> alloca $ \ptr -> do+    result <- withRunInIO $ \run -> alloca $ \ptr -> do         r <- withForeignPtr (repoObj repo) $ \repoPtr ->             withForeignPtr oid $ \oidPtr ->                 if len == 40@@ -85,7 +85,7 @@               let p = castPtr ptr'               fptr <- FC.newForeignPtr p (c'git_object_free p)               Right <$> run (createFn coidCopy (castForeignPtr fptr) ptr')-    either (throwM . Git.BackendError) restoreM result+    either (throwM . Git.BackendError) pure result  -- lgLookupObject :: Text -> LgRepository Dynamic -- lgLookupObject str
Git/Libgit2/Types.hs view
@@ -12,7 +12,7 @@ import           Control.Applicative import           Control.Monad.Catch import           Control.Monad.IO.Class-import           Control.Monad.Trans.Control+import           Control.Monad.IO.Unlift import           Data.IORef import           Foreign.ForeignPtr import qualified Git@@ -53,7 +53,6 @@  type MonadExcept m = (MonadThrow m, MonadCatch m, MonadMask m) -type MonadLg m = (Applicative m, MonadExcept m,-                  MonadIO m, MonadBaseControl IO m)+type MonadLg m = (Applicative m, MonadExcept m, MonadUnliftIO m)  -- Types.hs
gitlib-libgit2.cabal view
@@ -1,5 +1,5 @@ Name:                gitlib-libgit2-Version:       3.1.1+Version:             3.1.2 Synopsis:            Libgit2 backend for gitlib License-file:        LICENSE License:             MIT@@ -21,11 +21,11 @@     Type: exitcode-stdio-1.0     Main-is: Smoke.hs     Hs-source-dirs: test-    Build-depends: +    Build-depends:           base >=3         , gitlib             >= 3.1.1         , gitlib-test        >= 3.0.0-        , gitlib-libgit2     >= 3.1.1+        , gitlib-libgit2         , HUnit              >= 1.2.5         , hspec              >= 1.4.4         , hspec-expectations >= 0.3@@ -48,10 +48,7 @@         , exceptions           >= 0.6         , fast-logger         , filepath             >= 1.3.0-        , lifted-async         >= 0.1.0-        , lifted-base          >= 0.2.0.2         , mmorph               >= 1.0.0-        , monad-control        >= 1.0         , monad-loops          >= 0.3.3.0         , mtl                  >= 2.1.2         , resourcet            >= 1.1.0@@ -64,6 +61,8 @@         , time                 >= 1.4         , transformers         >= 0.3.0.0         , transformers-base    >= 0.4.1+        , unliftio-core        >= 0.1.1+        , unliftio     exposed-modules:         Git.Libgit2         Git.Libgit2.Backend