add ls-files --unmerged support

This commit is contained in:
Joey Hess 2012-06-27 09:27:59 -04:00
parent 6f45827fe0
commit 8e8439a519
2 changed files with 32 additions and 1 deletions

View file

@ -1,6 +1,6 @@
{- git ls-files interface {- git ls-files interface
- -
- Copyright 2010 Joey Hess <joey@kitenet.net> - Copyright 2010,2012 Joey Hess <joey@kitenet.net>
- -
- Licensed under the GNU GPL version 3 or higher. - Licensed under the GNU GPL version 3 or higher.
-} -}
@ -18,6 +18,8 @@ module Git.LsFiles (
import Common import Common
import Git import Git
import Git.Command import Git.Command
import Git.Types
import Git.Sha
{- Scans for files that are checked into git at the specified locations. -} {- Scans for files that are checked into git at the specified locations. -}
inRepo :: [FilePath] -> Repo -> IO [FilePath] inRepo :: [FilePath] -> Repo -> IO [FilePath]
@ -75,3 +77,26 @@ typeChanged' ps l repo = do
where where
prefix = [Params "diff --name-only --diff-filter=T -z"] prefix = [Params "diff --name-only --diff-filter=T -z"]
suffix = Param "--" : map File l suffix = Param "--" : map File l
data Unmerged = Unmerged
{ unmergedFile :: FilePath
, unmergedBlobType :: BlobType
, unmergedSha :: Sha
}
{- Returns a list of the files in the specified locations that have
- unresolved merge conflicts. Each unmerged file will have duplicates
- in the list for each unmerged version (typically two). -}
unmerged :: [FilePath] -> Repo -> IO [Unmerged]
unmerged l repo = catMaybes . map parse <$> list repo
where
list = pipeNullSplit $ Params "ls-files --unmerged -z --" : map File l
parse s
| null file || length ws < 2 = Nothing
| otherwise = do
blobtype <- readBlobType (ws !! 0)
sha <- extractSha (ws !! 1)
return $ Unmerged file blobtype sha
where
(metadata, file) = separate (== '\t') s
ws = words metadata

View file

@ -71,3 +71,9 @@ instance Show BlobType where
show FileBlob = "100644" show FileBlob = "100644"
show ExecutableBlob = "100755" show ExecutableBlob = "100755"
show SymlinkBlob = "120000" show SymlinkBlob = "120000"
readBlobType :: String -> Maybe BlobType
readBlobType "100644" = Just FileBlob
readBlobType "100755" = Just ExecutableBlob
readBlobType "120000" = Just SymlinkBlob
readBlobType _ = Nothing