packages feed

gitlib 2.0.1.1 → 2.1.0.0

raw patch · 10 files changed

+120/−103 lines, 10 filesdep +directorydep +unixdep −system-fileiodep −system-filepathPVP ok

version bump matches the API change (PVP)

Dependencies added: directory, unix

Dependencies removed: system-fileio, system-filepath

API changes (from Hackage documentation)

+ Git.Types: type CommitAuthor = Text
+ Git.Types: type CommitEmail = Text
+ Git.Types: type CommitMessage = Text
+ Git.Types: type RefName = Text
+ Git.Types: type TreeFilePath = RawFilePath
- Git.Blob: treeBlobEntries :: Repository m => Tree m -> m [(Text, BlobOid m, BlobKind)]
+ Git.Blob: treeBlobEntries :: Repository m => Tree m -> m [(TreeFilePath, BlobOid m, BlobKind)]
- Git.Commit: commitTreeEntry :: Repository m => Commit m -> Text -> m (Maybe (TreeEntry m))
+ Git.Commit: commitTreeEntry :: Repository m => Commit m -> TreeFilePath -> m (Maybe (TreeEntry m))
- Git.Commit: copyCommit :: (Repository m, Repository (t m), MonadTrans t) => CommitOid m -> Maybe Text -> HashSet Text -> t m (CommitOid (t m), HashSet Text)
+ Git.Commit: copyCommit :: (Repository m, Repository (t m), MonadTrans t) => CommitOid m -> Maybe RefName -> HashSet Text -> t m (CommitOid (t m), HashSet Text)
- Git.Reference: resolveReference :: Repository m => Text -> m (Maybe (CommitOid m))
+ Git.Reference: resolveReference :: Repository m => RefName -> m (Maybe (CommitOid m))
- Git.Reference: resolveReferenceTree :: Repository m => Text -> m (Maybe (Tree m))
+ Git.Reference: resolveReferenceTree :: Repository m => RefName -> m (Maybe (Tree m))
- Git.Tree.Builder: TreeBuilder :: Maybe (TreeOid m) -> HashMap Text (TreeBuilder m) -> (Maybe (Tree m) -> m (TreeBuilder m)) -> (TreeBuilder m -> m (ModifiedBuilder m, TreeOid m)) -> (Text -> m (Maybe (TreeEntry m))) -> m Int -> (TreeBuilder m -> Text -> TreeEntry m -> m (ModifiedBuilder m)) -> (TreeBuilder m -> Text -> m (ModifiedBuilder m)) -> TreeBuilder m
+ Git.Tree.Builder: TreeBuilder :: Maybe (TreeOid m) -> HashMap TreeFilePath (TreeBuilder m) -> (Maybe (Tree m) -> m (TreeBuilder m)) -> (TreeBuilder m -> m (ModifiedBuilder m, TreeOid m)) -> (TreeFilePath -> m (Maybe (TreeEntry m))) -> m Int -> (TreeBuilder m -> TreeFilePath -> TreeEntry m -> m (ModifiedBuilder m)) -> (TreeBuilder m -> TreeFilePath -> m (ModifiedBuilder m)) -> TreeBuilder m
- Git.Tree.Builder: dropEntry :: Repository m => Text -> TreeT m ()
+ Git.Tree.Builder: dropEntry :: Repository m => TreeFilePath -> TreeT m ()
- Git.Tree.Builder: getEntry :: Repository m => Text -> TreeT m (Maybe (TreeEntry m))
+ Git.Tree.Builder: getEntry :: Repository m => TreeFilePath -> TreeT m (Maybe (TreeEntry m))
- Git.Tree.Builder: mtbDropEntry :: TreeBuilder m -> TreeBuilder m -> Text -> m (ModifiedBuilder m)
+ Git.Tree.Builder: mtbDropEntry :: TreeBuilder m -> TreeBuilder m -> TreeFilePath -> m (ModifiedBuilder m)
- Git.Tree.Builder: mtbLookupEntry :: TreeBuilder m -> Text -> m (Maybe (TreeEntry m))
+ Git.Tree.Builder: mtbLookupEntry :: TreeBuilder m -> TreeFilePath -> m (Maybe (TreeEntry m))
- Git.Tree.Builder: mtbPendingUpdates :: TreeBuilder m -> HashMap Text (TreeBuilder m)
+ Git.Tree.Builder: mtbPendingUpdates :: TreeBuilder m -> HashMap TreeFilePath (TreeBuilder m)
- Git.Tree.Builder: mtbPutEntry :: TreeBuilder m -> TreeBuilder m -> Text -> TreeEntry m -> m (ModifiedBuilder m)
+ Git.Tree.Builder: mtbPutEntry :: TreeBuilder m -> TreeBuilder m -> TreeFilePath -> TreeEntry m -> m (ModifiedBuilder m)
- Git.Tree.Builder: putBlob :: Repository m => Text -> BlobOid m -> TreeT m ()
+ Git.Tree.Builder: putBlob :: Repository m => TreeFilePath -> BlobOid m -> TreeT m ()
- Git.Tree.Builder: putBlob' :: Repository m => Text -> BlobOid m -> BlobKind -> TreeT m ()
+ Git.Tree.Builder: putBlob' :: Repository m => TreeFilePath -> BlobOid m -> BlobKind -> TreeT m ()
- Git.Tree.Builder: putCommit :: Repository m => Text -> CommitOid m -> TreeT m ()
+ Git.Tree.Builder: putCommit :: Repository m => TreeFilePath -> CommitOid m -> TreeT m ()
- Git.Tree.Builder: putEntry :: Repository m => Text -> TreeEntry m -> TreeT m ()
+ Git.Tree.Builder: putEntry :: Repository m => TreeFilePath -> TreeEntry m -> TreeT m ()
- Git.Tree.Builder: putTree :: Repository m => Text -> TreeOid m -> TreeT m ()
+ Git.Tree.Builder: putTree :: Repository m => TreeFilePath -> TreeOid m -> TreeT m ()
- Git.Tree.Builder: treeEntry :: Repository m => Tree m -> Text -> m (Maybe (TreeEntry m))
+ Git.Tree.Builder: treeEntry :: Repository m => Tree m -> TreeFilePath -> m (Maybe (TreeEntry m))
- Git.Tree.Builder.Pure: type EntryHashMap m = HashMap Text (TreeEntry m)
+ Git.Tree.Builder.Pure: type EntryHashMap m = HashMap TreeFilePath (TreeEntry m)
- Git.Types: Commit :: !(CommitOid m) -> ![CommitOid m] -> !(TreeOid m) -> !Signature -> !Signature -> !Text -> !Text -> Commit m
+ Git.Types: Commit :: !(CommitOid m) -> ![CommitOid m] -> !(TreeOid m) -> !Signature -> !Signature -> !CommitMessage -> !Text -> Commit m
- Git.Types: MergeConflicted :: CommitOid m -> CommitOid m -> CommitOid m -> Map Text (ModificationKind, ModificationKind) -> MergeResult m
+ Git.Types: MergeConflicted :: CommitOid m -> CommitOid m -> CommitOid m -> Map TreeFilePath (ModificationKind, ModificationKind) -> MergeResult m
- Git.Types: RefSymbolic :: !Text -> RefTarget m
+ Git.Types: RefSymbolic :: !RefName -> RefTarget m
- Git.Types: ReferenceCreateFailed :: Text -> GitException
+ Git.Types: ReferenceCreateFailed :: RefName -> GitException
- Git.Types: ReferenceDeleteFailed :: Text -> GitException
+ Git.Types: ReferenceDeleteFailed :: RefName -> GitException
- Git.Types: ReferenceLookupFailed :: Text -> GitException
+ Git.Types: ReferenceLookupFailed :: RefName -> GitException
- Git.Types: Signature :: !Text -> !Text -> !ZonedTime -> Signature
+ Git.Types: Signature :: !CommitAuthor -> !CommitEmail -> !ZonedTime -> Signature
- Git.Types: TreeBuilder :: Maybe (TreeOid m) -> HashMap Text (TreeBuilder m) -> (Maybe (Tree m) -> m (TreeBuilder m)) -> (TreeBuilder m -> m (ModifiedBuilder m, TreeOid m)) -> (Text -> m (Maybe (TreeEntry m))) -> m Int -> (TreeBuilder m -> Text -> TreeEntry m -> m (ModifiedBuilder m)) -> (TreeBuilder m -> Text -> m (ModifiedBuilder m)) -> TreeBuilder m
+ Git.Types: TreeBuilder :: Maybe (TreeOid m) -> HashMap TreeFilePath (TreeBuilder m) -> (Maybe (Tree m) -> m (TreeBuilder m)) -> (TreeBuilder m -> m (ModifiedBuilder m, TreeOid m)) -> (TreeFilePath -> m (Maybe (TreeEntry m))) -> m Int -> (TreeBuilder m -> TreeFilePath -> TreeEntry m -> m (ModifiedBuilder m)) -> (TreeBuilder m -> TreeFilePath -> m (ModifiedBuilder m)) -> TreeBuilder m
- Git.Types: TreeBuilderInsertFailed :: Text -> GitException
+ Git.Types: TreeBuilderInsertFailed :: TreeFilePath -> GitException
- Git.Types: TreeBuilderRemoveFailed :: Text -> GitException
+ Git.Types: TreeBuilderRemoveFailed :: TreeFilePath -> GitException
- Git.Types: TreeEntryLookupFailed :: Text -> GitException
+ Git.Types: TreeEntryLookupFailed :: TreeFilePath -> GitException
- Git.Types: commitLog :: Commit m -> !Text
+ Git.Types: commitLog :: Commit m -> !CommitMessage
- Git.Types: createCommit :: Repository m => [CommitOid m] -> TreeOid m -> Signature -> Signature -> Text -> Maybe Text -> m (Commit m)
+ Git.Types: createCommit :: Repository m => [CommitOid m] -> TreeOid m -> Signature -> Signature -> CommitMessage -> Maybe RefName -> m (Commit m)
- Git.Types: createReference :: Repository m => Text -> RefTarget m -> m ()
+ Git.Types: createReference :: Repository m => RefName -> RefTarget m -> m ()
- Git.Types: createTag :: Repository m => CommitOid m -> Signature -> Text -> Text -> m (Tag m)
+ Git.Types: createTag :: Repository m => CommitOid m -> Signature -> CommitMessage -> Text -> m (Tag m)
- Git.Types: deleteReference :: Repository m => Text -> m ()
+ Git.Types: deleteReference :: Repository m => RefName -> m ()
- Git.Types: listReferences :: Repository m => m [Text]
+ Git.Types: listReferences :: Repository m => m [RefName]
- Git.Types: listTreeEntries :: Repository m => Tree m -> m [(Text, TreeEntry m)]
+ Git.Types: listTreeEntries :: Repository m => Tree m -> m [(TreeFilePath, TreeEntry m)]
- Git.Types: lookupReference :: Repository m => Text -> m (Maybe (RefTarget m))
+ Git.Types: lookupReference :: Repository m => RefName -> m (Maybe (RefTarget m))
- Git.Types: mergeConflicts :: MergeResult m -> Map Text (ModificationKind, ModificationKind)
+ Git.Types: mergeConflicts :: MergeResult m -> Map TreeFilePath (ModificationKind, ModificationKind)
- Git.Types: mtbDropEntry :: TreeBuilder m -> TreeBuilder m -> Text -> m (ModifiedBuilder m)
+ Git.Types: mtbDropEntry :: TreeBuilder m -> TreeBuilder m -> TreeFilePath -> m (ModifiedBuilder m)
- Git.Types: mtbLookupEntry :: TreeBuilder m -> Text -> m (Maybe (TreeEntry m))
+ Git.Types: mtbLookupEntry :: TreeBuilder m -> TreeFilePath -> m (Maybe (TreeEntry m))
- Git.Types: mtbPendingUpdates :: TreeBuilder m -> HashMap Text (TreeBuilder m)
+ Git.Types: mtbPendingUpdates :: TreeBuilder m -> HashMap TreeFilePath (TreeBuilder m)
- Git.Types: mtbPutEntry :: TreeBuilder m -> TreeBuilder m -> Text -> TreeEntry m -> m (ModifiedBuilder m)
+ Git.Types: mtbPutEntry :: TreeBuilder m -> TreeBuilder m -> TreeFilePath -> TreeEntry m -> m (ModifiedBuilder m)
- Git.Types: signatureEmail :: Signature -> !Text
+ Git.Types: signatureEmail :: Signature -> !CommitEmail
- Git.Types: signatureName :: Signature -> !Text
+ Git.Types: signatureName :: Signature -> !CommitAuthor
- Git.Types: treeEntry :: Repository m => Tree m -> Text -> m (Maybe (TreeEntry m))
+ Git.Types: treeEntry :: Repository m => Tree m -> TreeFilePath -> m (Maybe (TreeEntry m))
- Git.Types: updateReference :: Repository m => Text -> RefTarget m -> m ()
+ Git.Types: updateReference :: Repository m => RefName -> RefTarget m -> m ()

