aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Main.hs20
-rw-r--r--Opts.hs14
-rw-r--r--Toks.hs3
3 files changed, 30 insertions, 7 deletions
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)