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>"
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 '\'' "'" (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> String -> String -> String
strReplace '"' """ (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
Char -> String -> String -> String
strReplace '>' ">" (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> String -> String -> String
strReplace '<' "<" (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> String -> String -> String
strReplace '&' "&"
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
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
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