zeal and resolution evasion works
This commit is contained in:
		
							parent
							
								
									0866223c2b
								
							
						
					
					
						commit
						3ce3c1d893
					
				
							
								
								
									
										37
									
								
								Main.hs
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								Main.hs
									
									
									
									
									
								
							|  | @ -32,7 +32,7 @@ rundiff f1 f2 out = do | |||
|            ]) | ||||
|           {std_in = NoStream, std_out = UseHandle oh, std_err = Inherit} $ \_ _ _ -> | ||||
|         waitForProcess | ||||
|   when (st == ExitFailure 2) $ error "fatal: diff failed" | ||||
|   when (st == ExitFailure 2) $ error "diff failed" | ||||
|   unless (st `elem` [ExitSuccess, ExitFailure 1]) | ||||
|     $ error "diff failed for unknown reason (is GNU diffutils installed?)" | ||||
| 
 | ||||
|  | @ -66,7 +66,7 @@ align ((Keep, m):ms) ((Del, y):ys) | |||
|   | m == y = Conflict [m] [m] [] : align ms ys | ||||
| align ((Add, m):ms) ys = Conflict [m] [] [] : align ms ys | ||||
| align ms ((Add, y):ys) = Conflict [] [] [y] : align ms ys | ||||
| align _ _ = error "fatal: diffs do not align" | ||||
| align _ _ = error "diffs do not align" | ||||
| 
 | ||||
| -- TODO this is quadratic, call regroup first and case it | ||||
| regroup :: [Merged] -> [Merged] | ||||
|  | @ -87,19 +87,36 @@ expand n = go | |||
|         go $ Conflict (m1 ++ a ++ m2) (o1 ++ a ++ o2) (y1 ++ a ++ y2) : xs | ||||
|     go (x:xs) = x : go xs | ||||
| 
 | ||||
| zeal = id -- TODO | ||||
| zeal (Conflict m o y) = | ||||
|   before' ++ (Conflict (reverse m'') o (reverse y'') : after') | ||||
|   where | ||||
|     ((m', y'), before) = pops m y | ||||
|     ((m'', y''), rafter) = pops (reverse m') (reverse y') | ||||
|     before' = | ||||
|       case before of | ||||
|         [] -> [] | ||||
|         xs -> [Ok xs] | ||||
|     after' = | ||||
|       case rafter of | ||||
|         [] -> [] | ||||
|         xs -> [Ok $ reverse xs] | ||||
|     pops (m:ms) (y:ys) | ||||
|       | m == y = (m :) <$> pops ms ys | ||||
|     pops ms ys = ((ms, ys), []) | ||||
| zeal x = [x] | ||||
| 
 | ||||
| resolve _ c@(Conflict m o y) | ||||
| resolve Config {..} c@(Conflict m o y) | ||||
|   | m == o && o == y = Ok o | ||||
|   | m == o = Ok y | ||||
|   | o == y = Ok m | ||||
|   | m == y = Ok m | ||||
| resolve cfg x = x | ||||
|   | m == o && cfgResolveSeparate = Ok y | ||||
|   | o == y && cfgResolveSeparate = Ok m | ||||
|   | m == y && cfgResolveOverlaps = Ok m | ||||
| resolve _ x = x | ||||
| 
 | ||||
| merge cfg@Config {..} ms ys = | ||||
|   regroup | ||||
|     . map (resolve cfg) | ||||
|     . bool id zeal cfgZealous | ||||
|     . regroup | ||||
|     . bool id (concatMap zeal) cfgZealous | ||||
|     . expand cfgContext | ||||
|     . regroup | ||||
|     $ align ms ys | ||||
|  | @ -129,7 +146,7 @@ runCmd CmdDiff3 {..} cfg = | |||
|     let [fMy, fOld, fYour, fdMy, fdYour] = | ||||
|           map (workdir </>) ["my", "old", "your", "mydiff", "yourdiff"] | ||||
|     for_ [(d3my, fMy), (d3old, fOld), (d3your, fYour)] $ \(path, tmp) -> | ||||
|       readFile path >>= writeFile tmp . Toks.split | ||||
|       readFile path >>= writeFile tmp . Toks.split -- TODO cfg | ||||
|     rundiff fOld fMy fdMy | ||||
|     rundiff fOld fYour fdYour | ||||
|     conflicted <- merge cfg <$> pdiff fdMy <*> pdiff fdYour >>= format cfg | ||||
|  |  | |||
							
								
								
									
										13
									
								
								Opts.hs
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								Opts.hs
									
									
									
									
									
								
							|  | @ -64,6 +64,9 @@ data Config = Config | |||
|   , cfgLabelMyOld :: String | ||||
|   , cfgLabelOldYour :: String | ||||
|   , cfgLabelEnd :: String | ||||
|   , cfgResolveSpaces :: Bool | ||||
|   , cfgResolveOverlaps :: Bool | ||||
|   , cfgResolveSeparate :: Bool | ||||
|   } deriving (Show) | ||||
| 
 | ||||
| config = do | ||||
|  | @ -123,9 +126,13 @@ config = do | |||
|           <> value ">>>>>" | ||||
|           <> showDefault | ||||
|           <> help "label for end of the conflict" | ||||
|   -- TODO also should support -3 "only merge non-overlapping changes", -x "only | ||||
|   -- merge overlapping changes" and something that doesn't merge anything at | ||||
|   -- all (maybe better have negative flags?) | ||||
|   cfgResolveOverlaps <- | ||||
|     fmap not . switch | ||||
|       $ long "conflict-overlaps" <> help "do not resolve overlapping changes" | ||||
|   cfgResolveSeparate <- | ||||
|     fmap not . switch | ||||
|       $ long "conflict-separate" | ||||
|           <> help "do not resolve separate (non-overlapping) changes" | ||||
|   pure Config {..} | ||||
| 
 | ||||
| data Command | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue