merge up to ghc HEAD 16-Apr-2011
[ghc-hetmet.git] / distrib / compare / Tar.hs
1
2 module Tar where
3
4 import Data.Either
5 import Data.List
6 import System.Exit
7 import System.Process
8
9 import Utils
10
11 readTarLines :: FilePath -> IO [TarLine]
12 readTarLines fp
13  = do (ec, out, err) <- readProcessWithExitCode "tar" ["-jtvf", fp] ""
14       case (ec, err) of
15           (ExitSuccess, []) ->
16                   case parseTarLines fp out of
17                   Left  errs -> die errs
18                   Right tls  -> return tls
19           _ ->
20               die ["Failed running tar -jtvf " ++ show fp,
21                    "Exit code: " ++ show ec,
22                    "Stderr: " ++ show err]
23
24 parseTarLines :: FilePath -> String -> Either Errors [TarLine]
25 parseTarLines fp xs
26     = case partitionEithers (zipWith (parseTarLine fp) [1..] (lines xs)) of
27       ([],    tls) -> Right tls
28       (errss, _)   -> Left (intercalate [""] errss)
29
30 data TarLine = TarLine {
31                    tlPermissions :: String,
32                    tlUser :: String,
33                    tlGroup :: String,
34                    tlSize :: Integer,
35                    tlDateTime :: String,
36                    tlFileName :: FilePath
37                }
38
39 parseTarLine :: FilePath -> Int -> String -> Either Errors TarLine
40 parseTarLine fp line str
41  = case re "^([^ ]+) ([^ ]+)/([^ ]+) +([0-9]+) ([^ ]+ [^ ]+) ([^ ]+)$"
42            str of
43    Just [perms, user, grp, sizeStr, dateTime, filename] ->
44        case maybeRead sizeStr of
45        Just size ->
46            Right $ TarLine {
47                        tlPermissions = perms,
48                        tlUser        = user,
49                        tlGroup       = grp,
50                        tlSize        = size,
51                        tlDateTime    = dateTime,
52                        tlFileName    = filename
53                    }
54        _ -> error "Can't happen: Can't parse size"
55    _ ->
56        Left ["In " ++ show fp ++ ", at line " ++ show line,
57              "Tar line doesn't parse: " ++ show str]
58