packages feed

gitlib 0.4.0 → 0.4.1

raw patch · 7 files changed

+73/−16 lines, 7 filesdep ~directory

Dependency ranges changed: directory

Files

Data/Git/Commit.hs view
@@ -99,17 +99,6 @@                       , _commitEncoding  = encs                       , _commitObj       = Just $ unsafeCoerce obj } -withGitCommit :: Updatable b-              => ObjRef Commit -> b -> (Ptr C'git_commit -> IO a) -> IO a-withGitCommit cref obj f = do-  c' <- loadObject cref obj-  case c' of-    Nothing -> error "Cannot find Git commit in repository"-    Just co ->-      case co^.commitInfo.gitObj of-        Nothing  -> error "Cannot find Git commit id"-        Just co' -> withForeignPtr co' (f . castPtr)- -- | Write out a commit to its repository.  If it has already been written, --   nothing will happen. writeCommit :: Maybe Text -> Commit -> IO Commit@@ -182,6 +171,22 @@               when (r < 0) $ throwIO CommitLookupFailed               ptr' <- peek ptr               FC.newForeignPtr ptr' (c'git_commit_free ptr')++modifyCommitTree+  :: FilePath -> (Maybe TreeEntry -> Either a (Maybe TreeEntry)) -> Bool+  -> Commit -> IO (Either a Commit)+modifyCommitTree path f createIfNotExist c =+  withObject (c^.commitTree) c $ \tr -> do+    result <- modifyTree path f createIfNotExist tr+    case result of+      Left x    -> return (Left x)+      Right tr' -> return $ Right $ commitTree .~ ObjRef tr' $ c++removeFromCommitTree :: FilePath -> Commit -> IO Commit+removeFromCommitTree path c =+  withObject (c^.commitTree) c $ \tr -> do+    tr' <- removeFromTree path tr+    return $ commitTree .~ ObjRef tr' $ c  doUpdateCommit :: [Text] -> TreeEntry -> Commit -> IO Commit doUpdateCommit xs item c = do
Data/Git/Errors.hs view
@@ -21,6 +21,7 @@                   | TreeBuilderWriteFailed                   | TreeLookupFailed                   | TreeCannotTraverseBlob+                  | TreeEntryLookupFailed                   | CommitCreateFailed                   | CommitLookupFailed                   | ReferenceCreateFailed
Data/Git/Internal.hs view
@@ -21,6 +21,8 @@        , repositoryPtr         , lookupObject'+       , withObject+       , withObjectPtr         , module X )        where@@ -156,6 +158,21 @@                           , _repoObj  = Just fptr }    where doesNotExist = throwIO . RepositoryNotExist . toString++withObject :: (Updatable a, Updatable b) => ObjRef a -> b -> (a -> IO c) -> IO c+withObject objRef parent f = do+  obj <- loadObject objRef parent+  case obj of+    Nothing   -> error "Cannot find Git object in repository"+    Just obj' -> f obj'++withObjectPtr :: (Updatable a, Updatable b)+              => ObjRef a -> b -> (Ptr c -> IO d) -> IO d+withObjectPtr objRef parent f =+  withObject objRef parent $ \obj ->+    case objectPtr obj of+      Nothing     -> error "Cannot find Git object id"+      Just objPtr -> withForeignPtr objPtr (f . castPtr)  lookupObject'   :: Oid -> Repository
Data/Git/Oid.hs view
@@ -42,6 +42,7 @@ --   loadObject from the type class 'Updatable'. data ObjRef a = IdRef COid               | ObjRef a+              deriving Show  wrapOidPtr :: Ptr C'git_oid -> IO (ObjRef a) wrapOidPtr = newForeignPtr_ >=> return . IdRef . COid
Data/Git/Repository.hs view
@@ -15,7 +15,12 @@         , openRepository        , createRepository-       , openOrCreateRepository )+       , openOrCreateRepository++       , lookupObject'+       , withObject+       , withObjectPtr+       )        where  import Data.Git.Internal
Data/Git/Tree.hs view
@@ -89,6 +89,34 @@                        newBase repo (Stored coid) (Just obj)                   , _treeContents = M.empty } +doLookupTreeEntry :: [Text] -> Tree -> IO (Maybe TreeEntry)+doLookupTreeEntry [] _ = throw TreeEntryLookupFailed+doLookupTreeEntry (name:names) t = do+  -- Lookup the current name in this tree.  If it doesn't exist, and there are+  -- more names in the path and 'createIfNotExist' is True, create a new Tree+  -- and descend into it.  Otherwise, if it exists we'll have @Just (TreeEntry+  -- {})@, and if not we'll have Nothing.+  y <- case M.lookup name (t^.treeContents) of+    Nothing -> return Nothing+    Just j  -> case j of+      BlobEntry b mode -> do+        bl <- loadObject b t+        for bl $ \x -> return $ BlobEntry (ObjRef x) mode+      TreeEntry t' -> do+        tr <- loadObject t' t+        for tr $ \x -> return $ TreeEntry (ObjRef x)++  if null names+    then return y+    else+      case y of+        Just (BlobEntry {}) -> throw TreeCannotTraverseBlob+        Just (TreeEntry (ObjRef t')) -> doLookupTreeEntry names t'+        _ -> throw TreeEntryLookupFailed++lookupTreeEntry :: FilePath -> Tree -> IO (Maybe TreeEntry)+lookupTreeEntry = doLookupTreeEntry . splitPath+ withGitTree :: Updatable b             => ObjRef Tree -> b -> (Ptr C'git_tree -> IO a) -> IO a withGitTree tref obj f =@@ -150,7 +178,7 @@     repo = fromMaybe (error "Repository invalid") $                      t^.treeInfo.gitRepo.repoObj -    insertObject :: (CStringable a, Updatable b)+    insertObject :: (CStringable a, Updatable b, Show b)                  => Ptr C'git_treebuilder -> a -> ObjRef b -> CUInt                  -> IO (ObjRef b)     insertObject builder key obj attrs = do@@ -160,7 +188,7 @@           oid <- objectId x           case oid of             Oid (COid y) -> return y-            _ -> error "Unexpected"+            _ -> error $ "Failed to determine object id for: " ++ show x        withForeignPtr coid $ \coid' ->         withCStringable key $ \name -> do
gitlib.cabal view
@@ -1,5 +1,5 @@ Name:                gitlib-Version:             0.4.0+Version:             0.4.1 Synopsis:            Higher-level types for working with hlibgit2 Description:         Higher-level types for working with hlibgit2 License-file:        LICENSE@@ -38,7 +38,7 @@   main-is: doctests.hs   build-depends:       base == 4.*-    , directory >= 1.0 && < 1.2+    , directory >= 1.0 && < 1.3     , doctest   >= 0.8 && <= 0.10     , filepath  >= 1.3 && < 1.4   ghc-options: -Wall -Werror