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