module Darcs.Patch.Summary
    ( plainSummary, plainSummaryPrim, plainSummaryPrims,
      xmlSummary )
    where

import Prelude ()
import Darcs.Prelude

import Darcs.Util.Path ( fn2fp )
import Darcs.Patch.Conflict ( Conflict(..), IsConflictedPrim(IsC), ConflictState(..) )
import Darcs.Patch.Format ( FileNameFormat(UserFormat) )
import Darcs.Patch.Prim.Class ( PrimDetails(..), PrimPatchBase )
import Darcs.Patch.Show ( formatFileName )
import Darcs.Patch.SummaryData ( SummDetail(..), SummOp(..) )
import Darcs.Patch.Witnesses.Ordered ( FL, mapFL )

import Darcs.Util.Printer ( Doc, empty, vcat,
                 text,
                 minus, plus, ($$), (<+>)
               )


plainSummaryPrim :: PrimDetails prim => prim wX wY -> Doc
plainSummaryPrim :: prim wX wY -> Doc
plainSummaryPrim = [Doc] -> Doc
vcat ([Doc] -> Doc) -> (prim wX wY -> [Doc]) -> prim wX wY -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SummChunk -> Doc) -> [SummChunk] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map (Bool -> SummChunk -> Doc
summChunkToLine Bool
False) ([SummChunk] -> [Doc])
-> (prim wX wY -> [SummChunk]) -> prim wX wY -> [Doc]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [IsConflictedPrim prim] -> [SummChunk]
forall (p :: * -> * -> *).
PrimDetails p =>
[IsConflictedPrim p] -> [SummChunk]
genSummary ([IsConflictedPrim prim] -> [SummChunk])
-> (prim wX wY -> [IsConflictedPrim prim])
-> prim wX wY
-> [SummChunk]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (IsConflictedPrim prim
-> [IsConflictedPrim prim] -> [IsConflictedPrim prim]
forall a. a -> [a] -> [a]
:[]) (IsConflictedPrim prim -> [IsConflictedPrim prim])
-> (prim wX wY -> IsConflictedPrim prim)
-> prim wX wY
-> [IsConflictedPrim prim]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConflictState -> prim wX wY -> IsConflictedPrim prim
forall (prim :: * -> * -> *) wX wY.
ConflictState -> prim wX wY -> IsConflictedPrim prim
IsC ConflictState
Okay

plainSummaryPrims :: PrimDetails prim => Bool -> FL prim wX wY -> Doc
plainSummaryPrims :: Bool -> FL prim wX wY -> Doc
plainSummaryPrims machineReadable :: Bool
machineReadable =
 [Doc] -> Doc
vcat ([Doc] -> Doc) -> (FL prim wX wY -> [Doc]) -> FL prim wX wY -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SummChunk -> Doc) -> [SummChunk] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map (Bool -> SummChunk -> Doc
summChunkToLine Bool
machineReadable) ([SummChunk] -> [Doc])
-> (FL prim wX wY -> [SummChunk]) -> FL prim wX wY -> [Doc]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [IsConflictedPrim prim] -> [SummChunk]
forall (p :: * -> * -> *).
PrimDetails p =>
[IsConflictedPrim p] -> [SummChunk]
genSummary ([IsConflictedPrim prim] -> [SummChunk])
-> (FL prim wX wY -> [IsConflictedPrim prim])
-> FL prim wX wY
-> [SummChunk]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall wW wZ. prim wW wZ -> IsConflictedPrim prim)
-> FL prim wX wY -> [IsConflictedPrim prim]
forall (a :: * -> * -> *) b wX wY.
(forall wW wZ. a wW wZ -> b) -> FL a wX wY -> [b]
mapFL (ConflictState -> prim wW wZ -> IsConflictedPrim prim
forall (prim :: * -> * -> *) wX wY.
ConflictState -> prim wX wY -> IsConflictedPrim prim
IsC ConflictState
Okay)

