packages feed

resolve-trivial-conflicts 0.3.2.3 → 0.3.2.4

raw patch · 2 files changed

+63/−21 lines, 2 files

Files

resolve-trivial-conflicts.cabal view
@@ -2,7 +2,7 @@ -- further documentation, see http://haskell.org/cabal/users-guide/  name:                resolve-trivial-conflicts-version:             0.3.2.3+version:             0.3.2.4 synopsis:            Remove trivial conflict markers in a git repository description:         Remove trivial conflict markers in a git repository homepage:            https://github.com/ElastiLotem/resolve-trivial-conflicts
resolve_trivial_conflicts.hs view
@@ -40,22 +40,54 @@     , cLinesB     :: [String]     } deriving (Show) -prettyConflict :: Conflict -> String-prettyConflict Conflict {..} =-    unlines $ concat+prettyConflictLines :: Conflict -> [String]+prettyConflictLines Conflict {..} =+    concat     [ snd cMarkerA    : cLinesA     , snd cMarkerBase : cLinesBase     , snd cMarkerB    : cLinesB     , [snd cMarkerEnd]     ] -resolveConflict :: Conflict -> Maybe String-resolveConflict Conflict{..}-    | cLinesA == cLinesBase = Just $ unlines cLinesB-    | cLinesB == cLinesBase = Just $ unlines cLinesA-    | cLinesA == cLinesB = Just $ unlines cLinesA-    | otherwise = Nothing+prettyConflict :: Conflict -> String+prettyConflict = unlines . prettyConflictLines +lengthOfCommonPrefix :: Eq a => [a] -> [a] -> Int+lengthOfCommonPrefix x y = length $ takeWhile id $ zipWith (==) x y++data Resolution+    = NoResolution+    | Resolution String+    | PartialResolution String++resolveConflict :: Conflict -> Resolution+resolveConflict conflict@Conflict{..}+    | cLinesA == cLinesBase = Resolution $ unlines cLinesB+    | cLinesB == cLinesBase = Resolution $ unlines cLinesA+    | cLinesA == cLinesB = Resolution $ unlines cLinesA+    | matchTop > 0 || matchBottom > 0 =+        PartialResolution $ unlines $+        take matchTop cLinesBase +++        prettyConflictLines conflict+        { cLinesA = unmatched cLinesA+        , cLinesBase = unmatched cLinesBase+        , cLinesB = unmatched cLinesB+        } +++        takeEnd matchBottom cLinesBase+    | otherwise = NoResolution+    where+        matchTop =+            minimum $ map (lengthOfCommonPrefix cLinesBase) [cLinesA, cLinesB]+        revBottom = reverse . drop matchTop+        revBottomBase = revBottom cLinesBase+        matchBottom =+            minimum $+            map (lengthOfCommonPrefix revBottomBase . revBottom)+            [cLinesA, cLinesB]+        dropEnd count xs = take (length xs - count) xs+        takeEnd count xs = drop (length xs - count) xs+        unmatched xs = drop matchTop $ dropEnd matchBottom xs+ -- '>' -> ">>>>>>> " markerPrefix :: Char -> String markerPrefix = replicate 7@@ -123,6 +155,7 @@  data NewContent = NewContent     { _resolvedSuccessfully :: Int+    , _reducedConflicts :: Int     , _failedToResolve :: Int     , _newContent :: String     }@@ -138,19 +171,22 @@ getConflictDiff2s Conflict{..} = (cMarkerA, cMarkerB, getDiff cLinesA cLinesB)  resolveContent :: [Either String Conflict] -> NewContent-resolveContent = asResult . mconcat . map go+resolveContent =+    asResult . mconcat . map go     where-        asResult (Monoid.Sum successes, Monoid.Sum failures, newContent) =+        asResult (Monoid.Sum successes, Monoid.Sum reductions, Monoid.Sum failures, newContent) =             NewContent             { _resolvedSuccessfully = successes+            , _reducedConflicts = reductions             , _failedToResolve = failures             , _newContent = newContent             }-        go (Left line) = (Monoid.Sum 0, Monoid.Sum 0, unlines [line])+        go (Left line) = (Monoid.Sum 0, Monoid.Sum 0, Monoid.Sum 0, unlines [line])         go (Right conflict) =             case resolveConflict conflict of-            Nothing -> (Monoid.Sum 0, Monoid.Sum 1, prettyConflict conflict)-            Just trivialLines -> (Monoid.Sum 1, Monoid.Sum 0, trivialLines)+            NoResolution -> (Monoid.Sum 0, Monoid.Sum 0, Monoid.Sum 1, prettyConflict conflict)+            Resolution trivialLines -> (Monoid.Sum 1, Monoid.Sum 0, Monoid.Sum 0, trivialLines)+            PartialResolution newLines -> (Monoid.Sum 0, Monoid.Sum 1, Monoid.Sum 0, newLines)  gitAdd :: FilePath -> IO () gitAdd fileName =@@ -195,26 +231,32 @@ resolve colorEnable opts fileName =     resolveContent . parseConflicts <$> readFile fileName     >>= \case-    NewContent successes failures newContent-        | successes == 0 && failures == 0 ->+    NewContent successes reductions failures newContent+        | successes == 0 && allGood ->           do  putStrLn $ fileName ++ ": No conflicts, git-adding"               gitAdd fileName-        | successes == 0 ->+        | successes == 0 && reductions == 0 ->           do  putStrLn $ concat                   [ fileName, ": Failed to resolve any of the "                   , show failures, " conflicts" ]               doDump+        | successes == 0 ->+          do  putStrLn $ concat+                  [ fileName, ": Reduced ", show reductions, " conflicts"]+              overwrite fileName newContent+              doDump         | otherwise ->           do  putStrLn $ concat                   [ fileName, ": Successfully resolved ", show successes-                  , " conflicts (failed to resolve " ++ show failures ++ " conflicts)"-                  , if failures == 0 then ", git adding" else ""+                  , " conflicts (failed to resolve " ++ show (reductions + failures) ++ " conflicts)"+                  , if allGood then ", git adding" else ""                   ]               overwrite fileName newContent-              if failures == 0+              if allGood                   then gitAdd fileName                   else doDump         where+            allGood = failures == 0 && reductions == 0             doDump =                 dumpAndOpenEditor colorEnable opts fileName                 [ conflict | Right conflict <- parseConflicts newContent ]