Compare commits
	
		
			3 commits
		
	
	
		
			259ad6101b
			...
			4499144a4d
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 4499144a4d | ||
|   | 8f9677e40f | ||
|   | b52b106ac5 | 
							
								
								
									
										25
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -8,17 +8,26 @@ on: | ||||||
| 
 | 
 | ||||||
| jobs: | jobs: | ||||||
|   build: |   build: | ||||||
|     runs-on: ubuntu-latest |     name: Build ${{ github.ref_name }} OS:${{ matrix.os }} GHC:${{ matrix.ghc }} | ||||||
|  |     runs-on: ${{ matrix.os }} | ||||||
|  |     strategy: | ||||||
|  |       matrix: | ||||||
|  |         os: [ubuntu-22.04, macos-15] | ||||||
|  |         ghc: | ||||||
|  |           - "9.6" | ||||||
|  |           - "9.12" | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v4 |       - uses: actions/checkout@v4 | ||||||
|         with: |  | ||||||
|           submodules: recursive |  | ||||||
|       - uses: haskell-actions/setup@v2 |       - uses: haskell-actions/setup@v2 | ||||||
|         with: |         with: | ||||||
|           ghc-version: '9.4' |           ghc-version: ${{ matrix.ghc }} | ||||||
|       - run: | |       - name: build | ||||||
|           cabal build |         run: | | ||||||
|           xz -9 < `cabal exec which werge` > werge-${{ github.ref_name }}-`uname -m`.xz |           mkdir dist | ||||||
|  |           cabal install exe:werge --install-method=copy --overwrite-policy=always --installdir=dist | ||||||
|  |           strip dist/werge | ||||||
|  |           mv dist/werge dist/werge-${{ github.ref_name }}_${{ matrix.os }}_ghc-${{ matrix.ghc }} | ||||||
|  |           xz dist/werge-* | ||||||
|       - uses: softprops/action-gh-release@v2 |       - uses: softprops/action-gh-release@v2 | ||||||
|         with: |         with: | ||||||
|           files: werge-*.xz |           files: dist/werge-*.xz | ||||||
|  |  | ||||||
							
								
								
									
										45
									
								
								Main.hs
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								Main.hs
									
									
									
									
									
								
							|  | @ -30,13 +30,16 @@ data Op | ||||||
|   | Add |   | Add | ||||||
|   deriving (Show, Eq) |   deriving (Show, Eq) | ||||||
| 
 | 
 | ||||||
| pdiff :: FilePath -> IO [(Op, Tok)] | pdiff' :: [String] -> [(Op, Tok)] | ||||||
| pdiff path = map go . lines <$> readFile path | pdiff' = map go | ||||||
|   where |   where | ||||||
|     go ('-':s) = (Del, s) |     go ('-':s) = (Del, s) | ||||||
|     go (' ':s) = (Keep, s) |     go (' ':s) = (Keep, s) | ||||||
|     go ('+':s) = (Add, s) |     go ('+':s) = (Add, s) | ||||||
|     go _ = error "unexpected output from diff" |     go _ = error "unexpected contents in diff" | ||||||
|  | 
 | ||||||
|  | pdiff :: FilePath -> IO [(Op, Tok)] | ||||||
|  | pdiff path = pdiff' . lines <$> readFile path | ||||||
| 
 | 
 | ||||||
| data Merged | data Merged | ||||||
|   = Ok [String] |   = Ok [String] | ||||||
|  | @ -286,6 +289,21 @@ format Config {..} h = go False | ||||||
|             [cfgLabelStart, Toks.glue o, cfgLabelDiff, Toks.glue n, cfgLabelEnd] |             [cfgLabelStart, Toks.glue o, cfgLabelDiff, Toks.glue n, cfgLabelEnd] | ||||||
|       go True xs |       go True xs | ||||||
| 
 | 
 | ||||||
