fine-grained space merging
This commit is contained in:
		
							parent
							
								
									96a623ac07
								
							
						
					
					
						commit
						bc5d7a6915
					
				
							
								
								
									
										20
									
								
								Main.hs
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								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) | ||||
|  |  | |||
							
								
								
									
										14
									
								
								Opts.hs
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								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" | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue