darcs-2.18.1: src/Darcs/Patch/Prim/V1/Core.hs
-- Copyright (C) 2002-2003,2007 David Roundy
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2, or (at your option)
-- any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; see the file COPYING. If not, write to
-- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-- Boston, MA 02110-1301, USA.
module Darcs.Patch.Prim.V1.Core
( Prim(..)
, DirPatchType(..)
, FilePatchType(..)
) where
import Darcs.Prelude
import qualified Data.ByteString as B (ByteString)
import Darcs.Util.Path ( AnchoredPath )
import Darcs.Patch.Witnesses.Eq ( Eq2(..) )
import Darcs.Patch.Witnesses.Unsafe ( unsafeCoerceP )
import Darcs.Patch.Apply ( ApplyState )
import Darcs.Patch.Debug ( PatchDebug(..) )
import Darcs.Patch.FileHunk ( FileHunk(..), IsHunk(..) )
import Darcs.Patch.Invert ( Invert(..) )
import Darcs.Patch.Inspect ( PatchInspect(..) )
import Darcs.Patch.Object ( ObjectIdOf )
import Darcs.Patch.Permutations () -- for Invert instance of FL
import Darcs.Patch.Prim.Class ( PrimConstruct(..), PrimSift(..) )
data Prim wX wY where
Move :: !AnchoredPath -> !AnchoredPath -> Prim wX wY
DP :: !AnchoredPath -> !(DirPatchType wX wY) -> Prim wX wY
FP :: !AnchoredPath -> !(FilePatchType wX wY) -> Prim wX wY
ChangePref :: !String -> !String -> !String -> Prim wX wY
data FilePatchType wX wY
= RmFile
| AddFile
| Hunk !Int [B.ByteString] [B.ByteString]
| TokReplace !String !String !String
| Binary B.ByteString B.ByteString
deriving (Eq,Ord)
type role FilePatchType nominal nominal
data DirPatchType wX wY = RmDir | AddDir
deriving (Eq,Ord)
type role DirPatchType nominal nominal
instance Eq2 FilePatchType where
unsafeCompare a b = a == unsafeCoerceP b
instance Invert FilePatchType where
invert RmFile = AddFile
invert AddFile = RmFile
invert (Hunk line old new) = Hunk line new old
invert (TokReplace t o n) = TokReplace t n o
invert (Binary o n) = Binary n o
instance Eq2 DirPatchType where
unsafeCompare a b = a == unsafeCoerceP b
instance Invert DirPatchType where
invert RmDir = AddDir
invert AddDir = RmDir
instance ObjectIdOf (ApplyState Prim) ~ AnchoredPath => PrimConstruct Prim where
addfile f = FP f AddFile
rmfile f = FP f RmFile
adddir d = DP d AddDir
rmdir d = DP d RmDir
move old new = Move old new
changepref p f t = ChangePref p f t
hunk f line old new = FP f (Hunk line old new)
tokreplace f tokchars old new = FP f (TokReplace tokchars old new)
binary f old new = FP f $ Binary old new
primFromHunk (FileHunk f line before after) = FP f (Hunk line before after)
instance ObjectIdOf (ApplyState Prim) ~ AnchoredPath => IsHunk Prim where
isHunk (FP f (Hunk line before after)) = Just (FileHunk f line before after)
isHunk _ = Nothing
instance Invert Prim where
invert (FP f p) = FP f (invert p)
invert (DP d p) = DP d (invert p)
invert (Move f f') = Move f' f
invert (ChangePref p f t) = ChangePref p t f
instance PatchInspect Prim where
-- Recurse on everything, these are potentially spoofed patches
listTouchedFiles (Move f1 f2) = [f1, f2]
listTouchedFiles (FP f _) = [f]
listTouchedFiles (DP d _) = [d]
listTouchedFiles (ChangePref _ _ _) = []
hunkMatches f (FP _ (Hunk _ remove add)) = anyMatches remove || anyMatches add
where anyMatches = foldr ((||) . f) False
hunkMatches _ (FP _ _) = False
hunkMatches _ (DP _ _) = False
hunkMatches _ (ChangePref _ _ _) = False
hunkMatches _ (Move _ _) = False
instance PatchDebug Prim
instance Eq2 Prim where
unsafeCompare (Move a b) (Move c d) = a == c && b == d
unsafeCompare (DP d1 p1) (DP d2 p2)
= d1 == d2 && p1 `unsafeCompare` p2
unsafeCompare (FP f1 fp1) (FP f2 fp2)
= f1 == f2 && fp1 `unsafeCompare` fp2
unsafeCompare (ChangePref a1 b1 c1) (ChangePref a2 b2 c2)
= c1 == c2 && b1 == b2 && a1 == a2
unsafeCompare _ _ = False
instance Eq (Prim wX wY) where
(==) = unsafeCompare
instance PrimSift Prim where
primIsSiftable (FP _ (Binary _ _)) = True
primIsSiftable (FP _ (Hunk _ _ _)) = True
primIsSiftable _ = False