diff --git a/Main.hs b/Main.hs index dd2f35f..c7701b1 100644 --- a/Main.hs +++ b/Main.hs @@ -112,13 +112,31 @@ zeal (Conflict m o y) = pops ms ys = ((ms, ys), []) zeal x = [x] -resolve Config {..} c@(Conflict m o y) +resolve cfg@Config {..} c@(Conflict m o y) + | all Toks.space (concat [m, o, y]) && cfgSpaces /= SpacesNormal = + resolveSpace cfg c | m == o && o == y = Ok o | m == o && cfgResolveSeparate = Ok y | o == y && cfgResolveSeparate = Ok m | m == y && cfgResolveOverlaps = Ok m resolve _ x = x +-- TODO: there might be a bit of interplay between the spaces handling and +-- separate/overlapped conflict resolution -- e.g., what if someone wants to +-- merge overlapping edits in text but separate edits in spaces? At this point +-- that might be ignorable. +resolveSpace Config {..} c@(Conflict m o y) + | m == o && o == y = Ok o + | otherwise = + case cfgSpaces of + SpacesConflict -> c + SpacesMy -> Ok m + SpacesOld -> Ok o + SpacesYour -> Ok y + _ -> error "spaces resolution failed" + +resolveSpaces _ x = x + merge cfg@Config {..} ms ys = regroup . map (resolve cfg) diff --git a/Opts.hs b/Opts.hs index bc76360..7b6f7d4 100644 --- a/Opts.hs +++ b/Opts.hs @@ -38,13 +38,15 @@ tokenizer = ] data Spaces - = SpacesConflict + = SpacesNormal + | SpacesConflict | SpacesMy | SpacesOld | SpacesYour - deriving (Show) + deriving (Show, Eq) spaceMode x + | x `isPrefixOf` "normal" = Right SpacesNormal | x `isPrefixOf` "conflict" = Right SpacesConflict | x `isPrefixOf` "my" = Right SpacesMy | x `isPrefixOf` "old" = Right SpacesOld @@ -53,7 +55,7 @@ spaceMode x Left $ "could not parse value `" ++ x - ++ "', use one of `conflict', `my', `old', and `your'" + ++ "', use one of `normal', `conflict', `my', `old', and `your'" data Config = Config { cfgTokenizer :: Tokenizer @@ -75,10 +77,10 @@ config = do option (eitherReader spaceMode) $ long "spaces" <> short 's' - <> metavar "(conflict|my|old|your)" + <> metavar "(normal|conflict|my|old|your)" <> help - "mode of merging the spaces; instead of conflict one may choose to default the space from the source files (default: conflict)" - <> value SpacesConflict + "mode of merging the space-only changes; instead of usual resolution one may choose to always conflict or to default the space from the source files (default: normal)" + <> value SpacesNormal cfgContext <- option auto $ long "expand-context" diff --git a/Toks.hs b/Toks.hs index c8ec567..3a27715 100644 --- a/Toks.hs +++ b/Toks.hs @@ -23,6 +23,9 @@ unmarkSpace ('.':s) = s unmarkSpace ('|':s) = s unmarkSpace _ = error "wat" +space ('.':_) = True +space _ = False + split = unlines . map (concatMap escape . markSpace)