summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2010-11-10 14:01:41 -0400
committerGravatar Joey Hess <joey@kitenet.net>2010-11-10 14:01:41 -0400
commit81524d19a7e5bc5f7b573260babe2def279187f7 (patch)
treee25af35c74d756ef4efdbf7801a16aa8a793c935
parentd0886a9ac7b662b2cdfe386af1d81af74925d0b1 (diff)
add typeChangedFiles
-rw-r--r--GitRepo.hs21
1 files changed, 17 insertions, 4 deletions
diff --git a/GitRepo.hs b/GitRepo.hs
index da86c225e..5fc077c44 100644
--- a/GitRepo.hs
+++ b/GitRepo.hs
@@ -39,6 +39,7 @@ module GitRepo (
checkAttr,
decodeGitFile,
encodeGitFile,
+ typeChangedFiles,
prop_idempotent_deencode
) where
@@ -58,6 +59,7 @@ import Data.Char
import Data.Word (Word8)
import Codec.Binary.UTF8.String (encode)
import Text.Printf
+import Data.List
import Utility
@@ -227,20 +229,31 @@ hPipeRead repo params = assertLocal repo $ do
- are checked into git at that location. -}
inRepo :: Repo -> FilePath -> IO [FilePath]
inRepo repo l = pipeNullSplit repo
- ["ls-files", "--cached", "--exclude-standard", "-z", l]
+ ["ls-files", "--cached", "--exclude-standard", "-z", "--", l]
{- Passed a location, recursively scans for all files that are not checked
- into git, and not gitignored. -}
notInRepo :: Repo -> FilePath -> IO [FilePath]
notInRepo repo l = pipeNullSplit repo
- ["ls-files", "--others", "--exclude-standard", "-z", l]
+ ["ls-files", "--others", "--exclude-standard", "-z", "--", l]
{- Passed a location, returns a list of the files, staged for
- commit, that are being added, moved, or changed (but not deleted). -}
stagedFiles :: Repo -> FilePath -> IO [FilePath]
stagedFiles repo l = pipeNullSplit repo
- ["diff", "--cached", "--name-only", "--diff-filter=ACMRT", "-z",
- "HEAD", l]
+ ["diff", "--cached", "--name-only", "--diff-filter=ACMRT", "-z",
+ "--", l]
+
+{- Passed a location, returns a list of the files whose type has changed. -}
+typeChangedFiles :: Repo -> FilePath -> IO [FilePath]
+typeChangedFiles repo l = do
+ changed <- pipeNullSplit repo $ start ++ end
+ changedCached <- pipeNullSplit repo $ start ++ ["--cached"] ++ end
+ -- a file can be found twice by the above, so nub
+ return $ nub $ changed ++ changedCached
+ where
+ start = ["diff", "--name-only", "--diff-filter=T", "-z"]
+ end = ["--", l]
{- Reads null terminated output of a git command (as enabled by the -z
- parameter), and splits it into a list of files. -}