| |
| 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 |