gitlib 1.0.1 → 1.1.0
raw patch · 2 files changed
+211/−73 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Git: Tree :: (FilePath -> Bool -> (Maybe (TreeEntry m) -> m (ModifyTreeResult m)) -> m (Maybe (TreeEntry m))) -> (FilePath -> m (Maybe (TreeEntry m))) -> (FilePath -> TreeEntry m -> m ()) -> (FilePath -> BlobOid m -> BlobKind -> m ()) -> (FilePath -> BlobOid m -> m ()) -> (FilePath -> TreeRef m -> m ()) -> (FilePath -> CommitOid m -> m ()) -> (FilePath -> m ()) -> m (TreeOid m) -> (forall a. (FilePath -> TreeEntry m -> m a) -> m [a]) -> ((FilePath -> TreeEntry m -> m ()) -> m ()) -> !(TreeData m) -> Tree m
- Git: data Tree m
- Git: dropFromTree :: Tree m -> FilePath -> m ()
- Git: getTreeData :: Tree m -> !(TreeData m)
- Git: lookupEntry :: Tree m -> FilePath -> m (Maybe (TreeEntry m))
- Git: mkTree :: Repository m => (Tree m -> FilePath -> Bool -> (Maybe (TreeEntry m) -> m (ModifyTreeResult m)) -> m (Maybe (TreeEntry m))) -> (Tree m -> m (TreeOid m)) -> (forall a. Tree m -> (FilePath -> TreeEntry m -> m a) -> m [a]) -> TreeData m -> Tree m
- Git: modifyTree :: Tree m -> FilePath -> Bool -> (Maybe (TreeEntry m) -> m (ModifyTreeResult m)) -> m (Maybe (TreeEntry m))
- Git: putTreeEntry :: Tree m -> FilePath -> TreeEntry m -> m ()
+ Git: class (Eq o, Ord o, Show o) => IsOid o where renderOid = renderObjOid . Tagged renderObjOid = renderOid . unTagged
+ Git: cloneTree :: Repository m => Tree m -> m (Tree m)
+ Git: createTree :: Repository m => TreeT m a -> m (Tree m)
+ Git: data TreeT m a
+ Git: dropEntry :: Repository m => FilePath -> TreeT m ()
+ Git: getEntry :: Repository m => FilePath -> TreeT m (Maybe (TreeEntry m))
+ Git: getTreeEntry :: Repository m => Tree m -> FilePath -> m (Maybe (TreeEntry m))
+ Git: instance (Functor m, Monad m) => Applicative (TreeT m)
+ Git: instance (Functor m, MonadPlus m) => Alternative (TreeT m)
+ Git: instance Functor m => Functor (TreeT m)
+ Git: instance Monad m => Monad (TreeT m)
+ Git: instance MonadFix m => MonadFix (TreeT m)
+ Git: instance MonadIO m => MonadIO (TreeT m)
+ Git: instance MonadPlus m => MonadPlus (TreeT m)
+ Git: instance MonadTrans TreeT
+ Git: mutateTree :: Repository m => Tree m -> TreeT m a -> m (Tree m)
+ Git: putEntry :: Repository m => FilePath -> TreeEntry m -> TreeT m ()
+ Git: unsafeGetTree :: Monad m => TreeT m (Tree m)
+ Git: unsafeMutateTree :: Repository m => Tree m -> TreeT m a -> m (Tree m)
+ Git: unsafeMutateTree_ :: Repository m => Tree m -> TreeT m a -> m ()
+ Git: unsafePutTree :: Monad m => Tree m -> TreeT m ()
+ Git: unsafeUpdateTree :: Repository m => Tree m -> FilePath -> Bool -> (Maybe (TreeEntry m) -> ModifyTreeResult m) -> m (Tree m, Maybe (TreeEntry m))
+ Git: unsafeWithTree :: Repository m => Tree m -> TreeT m a -> m (a, Tree m)
+ Git: withNewTree :: Repository m => TreeT m a -> m (a, Tree m)
+ Git: withTree :: Repository m => Tree m -> TreeT m a -> m (a, Tree m)
- Git: class (Applicative m, Monad m, Failure GitException m, Eq (Oid m), Ord (Oid m), Show (Oid m)) => Repository m where data family Oid m data family TreeData m data family Options m renderOid = renderObjOid . Tagged renderObjOid = renderOid . unTagged createRef_ = (void .) . createRef updateRef_ = (void .) . updateRef allRefs = catMaybes <$> (mapM lookupRef =<< allRefNames) allRefNames = map refName <$> allRefs resolveRef name = lookupRef name >>= referenceToRef (Just name) traverseObjects_ = (void .) . traverseObjects traverseCommits_ = (void .) . traverseCommits buildPackFile _ _ = failure (BackendError "Backend does not support building pack files") buildPackIndex _ _ = failure (BackendError "Backend does not support building pack indexes") writePackFile _ = failure (BackendError "Backend does not support writing pack files")
+ Git: class (Applicative m, Monad m, Failure GitException m, IsOid (Oid m)) => Repository m where type family Oid m type family Tree m data family Options m createRef_ = (void .) . createRef updateRef_ = (void .) . updateRef allRefs = catMaybes <$> (mapM lookupRef =<< allRefNames) allRefNames = map refName <$> allRefs resolveRef name = lookupRef name >>= referenceToRef (Just name) traverseObjects_ = (void .) . traverseObjects traverseCommits_ = (void .) . traverseCommits traverseEntries_ = (void .) . traverseEntries buildPackFile _ _ = failure (BackendError "Backend does not support building pack files") buildPackIndex _ _ = failure (BackendError "Backend does not support building pack indexes") writePackFile _ = failure (BackendError "Backend does not support writing pack files")
- Git: putBlob :: Tree m -> FilePath -> BlobOid m -> m ()
+ Git: putBlob :: Repository m => FilePath -> BlobOid m -> TreeT m ()
- Git: putBlob' :: Tree m -> FilePath -> BlobOid m -> BlobKind -> m ()
+ Git: putBlob' :: Repository m => FilePath -> BlobOid m -> BlobKind -> TreeT m ()
- Git: putCommit :: Tree m -> FilePath -> CommitOid m -> m ()
+ Git: putCommit :: Repository m => FilePath -> CommitOid m -> TreeT m ()
- Git: putTree :: Tree m -> FilePath -> TreeRef m -> m ()
+ Git: putTree :: Repository m => FilePath -> TreeRef m -> TreeT m ()
- Git: renderObjOid :: Repository m => Tagged a (Oid m) -> Text
+ Git: renderObjOid :: IsOid o => Tagged a o -> Text
- Git: renderOid :: Repository m => Oid m -> Text
+ Git: renderOid :: IsOid o => o -> Text
- Git: traverseEntries :: Tree m -> forall a. (FilePath -> TreeEntry m -> m a) -> m [a]
+ Git: traverseEntries :: Repository m => (FilePath -> TreeEntry m -> m a) -> Tree m -> m [a]
- Git: traverseEntries_ :: Tree m -> (FilePath -> TreeEntry m -> m ()) -> m ()
+ Git: traverseEntries_ :: Repository m => (FilePath -> TreeEntry m -> m a) -> Tree m -> m ()
- Git: writeTree :: Tree m -> m (TreeOid m)
+ Git: writeTree :: Repository m => Tree m -> m (TreeOid m)
Files
- Git.hs +210/−72
- gitlib.cabal +1/−1
Git.hs view
@@ -1,23 +1,110 @@-{-# LANGUAGE CPP #-} {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TypeFamilies #-} -- | Interface for working with Git repositories.-module Git where+module Git+ ( RepositoryFacts(..)+ , Repository(..)+ , RepositoryFactory(..)+ , RepositoryOptions(..)+ , withBackendDo+ , withRepository+ , withRepository'+ , MonadGit + , IsOid(..)+ , copyOid+ , Object(..)+ , ObjRef(..)+ , objectOid++ , Blob(..)+ , BlobOid+ , BlobContents(..)+ , BlobKind(..)+ , ByteSource+ , BlobRef+ , blobEntry+ , blobRefOid+ , resolveBlobRef++ , TreeT+ , TreeEntry(..)+ , TreeOid+ , TreeRef+ , createTree+ , withNewTree+ , mutateTree+ , withTree+ , unsafeMutateTree+ , unsafeMutateTree_+ , unsafeWithTree+ , unsafeGetTree+ , unsafePutTree+ , dropEntry+ , getEntry+ , getTreeEntry+ , putBlob+ , putBlob'+ , putCommit+ , putEntry+ , putTree+ , resolveTreeRef+ , treeEntry+ , treeEntryOid+ , treeRef+ , treeRefOid+ , ModifyTreeResult(..)+ , fromModifyTreeResult+ , toModifyTreeResult++ , Commit(..)+ , CommitOid+ , CommitName(..)+ , CommitRef+ , Signature(..)+ , commitEntry+ , commitNameToRef+ , commitRef+ , commitRefOid+ , commitRefTarget+ , copyCommitName+ , copyCommitOid+ , nameOfCommit+ , renderCommitName+ , resolveCommitRef++ , Tag(..)+ , TagOid+ , TagRef+ , tagRefOid++ , RefTarget(..)+ , Reference(..)+ , referenceToRef++ , GitException(..)+ , ModificationKind(..)+ , MergeStatus(..)+ , MergeResult(..)+ , mergeStatus+ , copyConflict+ ) where+ import Control.Applicative import qualified Control.Exception.Lifted as Exc import Control.Failure import Control.Monad+import Control.Monad.Fix import Control.Monad.IO.Class import Control.Monad.Trans.Class+import Control.Monad.Trans.State import Data.ByteString (ByteString) import Data.Conduit import Data.Default@@ -40,21 +127,24 @@ type MonadGit m = (Failure Git.GitException m, Applicative m, MonadIO m, MonadBaseControl IO m) +class (Eq o, Ord o, Show o) => IsOid o where+ renderOid :: o -> Text+ renderOid = renderObjOid . Tagged+ renderObjOid :: Tagged a o -> Text+ renderObjOid = renderOid . unTagged+ -- | 'Repository' is the central point of contact between user code and -- Git data objects. Every object must belong to some repository.-class (Applicative m, Monad m, Failure GitException m,- Eq (Oid m), Ord (Oid m), Show (Oid m)) => Repository m where- data Oid m- data TreeData m+class (Applicative m, Monad m, Failure GitException m, IsOid (Oid m))+ => Repository m where+ type Oid m+ type Tree m+ data Options m facts :: m RepositoryFacts parseOid :: Text -> m (Oid m)- renderOid :: Oid m -> Text- renderOid = renderObjOid . Tagged- renderObjOid :: Tagged a (Oid m) -> Text- renderObjOid = renderOid . unTagged -- References createRef :: Text -> RefTarget m (Commit m) -> m (Reference m (Commit m))@@ -105,6 +195,19 @@ -- Object creation newTree :: m (Tree m)+ cloneTree :: Tree m -> m (Tree m)+ traverseEntries :: (FilePath -> TreeEntry m -> m a) -> Tree m -> m [a]+ traverseEntries_ :: (FilePath -> TreeEntry m -> m a) -> Tree m -> m ()+ traverseEntries_ = (void .) . traverseEntries+ writeTree :: Tree m -> m (TreeOid m)++ unsafeUpdateTree+ :: Tree m+ -> FilePath -- path within the tree+ -> Bool -- create subtree's leading up to path?+ -> (Maybe (TreeEntry m) -> ModifyTreeResult m)+ -> m (Tree m, Maybe (TreeEntry m))+ hashContents :: BlobContents m -> m (BlobOid m) createBlob :: BlobContents m -> m (BlobOid m) createCommit :: [CommitRef m] -> TreeRef m@@ -272,6 +375,98 @@ _ == _ = False {- $trees -}+newtype TreeT m a = TreeT { runTreeT :: StateT (Tree m) m a }++instance Functor m => Functor (TreeT m) where+ fmap f (TreeT t) = TreeT (fmap f t)++instance Monad m => Monad (TreeT m) where+ return x = TreeT (return x)+ TreeT x >>= f = TreeT (x >>= runTreeT . f)++instance (Functor m, Monad m) => Applicative (TreeT m) where+ pure = return+ (<*>) = ap++instance (Functor m, MonadPlus m) => Alternative (TreeT m) where+ empty = mzero+ (<|>) = mplus++instance (MonadPlus m) => MonadPlus (TreeT m) where+ mzero = TreeT $ mzero+ m `mplus` n = TreeT $ runTreeT m `mplus` runTreeT n++instance (MonadFix m) => MonadFix (TreeT m) where+ mfix f = TreeT $ mfix $ \ ~a -> runTreeT (f a)++instance MonadTrans TreeT where+ lift m = TreeT $ lift m++instance (MonadIO m) => MonadIO (TreeT m) where+ liftIO = lift . liftIO++unsafeGetTree :: Monad m => TreeT m (Tree m)+unsafeGetTree = TreeT get++unsafePutTree :: Monad m => Tree m -> TreeT m ()+unsafePutTree = TreeT . put++getEntry :: Repository m => FilePath -> TreeT m (Maybe (TreeEntry m))+getEntry path = do+ tr <- unsafeGetTree+ snd <$> lift (unsafeUpdateTree tr path False+ (toModifyTreeResult TreeEntryPersistent))++getTreeEntry :: Repository m => Tree m -> FilePath -> m (Maybe (TreeEntry m))+getTreeEntry tree path = fst <$> unsafeWithTree tree (getEntry path)++putEntry :: Repository m => FilePath -> TreeEntry m -> TreeT m ()+putEntry path ent = do+ tr <- unsafeGetTree+ tr' <- fst <$> lift (unsafeUpdateTree tr path True+ (const (TreeEntryMutated ent)))+ unsafePutTree tr'++dropEntry :: Repository m => FilePath -> TreeT m ()+dropEntry path = do+ tr <- unsafeGetTree+ tr' <- fst <$> lift (unsafeUpdateTree tr path False+ (const TreeEntryDeleted))+ unsafePutTree tr'++putBlob' :: Repository m => FilePath -> BlobOid m -> BlobKind -> TreeT m ()+putBlob' path b kind = putEntry path (BlobEntry b kind)++putBlob :: Repository m => FilePath -> BlobOid m -> TreeT m ()+putBlob path b = putBlob' path b PlainBlob++putTree :: Repository m => FilePath -> TreeRef m -> TreeT m ()+putTree path ent = putEntry path (TreeEntry ent)++putCommit :: Repository m => FilePath -> CommitOid m -> TreeT m ()+putCommit path c = putEntry path (CommitEntry c)++withNewTree :: Repository m => TreeT m a -> m (a, Tree m)+withNewTree (TreeT action) = runStateT action =<< newTree++createTree :: Repository m => TreeT m a -> m (Tree m)+createTree (TreeT action) = execStateT action =<< newTree++withTree :: Repository m => Tree m -> TreeT m a -> m (a, Tree m)+withTree tr (TreeT action) = runStateT action =<< cloneTree tr++unsafeWithTree :: Repository m => Tree m -> TreeT m a -> m (a, Tree m)+unsafeWithTree tr (TreeT action) = runStateT action tr++mutateTree :: Repository m => Tree m -> TreeT m a -> m (Tree m)+mutateTree tr (TreeT action) = execStateT action =<< cloneTree tr++unsafeMutateTree :: Repository m => Tree m -> TreeT m a -> m (Tree m)+unsafeMutateTree tr (TreeT action) = execStateT action tr++unsafeMutateTree_ :: Repository m => Tree m -> TreeT m a -> m ()+unsafeMutateTree_ = (void .) . unsafeMutateTree+ data TreeEntry m = BlobEntry { blobEntryOid :: !(BlobOid m) , blobEntryKind :: !BlobKind } | TreeEntry { treeEntryRef :: !(TreeRef m) }@@ -297,10 +492,10 @@ | TreeEntryMutated (TreeEntry m) fromModifyTreeResult :: ModifyTreeResult m -> Maybe (TreeEntry m)-fromModifyTreeResult TreeEntryNotFound = Nothing-fromModifyTreeResult TreeEntryDeleted = Nothing+fromModifyTreeResult TreeEntryNotFound = Nothing+fromModifyTreeResult TreeEntryDeleted = Nothing fromModifyTreeResult (TreeEntryPersistent x) = Just x-fromModifyTreeResult (TreeEntryMutated x) = Just x+fromModifyTreeResult (TreeEntryMutated x) = Just x toModifyTreeResult :: (TreeEntry m -> ModifyTreeResult m) -> Maybe (TreeEntry m)@@ -309,63 +504,6 @@ toModifyTreeResult f (Just x) = f x -- | A 'Tree' is anything that is "treeish".------ Minimal complete definition: 'modifyTree'. Note that for some treeish--- things, like Tags, it should always be an error to attempt to modify the--- tree in any way.-data Tree m = Tree- { modifyTree :: FilePath -- path within the tree- -> Bool -- create subtree's leading up to path?- -> (Maybe (TreeEntry m) -> m (ModifyTreeResult m))- -> m (Maybe (TreeEntry m))-- , lookupEntry :: FilePath -> m (Maybe (TreeEntry m))- , putTreeEntry :: FilePath -> TreeEntry m -> m ()- , putBlob' :: FilePath -> BlobOid m -> BlobKind -> m ()- , putBlob :: FilePath -> BlobOid m -> m ()- , putTree :: FilePath -> TreeRef m -> m ()- , putCommit :: FilePath -> CommitOid m -> m ()- , dropFromTree :: FilePath -> m ()- , writeTree :: m (TreeOid m)- , traverseEntries :: forall a. (FilePath -> TreeEntry m -> m a) -> m [a]- , traverseEntries_ :: (FilePath -> TreeEntry m -> m ()) -> m ()- , getTreeData :: !(TreeData m)- }--mkTree :: Repository m- => (Tree m- -> FilePath -- path within the tree- -> Bool -- create subtree's leading up to path?- -> (Maybe (TreeEntry m) -> m (ModifyTreeResult m))- -> m (Maybe (TreeEntry m)))- -> (Tree m -> m (TreeOid m))- -> (forall a. Tree m -> (FilePath -> TreeEntry m -> m a) -> m [a])- -> TreeData m- -> Tree m-mkTree modifyTree' writeTree' traverseEntries' treeData = tr- where- tr = Tree- { modifyTree = modifyTree' tr- , lookupEntry =- \path -> modifyTree' tr path False- (return . toModifyTreeResult TreeEntryPersistent)- , putTreeEntry = \path ent ->- void $ modifyTree' tr path True- (const (return (TreeEntryMutated ent)))- , putBlob' = \path b kind ->- putTreeEntry tr path (BlobEntry b kind)- , putBlob = \path b -> putBlob' tr path b PlainBlob- , putTree = \path tr' -> putTreeEntry tr path (TreeEntry tr')- , putCommit = \path c -> putTreeEntry tr path (CommitEntry c)- , dropFromTree = \path ->- void $ modifyTree' tr path False- (const (return TreeEntryDeleted))- , writeTree = writeTree' tr- , traverseEntries = traverseEntries' tr- , traverseEntries_ = void . traverseEntries' tr- , getTreeData = treeData- }- treeRef :: Tree m -> TreeRef m treeRef = Known
gitlib.cabal view
@@ -1,5 +1,5 @@ Name: gitlib-Version: 1.0.1+Version: 1.1.0 Synopsis: API library for working with Git repositories License-file: LICENSE License: MIT