|  | fmtPatch :: Config -> Handle -> Handle -> IO () | ||||||
|  | fmtPatch cfg out h = hGetContents h >>= go . lines | ||||||
|  |   where | ||||||
|  |     go all@(l:ls) | ||||||
|  |       | patchLine l = do | ||||||
|  |         let (p, ls') = span patchLine all | ||||||
|  |         format cfg out . chunks $ pdiff' p | ||||||
|  |         go ls' | ||||||
|  |       | otherwise = hPutStrLn out l >> go ls | ||||||
|  |     go [] = pure () | ||||||
|  |     patchLine (' ':_) = True | ||||||
|  |     patchLine ('-':_) = True | ||||||
|  |     patchLine ('+':_) = True | ||||||
|  |     patchLine _ = False | ||||||
|  | 
 | ||||||
| runCmd :: Command -> Config -> IO () | runCmd :: Command -> Config -> IO () | ||||||
| runCmd CmdDiff3 {..} cfg = | runCmd CmdDiff3 {..} cfg = | ||||||
|   withSystemTempDirectory "werge-diff3" $ \workdir -> do |   withSystemTempDirectory "werge-diff3" $ \workdir -> do | ||||||
|  | @ -343,12 +361,21 @@ runCmd CmdDiff {..} cfg = do | ||||||
| runCmd CmdPatch {..} cfg = do | runCmd CmdPatch {..} cfg = do | ||||||
|   withSystemTempDirectory "werge-patch" $ \workdir -> do |   withSystemTempDirectory "werge-patch" $ \workdir -> do | ||||||
|     let f = workdir </> "file" |     let f = workdir </> "file" | ||||||
|     bracketFile patchMy ReadMode $ \h -> hSplitToFile cfg h f |     case patchTarget of | ||||||
|     _ <- runPatch f stdin |       Just patchMy -> do | ||||||
|     conflicted <- pmerge f >>= format cfg stdout -- TODO try to resolve more? |         bracketFile patchMy ReadMode $ \h -> hSplitToFile cfg h f | ||||||
|     if conflicted |         _ <- | ||||||
|       then exitWith (ExitFailure 1) |           case patchInput of | ||||||
|       else exitSuccess |             Nothing -> runPatch f stdin | ||||||
|  |             Just path -> bracketFile path ReadMode $ runPatch f | ||||||
|  |         conflicted <- pmerge f >>= format cfg stdout -- TODO try to resolve more? | ||||||
|  |         if conflicted | ||||||
|  |           then exitWith (ExitFailure 1) | ||||||
|  |           else exitSuccess | ||||||
|  |       Nothing -> do | ||||||
|  |         case patchInput of | ||||||
|  |           Nothing -> fmtPatch cfg stdout stdin | ||||||
|  |           Just path -> bracketFile path ReadMode $ fmtPatch cfg stdout | ||||||
| runCmd CmdBreak cfg = hSplit cfg stdin stdout | runCmd CmdBreak cfg = hSplit cfg stdin stdout | ||||||
| runCmd CmdGlue _ = getContents >>= putStr . Toks.glue . Toks.fromFile | runCmd CmdGlue _ = getContents >>= putStr . Toks.glue . Toks.fromFile | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										21
									
								
								Opts.hs
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								Opts.hs
									
									
									
									
									
								
							|  | @ -229,7 +229,8 @@ data Command | ||||||
|       , diffUnified :: Maybe Int |       , diffUnified :: Maybe Int | ||||||
|       } |       } | ||||||
|   | CmdPatch |   | CmdPatch | ||||||
|       { patchMy :: FilePath |       { patchTarget :: Maybe FilePath | ||||||
|  |       , patchInput :: Maybe FilePath | ||||||
|       } |       } | ||||||
|   | CmdBreak |   | CmdBreak | ||||||
|   | CmdGlue |   | CmdGlue | ||||||
|  | @ -294,7 +295,21 @@ cmdDiff = do | ||||||
| 
 | 
 | ||||||
| cmdPatch :: Parser Command | cmdPatch :: Parser Command | ||||||
| cmdPatch = do | cmdPatch = do | ||||||
|   patchMy <- strArgument $ metavar "MYFILE" <> help "File to be modified" |   patchTarget <- | ||||||
|  |     asum | ||||||
|  |       [ Just <$> strArgument (metavar "MYFILE" <> help "File to be patched") | ||||||
|  |       , flag' Nothing | ||||||
|  |           $ long "format" | ||||||
|  |               <> short 'f' | ||||||
|  |               <> help | ||||||
|  |                    "Do not patch anything, only format the patch using conflict marks on joined tokens" | ||||||
|  |       ] | ||||||
|  |   patchInput <- | ||||||
|  |     optional . strOption | ||||||
|  |       $ long "patch" | ||||||
|  |           <> short 'p' | ||||||
|  |           <> metavar "PATCH" | ||||||
|  |           <> help "File with the patch (default: stdin)" | ||||||
|   pure CmdPatch {..} |   pure CmdPatch {..} | ||||||
| 
 | 
 | ||||||
| -- TODO have some option to output the (partially merged) my/old/your files so | -- TODO have some option to output the (partially merged) my/old/your files so | ||||||
|  | @ -314,7 +329,7 @@ cmd = | ||||||
|             $ progDesc "Find differences between two files" |             $ progDesc "Find differences between two files" | ||||||
|         , command "patch" |         , command "patch" | ||||||
|             $ info cmdPatch |             $ info cmdPatch | ||||||
|             $ progDesc "Apply a patch from `diff' to file" |             $ progDesc "Modify a file using a patch from `diff'" | ||||||
|         , command "break" |         , command "break" | ||||||
|             $ info (pure CmdBreak) |             $ info (pure CmdBreak) | ||||||
|             $ progDesc "Break text to tokens" |             $ progDesc "Break text to tokens" | ||||||
|  |  | ||||||
|  | @ -279,12 +279,15 @@ Available options: | ||||||
| 
 | 
 | ||||||
| #### Patching files in place | #### Patching files in place | ||||||
| ``` | ``` | ||||||
| Usage: werge patch MYFILE | Usage: werge patch (MYFILE | (-f|--format)) [-p|--patch PATCH] | ||||||
| 
 | 
 | ||||||
|   Apply a patch from `diff' to file |   Modify a file using a patch from `diff' | ||||||
| 
 | 
 | ||||||
| Available options: | Available options: | ||||||
|   MYFILE                   File to be modified |   MYFILE                   File to be patched | ||||||
|  |   -f,--format              Do not patch anything, only format the patch using | ||||||
|  |                            conflict marks on joined tokens | ||||||
|  |   -p,--patch PATCH         File with the patch (default: stdin) | ||||||
|   -h,--help                Show this help text |   -h,--help                Show this help text | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| cabal-version:   3.0 | cabal-version:   3.0 | ||||||
| name:            werge | name:            werge | ||||||
| version:         0.1.0.0 | version:         0.2.0.0 | ||||||
| synopsis:        mergetool for mangled-up bite-size changes | synopsis:        mergetool for mangled-up bite-size changes | ||||||
| license:         GPL-3.0-or-later | license:         GPL-3.0-or-later | ||||||
| license-file:    LICENSE | license-file:    LICENSE | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue