mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
67 lines
1.7 KiB
Haskell
67 lines
1.7 KiB
Haskell
|
|
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
|