plainSummary :: (Conflict e, PrimPatchBase e) => e wX wY -> Doc
plainSummary :: e wX wY -> Doc
plainSummary = [Doc] -> Doc
vcat ([Doc] -> Doc) -> (e wX wY -> [Doc]) -> e wX wY -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SummChunk -> Doc) -> [SummChunk] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map (Bool -> SummChunk -> Doc
summChunkToLine Bool
False) ([SummChunk] -> [Doc])
-> (e wX wY -> [SummChunk]) -> e wX wY -> [Doc]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [IsConflictedPrim (PrimOf e)] -> [SummChunk]
forall (p :: * -> * -> *).
PrimDetails p =>
[IsConflictedPrim p] -> [SummChunk]
genSummary ([IsConflictedPrim (PrimOf e)] -> [SummChunk])
-> (e wX wY -> [IsConflictedPrim (PrimOf e)])
-> e wX wY
-> [SummChunk]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e wX wY -> [IsConflictedPrim (PrimOf e)]
forall (p :: * -> * -> *) wX wY.
Conflict p =>
p wX wY -> [IsConflictedPrim (PrimOf p)]
conflictedEffect

xmlSummary :: (Conflict p, PrimPatchBase p) => p wX wY -> Doc
xmlSummary :: p wX wY -> Doc
xmlSummary p :: p wX wY
p = String -> Doc
text "<summary>"
             Doc -> Doc -> Doc
$$ ([Doc] -> Doc
vcat ([Doc] -> Doc) -> (p wX wY -> [Doc]) -> p wX wY -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SummChunk -> Doc) -> [SummChunk] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map SummChunk -> Doc
summChunkToXML ([SummChunk] -> [Doc])
-> (p wX wY -> [SummChunk]) -> p wX wY -> [Doc]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [IsConflictedPrim (PrimOf p)] -> [SummChunk]
forall (p :: * -> * -> *).
PrimDetails p =>
[IsConflictedPrim p] -> [SummChunk]
genSummary ([IsConflictedPrim (PrimOf p)] -> [SummChunk])
-> (p wX wY -> [IsConflictedPrim (PrimOf p)])
-> p wX wY
-> [SummChunk]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p wX wY -> [IsConflictedPrim (PrimOf p)]
forall (p :: * -> * -> *) wX wY.
Conflict p =>
p wX wY -> [IsConflictedPrim (PrimOf p)]
conflictedEffect (p wX wY -> Doc) -> p wX wY -> Doc
forall a b. (a -> b) -> a -> b
$ p wX wY
p)
             Doc -> Doc -> Doc
$$ String -> Doc
text "</summary>"

