gitlib 1.3.1 → 1.4.0
raw patch · 2 files changed
+157/−195 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Git: ByOid :: !(Tagged a (Oid m)) -> ObjRef m a
- Git: CommitRefName :: !Text -> CommitName m
- Git: Known :: !a -> ObjRef m a
- Git: blobRefOid :: Repository m => BlobRef m -> BlobOid m
- Git: commitNameToRef :: Repository m => CommitName m -> m (Maybe (CommitRef m))
- Git: commitRef :: Commit m -> CommitRef m
- Git: commitRefOid :: Repository m => CommitRef m -> CommitOid m
- Git: currentTreeRef :: Repository m => TreeT m (TreeRef m)
- Git: data ObjRef m a
- Git: mtbBaseTreeRef :: TreeBuilder m -> Maybe (TreeRef m)
- Git: mutateTreeRef :: Repository m => TreeRef m -> TreeT m a -> m (TreeRef m)
- Git: referenceToRef :: Repository m => Maybe Text -> Maybe (Reference m (Commit m)) -> m (Maybe (CommitRef m))
- Git: resolveBlobRef :: Repository m => BlobRef m -> m (Blob m)
- Git: resolveCommitRef :: Repository m => CommitRef m -> m (Commit m)
- Git: resolveTreeRef :: Repository m => TreeRef m -> m (Tree m)
- Git: tagRefOid :: Repository m => TagRef m -> TagOid m
- Git: treeRef :: Tree m -> TreeRef m
- Git: treeRefOid :: Repository m => TreeRef m -> TreeOid m
- Git: type BlobRef m = ObjRef m (Blob m)
- Git: type CommitRef m = ObjRef m (Commit m)
- Git: type TagRef m = ObjRef m (Tag m)
- Git: type TreeRef m = ObjRef m (Tree m)
- Git: withTreeRef :: Repository m => TreeRef m -> TreeT m a -> m (a, TreeRef m)
+ Git: BlobObjOid :: !(BlobOid m) -> ObjectOid m
+ Git: CommitObjOid :: !(CommitOid m) -> ObjectOid m
+ Git: CommitReferenceName :: !Text -> CommitName m
+ Git: TagObjOid :: !(TagOid m) -> ObjectOid m
+ Git: TreeObjOid :: !(TreeOid m) -> ObjectOid m
+ Git: commitNameToOid :: Repository m => CommitName m -> m (Maybe (CommitOid m))
+ Git: data ObjectOid m
+ Git: loadObject :: Repository m => ObjectOid m -> m (Object m)
+ Git: lookupObjectOid :: Repository m => Text -> m (ObjectOid m)
+ Git: mtbBaseTreeOid :: TreeBuilder m -> Maybe (TreeOid m)
+ Git: mutateTreeOid :: Repository m => TreeOid m -> TreeT m a -> m (TreeOid m)
+ Git: objectToObjOid :: Repository m => Object m -> ObjectOid m
+ Git: referenceToOid :: Repository m => Maybe Text -> Maybe (Reference m) -> m (Maybe (CommitOid m))
+ Git: untagObjOid :: Repository m => ObjectOid m -> Oid m
+ Git: withTreeOid :: Repository m => TreeOid m -> TreeT m a -> m (a, TreeOid m)
- Git: BlobObj :: !(BlobRef m) -> Object m
+ Git: BlobObj :: !(Blob m) -> Object m
- Git: Commit :: !(CommitOid m) -> ![CommitRef m] -> !(TreeRef m) -> !Signature -> !Signature -> !Text -> !Text -> Commit m
+ Git: Commit :: !(CommitOid m) -> ![CommitOid m] -> !(TreeOid m) -> !Signature -> !Signature -> !Text -> !Text -> Commit m
- Git: CommitObj :: !(CommitRef m) -> Object m
+ Git: CommitObj :: !(Commit m) -> Object m
- Git: CommitReference :: !(Reference m (Commit m)) -> CommitName m
+ Git: CommitReference :: !(Reference m) -> CommitName m
- Git: RefObj :: !(ObjRef m a) -> RefTarget m a
+ Git: RefObj :: !(CommitOid m) -> RefTarget m
- Git: RefSymbolic :: !Text -> RefTarget m a
+ Git: RefSymbolic :: !Text -> RefTarget m
- Git: Reference :: !Text -> !(RefTarget m a) -> Reference m a
+ Git: Reference :: !Text -> !(RefTarget m) -> Reference m
- Git: Tag :: !(TagOid m) -> !(CommitRef m) -> Tag m
+ Git: Tag :: !(TagOid m) -> !(CommitOid m) -> Tag m
- Git: TagObj :: !(TagRef m) -> Object m
+ Git: TagObj :: !(Tag m) -> Object m
- Git: TreeBuilder :: Maybe (TreeRef m) -> HashMap Text (TreeBuilder m) -> (Maybe (Tree m) -> m (TreeBuilder m)) -> (TreeBuilder m -> m (ModifiedBuilder m, TreeRef 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: 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: TreeObj :: !(TreeRef m) -> Object m
+ Git: TreeObj :: !(Tree m) -> Object m
- Git: allMissingObjects :: Repository m => [Object m] -> m [Object m]
+ Git: allMissingObjects :: Repository m => [ObjectOid m] -> m [ObjectOid m]
- Git: allReferences :: Repository m => m [Reference m (Commit m)]
+ Git: allReferences :: Repository m => m [Reference m]
- Git: class (Applicative m, Monad m, Failure GitException m, IsOid (Oid m)) => Repository m where type family Oid m :: * data family Tree m :: * data family Options m :: * parseObjOid sha = Tagged <$> parseOid sha createReference_ = (void .) . createReference updateReference_ = (void .) . updateReference allReferences = catMaybes <$> (mapM lookupReference =<< allReferenceNames) allReferenceNames = map referenceName <$> allReferences resolveReference name = lookupReference 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: class (Applicative m, Monad m, Failure GitException m, IsOid (Oid m)) => Repository m where type family Oid m :: * data family Tree m :: * data family Options m :: * parseObjOid sha = Tagged <$> parseOid sha createReference_ = (void .) . createReference updateReference_ = (void .) . updateReference allReferences = catMaybes <$> (mapM lookupReference =<< allReferenceNames) allReferenceNames = map referenceName <$> allReferences resolveReference name = lookupReference name >>= referenceToOid (Just name) lookupObjectOid = fmap objectToObjOid . lookupObject 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: commitParents :: Commit m -> ![CommitRef m]
+ Git: commitParents :: Commit m -> ![CommitOid m]
- Git: commitRefTarget :: Commit c -> RefTarget m (Commit c)
+ Git: commitRefTarget :: Commit m -> RefTarget m
- Git: commitTree :: Commit m -> !(TreeRef m)
+ Git: commitTree :: Commit m -> !(TreeOid m)
- Git: copyBlob :: (Repository m, Repository (t m), MonadTrans t) => BlobRef m -> HashSet Text -> t m (BlobOid (t m), HashSet Text)
+ Git: copyBlob :: (Repository m, Repository (t m), MonadTrans t) => BlobOid m -> HashSet Text -> t m (BlobOid (t m), HashSet Text)
- Git: copyCommit :: (Repository m, Repository (t m), MonadTrans t) => CommitRef m -> Maybe Text -> HashSet Text -> t m (CommitRef (t m), HashSet Text)
+ Git: copyCommit :: (Repository m, Repository (t m), MonadTrans t) => CommitOid m -> Maybe Text -> HashSet Text -> t m (CommitOid (t m), HashSet Text)
- Git: copyTree :: (Repository m, Repository (t m), MonadTrans t) => TreeRef m -> HashSet Text -> t m (TreeRef (t m), HashSet Text)
+ Git: copyTree :: (Repository m, Repository (t m), MonadTrans t) => TreeOid m -> HashSet Text -> t m (TreeOid (t m), HashSet Text)
- Git: createCommit :: Repository m => [CommitRef m] -> TreeRef m -> Signature -> Signature -> Text -> Maybe Text -> m (Commit m)
+ Git: createCommit :: Repository m => [CommitOid m] -> TreeOid m -> Signature -> Signature -> Text -> Maybe Text -> m (Commit m)
- Git: createReference :: Repository m => Text -> RefTarget m (Commit m) -> m (Reference m (Commit m))
+ Git: createReference :: Repository m => Text -> RefTarget m -> m (Reference m)
- Git: createReference_ :: Repository m => Text -> RefTarget m (Commit m) -> m ()
+ Git: createReference_ :: Repository m => Text -> RefTarget m -> m ()
- Git: createTree :: Repository m => TreeT m a -> m (TreeRef m)
+ Git: createTree :: Repository m => TreeT m a -> m (TreeOid m)
- Git: data RefTarget m a
+ Git: data RefTarget m
- Git: data Reference m a
+ Git: data Reference m
- Git: genericPushCommit :: (Repository m, Repository (t m), MonadTrans t) => CommitName m -> Text -> t m (CommitRef (t m))
+ Git: genericPushCommit :: (Repository m, Repository (t m), MonadTrans t) => CommitOid m -> Text -> t m (CommitOid (t m))
- Git: lookupReference :: Repository m => Text -> m (Maybe (Reference m (Commit m)))
+ Git: lookupReference :: Repository m => Text -> m (Maybe (Reference m))
- Git: missingObjects :: Repository m => Maybe (CommitName m) -> CommitName m -> m [Object m]
+ Git: missingObjects :: Repository m => Maybe (CommitOid m) -> CommitOid m -> m [ObjectOid m]
- Git: mtbWriteContents :: TreeBuilder m -> TreeBuilder m -> m (ModifiedBuilder m, TreeRef m)
+ Git: mtbWriteContents :: TreeBuilder m -> TreeBuilder m -> m (ModifiedBuilder m, TreeOid m)
- Git: mutateTree :: Repository m => Tree m -> TreeT m a -> m (TreeRef m)
+ Git: mutateTree :: Repository m => Tree m -> TreeT m a -> m (TreeOid m)
- Git: objectOid :: Repository m => Object m -> m (Oid m)
+ Git: objectOid :: Repository m => Object m -> Oid m
- Git: pushCommit :: (Repository m, MonadTrans t, MonadGit m, MonadGit (t m), Repository m, Repository (t m)) => CommitName m -> Maybe Text -> Text -> t m (CommitRef (t m))
+ Git: pushCommit :: (Repository m, MonadTrans t, MonadGit m, MonadGit (t m), Repository m, Repository (t m)) => CommitOid m -> Maybe Text -> Text -> t m (CommitOid (t m))
- Git: referenceName :: Reference m a -> !Text
+ Git: referenceName :: Reference m -> !Text
- Git: referenceTarget :: Reference m a -> !(RefTarget m a)
+ Git: referenceTarget :: Reference m -> !(RefTarget m)
- Git: resolveReference :: Repository m => Text -> m (Maybe (CommitRef m))
+ Git: resolveReference :: Repository m => Text -> m (Maybe (CommitOid m))
- Git: tagCommit :: Tag m -> !(CommitRef m)
+ Git: tagCommit :: Tag m -> !(CommitOid m)
- Git: traverseCommits :: Repository m => (CommitRef m -> m a) -> CommitName m -> m [a]
+ Git: traverseCommits :: Repository m => (CommitOid m -> m a) -> CommitOid m -> m [a]
- Git: traverseCommits_ :: Repository m => (CommitRef m -> m ()) -> CommitName m -> m ()
+ Git: traverseCommits_ :: Repository m => (CommitOid m -> m ()) -> CommitOid m -> m ()
- Git: traverseObjects :: Repository m => (Object m -> m a) -> Maybe (CommitName m) -> m [a]
+ Git: traverseObjects :: Repository m => (Oid m -> m a) -> Maybe (CommitOid m) -> m [a]
- Git: traverseObjects_ :: Repository m => (Object m -> m ()) -> Maybe (CommitName m) -> m ()
+ Git: traverseObjects_ :: Repository m => (Oid m -> m ()) -> Maybe (CommitOid m) -> m ()
- Git: updateReference :: Repository m => Text -> RefTarget m (Commit m) -> m (Reference m (Commit m))
+ Git: updateReference :: Repository m => Text -> RefTarget m -> m (Reference m)
- Git: updateReference_ :: Repository m => Text -> RefTarget m (Commit m) -> m ()
+ Git: updateReference_ :: Repository m => Text -> RefTarget m -> m ()
- Git: withNewTree :: Repository m => TreeT m a -> m (a, TreeRef m)
+ Git: withNewTree :: Repository m => TreeT m a -> m (a, TreeOid m)
- Git: withTree :: Repository m => Tree m -> TreeT m a -> m (a, TreeRef m)
+ Git: withTree :: Repository m => Tree m -> TreeT m a -> m (a, TreeOid m)
Files
- Git.hs +156/−194
- gitlib.cabal +1/−1
Git.hs view
@@ -23,8 +23,11 @@ , IsOid(..) , copyOid , Object(..)- , ObjRef(..)+ , ObjectOid(..) , objectOid+ , loadObject+ , objectToObjOid+ , untagObjOid , SHA(..) , textToSha , shaToText@@ -34,10 +37,7 @@ , BlobContents(..) , BlobKind(..) , ByteSource- , BlobRef , blobEntry- , blobRefOid- , resolveBlobRef , createBlobUtf8 , catBlob , catBlobUtf8@@ -50,15 +50,13 @@ , ModifiedBuilder(..) , TreeEntry(..) , TreeOid- , TreeRef , createTree , withNewTree , mutateTree- , mutateTreeRef+ , mutateTreeOid , currentTree- , currentTreeRef , withTree- , withTreeRef+ , withTreeOid , dropEntry , getEntry , putBlob@@ -66,11 +64,8 @@ , putCommit , putEntry , putTree- , resolveTreeRef , treeEntry , getTreeEntryOid- , treeRef- , treeRefOid , ModifyTreeResult(..) , fromModifyTreeResult , toModifyTreeResult@@ -82,19 +77,15 @@ , Commit(..) , CommitOid , CommitName(..)- , CommitRef , Signature(..) , commitEntry- , commitNameToRef- , commitRef- , commitRefOid , commitRefTarget , getCommitParents , copyCommitName , copyCommitOid , nameOfCommit+ , commitNameToOid , renderCommitName- , resolveCommitRef , commitTreeEntry , copyCommit , genericPushCommit@@ -106,12 +97,10 @@ , Tag(..) , TagOid- , TagRef- , tagRefOid , RefTarget(..) , Reference(..)- , referenceToRef+ , referenceToOid , resolveReferenceTree , GitException(..)@@ -191,25 +180,23 @@ parseObjOid sha = Tagged <$> parseOid sha -- References- createReference :: Text -> RefTarget m (Commit m)- -> m (Reference m (Commit m))- createReference_ :: Text -> RefTarget m (Commit m) -> m ()+ createReference :: Text -> RefTarget m -> m (Reference m)+ createReference_ :: Text -> RefTarget m -> m () createReference_ = (void .) . createReference- lookupReference :: Text -> m (Maybe (Reference m (Commit m)))- updateReference :: Text -> RefTarget m (Commit m)- -> m (Reference m (Commit m))- updateReference_ :: Text -> RefTarget m (Commit m) -> m ()+ lookupReference :: Text -> m (Maybe (Reference m))+ updateReference :: Text -> RefTarget m -> m (Reference m)+ updateReference_ :: Text -> RefTarget m -> m () updateReference_ = (void .) . updateReference deleteReference :: Text -> m () - allReferences :: m [Reference m (Commit m)]+ allReferences :: m [Reference m] allReferences = catMaybes <$> (mapM lookupReference =<< allReferenceNames) allReferenceNames :: m [Text] allReferenceNames = map referenceName <$> allReferences - resolveReference :: Text -> m (Maybe (CommitRef m))- resolveReference name = lookupReference name >>= referenceToRef (Just name)+ resolveReference :: Text -> m (Maybe (CommitOid m))+ resolveReference name = lookupReference name >>= referenceToOid (Just name) -- Lookup lookupCommit :: CommitOid m -> m (Commit m)@@ -218,28 +205,29 @@ lookupTag :: TagOid m -> m (Tag m) lookupObject :: Text -> m (Object m)+ lookupObjectOid :: Text -> m (ObjectOid m)+ lookupObjectOid = fmap objectToObjOid . lookupObject existsObject :: Oid m -> m Bool traverseObjects :: forall a.- (Object m -> m a) -> Maybe (CommitName m) -> m [a]- traverseObjects_ :: (Object m -> m ()) -> Maybe (CommitName m) -> m ()+ (Oid m -> m a) -> Maybe (CommitOid m) -> m [a]+ traverseObjects_ :: (Oid m -> m ()) -> Maybe (CommitOid m) -> m () traverseObjects_ = (void .) . traverseObjects pushCommit :: (MonadTrans t, MonadGit m, MonadGit (t m), Repository m, Repository (t m))- => CommitName m -> Maybe Text -> Text- -> t m (CommitRef (t m))+ => CommitOid m -> Maybe Text -> Text -> t m (CommitOid (t m)) traverseCommits :: forall a.- (CommitRef m -> m a) -> CommitName m -> m [a]- traverseCommits_ :: (CommitRef m -> m ()) -> CommitName m -> m ()+ (CommitOid m -> m a) -> CommitOid m -> m [a]+ traverseCommits_ :: (CommitOid m -> m ()) -> CommitOid m -> m () traverseCommits_ = (void .) . traverseCommits - missingObjects :: Maybe (CommitName m) -- ^ A commit we may already have- -> CommitName m -- ^ The commit we need- -> m [Object m] -- ^ All the objects in between+ missingObjects :: Maybe (CommitOid m) -- ^ A commit we may already have+ -> CommitOid m -- ^ The commit we need+ -> m [ObjectOid m] -- ^ All the objects in between - -- Object creation+ -- Object creation, not to be called by users directly newTreeBuilder :: Maybe (Tree m) -> m (TreeBuilder m) treeOid :: Tree m -> TreeOid m@@ -250,7 +238,7 @@ hashContents :: BlobContents m -> m (BlobOid m) createBlob :: BlobContents m -> m (BlobOid m)- createCommit :: [CommitRef m] -> TreeRef m+ createCommit :: [CommitOid m] -> TreeOid m -> Signature -> Signature -> Text -> Maybe Text -> m (Commit m) createTag :: CommitOid m -> Signature -> Text -> Text -> m (Tag m) @@ -324,32 +312,32 @@ type TagOid m = Tagged (Tag m) (Oid m) {- $references -}-data RefTarget m a = RefObj !(ObjRef m a) | RefSymbolic !Text+data RefTarget m = RefObj !(CommitOid m) | RefSymbolic !Text -data Reference m a = Reference+data Reference m = Reference { referenceName :: !Text- , referenceTarget :: !(RefTarget m a) }+ , referenceTarget :: !(RefTarget m) } data CommitName m = CommitObjectId !(CommitOid m)- | CommitRefName !Text- | CommitReference !(Reference m (Commit m))+ | CommitReferenceName !Text+ | CommitReference !(Reference m) instance Repository m => Show (CommitName m) where show (CommitObjectId coid) = T.unpack (renderObjOid coid)- show (CommitRefName name) = show name+ show (CommitReferenceName name) = show name show (CommitReference ref) = show (referenceName ref) nameOfCommit :: Commit m -> CommitName m nameOfCommit = CommitObjectId . commitOid -commitNameToRef :: Repository m => CommitName m -> m (Maybe (CommitRef m))-commitNameToRef (CommitObjectId coid) = return (Just (ByOid coid))-commitNameToRef (CommitRefName name) = resolveReference name-commitNameToRef (CommitReference ref) = referenceToRef Nothing (Just ref)+commitNameToOid :: Repository m => CommitName m -> m (Maybe (CommitOid m))+commitNameToOid (CommitObjectId coid) = return (Just coid)+commitNameToOid (CommitReferenceName name) = resolveReference name+commitNameToOid (CommitReference ref) = referenceToOid Nothing (Just ref) renderCommitName :: Repository m => CommitName m -> Text renderCommitName (CommitObjectId coid) = renderObjOid coid-renderCommitName (CommitRefName name) = name+renderCommitName (CommitReferenceName name) = name renderCommitName (CommitReference ref) = referenceName ref copyOid :: (Repository m, Repository n) => Oid m -> n (Oid n)@@ -365,41 +353,50 @@ => CommitName m -> n (Maybe (CommitName n)) copyCommitName (CommitObjectId coid) = Just . CommitObjectId . Tagged <$> parseOid (renderObjOid coid)-copyCommitName (CommitRefName name) = return (Just (CommitRefName name))+copyCommitName (CommitReferenceName name) =+ return (Just (CommitReferenceName name)) copyCommitName (CommitReference ref) = fmap CommitReference <$> lookupReference (referenceName ref) {- $objects -}-data ObjRef m a = ByOid !(Tagged a (Oid m)) | Known !a+data ObjectOid m = BlobObjOid !(BlobOid m)+ | TreeObjOid !(TreeOid m)+ | CommitObjOid !(CommitOid m)+ | TagObjOid !(TagOid m) -type BlobRef m = ObjRef m (Blob m)-type TreeRef m = ObjRef m (Tree m)-type CommitRef m = ObjRef m (Commit m)-type TagRef m = ObjRef m (Tag m)+data Object m = BlobObj !(Blob m)+ | TreeObj !(Tree m)+ | CommitObj !(Commit m)+ | TagObj !(Tag m) -data Object m = BlobObj !(BlobRef m)- | TreeObj !(TreeRef m)- | CommitObj !(CommitRef m)- | TagObj !(TagRef m)+objectOid :: Repository m => Object m -> Oid m+objectOid (BlobObj obj) = untag (blobOid obj)+objectOid (TreeObj obj) = untag (treeOid obj)+objectOid (CommitObj obj) = untag (commitOid obj)+objectOid (TagObj obj) = untag (tagOid obj) -objectOid :: Repository m => Object m -> m (Oid m)-objectOid (BlobObj ref) = return . untag $ blobRefOid ref-objectOid (TreeObj ref) = return . untag $ treeRefOid ref-objectOid (CommitObj ref) = return . untag $ commitRefOid ref-objectOid (TagObj ref) = return . untag $ tagRefOid ref+loadObject :: Repository m => ObjectOid m -> m (Object m)+loadObject (BlobObjOid oid) = BlobObj <$> lookupBlob oid+loadObject (TreeObjOid oid) = TreeObj <$> lookupTree oid+loadObject (CommitObjOid oid) = CommitObj <$> lookupCommit oid+loadObject (TagObjOid oid) = TagObj <$> lookupTag oid +objectToObjOid :: Repository m => Object m -> ObjectOid m+objectToObjOid (BlobObj obj) = BlobObjOid (blobOid obj)+objectToObjOid (TreeObj obj) = TreeObjOid (treeOid obj)+objectToObjOid (CommitObj obj) = CommitObjOid (commitOid obj)+objectToObjOid (TagObj obj) = TagObjOid (tagOid obj)++untagObjOid :: Repository m => ObjectOid m -> Oid m+untagObjOid (BlobObjOid oid) = untag oid+untagObjOid (TreeObjOid oid) = untag oid+untagObjOid (CommitObjOid oid) = untag oid+untagObjOid (TagObjOid oid) = untag oid+ {- $blobs -} data Blob m = Blob { blobOid :: !(BlobOid m) , blobContents :: !(BlobContents m) } -blobRefOid :: Repository m => BlobRef m -> BlobOid m-blobRefOid (ByOid oid) = oid-blobRefOid (Known (Blob {..})) = blobOid--resolveBlobRef :: Repository m => BlobRef m -> m (Blob m)-resolveBlobRef (ByOid oid) = lookupBlob oid-resolveBlobRef (Known obj) = return obj- type ByteSource m = Producer m ByteString data BlobContents m = BlobString !ByteString@@ -485,40 +482,40 @@ putCommit :: Repository m => FilePath -> CommitOid m -> TreeT m () putCommit path c = putEntry path (CommitEntry c) -doWithTree :: Repository m => Maybe (Tree m) -> TreeT m a -> m (a, TreeRef m)+doWithTree :: Repository m => Maybe (Tree m) -> TreeT m a -> m (a, TreeOid m) doWithTree mtr act = fst <$> (runStateT (runTreeT go) =<< newTreeBuilder mtr) where- go = liftM2 (,) act currentTreeRef+ go = liftM2 (,) act currentTreeOid -withTree :: Repository m => Tree m -> TreeT m a -> m (a, TreeRef m)+withTree :: Repository m => Tree m -> TreeT m a -> m (a, TreeOid m) withTree tr = doWithTree (Just tr) -withTreeRef :: Repository m => TreeRef m -> TreeT m a -> m (a, TreeRef m)-withTreeRef ref action = do- tree <- resolveTreeRef ref+withTreeOid :: Repository m => TreeOid m -> TreeT m a -> m (a, TreeOid m)+withTreeOid oid action = do+ tree <- lookupTree oid doWithTree (Just tree) action -mutateTree :: Repository m => Tree m -> TreeT m a -> m (TreeRef m)+mutateTree :: Repository m => Tree m -> TreeT m a -> m (TreeOid m) mutateTree tr action = snd <$> withTree tr action -mutateTreeRef :: Repository m => TreeRef m -> TreeT m a -> m (TreeRef m)-mutateTreeRef tr action = snd <$> withTreeRef tr action+mutateTreeOid :: Repository m => TreeOid m -> TreeT m a -> m (TreeOid m)+mutateTreeOid tr action = snd <$> withTreeOid tr action -currentTreeRef :: Repository m => TreeT m (TreeRef m)-currentTreeRef = do+currentTreeOid :: Repository m => TreeT m (TreeOid m)+currentTreeOid = do tb <- getBuilder- (tb', tref) <- lift $ writeTreeBuilder tb+ (tb', toid) <- lift $ writeTreeBuilder tb putBuilder tb'- return tref+ return toid currentTree :: Repository m => TreeT m (Tree m)-currentTree = lift . resolveTreeRef =<< currentTreeRef+currentTree = lift . lookupTree =<< currentTreeOid -withNewTree :: Repository m => TreeT m a -> m (a, TreeRef m)+withNewTree :: Repository m => TreeT m a -> m (a, TreeOid m) withNewTree = doWithTree Nothing -createTree :: Repository m => TreeT m a -> m (TreeRef m)+createTree :: Repository m => TreeT m a -> m (TreeOid m) createTree action = snd <$> withNewTree action data TreeEntry m = BlobEntry { blobEntryOid :: !(BlobOid m)@@ -557,18 +554,6 @@ toModifyTreeResult _ Nothing = TreeEntryNotFound toModifyTreeResult f (Just x) = f x --- | A 'Tree' is anything that is "treeish".-treeRef :: Tree m -> TreeRef m-treeRef = Known--treeRefOid :: Repository m => TreeRef m -> TreeOid m-treeRefOid (ByOid x) = x-treeRefOid (Known x) = treeOid x--resolveTreeRef :: Repository m => TreeRef m -> m (Tree m)-resolveTreeRef (ByOid oid) = lookupTree oid-resolveTreeRef (Known obj) = return obj- {- $commits -} data Signature = Signature { signatureName :: !Text@@ -591,32 +576,21 @@ data Commit m = Commit { commitOid :: !(CommitOid m)- , commitParents :: ![CommitRef m]- , commitTree :: !(TreeRef m)+ , commitParents :: ![CommitOid m]+ , commitTree :: !(TreeOid m) , commitAuthor :: !Signature , commitCommitter :: !Signature , commitLog :: !Text , commitEncoding :: !Text } -commitRef :: Commit m -> CommitRef m-commitRef = Known--commitRefTarget :: Commit c -> RefTarget m (Commit c)-commitRefTarget = RefObj . Known--commitRefOid :: Repository m => CommitRef m -> CommitOid m-commitRefOid (ByOid x) = x-commitRefOid (Known x) = commitOid x--resolveCommitRef :: Repository m => CommitRef m -> m (Commit m)-resolveCommitRef (ByOid oid) = lookupCommit oid-resolveCommitRef (Known obj) = return obj+commitRefTarget :: Commit m -> RefTarget m+commitRefTarget = RefObj . commitOid -referenceToRef :: Repository m- => Maybe Text -> Maybe (Reference m (Commit m))- -> m (Maybe (CommitRef m))-referenceToRef mname mref =+referenceToOid :: Repository m+ => Maybe Text -> Maybe (Reference m)+ -> m (Maybe (CommitOid m))+referenceToOid mname mref = case mref of Nothing -> return Nothing Just (Reference { referenceTarget = RefObj x }) ->@@ -630,13 +604,9 @@ data Tag m = Tag { tagOid :: !(TagOid m)- , tagCommit :: !(CommitRef m)+ , tagCommit :: !(CommitOid m) } -tagRefOid :: Repository m => TagRef m -> TagOid m-tagRefOid (ByOid x) = x-tagRefOid (Known x) = tagOid x- {- $merges -} data ModificationKind = Unchanged | Modified | Added | Deleted | TypeChanged@@ -756,8 +726,7 @@ else do obj <- lookupObject str case obj of- BlobObj (ByOid oid) -> lookupBlob oid >>= blobToByteString- BlobObj (Known x) -> blobToByteString x+ BlobObj b -> blobToByteString b _ -> failure (ObjectLookupFailed str len) where len = T.length str@@ -780,8 +749,8 @@ splitPath :: FilePath -> [Text] splitPath path = T.splitOn "/" text where text = case toText path of- Left x -> error $ "Invalid path: " ++ T.unpack x- Right y -> y+ Left x -> error $ "Invalid path: " ++ T.unpack x+ Right y -> y data ModifiedBuilder m = ModifiedBuilder (TreeBuilder m) | BuilderUnchanged (TreeBuilder m)@@ -798,10 +767,10 @@ fromBuilderMod (ModifiedBuilder tb) = tb data TreeBuilder m = TreeBuilder- { mtbBaseTreeRef :: Maybe (TreeRef m)+ { mtbBaseTreeOid :: Maybe (TreeOid m) , mtbPendingUpdates :: HashMap Text (TreeBuilder m) , mtbNewBuilder :: Maybe (Tree m) -> m (TreeBuilder m)- , mtbWriteContents :: TreeBuilder m -> m (ModifiedBuilder m, TreeRef m)+ , mtbWriteContents :: TreeBuilder m -> m (ModifiedBuilder m, TreeOid m) , mtbLookupEntry :: Text -> m (Maybe (TreeEntry m)) , mtbEntryCount :: m Int , mtbPutEntry :: TreeBuilder m -> Text -> TreeEntry m@@ -811,7 +780,7 @@ instance Monad m => Monoid (TreeBuilder m) where mempty = TreeBuilder- { mtbBaseTreeRef = Nothing+ { mtbBaseTreeOid = Nothing , mtbPendingUpdates = HashMap.empty , mtbNewBuilder = error "Implement TreeBuilder.mtbNewBuilder" , mtbWriteContents = error "Implement TreeBuilder.mtbWriteContents"@@ -821,7 +790,7 @@ , mtbDropEntry = \tb _ -> return (BuilderUnchanged tb) } tb1 `mappend` tb2 = tb2- { mtbBaseTreeRef = mtbBaseTreeRef tb1+ { mtbBaseTreeOid = mtbBaseTreeOid tb1 , mtbPendingUpdates = mtbPendingUpdates tb1 } @@ -861,7 +830,7 @@ doUpdate GetEntry bm name sbm = do (_, tref) <- writeTreeBuilder (fromBuilderMod sbm)- returnTree bm name $ f (Just (TreeEntry (treeRefOid tref)))+ returnTree bm name $ f (Just (TreeEntry tref)) doUpdate _ bm name _ = returnTree bm name (f Nothing) update bm name [] (Left sbm) = doUpdate kind bm name sbm@@ -894,11 +863,15 @@ bm' <- mtbDropEntry tb tb n let tb' = fromBuilderMod bm' upds' = mtbPendingUpdates tb'- return $- if HashMap.member n upds'- then ModifiedBuilder tb'- { mtbPendingUpdates = HashMap.delete n upds' }- else bm'+ return $ case bm' of+ ModifiedBuilder _ ->+ ModifiedBuilder tb'+ { mtbPendingUpdates = HashMap.delete n upds' }+ BuilderUnchanged _ ->+ if HashMap.member n upds'+ then ModifiedBuilder tb'+ { mtbPendingUpdates = HashMap.delete n upds' }+ else bm' TreeEntryMutated z' -> mtbPutEntry tb tb n z' let bm'' = bm <> bm' return $ bm'' `seq` (bm'', z)@@ -913,13 +886,11 @@ -- nothing will happen. writeTreeBuilder :: Repository m => TreeBuilder m- -> m (TreeBuilder m, TreeRef m)+ -> m (TreeBuilder m, TreeOid m) writeTreeBuilder builder = do (bm, mtref) <- go (BuilderUnchanged builder) tref <- case mtref of- Nothing -> do- emptyTreeOid <- parseObjOid emptyTreeId- return $ ByOid emptyTreeOid+ Nothing -> parseObjOid emptyTreeId Just tref -> return tref return (fromBuilderMod bm, tref) where@@ -946,7 +917,7 @@ (_,mtref) <- go (BuilderUnchanged v) bm' <- case mtref of Nothing -> mtbDropEntry tb tb k- Just tref -> mtbPutEntry tb tb k (TreeEntry (treeRefOid tref))+ Just tref -> mtbPutEntry tb tb k (TreeEntry tref) return $ bm <> bm' treeBlobEntries :: Repository m => Tree m -> m [(FilePath,TreeEntry m)]@@ -962,20 +933,19 @@ -> FilePath -> m (Maybe (TreeEntry m)) commitTreeEntry c path =- flip getTreeEntry path =<< resolveTreeRef (commitTree c)+ flip getTreeEntry path =<< lookupTree (commitTree c) copyBlob :: (Repository m, Repository (t m), MonadTrans t)- => BlobRef m+ => BlobOid m -> HashSet Text -> t m (BlobOid (t m), HashSet Text) copyBlob blobr needed = do- let oid = untag (blobRefOid blobr)+ let oid = untag blobr sha = renderOid oid oid2 <- parseOid (renderOid oid) if HashSet.member sha needed then do- bs <- lift $ blobToByteString- =<< resolveBlobRef (ByOid (Tagged oid))+ bs <- lift $ blobToByteString =<< lookupBlob (Tagged oid) boid <- createBlob (BlobString bs) let x = HashSet.delete sha needed@@ -988,7 +958,7 @@ -> HashSet Text -> t m (TreeEntry (t m), HashSet Text) copyTreeEntry (BlobEntry oid kind) needed = do- (b,needed') <- copyBlob (ByOid oid) needed+ (b,needed') <- copyBlob oid needed return (BlobEntry b kind, needed') copyTreeEntry (CommitEntry oid) needed = do coid <- parseOid (renderObjOid oid)@@ -996,23 +966,23 @@ copyTreeEntry (TreeEntry _) _ = error "This should never be called" copyTree :: (Repository m, Repository (t m), MonadTrans t)- => TreeRef m+ => TreeOid m -> HashSet Text- -> t m (TreeRef (t m), HashSet Text)+ -> t m (TreeOid (t m), HashSet Text) copyTree tr needed = do- let oid = untag (treeRefOid tr)+ let oid = untag tr sha = renderOid oid oid2 <- parseOid (renderOid oid) if HashSet.member sha needed then do- tree <- lift $ resolveTreeRef tr+ tree <- lift $ lookupTree tr entries <- lift $ traverseEntries (curry return) tree (needed', tref) <- withNewTree $ foldM doCopyTreeEntry needed entries let x = HashSet.delete sha needed' return $ tref `seq` x `seq` (tref, x) - else return (ByOid (Tagged oid2), needed)+ else return (Tagged oid2, needed) where doCopyTreeEntry :: (Repository m, Repository (t m), MonadTrans t) => HashSet Text -> (FilePath, TreeEntry m)@@ -1024,14 +994,14 @@ return needed'' copyCommit :: (Repository m, Repository (t m), MonadTrans t)- => CommitRef m+ => CommitOid m -> Maybe Text -> HashSet Text- -> t m (CommitRef (t m), HashSet Text)+ -> t m (CommitOid (t m), HashSet Text) copyCommit cr mref needed = do- let oid = untag (commitRefOid cr)+ let oid = untag cr sha = renderOid oid- commit <- lift $ resolveCommitRef cr+ commit <- lift $ lookupCommit cr oid2 <- parseOid sha if HashSet.member sha needed then do@@ -1045,11 +1015,11 @@ (commitLog commit) mref - let cref = commitRef $! commit'+ let coid = commitOid commit' x = HashSet.delete sha needed''- return $ cref `seq` x `seq` (cref, x)+ return $ coid `seq` x `seq` (coid, x) - else return (ByOid (Tagged oid2), needed)+ else return (Tagged oid2, needed) where copyParent (prefs,needed') cref = do (cref2,needed'') <- copyCommit cref Nothing needed'@@ -1059,15 +1029,15 @@ -- | Given a list of objects (commit and top-level trees) return by -- 'missingObjects', expand it to include all subtrees and blobs as well. -- Ordering is preserved.-allMissingObjects :: Repository m => [Object m] -> m [Object m]+allMissingObjects :: Repository m => [ObjectOid m] -> m [ObjectOid m] allMissingObjects objs = fmap concat . forM objs $ \obj -> case obj of- TreeObj ref -> do- tr <- resolveTreeRef ref+ TreeObjOid toid -> do+ tr <- lookupTree toid subobjss <- flip traverseEntries tr $ \_ ent -> return $ case ent of- BlobEntry oid _ -> [BlobObj (ByOid oid)]- TreeEntry oid -> [TreeObj (ByOid oid)]+ BlobEntry oid _ -> [BlobObjOid oid]+ TreeEntry oid -> [TreeObjOid oid] _ -> [] return (obj:concat subobjss) _ -> return [obj]@@ -1075,10 +1045,10 @@ -- | Fast-forward push a reference between repositories using a recursive -- copy. This can be extremely slow, but always works. genericPushCommit :: (Repository m, Repository (t m), MonadTrans t)- => CommitName m -> Text -> t m (CommitRef (t m))-genericPushCommit cname remoteRefName = do+ => CommitOid m -> Text -> t m (CommitOid (t m))+genericPushCommit coid remoteRefName = do mrref <- lookupReference remoteRefName- commits1 <- lift $ traverseCommits crefToSha cname+ commits1 <- lift $ traverseCommits crefToSha coid fastForward <- case mrref of Just rref -> do mrsha <- referenceSha rref@@ -1088,7 +1058,7 @@ Just rsha | rsha `elem` commits1 -> do roid <- lift $ parseOid rsha- return $ Just (Just (CommitObjectId (Tagged roid)))+ return $ Just (Just (Tagged roid)) | otherwise -> do failure (PushNotFastForward $ "SHA " <> rsha@@ -1096,31 +1066,23 @@ Nothing -> return (Just Nothing) case fastForward of Nothing -> failure (PushNotFastForward "unexpected")- Just liftedMrref -> do- objs <- lift $ allMissingObjects- =<< missingObjects liftedMrref cname- shas <- mapM (\obj -> renderOid <$> lift (objectOid obj)) objs- mref <- lift $ commitNameToRef cname- case mref of- Nothing -> failure (ReferenceLookupFailed (T.pack (show cname)))- Just ref -> do- (cref,_) <- copyCommit ref Nothing (HashSet.fromList shas)- -- jww (2013-04-18): This is something the user must- -- decide to do- -- updateRef_ remoteRefName (RefObj cref)- return cref+ Just rref -> do+ objs <- lift $ allMissingObjects =<< missingObjects 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 where- referenceSha ref = do- r <- referenceToRef Nothing (Just ref)- return $ renderObjOid . commitRefOid <$> r-- crefToSha cref = return (renderObjOid (commitRefOid cref))+ referenceSha ref = fmap renderObjOid <$> referenceToOid Nothing (Just ref)+ crefToSha cref = return $ renderObjOid cref commitHistoryFirstParent :: Repository m => Commit m -> m [Commit m] commitHistoryFirstParent c = case commitParents c of [] -> return [c]- (p:_) -> do ps <- commitHistoryFirstParent =<< resolveCommitRef p+ (p:_) -> do ps <- commitHistoryFirstParent =<< lookupCommit p return (c:ps) data PinnedEntry m = PinnedEntry@@ -1145,7 +1107,7 @@ entry <- getCommitTreeEntry co rest <- case commitParents co of [] -> return []- (p:_) -> go =<< resolveCommitRef p+ (p:_) -> go =<< lookupCommit p return $ maybe rest (:rest) entry getCommitTreeEntry co = do@@ -1155,7 +1117,7 @@ Just ce' -> Just <$> identifyEntry co ce' getCommitParents :: Repository m => Commit m -> m [Commit m]-getCommitParents = traverse resolveCommitRef . commitParents+getCommitParents = traverse lookupCommit . commitParents resolveReferenceTree :: Repository m => Text -> m (Maybe (Tree m)) resolveReferenceTree refName = do@@ -1163,7 +1125,7 @@ case c of Nothing -> return Nothing Just c' ->- Just <$> (resolveCommitRef c' >>= resolveTreeRef . commitTree)+ Just <$> (lookupCommit c' >>= lookupTree . commitTree) withNewRepository :: (Repository (t m), MonadGit (t m), MonadBaseControl IO m, MonadIO m, MonadTrans t)
gitlib.cabal view
@@ -1,5 +1,5 @@ Name: gitlib-Version: 1.3.1+Version: 1.4.0 Synopsis: API library for working with Git repositories License-file: LICENSE License: MIT