diff options
| author | Mirek Kratochvil <exa.exa@gmail.com> | 2025-07-13 10:24:23 +0200 |
|---|---|---|
| committer | Mirek Kratochvil <exa.exa@gmail.com> | 2025-07-13 10:24:23 +0200 |
| commit | bc5d7a6915af2774f17f31641ed249d20311f9ee (patch) | |
| tree | e0615bfd375c20ba3bf4eaa436a216aeb8eb3722 | |
| parent | 96a623ac0766df9d6427419c1c8a8e799798d825 (diff) | |
| download | werge-bc5d7a6915af2774f17f31641ed249d20311f9ee.tar.gz werge-bc5d7a6915af2774f17f31641ed249d20311f9ee.tar.bz2 | |
fine-grained space merging
| -rw-r--r-- | Main.hs | 20 | ||||
| -rw-r--r-- | Opts.hs | 14 | ||||
| -rw-r--r-- | Toks.hs | 3 |
3 files changed, 30 insertions, 7 deletions
@@ -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) @@ -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" @@ -23,6 +23,9 @@ unmarkSpace ('.':s) = s unmarkSpace ('|':s) = s unmarkSpace _ = error "wat" +space ('.':_) = True +space _ = False + split = unlines . map (concatMap escape . markSpace) |