-- Yuck duplicated code below...
escapeXML :: String -> Doc
escapeXML :: String -> Doc
escapeXML = String -> Doc
text (String -> Doc) -> (String -> String) -> String -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> String -> String -> String
strReplace '\'' "&apos;" (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> String -> String -> String
strReplace '"' "&quot;" (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Char -> String -> String -> String
strReplace '>' "&gt;" (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> String -> String -> String
strReplace '<' "&lt;" (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> String -> String -> String
strReplace '&' "&amp;"

strReplace :: Char -> String -> String -> String
strReplace :: Char -> String -> String -> String
strReplace _ _ [] = []
strReplace x :: Char
x y :: String
y (z :: Char
z:zs :: String
zs)
  | Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
z    = String
y String -> String -> String
forall a. [a] -> [a] -> [a]
++ Char -> String -> String -> String
strReplace Char
x String
y String
zs
  | Bool
otherwise = Char
z Char -> String -> String
forall a. a -> [a] -> [a]
: Char -> String -> String -> String
strReplace Char
x String
y String
zs
-- end yuck duplicated code.

-- | High-level representation of a piece of patch summary
data SummChunk = SummChunk SummDetail ConflictState
   deriving (Eq SummChunk
Eq SummChunk =>
(SummChunk -> SummChunk -> Ordering)
-> (SummChunk -> SummChunk -> Bool)
-> (SummChunk -> SummChunk -> Bool)
-> (SummChunk -> SummChunk -> Bool)
-> (SummChunk -> SummChunk -> Bool)
-> (SummChunk -> SummChunk -> SummChunk)
-> (SummChunk -> SummChunk -> SummChunk)
-> Ord SummChunk
SummChunk -> SummChunk -> Bool
SummChunk -> SummChunk -> Ordering
SummChunk -> SummChunk -> SummChunk
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: SummChunk -> SummChunk -> SummChunk
$cmin :: SummChunk -> SummChunk -> SummChunk
max :: SummChunk -> SummChunk -> SummChunk
$cmax :: SummChunk -> SummChunk -> SummChunk
>= :: SummChunk -> SummChunk -> Bool
$c>= :: SummChunk -> SummChunk -> Bool
> :: SummChunk -> SummChunk -> Bool
$c> :: SummChunk -> SummChunk -> Bool
<= :: SummChunk -> SummChunk -> Bool
$c<= :: SummChunk -> SummChunk -> Bool
< :: SummChunk -> SummChunk -> Bool
$c< :: SummChunk -> SummChunk -> Bool
compare :: SummChunk -> SummChunk -> Ordering
$ccompare :: SummChunk -> SummChunk -> Ordering
$cp1Ord :: Eq SummChunk
Ord, SummChunk -> SummChunk -> Bool
(SummChunk -> SummChunk -> Bool)
-> (SummChunk -> SummChunk -> Bool) -> Eq SummChunk
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SummChunk -> SummChunk -> Bool
$c/= :: SummChunk -> SummChunk -> Bool
== :: SummChunk -> SummChunk -> Bool
$c== :: SummChunk -> SummChunk -> Bool
Eq)

genSummary :: forall p . PrimDetails p => [IsConflictedPrim p] -> [SummChunk]
genSummary :: [IsConflictedPrim p] -> [SummChunk]
genSummary p :: [IsConflictedPrim p]
p
    = [SummChunk] -> [SummChunk]
combine ([SummChunk] -> [SummChunk]) -> [SummChunk] -> [SummChunk]
forall a b. (a -> b) -> a -> b
$ (IsConflictedPrim p -> [SummChunk])
-> [IsConflictedPrim p] -> [SummChunk]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap IsConflictedPrim p -> [SummChunk]
s2 [IsConflictedPrim p]
p
    where s2 :: IsConflictedPrim p -> [SummChunk]
          s2 :: IsConflictedPrim p -> [SummChunk]
s2 (IsC c :: ConflictState
c x :: p wX wY
x) = (SummDetail -> SummChunk) -> [SummDetail] -> [SummChunk]
forall a b. (a -> b) -> [a] -> [b]
map (SummDetail -> ConflictState -> SummChunk
`SummChunk` ConflictState
c) ([SummDetail] -> [SummChunk]) -> [SummDetail] -> [SummChunk]
forall a b. (a -> b) -> a -> b
$ p wX wY -> [SummDetail]
forall (prim :: * -> * -> *) wX wY.
PrimDetails prim =>
prim wX wY -> [SummDetail]
summarizePrim p wX wY
x
          combine :: [SummChunk] -> [SummChunk]
combine (x1 :: SummChunk
x1@(SummChunk d1 :: SummDetail
d1 c1 :: ConflictState
c1) : x2 :: SummChunk
x2@(SummChunk d2 :: SummDetail
d2 c2 :: ConflictState
c2) : ss :: [SummChunk]
ss)
              = case SummDetail -> SummDetail -> Maybe SummDetail
combineDetail SummDetail
d1 SummDetail
d2 of
                  Nothing -> SummChunk
x1 SummChunk -> [SummChunk] -> [SummChunk]
forall a. a -> [a] -> [a]
: [SummChunk] -> [SummChunk]
combine (SummChunk
x2SummChunk -> [SummChunk] -> [SummChunk]
forall a. a -> [a] -> [a]
:[SummChunk]
ss)
                  Just d3 :: SummDetail
d3 -> [SummChunk] -> [SummChunk]
combine ([SummChunk] -> [SummChunk]) -> [SummChunk] -> [SummChunk]
forall a b. (a -> b) -> a -> b
$ SummDetail -> ConflictState -> SummChunk
SummChunk SummDetail
d3 (ConflictState -> ConflictState -> ConflictState
combineConflictStates ConflictState
c1 ConflictState
c2) SummChunk -> [SummChunk] -> [SummChunk]
forall a. a -> [a] -> [a]
: [SummChunk]
ss
          combine (x :: SummChunk
x:ss :: [SummChunk]
ss) = SummChunk
x  SummChunk -> [SummChunk] -> [SummChunk]
forall a. a -> [a] -> [a]
: [SummChunk] -> [SummChunk]
combine [SummChunk]
ss
          combine [] = []
          --
          combineDetail :: SummDetail -> SummDetail -> Maybe SummDetail
combineDetail (SummFile o1 :: SummOp
o1 f1 :: FileName
f1 r1 :: Int
r1 a1 :: Int
a1 x1 :: Int
x1) (SummFile o2 :: SummOp
o2 f2 :: FileName
f2 r2 :: Int
r2 a2 :: Int
a2 x2 :: Int
x2) | FileName
f1 FileName -> FileName -> Bool
forall a. Eq a => a -> a -> Bool
== FileName
f2 =
            do SummOp
o3 <- SummOp -> SummOp -> Maybe SummOp
combineOp SummOp
o1 SummOp
o2
               SummDetail -> Maybe SummDetail
forall (m :: * -> *) a. Monad m => a -> m a
return (SummDetail -> Maybe SummDetail) -> SummDetail -> Maybe SummDetail
forall a b. (a -> b) -> a -> b
$ SummOp -> FileName -> Int -> Int -> Int -> SummDetail
SummFile SummOp
o3 FileName
f1 (Int
r1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
r2) (Int
a1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
a2) (Int
x1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
x2)
          combineDetail _ _ = Maybe SummDetail
forall a. Maybe a
Nothing
          --
          combineConflictStates :: ConflictState -> ConflictState -> ConflictState
combineConflictStates Conflicted _ = ConflictState
Conflicted
          combineConflictStates _ Conflicted = ConflictState
Conflicted
          combineConflictStates Duplicated _ = ConflictState
Duplicated
          combineConflictStates _ Duplicated = ConflictState
Duplicated
          combineConflictStates Okay Okay = ConflictState
Okay
          -- Don't combine AddFile and RmFile: (maybe an old revision of) darcs
          -- allows a single patch to add and remove the same file, see issue 185
          combineOp :: SummOp -> SummOp -> Maybe SummOp
combineOp SummAdd SummRm  = Maybe SummOp
forall a. Maybe a
Nothing
          combineOp SummRm  SummAdd = Maybe SummOp
forall a. Maybe a
Nothing
          combineOp SummAdd _ = SummOp -> Maybe SummOp
forall a. a -> Maybe a
Just SummOp
SummAdd
          combineOp _ SummAdd = SummOp -> Maybe SummOp
forall a. a -> Maybe a
Just SummOp
SummAdd
          combineOp SummRm  _ = SummOp -> Maybe SummOp
forall a. a -> Maybe a
Just SummOp
SummRm
          combineOp _ SummRm  = SummOp -> Maybe SummOp
forall a. a -> Maybe a
Just SummOp
SummRm
          combineOp SummMod SummMod = SummOp -> Maybe SummOp
forall a. a -> Maybe a
Just SummOp
SummMod

summChunkToXML :: SummChunk -> Doc
summChunkToXML :: SummChunk -> Doc
summChunkToXML (SummChunk detail :: SummDetail
detail c :: ConflictState
c) =
 case SummDetail
detail of
   SummRmDir f :: FileName
f  -> ConflictState -> String -> Doc -> Doc
xconf ConflictState
c "remove_directory" (FileName -> Doc
xfn FileName
f)
   SummAddDir f :: FileName
f -> ConflictState -> String -> Doc -> Doc
xconf ConflictState
c "add_directory"    (FileName -> Doc
xfn FileName
f)
   SummFile SummRm  f :: FileName
f _ _ _ -> ConflictState -> String -> Doc -> Doc
xconf ConflictState
c "remove_file" (FileName -> Doc
xfn FileName
f)
   SummFile SummAdd f :: FileName
f _ _ _ -> ConflictState -> String -> Doc -> Doc
xconf ConflictState
c "add_file"    (FileName -> Doc
xfn FileName
f)
   SummFile SummMod f :: FileName
f r :: Int
r a :: Int
a x :: Int
x -> ConflictState -> String -> Doc -> Doc
xconf ConflictState
c "modify_file" (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ FileName -> Doc
xfn FileName
f Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Int -> Doc
forall a. (Eq a, Num a, Show a) => a -> Doc
xrm Int
r Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Int -> Doc
forall a. (Eq a, Num a, Show a) => a -> Doc
xad Int
a Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Int -> Doc
forall a. (Eq a, Num a, Show a) => a -> Doc
xrp Int
x
   SummMv f1 :: FileName
f1 f2 :: FileName
f2  -> String -> Doc
text "<move from=\"" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> FileName -> Doc
xfn FileName
f1
                      Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text "\" to=\"" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> FileName -> Doc
xfn FileName
f2 Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text"\"/>"
   SummNone      -> Doc
empty
 where
   xconf :: ConflictState -> String -> Doc -> Doc
xconf Okay t :: String
t x :: Doc
x       = String -> Doc
text ('<'Char -> String -> String
forall a. a -> [a] -> [a]
:String
tString -> String -> String
forall a. [a] -> [a] -> [a]
++">") Doc -> Doc -> Doc
$$ Doc
x Doc -> Doc -> Doc
$$ String -> Doc
text ("</"String -> String -> String
forall a. [a] -> [a] -> [a]
++String
tString -> String -> String
forall a. [a] -> [a] -> [a]
++">")
   xconf Conflicted t :: String
t x :: Doc
x = String -> Doc
text ('<'Char -> String -> String
forall a. a -> [a] -> [a]
:String
tString -> String -> String
forall a. [a] -> [a] -> [a]
++" conflict='true'>") Doc -> Doc -> Doc
$$ Doc
x Doc -> Doc -> Doc
$$ String -> Doc
text ("</"String -> String -> String
forall a. [a] -> [a] -> [a]
++String
tString -> String -> String
forall a. [a] -> [a] -> [a]
++">")
   xconf Duplicated t :: String
t x :: Doc
x = String -> Doc
text ('<'Char -> String -> String
forall a. a -> [a] -> [a]
:String
tString -> String -> String
forall a. [a] -> [a] -> [a]
++" duplicate='true'>") Doc -> Doc -> Doc
$$ Doc
x Doc -> Doc -> Doc
$$ String -> Doc
text ("</"String -> String -> String
forall a. [a] -> [a] -> [a]
++String
tString -> String -> String
forall a. [a] -> [a] -> [a]
++">")
   xfn :: FileName -> Doc
xfn = String -> Doc
escapeXML (String -> Doc) -> (FileName -> String) -> FileName -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
dropDotSlash (String -> String) -> (FileName -> String) -> FileName -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FileName -> String
fn2fp
   --
   xad :: a -> Doc
xad 0 = Doc
empty
   xad a :: a
a = String -> Doc
text "<added_lines num='" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text (a -> String
forall a. Show a => a -> String
show a
a) Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text "'/>"
   xrm :: a -> Doc
xrm 0 = Doc
empty
   xrm a :: a
a = String -> Doc
text "<removed_lines num='" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text (a -> String
forall a. Show a => a -> String
show a
a) Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text "'/>"
   xrp :: a -> Doc
xrp 0 = Doc
empty
   xrp a :: a
a = String -> Doc
text "<replaced_tokens num='" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text (a -> String
forall a. Show a => a -> String
show a
a) Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text "'/>"

summChunkToLine :: Bool -> SummChunk -> Doc
summChunkToLine :: Bool -> SummChunk -> Doc
summChunkToLine machineReadable :: Bool
machineReadable (SummChunk detail :: SummDetail
detail c :: ConflictState
c) =
  case SummDetail
detail of
   SummRmDir f :: FileName
f   -> ConflictState -> String -> Doc -> Doc
lconf ConflictState
c "R" (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ FileNameFormat -> FileName -> Doc
formatFileName FileNameFormat
UserFormat FileName
f Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text "/"
   SummAddDir f :: FileName
f  -> ConflictState -> String -> Doc -> Doc
lconf ConflictState
c "A" (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ FileNameFormat -> FileName -> Doc
formatFileName FileNameFormat
UserFormat FileName
f Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text "/"
   SummFile SummRm  f :: FileName
f _ _ _ -> ConflictState -> String -> Doc -> Doc
lconf ConflictState
c "R" (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ FileNameFormat -> FileName -> Doc
formatFileName FileNameFormat
UserFormat FileName
f
   SummFile SummAdd f :: FileName
f _ _ _ -> ConflictState -> String -> Doc -> Doc
lconf ConflictState
c "A" (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ FileNameFormat -> FileName -> Doc
formatFileName FileNameFormat
UserFormat FileName
f
   SummFile SummMod f :: FileName
f r :: Int
r a :: Int
a x :: Int
x
     | Bool
machineReadable -> ConflictState -> String -> Doc -> Doc
lconf ConflictState
c "M" (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ FileNameFormat -> FileName -> Doc
formatFileName FileNameFormat
UserFormat FileName
f
     | Bool
otherwise       -> ConflictState -> String -> Doc -> Doc
lconf ConflictState
c "M" (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ FileNameFormat -> FileName -> Doc
formatFileName FileNameFormat
UserFormat FileName
f Doc -> Doc -> Doc
<+> Int -> Doc
forall a. (Eq a, Num a, Show a) => a -> Doc
rm Int
r Doc -> Doc -> Doc
<+> Int -> Doc
forall a. (Eq a, Num a, Show a) => a -> Doc
ad Int
a Doc -> Doc -> Doc
<+> Int -> Doc
forall a. (Eq a, Num a, Show a) => a -> Doc
rp Int
x
   SummMv f1 :: FileName
f1 f2 :: FileName
f2
     | Bool
machineReadable -> String -> Doc
text "F " Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> FileNameFormat -> FileName -> Doc
formatFileName FileNameFormat
UserFormat FileName
f1
                       Doc -> Doc -> Doc
$$ String -> Doc
text "T " Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> FileNameFormat -> FileName -> Doc
formatFileName FileNameFormat
UserFormat FileName
f2
     | Bool
otherwise       -> String -> Doc
text " "    Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> FileNameFormat -> FileName -> Doc
formatFileName FileNameFormat
UserFormat FileName
f1
                       Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text " -> " Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> FileNameFormat -> FileName -> Doc
formatFileName FileNameFormat
UserFormat FileName
f2
   SummNone -> case ConflictState
c of
               Okay -> Doc
empty
               _    -> ConflictState -> String -> Doc -> Doc
lconf ConflictState
c ""  Doc
empty
  where
   lconf :: ConflictState -> String -> Doc -> Doc
lconf Okay       t :: String
t x :: Doc
x = String -> Doc
text String
t Doc -> Doc -> Doc
<+> Doc
x
   lconf Conflicted t :: String
t x :: Doc
x = String -> Doc
text (String
t String -> String -> String
forall a. [a] -> [a] -> [a]
++ "!") Doc -> Doc -> Doc
<+> Doc
x
   lconf Duplicated t :: String
t x :: Doc
x
     | Bool
machineReadable = String -> Doc
text String
t Doc -> Doc -> Doc
<+> Doc
x
     | Bool
otherwise       = String -> Doc
text String
t Doc -> Doc -> Doc
<+> Doc
x Doc -> Doc -> Doc
<+> String -> Doc
text "duplicate"
   --
   ad :: a -> Doc
ad 0 = Doc
empty
   ad a :: a
a = Doc
plus Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text (a -> String
forall a. Show a => a -> String
show a
a)
   rm :: a -> Doc
rm 0 = Doc
empty
   rm a :: a
a = Doc
minus Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text (a -> String
forall a. Show a => a -> String
show a
a)
   rp :: a -> Doc
rp 0 = Doc
empty
   rp a :: a
a = String -> Doc
text "r" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> String -> Doc
text (a -> String
forall a. Show a => a -> String
show a
a)

dropDotSlash :: FilePath -> FilePath
dropDotSlash :: String -> String
dropDotSlash ('.':'/':str :: String
str) = String -> String
dropDotSlash String
str
dropDotSlash str :: String
str = String
str