Initial check-in
[darcs-mirror-ipatch.git] / DiffFile.hs
1 {-# LANGUAGE Rank2Types #-}
2 module DiffFile where
3
4
5 import qualified Data.ByteString as B
6     ( ByteString, null, hGetContents, readFile )
7 import qualified Data.ByteString.Char8 as BC ( unpack )
8 import System.IO ( stdin )
9 import Control.Applicative ( (<$>) )
10 import Darcs.RepoPath ( FilePathLike(..), useAbsoluteOrStd )
11 import Darcs.External ( execDocPipe )
12 import Printer ( packedString, renderPS )
13 import ByteStringUtils ( linesPS )
14
15 newtype DiffFile = DiffFile B.ByteString
16
17 readDiffFile = fmap DiffFile . useAbsoluteOrStd (B.readFile . toFilePath) (B.hGetContents stdin) 
18
19 filesTouchedByDiff (DiffFile bs) = map BC.unpack . filter (not . B.null) . linesPS <$> execPSPipe "diffstat" ["-l","-p1"] bs
20
21 applyDiff (DiffFile bs) = execPSPipe "patch" ["-r","-","-p1"] bs
22
23
24 execPSPipe :: String -> [String] -> B.ByteString -> IO B.ByteString
25 execPSPipe c args ps = fmap renderPS
26                      $ execDocPipe c args
27                      $ packedString ps
28