11 readTarLines :: FilePath -> IO [TarLine]
13 = do (ec, out, err) <- readProcessWithExitCode "tar" ["-jtvf", fp] ""
16 case parseTarLines fp out of
18 Right tls -> return tls
20 die ["Failed running tar -jtvf " ++ show fp,
21 "Exit code: " ++ show ec,
22 "Stderr: " ++ show err]
24 parseTarLines :: FilePath -> String -> Either Errors [TarLine]
26 = case partitionEithers (zipWith (parseTarLine fp) [1..] (lines xs)) of
27 ([], tls) -> Right tls
28 (errss, _) -> Left (intercalate [""] errss)
30 data TarLine = TarLine {
31 tlPermissions :: String,
36 tlFileName :: FilePath
39 parseTarLine :: FilePath -> Int -> String -> Either Errors TarLine
40 parseTarLine fp line str
41 = case re "^([^ ]+) ([^ ]+)/([^ ]+) +([0-9]+) ([^ ]+ [^ ]+) ([^ ]+)$"
43 Just [perms, user, grp, sizeStr, dateTime, filename] ->
44 case maybeRead sizeStr of
47 tlPermissions = perms,
51 tlDateTime = dateTime,
54 _ -> error "Can't happen: Can't parse size"
56 Left ["In " ++ show fp ++ ", at line " ++ show line,
57 "Tar line doesn't parse: " ++ show str]