expand README
This commit is contained in:
		
							parent
							
								
									44bd3e8c14
								
							
						
					
					
						commit
						554429b9b1
					
				
							
								
								
									
										5
									
								
								Main.hs
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								Main.hs
									
									
									
									
									
								
							|  | @ -156,6 +156,11 @@ isKeepTok _ = False | |||
| isDelTok (Del, _) = True | ||||
| isDelTok _ = False | ||||
| 
 | ||||
| -- TODO: Diff output is not necessarily deterministic; we could make the chunk | ||||
| -- sequences more unique by rolling them to front (or back), possibly enabling | ||||
| -- more conflict resolution and preventing mismerges. | ||||
| -- | ||||
| -- Example: " a " can be made out of " {+a +}" or "{+ a+} " | ||||
| chunks :: [(Op, String)] -> [Merged] | ||||
| chunks [] = [] | ||||
| chunks xs@((Keep, _):_) = | ||||
|  |  | |||
							
								
								
									
										2
									
								
								Opts.hs
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Opts.hs
									
									
									
									
									
								
							|  | @ -225,7 +225,7 @@ cmdGitMerge = do | |||
|       [ fmap Just . some | ||||
|           $ strArgument | ||||
|           $ metavar "UNMERGED" | ||||
|               <> help "Unmerged git file (can be specified repeatedly)" | ||||
|               <> help "Unmerged file tracked by git (can be specified repeatedly)" | ||||
|       , flag' | ||||
|           Nothing | ||||
|           (long "unmerged" | ||||
|  |  | |||
							
								
								
									
										191
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										191
									
								
								README.md
									
									
									
									
									
								
							|  | @ -1,19 +1,77 @@ | |||
| 
 | ||||
| # werge (merge weird stuff) | ||||
| 
 | ||||
| This is a partial work-alike of `diff3` and `git merge` and other merge-y tools that is capable of | ||||
| This is a partial work-alike of `diff3` and `git merge` and other merge-y tools | ||||
| that is capable of | ||||
| 
 | ||||
| - merging token-size changes instead of line-size ones | ||||
| - largely ignoring changes in blank characters | ||||
| 
 | ||||
| These properties are great for several use-cases: | ||||
| 
 | ||||
| - merging free-flowing text changes (such as in TeX) irrespective of linebreaks | ||||
| - merging free-flowing text changes (such as in TeX) irrespective of line breaks | ||||
|   etc, | ||||
| - merging of changesets that use different code formatters | ||||
| - merging of change sets that use different code formatters | ||||
| - minimizing the conflict size of tiny changes to a few characters, making them | ||||
|   easier to resolve | ||||
| 
 | ||||
| ## Demo | ||||
| 
 | ||||
| Original (`old` file): | ||||
| ``` | ||||
| Roses are red. Violets are blue. | ||||
| Patch is quite hard. I cannot rhyme. | ||||
| ``` | ||||
| 
 | ||||
| Local changes (`my` file): | ||||
| ``` | ||||
| Roses are red. Violets are blue. | ||||
| Patching is hard. I still cannot rhyme. | ||||
| ``` | ||||
| 
 | ||||
| Remote changes (`your` file): | ||||
| ``` | ||||
| Roses are red. | ||||
| Violets are blue. | ||||
| Patch is quite hard. | ||||
| I cannot do verses. | ||||
| ``` | ||||
| 
 | ||||
| Token-merged version with `werge merge my orig your` (conflicts on the space | ||||
| change that is too close to the disappearing "still" token): | ||||
| ``` | ||||
| Roses are red. | ||||
| Violets are blue. | ||||
| Patching is hard.<<<<< I still||||| I===== | ||||
| I>>>>> cannot do verses. | ||||
| ``` | ||||
| (NOTE: option `-G` gives nicely colored output that is much easier to read.) | ||||
| 
 | ||||
| Token-merged version with separate space resolution using `-s` (conflicts get | ||||
| fixed separately): | ||||
| ``` | ||||
| Roses are red. | ||||
| Violets are blue. | ||||
| Patching is hard. | ||||
| I still cannot do verses. | ||||
| ``` | ||||
| 
 | ||||
| A harder-conflicting file (`theirs`): | ||||
| ``` | ||||
| Roses are red. | ||||
| Violets are blue. | ||||
| Merging is quite hard. | ||||
| I cannot do verses. | ||||
| ``` | ||||
| 
 | ||||
| `werge merge mine orig theirs -s` highlights the actual unmergeable change: | ||||
| ``` | ||||
| Roses are red. | ||||
| Violets are blue. | ||||
| <<<<<Patching|||||Patch=====Merging>>>>> is hard. | ||||
| I still cannot do verses. | ||||
| ``` | ||||
| 
 | ||||
| ## How does it work? | ||||
| 
 | ||||
| - Instead of lines, the files are torn to small tokens (words, spaces, symbols, | ||||
|  | @ -21,6 +79,10 @@ These properties are great for several use-cases: | |||
| - Some tokens are marked as spaces by the tokenizer, which allows the merge | ||||
|   algorithm to be (selectively) more zealous when resolving conflicts on these. | ||||
| 
 | ||||
| This approach differs from various other structured-merge tools by being | ||||
| completely oblivious about the file structure. Werge trades off some merge | ||||
| quality for (a lot of) complexity. | ||||
| 
 | ||||
| Tokenizers are simple, implementable as linear scanners that print separate | ||||
| tokens on individual lines that are prefixed with a space mark (`.` for space | ||||
| and `|` for non-space), and also escape newlines and backslashes. A default | ||||
|  | @ -61,50 +123,117 @@ with the one from [GNU diffutils](https://www.gnu.org/software/diffutils/). You | |||
| may set up a path to such `diff` (or a wrapper script) via environment variable | ||||
| `WERGE_DIFF`. | ||||
| 
 | ||||
| ## Help & features | ||||
| ## Use with `git` | ||||
| 
 | ||||
| `werge` can automatically process files that are marked in `git` as merge | ||||
| conflicts: | ||||
| 
 | ||||
| ```sh | ||||
| $ git merge somebranch | ||||
| $ werge git -ua | ||||
| ``` | ||||
| 
 | ||||
| Options `-ua` (`--unmerged --add`) find all files that are marked as unmerged, | ||||
| tries to merge them token-by-token, and if the merge is successful with current | ||||
| settings it runs `git add` on them. The current changes in the files are | ||||
| replaced by the merged (or partially merged) state; backups are written | ||||
| automatically to `filename.werge-backup`. | ||||
| 
 | ||||
| ## Current `--help` and features | ||||
| 
 | ||||
| ``` | ||||
| werge -- blanks-friendly mergetool for tiny interdwindled changes | ||||
| 
 | ||||
| Usage: werge [(-F|--tok-filter FILTER) | (-i|--simple-tokens) |  | ||||
|                (-I|--full-tokens)] [-s|--spaces (normal|conflict|my|old|your)]  | ||||
|              [-C|--expand-context N] [--no-zeal | (-z|--zeal)]  | ||||
|              [--label-start STRING] [--label-mo STRING] [--label-oy STRING]  | ||||
|              [--label-end STRING] [--conflict-overlaps] [--conflict-separate] | ||||
|              COMMAND | ||||
|                (-I|--full-tokens)] [--no-zeal | (-z|--zeal)]  | ||||
|              [-S|--space (keep|my|old|your)]  | ||||
|              [-s | --resolve-space (normal|keep|my|old|your)]  | ||||
|              [--conflict-space-overlaps] [--conflict-space-separate]  | ||||
|              [--conflict-space-all] [-C|--expand-context N]  | ||||
|              [--resolve (keep|my|old|your)] [--conflict-overlaps]  | ||||
|              [--conflict-separate] [--conflict-all] [-G|--color]  | ||||
|              [--label-start "<<<<<"] [--label-mo "|||||"] [--label-oy "====="]  | ||||
|              [--label-end ">>>>>"] COMMAND | ||||
| 
 | ||||
| Available options: | ||||
|   -F,--tok-filter FILTER   external program to separate the text to tokens | ||||
|   -i,--simple-tokens       use wider character class to separate the tokens | ||||
|   -F,--tok-filter FILTER   External program to separate the text to tokens | ||||
|   -i,--simple-tokens       Use wider character class to separate the tokens | ||||
|                            (results in larger tokens and ignores case) | ||||
|   -I,--full-tokens         separate characters by all known character classes | ||||
|   -I,--full-tokens         Separate characters by all known character classes | ||||
|                            (default) | ||||
|   -s,--spaces (normal|conflict|my|old|your) | ||||
|                            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) | ||||
|   --no-zeal                avoid zealous mode (default) | ||||
|   -z,--zeal                Try to zealously minify conflicts, potentially | ||||
|                            resolving them | ||||
|   -S,--space (keep|my|old|your) | ||||
|                            Retain spacing from a selected version, or keep all | ||||
|                            space changes for merging (default: keep) | ||||
|   -s                       Shortcut for `--resolve-space keep' (this separates | ||||
|                            space-only conflicts, enabling better automated | ||||
|                            resolution) | ||||
|   --resolve-space (normal|keep|my|old|your) | ||||
|                            Resolve conflicts in space-only tokens separately, | ||||
|                            and either keep unresolved conflicts, or resolve in | ||||
|                            favor of a given version; `normal' resolves the | ||||
|                            spaces together with other tokens, ignoring choices | ||||
|                            in --resolve-space-* (default: normal) | ||||
|   --conflict-space-overlaps | ||||
|                            Never resolve overlapping changes in space-only | ||||
|                            tokens | ||||
|   --conflict-space-separate | ||||
|                            Never resolve separate (non-overlapping) changes in | ||||
|                            space-only tokens | ||||
|   --conflict-space-all     Never resolve any changes in space-only tokens | ||||
|   -C,--expand-context N    Consider changes that are at most N tokens apart to | ||||
|                            be a single change. Zero may cause bad resolutions of | ||||
|                            near conflicting edits. (default: 1) | ||||
|   --no-zeal                avoid zealous mode (default) | ||||
|   -z,--zeal                try to zealously minify conflicts, potentially | ||||
|                            resolving them | ||||
|   --label-start STRING     label for beginning of the conflict | ||||
|                            (default: "<<<<<") | ||||
|   --label-mo STRING        separator of local edits and original | ||||
|                            (default: "|||||") | ||||
|   --label-oy STRING        separator of original and other people's edits | ||||
|                            (default: "=====") | ||||
|   --label-end STRING       label for end of the conflict (default: ">>>>>") | ||||
|   --conflict-overlaps      do not resolve overlapping changes | ||||
|   --conflict-separate      do not resolve separate (non-overlapping) changes | ||||
|                            near conflicting edits (default: 1) | ||||
|   --resolve (keep|my|old|your) | ||||
|                            Resolve general conflicts in favor of a given | ||||
|                            version, or keep the conflicts (default: keep) | ||||
|   --conflict-overlaps      Never resolve overlapping changes in general tokens | ||||
|   --conflict-separate      Never resolve separate (non-overlapping) changes in | ||||
|                            general tokens | ||||
|   --conflict-all           Never resolve any changes in general tokens | ||||
|   -G,--color               Use shorter, gaily colored output markers by default | ||||
|                            (requires ANSI color support; good for terminals or | ||||
|                            `less -R') | ||||
|   --label-start "<<<<<"    Label for beginning of the conflict | ||||
|   --label-mo "|||||"       Separator of local edits and original | ||||
|   --label-oy "====="       Separator of original and other people's edits | ||||
|   --label-end ">>>>>"      Label for end of the conflict | ||||
|   -h,--help                Show this help text | ||||
|   --version                Show version information | ||||
| 
 | ||||
| Available commands: | ||||
|   merge                    diff3-style merge of two changesets | ||||
|   git                      automerge unmerged files in git conflict | ||||
|   git                      Automerge unmerged files in git conflict | ||||
| 
 | ||||
| werge is a free software, use it accordingly. | ||||
| ``` | ||||
| 
 | ||||
| #### Manual merging | ||||
| ``` | ||||
| Usage: werge merge MYFILE OLDFILE YOURFILE | ||||
| 
 | ||||
|   diff3-style merge of two changesets | ||||
| 
 | ||||
| Available options: | ||||
|   MYFILE                   Version with local edits | ||||
|   OLDFILE                  Original file version | ||||
|   YOURFILE                 Version with other people's edits | ||||
|   -h,--help                Show this help text | ||||
| ``` | ||||
| 
 | ||||
| #### Git interoperability | ||||
| ``` | ||||
| Usage: werge git (UNMERGED | (-u|--unmerged)) [(-a|--add) | --no-add] | ||||
| 
 | ||||
|   Automerge unmerged files in git conflict | ||||
| 
 | ||||
| Available options: | ||||
|   UNMERGED                 Unmerged file tracked by git (can be specified | ||||
|                            repeatedly) | ||||
|   -u,--unmerged            Process all files marked as unmerged by git | ||||
|   -a,--add                 Run `git add' for fully merged files | ||||
|   --no-add                 Prevent running `git add' | ||||
|   -h,--help                Show this help text | ||||
| ``` | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Mirek Kratochvil
						Mirek Kratochvil