blob: 5ca6f069608a242eae314f1905d09dc3b7020ae9 [file] [log] [blame]
module Main where
import IO
import Directory
import System
dirAA = "in-AAcommon-6077-1660"
dirBB = "in-BBtrunk"
dirCC = "in-CCaixbranch"
dirRR = "RESULT"
maybe_do :: String -> IO ()
maybe_do f
= let r = dirRR ++ "/" ++ f
a = dirAA ++ "/" ++ f
b = dirBB ++ "/" ++ f
c = dirCC ++ "/" ++ f
in
do x <- doesFileExist r
if x
then hPutStrLn stderr ("done: " ++ f)
else
do hPutStrLn stderr (" do: " ++ f)
xx <- system ("mkdir -p " ++ basename r)
rs <- merge3 r a b c
hPutStrLn stderr (rs ++ f)
merge3 :: String -> String -> String -> String -> IO String
merge3 r a b c
= do ca <- readFile a
cb <- readFile b
cc <- readFile c
let same = identical3 ca cb cc
if same
then
do ec <- system ("/bin/cp " ++ a ++ " " ++ r)
if ec == ExitSuccess
then return "COPY: "
else barf "/bin/cp failed"
else
do ec <- system ("kdiff3 -m -o " ++ r ++ " -b "
++ a ++ " " ++ b ++ " " ++ c ++ " &> /dev/null" )
if ec == ExitSuccess
then return " ok: "
else barf "kdiff3 failed"
barf :: String -> IO a
barf who
= do hPutStrLn stderr ("FAIL: " ++ who)
exitWith ExitSuccess
identical3 :: String -> String -> String -> Bool
identical3 [] [] [] = True
identical3 (x:xs) (y:ys) (z:zs)
= x == y && y == z && identical3 xs ys zs
identical3 _ _ _ = False
main :: IO ()
main
= do t <- readFile "FILEScba"
let fs = lines t
mapM_ maybe_do fs
basename = reverse . drop 1 . dropWhile (/= '/') . reverse