Files

Git/Blob.hs view
@@ -12,7 +12,6 @@ import           Data.Text as T import           Data.Text.Encoding as T import           Git.Types-import           Prelude hiding (FilePath)  createBlobUtf8 :: Repository m => Text -> m (BlobOid m) createBlobUtf8 = createBlob . BlobString . T.encodeUtf8@@ -33,7 +32,8 @@ blobToByteString :: Repository m => Blob m -> m ByteString blobToByteString (Blob _ contents) = blobContentsToByteString contents -treeBlobEntries :: Repository m => Tree m -> m [(Text, BlobOid m, BlobKind)]+treeBlobEntries :: Repository m+                => Tree m -> m [(TreeFilePath, BlobOid m, BlobKind)] treeBlobEntries tree = do     entries <- listTreeEntries tree     return $ Prelude.foldr f [] entries
Git/Commit.hs view
@@ -1,5 +1,6 @@ module Git.Commit where +import           Control.Failure import           Control.Monad import           Control.Monad.Trans.Class import           Data.Conduit@@ -9,6 +10,7 @@ import qualified Data.HashSet as HashSet import           Data.List import           Data.Maybe+import           Data.Monoid import           Data.Tagged import           Data.Text (Text) import           Git.Tree@@ -17,7 +19,7 @@  commitTreeEntry :: Repository m                 => Commit m-                -> Text+                -> TreeFilePath                 -> m (Maybe (TreeEntry m)) commitTreeEntry c path = flip treeEntry path =<< lookupTree (commitTree c) @@ -26,7 +28,7 @@  copyCommit :: (Repository m, Repository (t m), MonadTrans t)            => CommitOid m-           -> Maybe Text+           -> Maybe RefName            -> HashSet Text            -> t m (CommitOid (t m), HashSet Text) copyCommit cr mref needed = do@@ -39,6 +41,10 @@         let parents = commitParents commit         (parentRefs,needed') <- foldM copyParent ([],needed) parents         (tr,needed'') <- copyTree (commitTree commit) needed'+        unless (renderObjOid (commitTree commit) == renderObjOid tr) $+            failure $ BackendError $ "Error copying tree: "+                <> renderObjOid (commitTree commit)+                <> " /= " <> renderObjOid tr          commit' <- createCommit (reverse parentRefs) tr             (commitAuthor commit)@@ -54,6 +60,9 @@   where     copyParent (prefs,needed') cref = do         (cref2,needed'') <- copyCommit cref Nothing needed'+        unless (renderObjOid cref == renderObjOid cref2) $+            failure $ BackendError $ "Error copying commit: "+                <> renderObjOid cref <> " /= " <> renderObjOid cref2         let x = cref2 `seq` (cref2:prefs)         return $ x `seq` needed'' `seq` (x,needed'') 
Git/Commit/Push.hs view
@@ -9,9 +9,10 @@ import           Data.Maybe import           Data.Monoid import           Data.Text (Text)+import           Data.Traversable (for) import           Git.Commit-import           Git.Reference import           Git.Object+import           Git.Reference import           Git.Types import           Prelude hiding (FilePath) @@ -22,25 +23,20 @@ pushCommit :: (Repository m, Repository (t m), MonadTrans t)            => CommitOid m -> Text -> t m (CommitOid (t m)) pushCommit coid remoteRefName = do-    mrref <- resolveReference remoteRefName-    commits1 <- mapM copyCommitOid =<< lift (listCommits Nothing coid)-    fastForward <- case mrref of-        Nothing -> return (Just Nothing)-        Just rref-            | rref `elem` commits1 -> do-                roid <- lift $ copyCommitOid rref-                return $ Just (Just roid)-            | otherwise -> do-                failure (PushNotFastForward $-                         "SHA " <> renderObjOid rref-                                <> " not found in remote")-    case fastForward of-        Nothing -> failure (PushNotFastForward "unexpected")-        Just rref -> do-            objs <- lift $ listAllObjects rref coid-            shas <- mapM (return . renderOid . untagObjOid) objs-            (cref,_) <- copyCommit coid Nothing (HashSet.fromList shas)-            -- jww (2013-04-18): This is something the user must-            -- decide to do-            -- updateReference_ remoteRefName (RefObj cref)-            return cref+    commits <- mapM copyCommitOid =<< lift (listCommits Nothing coid)+    mrref   <- resolveReference remoteRefName+    mrref'  <- for mrref $ \rref ->+        if rref `elem` commits+        then lift $ copyCommitOid rref+        else failure $ PushNotFastForward+                     $ "SHA " <> renderObjOid rref+                    <> " not found in remote"+    objs <- lift $ listAllObjects mrref' coid+    let shas = HashSet.fromList $ map (renderOid . untagObjOid) objs+    (cref,_) <- copyCommit coid Nothing shas+    unless (renderObjOid coid == renderObjOid cref) $+        failure $ BackendError $ "Error copying commit: "+            <> renderObjOid coid <> " /= " <> renderObjOid cref+    -- jww (2013-04-18): This is something the user must decide to do+    -- updateReference_ remoteRefName (RefObj cref)+    return cref
Git/Reference.hs view
@@ -1,10 +1,9 @@ module Git.Reference where  import Control.Applicative-import Data.Text import Git.Types -resolveReference :: Repository m => Text -> m (Maybe (CommitOid m))+resolveReference :: Repository m => RefName -> m (Maybe (CommitOid m)) resolveReference name = do     mref <- lookupReference name     maybe (return Nothing) referenceToOid mref@@ -13,7 +12,7 @@ referenceToOid (RefObj oid)       = return $ Just oid referenceToOid (RefSymbolic name) = resolveReference name -resolveReferenceTree :: Repository m => Text -> m (Maybe (Tree m))+resolveReferenceTree :: Repository m => RefName -> m (Maybe (Tree m)) resolveReferenceTree refName = do     c <- resolveReference refName     case c of
Git/Repository.hs view
@@ -5,11 +5,8 @@ import           Control.Monad.IO.Class import           Control.Monad.Trans.Class import           Data.Conduit-import           Data.Function-import           Filesystem-import           Filesystem.Path.CurrentOS hiding (null, concat) import           Git.Types-import           Prelude hiding (FilePath)+import           System.Directory import           System.Mem  withNewRepository :: (Repository (t m), MonadGit (t m),@@ -18,8 +15,8 @@                   -> FilePath -> t m a -> m a withNewRepository factory path action = do     liftIO $ do-        exists <- isDirectory path-        when exists $ removeTree path+        exists <- doesDirectoryExist path+        when exists $ removeDirectoryRecursive path      -- we want exceptions to leave the repo behind     a <- withRepository' factory (defaultOptions factory)@@ -29,8 +26,8 @@         } action      liftIO $ do-        exists <- isDirectory path-        when exists $ removeTree path+        exists <- doesDirectoryExist path+        when exists $ removeDirectoryRecursive path      return a @@ -46,9 +43,8 @@             } action   where     recover = liftIO $ do-        exists <- isDirectory path-        when exists $ removeTree path-+        exists <- doesDirectoryExist path+        when exists $ removeDirectoryRecursive path  withBackendDo :: (MonadIO m, MonadBaseControl IO m)               => RepositoryFactory t m a -> m b -> m b
Git/Tree.hs view
@@ -1,16 +1,16 @@ module Git.Tree where +import           Control.Failure import           Control.Monad import           Control.Monad.Trans.Class-import           Data.Function import           Data.HashSet (HashSet) import qualified Data.HashSet as HashSet+import           Data.Monoid import           Data.Tagged import           Data.Text (Text) import           Git.Blob import           Git.Tree.Builder import           Git.Types-import           Prelude hiding (FilePath)  copyTreeEntry :: (Repository m, Repository (t m), MonadTrans t)               => TreeEntry m@@ -18,6 +18,9 @@               -> t m (TreeEntry (t m), HashSet Text) copyTreeEntry (BlobEntry oid kind) needed = do     (b,needed') <- copyBlob oid needed+    unless (renderObjOid oid == renderObjOid b) $+        failure $ BackendError $ "Error copying blob: "+            <> renderObjOid oid <> " /= " <> renderObjOid b     return (BlobEntry b kind, needed') copyTreeEntry (CommitEntry oid) needed = do     coid <- parseOid (renderObjOid oid)@@ -46,7 +49,7 @@   where     doCopyTreeEntry :: (Repository m, Repository (t m), MonadTrans t)                     => HashSet Text-                    -> (Text, TreeEntry m)+                    -> (TreeFilePath, TreeEntry m)                     -> TreeT (t m) (HashSet Text)     doCopyTreeEntry set (_, TreeEntry {}) = return set     doCopyTreeEntry set (fp, ent) = do
Git/Tree/Builder.hs view
@@ -31,15 +31,14 @@ import           Control.Monad.IO.Class import           Control.Monad.Trans.Class import           Control.Monad.Trans.State-import           Data.Function+import qualified Data.ByteString as B+import           Data.Char import qualified Data.HashMap.Strict as HashMap-import           Data.List-import           Data.Maybe import           Data.Monoid import           Data.Text (Text)-import qualified Data.Text as T+import           Data.Word import           Git.Types-import           Prelude hiding (FilePath)+import           System.Posix.ByteString.FilePath  data ModifyTreeResult m = TreeEntryNotFound                         | TreeEntryDeleted@@ -76,7 +75,7 @@     (<|>) = mplus  instance (MonadPlus m) => MonadPlus (TreeT m) where-    mzero       = TreeT $ mzero+    mzero       = TreeT mzero     m `mplus` n = TreeT $ runTreeT m `mplus` runTreeT n  instance (MonadFix m) => MonadFix (TreeT m) where@@ -95,7 +94,7 @@ putBuilder = TreeT . put  data BuilderAction = GetEntry | PutEntry | DropEntry-                   deriving (Eq, Show)+    deriving (Eq, Show)  emptyTreeId :: Text emptyTreeId = "4b825dc642cb6eb9a060e54bf8d69288fbee4904"@@ -106,13 +105,13 @@ --   This is a complex algorithm which has been rewritten many times, so I --   will try to guide you through it as best I can. queryTreeBuilder :: Repository m-                  => TreeBuilder m-                  -> Text-                  -> BuilderAction-                  -> (Maybe (TreeEntry m) -> ModifyTreeResult m)-                  -> m (TreeBuilder m, Maybe (TreeEntry m))+                 => TreeBuilder m+                 -> TreeFilePath+                 -> BuilderAction+                 -> (Maybe (TreeEntry m) -> ModifyTreeResult m)+                 -> m (TreeBuilder m, Maybe (TreeEntry m)) queryTreeBuilder builder path kind f = do-    (mtb, mtresult) <- walk (BuilderUnchanged builder) (splitPath path)+    (mtb, mtresult) <- walk (BuilderUnchanged builder) (splitDirectories path)     return (fromBuilderMod mtb, fromModifyTreeResult mtresult)   where     walk _ [] = error "queryTreeBuilder called without a path"@@ -185,6 +184,21 @@             { mtbPendingUpdates =                    HashMap.insert name sbm (mtbPendingUpdates tb) } +    pathSeparator :: Word8+    pathSeparator = fromIntegral $ ord '/'++    isPathSeparator :: Word8 -> Bool+    isPathSeparator = (== pathSeparator)++    splitDirectories :: RawFilePath -> [RawFilePath]+    splitDirectories x+        | B.null x = []+        | isPathSeparator (B.head x) = let (root,rest) = B.splitAt 1 x+                                        in root : splitter rest+        | otherwise = splitter x+      where+        splitter = filter (not . B.null) . B.split pathSeparator+ -- | Write out a tree to its repository.  If it has already been written, --   nothing will happen. writeTreeBuilder :: Repository m@@ -222,36 +236,36 @@             Just tref -> mtbPutEntry tb tb k (TreeEntry tref)         return $ bm <> bm' -getEntry :: Repository m => Text -> TreeT m (Maybe (TreeEntry m))+getEntry :: Repository m => TreeFilePath -> TreeT m (Maybe (TreeEntry m)) getEntry path = do     tb <- getBuilder     snd <$> lift (queryTreeBuilder tb path GetEntry                   (toModifyTreeResult TreeEntryPersistent)) -putEntry :: Repository m => Text -> TreeEntry m -> TreeT m ()+putEntry :: Repository m => TreeFilePath -> TreeEntry m -> TreeT m () putEntry path ent = do     tb  <- getBuilder     tb' <- fst <$> lift (queryTreeBuilder tb path PutEntry                          (const (TreeEntryMutated ent)))     putBuilder tb' -dropEntry :: Repository m => Text -> TreeT m ()+dropEntry :: Repository m => TreeFilePath -> TreeT m () dropEntry path = do     tb  <- getBuilder     tb' <- fst <$> lift (queryTreeBuilder tb path DropEntry                          (const TreeEntryDeleted))     putBuilder tb' -putBlob' :: Repository m => Text -> BlobOid m -> BlobKind -> TreeT m ()+putBlob' :: Repository m => TreeFilePath -> BlobOid m -> BlobKind -> TreeT m () putBlob' path b kind = putEntry path (BlobEntry b kind) -putBlob :: Repository m => Text -> BlobOid m -> TreeT m ()+putBlob :: Repository m => TreeFilePath -> BlobOid m -> TreeT m () putBlob path b = putBlob' path b PlainBlob -putTree :: Repository m => Text -> TreeOid m -> TreeT m ()+putTree :: Repository m => TreeFilePath -> TreeOid m -> TreeT m () putTree path t = putEntry path (TreeEntry t) -putCommit :: Repository m => Text -> CommitOid m -> TreeT m ()+putCommit :: Repository m => TreeFilePath -> CommitOid m -> TreeT m () putCommit path c = putEntry path (CommitEntry c)  doWithTree :: Repository m => Maybe (Tree m) -> TreeT m a -> m (a, TreeOid m)@@ -289,6 +303,3 @@  createTree :: Repository m => TreeT m a -> m (TreeOid m) createTree action = snd <$> withNewTree action--splitPath :: Text -> [Text]-splitPath = T.splitOn "/"
Git/Tree/Builder/Pure.hs view
@@ -5,12 +5,11 @@  import           Control.Applicative import           Data.Monoid-import           Data.Text import           Data.HashMap.Strict (HashMap) import qualified Data.HashMap.Strict as HashMap import           Git -type EntryHashMap m = HashMap Text (TreeEntry m)+type EntryHashMap m = HashMap TreeFilePath (TreeEntry m)  -- | Create a new, empty tree. --@@ -34,7 +33,7 @@  makePureBuilder :: Repository m                 => Maybe (TreeOid m)-                -> HashMap Text (TreeBuilder m)+                -> HashMap TreeFilePath (TreeBuilder m)                 -> (Maybe (Tree m) -> m (TreeBuilder m))                 -> EntryHashMap m                 -> (EntryHashMap m -> m (TreeOid m))
Git/Types.hs view
@@ -3,7 +3,6 @@ import           Control.Applicative import qualified Control.Exception.Lifted as Exc import           Control.Failure-import           Control.Monad import           Control.Monad.IO.Class import qualified Data.Binary as Bin import           Data.ByteString (ByteString)@@ -11,12 +10,9 @@ import qualified Data.ByteString.Base16 as B16 import           Data.Conduit import           Data.Default-import           Data.Function import           Data.HashMap.Strict (HashMap) import           Data.Hashable-import           Data.List import           Data.Map (Map)-import           Data.Maybe import           Data.Monoid import           Data.Tagged import           Data.Text (Text)@@ -24,8 +20,7 @@ import qualified Data.Text.Encoding as T import           Data.Time import           Data.Typeable-import           Filesystem.Path.CurrentOS hiding (null, concat)-import           Prelude hiding (FilePath)+import           System.Posix.ByteString.FilePath  data RepositoryFacts = RepositoryFacts     { hasSymbolicReferences :: !Bool@@ -34,6 +29,12 @@ type MonadGit m = (Failure GitException m, Applicative m,                    MonadIO m, MonadBaseControl IO m) +type RefName = Text+type CommitAuthor = Text+type CommitEmail = Text+type CommitMessage = Text+type TreeFilePath = RawFilePath+ -- | '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, IsOid (Oid m))@@ -47,11 +48,11 @@     deleteRepository :: m ()      -- References-    createReference :: Text -> RefTarget m -> m ()-    lookupReference :: Text -> m (Maybe (RefTarget m))-    updateReference :: Text -> RefTarget m -> m ()-    deleteReference :: Text -> m ()-    listReferences  :: m [Text]+    createReference :: RefName -> RefTarget m -> m ()+    lookupReference :: RefName -> m (Maybe (RefTarget m))+    updateReference :: RefName -> RefTarget m -> m ()+    deleteReference :: RefName -> m ()+    listReferences  :: m [RefName]      -- Object lookup     lookupCommit  :: CommitOid m -> m (Commit m)@@ -69,15 +70,16 @@     newTreeBuilder :: Maybe (Tree m) -> m (TreeBuilder m)      treeOid   :: Tree m -> TreeOid m-    treeEntry :: Tree m -> Text -> m (Maybe (TreeEntry m))-    listTreeEntries :: Tree m -> m [(Text, TreeEntry m)]+    treeEntry :: Tree m -> TreeFilePath -> m (Maybe (TreeEntry m))+    listTreeEntries :: Tree m -> m [(TreeFilePath, TreeEntry m)]      -- Creating other objects     hashContents :: BlobContents m -> m (BlobOid m)     createBlob   :: BlobContents m -> m (BlobOid m)     createCommit :: [CommitOid m] -> TreeOid m-                 -> Signature -> Signature -> Text -> Maybe Text -> m (Commit m)-    createTag :: CommitOid m -> Signature -> Text -> Text -> m (Tag m)+                 -> Signature -> Signature -> CommitMessage -> Maybe RefName+                 -> m (Commit m)+    createTag :: CommitOid m -> Signature -> CommitMessage -> Text -> m (Tag m)      -- -- Pack files     -- buildPackFile :: FilePath -> [Either (CommitOid m) (TreeOid m)]@@ -197,14 +199,15 @@  data TreeBuilder m = TreeBuilder     { mtbBaseTreeOid    :: Maybe (TreeOid m)-    , mtbPendingUpdates :: HashMap Text (TreeBuilder m)+    , mtbPendingUpdates :: HashMap TreeFilePath (TreeBuilder m)     , mtbNewBuilder     :: Maybe (Tree m) -> m (TreeBuilder m)     , mtbWriteContents  :: TreeBuilder m -> m (ModifiedBuilder m, TreeOid m)-    , mtbLookupEntry    :: Text -> m (Maybe (TreeEntry m))+    , mtbLookupEntry    :: TreeFilePath -> m (Maybe (TreeEntry m))     , mtbEntryCount     :: m Int-    , mtbPutEntry       :: TreeBuilder m -> Text -> TreeEntry m+    , mtbPutEntry       :: TreeBuilder m -> TreeFilePath -> TreeEntry m                         -> m (ModifiedBuilder m)-    , mtbDropEntry      :: TreeBuilder m -> Text -> m (ModifiedBuilder m)+    , mtbDropEntry      :: TreeBuilder m -> TreeFilePath+                        -> m (ModifiedBuilder m)     }  data ModifiedBuilder m = ModifiedBuilder (TreeBuilder m)@@ -228,7 +231,7 @@     , commitTree      :: !(TreeOid m)     , commitAuthor    :: !Signature     , commitCommitter :: !Signature-    , commitLog       :: !Text+    , commitLog       :: !CommitMessage     , commitEncoding  :: !Text     } @@ -236,8 +239,8 @@ lookupCommitParents = mapM lookupCommit . commitParents  data Signature = Signature-    { signatureName  :: !Text-    , signatureEmail :: !Text+    { signatureName  :: !CommitAuthor+    , signatureEmail :: !CommitEmail     , signatureWhen  :: !ZonedTime     } deriving Show @@ -291,7 +294,7 @@ untagObjOid (TagObjOid oid)    = untag oid  {- $references -}-data RefTarget m = RefObj !(CommitOid m) | RefSymbolic !Text+data RefTarget m = RefObj !(CommitOid m) | RefSymbolic !RefName  instance Repository m => Show (RefTarget m) where     show (RefObj coid) = "RefObj#" ++ T.unpack (renderObjOid coid)@@ -356,7 +359,8 @@         { mergeCommit    :: CommitOid m         , mergeHeadLeft  :: CommitOid m         , mergeHeadRight :: CommitOid m-        , mergeConflicts :: Map Text (ModificationKind, ModificationKind)+        , mergeConflicts ::+               Map TreeFilePath (ModificationKind, ModificationKind)         }  copyMergeResult :: (Repository m, MonadGit m, Repository n, MonadGit n)@@ -395,23 +399,23 @@                   | TranslationException Text                   | TreeCreateFailed Text                   | TreeBuilderCreateFailed-                  | TreeBuilderInsertFailed Text-                  | TreeBuilderRemoveFailed Text+                  | TreeBuilderInsertFailed TreeFilePath+                  | TreeBuilderRemoveFailed TreeFilePath                   | TreeBuilderWriteFailed Text                   | TreeLookupFailed                   | TreeCannotTraverseBlob                   | TreeCannotTraverseCommit-                  | TreeEntryLookupFailed Text+                  | TreeEntryLookupFailed TreeFilePath                   | TreeUpdateFailed                   | TreeWalkFailed                   | TreeEmptyCreateFailed                   | CommitCreateFailed                   | CommitLookupFailed Text-                  | ReferenceCreateFailed Text-                  | ReferenceDeleteFailed Text+                  | ReferenceCreateFailed RefName+                  | ReferenceDeleteFailed RefName                   | RefCannotCreateFromPartialOid                   | ReferenceListingFailed-                  | ReferenceLookupFailed Text+                  | ReferenceLookupFailed RefName                   | ObjectLookupFailed Text Int                   | ObjectRefRequiresFullOid                   | OidCopyFailed
gitlib.cabal view
@@ -1,5 +1,5 @@ Name:                gitlib-Version:             2.0.1.1+Version:             2.1.0.0 Synopsis:            API library for working with Git repositories License-file:        LICENSE License:             MIT@@ -46,15 +46,15 @@         , conduit              >= 1.0.0         , containers           >= 0.4.2.1         , data-default         >= 0.5.0+        , directory            >= 1.1.0.2         , failure              >= 0.2.0.1         , hashable             >= 1.1.2.5         , lifted-base          >= 0.2-        , system-fileio        >= 0.3.11-        , system-filepath      >= 0.4.7         , tagged               >= 0.2.3.1         , text                 >= 0.11.2         , time                 >= 1.4         , transformers         >= 0.3.0.0+        , unix                 >= 2.5         , unordered-containers >= 0.2.3.0     exposed-modules:         Git