##// END OF EJS Templates
errors: name arguments to AmbiguousCommand constructor...
errors: name arguments to AmbiguousCommand constructor Differential Revision: https://phab.mercurial-scm.org/D9165

File last commit:

r42766:f802a75d default
r46271:65e2b646 default
Show More
test-diff-color.t
416 lines | 11.5 KiB | text/troff | Tads3Lexer
/ tests / test-diff-color.t
Matt Mackall
tests: unify test-diff-color
r12415 Setup
Yuya Nishihara
tests: write hgrc of more than two lines by using shell heredoc...
r23172 $ cat <<EOF >> $HGRCPATH
Pierre-Yves David
color: add a 'ui.color' option to control color behavior...
r31110 > [ui]
Pierre-Yves David
color: special case 'always' in 'ui.color'...
r32104 > color = yes
Pierre-Yves David
color: turn 'ui.color' into a boolean (auto or off)...
r32103 > formatted = always
Matt Harbison
test-diff-color: disable pager for expected output on Windows (issue5555)...
r32122 > paginate = never
Yuya Nishihara
tests: write hgrc of more than two lines by using shell heredoc...
r23172 > [color]
> mode = ansi
> EOF
Matt Mackall
tests: unify test-diff-color
r12415 $ hg init repo
$ cd repo
$ cat > a <<EOF
> c
> c
> a
> a
> b
> a
> a
> c
> c
> EOF
$ hg ci -Am adda
Boris Feld
addremove: add associated color for the new labels...
r39126 \x1b[0;32madding a\x1b[0m (esc)
Matt Mackall
tests: unify test-diff-color
r12415 $ cat > a <<EOF
> c
> c
> a
> a
> dd
> a
> a
> c
> c
> EOF
default context
Pierre-Yves David
color: add a 'ui.color' option to control color behavior...
r31110 $ hg diff --nodates
Mads Kiilerich
tests: use (esc) for all non-ASCII test output
r12942 \x1b[0;1mdiff -r cf9f4ba66af2 a\x1b[0m (esc)
\x1b[0;31;1m--- a/a\x1b[0m (esc)
\x1b[0;32;1m+++ b/a\x1b[0m (esc)
\x1b[0;35m@@ -2,7 +2,7 @@\x1b[0m (esc)
Matt Mackall
tests: unify test-diff-color
r12415 c
a
a
Mads Kiilerich
tests: use (esc) for all non-ASCII test output
r12942 \x1b[0;31m-b\x1b[0m (esc)
\x1b[0;32m+dd\x1b[0m (esc)
Matt Mackall
tests: unify test-diff-color
r12415 a
a
c
Sune Foldager
tests: add diff color trailing whitespace test
r38682 trailing whitespace
$ cp a a.orig
Augie Fackler
tests: use inline Python instead of sed to add trailing whitespace...
r38775 >>> with open('a', 'rb') as f:
... data = f.read()
>>> with open('a', 'wb') as f:
Pulkit Goyal
py3: suppress the return value from .write() call...
r39654 ... f.write(data.replace(b'dd', b'dd \r')) and None
Sune Foldager
tests: add diff color trailing whitespace test
r38682 $ hg diff --nodates
\x1b[0;1mdiff -r cf9f4ba66af2 a\x1b[0m (esc)
\x1b[0;31;1m--- a/a\x1b[0m (esc)
\x1b[0;32;1m+++ b/a\x1b[0m (esc)
\x1b[0;35m@@ -2,7 +2,7 @@\x1b[0m (esc)
c
a
a
\x1b[0;31m-b\x1b[0m (esc)
\x1b[0;32m+dd\x1b[0m\x1b[0;1;41m \x1b[0m\r (esc)
a
a
c
$ mv a.orig a
Pierre-Yves David
color: turn 'ui.color' into a boolean (auto or off)...
r32103 (check that 'ui.color=yes' match '--color=auto')
$ hg diff --nodates --config ui.formatted=no
diff -r cf9f4ba66af2 a
--- a/a
+++ b/a
@@ -2,7 +2,7 @@
c
a
a
-b
+dd
a
a
c
(check that 'ui.color=no' disable color)
$ hg diff --nodates --config ui.formatted=yes --config ui.color=no
diff -r cf9f4ba66af2 a
--- a/a
+++ b/a
@@ -2,7 +2,7 @@
c
a
a
-b
+dd
a
a
c
Pierre-Yves David
color: special case 'always' in 'ui.color'...
r32104 (check that 'ui.color=always' force color)
$ hg diff --nodates --config ui.formatted=no --config ui.color=always
\x1b[0;1mdiff -r cf9f4ba66af2 a\x1b[0m (esc)
\x1b[0;31;1m--- a/a\x1b[0m (esc)
\x1b[0;32;1m+++ b/a\x1b[0m (esc)
\x1b[0;35m@@ -2,7 +2,7 @@\x1b[0m (esc)
c
a
a
\x1b[0;31m-b\x1b[0m (esc)
\x1b[0;32m+dd\x1b[0m (esc)
a
a
c
Matt Mackall
tests: unify test-diff-color
r12415 --unified=2
Pierre-Yves David
color: add a 'ui.color' option to control color behavior...
r31110 $ hg diff --nodates -U 2
Mads Kiilerich
tests: use (esc) for all non-ASCII test output
r12942 \x1b[0;1mdiff -r cf9f4ba66af2 a\x1b[0m (esc)
\x1b[0;31;1m--- a/a\x1b[0m (esc)
\x1b[0;32;1m+++ b/a\x1b[0m (esc)
\x1b[0;35m@@ -3,5 +3,5 @@\x1b[0m (esc)
Matt Mackall
tests: unify test-diff-color
r12415 a
a
Mads Kiilerich
tests: use (esc) for all non-ASCII test output
r12942 \x1b[0;31m-b\x1b[0m (esc)
\x1b[0;32m+dd\x1b[0m (esc)
Matt Mackall
tests: unify test-diff-color
r12415 a
a
diffstat
Pierre-Yves David
color: add a 'ui.color' option to control color behavior...
r31110 $ hg diff --stat
Mads Kiilerich
tests: use (esc) for all non-ASCII test output
r12942 a | 2 \x1b[0;32m+\x1b[0m\x1b[0;31m-\x1b[0m (esc)
Matt Mackall
tests: unify test-diff-color
r12415 1 files changed, 1 insertions(+), 1 deletions(-)
Yuya Nishihara
tests: write hgrc of more than two lines by using shell heredoc...
r23172 $ cat <<EOF >> $HGRCPATH
Pierre-Yves David
color: add a 'ui.color' option to control color behavior...
r31110 > [extensions]
Yuya Nishihara
tests: write hgrc of more than two lines by using shell heredoc...
r23172 > record =
> [ui]
> interactive = true
> [diff]
> git = True
> EOF
Matt Mackall
tests: unify test-diff-color
r12415
Mads Kiilerich
tests: convert some 'hghave execbit' to #if...
r16899 #if execbit
Matt Mackall
tests: unify test-diff-color
r12415 record
Mads Kiilerich
tests: use 'hghave execbit' for tests that manipulate x bit in file system
r15442 $ chmod +x a
Pierre-Yves David
color: add a 'ui.color' option to control color behavior...
r31110 $ hg record -m moda a <<EOF
Matt Mackall
tests: unify test-diff-color
r12415 > y
> EOF
Mads Kiilerich
tests: use (esc) for all non-ASCII test output
r12942 \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
\x1b[0;36;1mold mode 100644\x1b[0m (esc)
\x1b[0;36;1mnew mode 100755\x1b[0m (esc)
Matt Mackall
tests: unify test-diff-color
r12415 1 hunks, 1 lines changed
timeless
record: turn on showfunc...
r27411 \x1b[0;35m@@ -2,7 +2,7 @@ c\x1b[0m (esc)
Matt Mackall
tests: unify test-diff-color
r12415 c
a
a
Mads Kiilerich
tests: use (esc) for all non-ASCII test output
r12942 \x1b[0;31m-b\x1b[0m (esc)
\x1b[0;32m+dd\x1b[0m (esc)
Matt Mackall
tests: unify test-diff-color
r12415 a
a
c
Kyle Lippincott
patch: use a short, fixed-size message for last line of prompt (issue6158)...
r42766 \x1b[0;33mrecord this change to 'a'?\x1b[0m (esc)
\x1b[0;33m(enter ? for help) [Ynesfdaq?]\x1b[0m y (esc)
Mads Kiilerich
ui: show prompt choice if input is not a tty but is forced to be interactive...
r22589
Mads Kiilerich
tests: cleanup of echo statements left over from test conversion
r15243
Matt Mackall
tests: unify test-diff-color
r12415 $ echo "[extensions]" >> $HGRCPATH
$ echo "mq=" >> $HGRCPATH
$ hg rollback
Gilles Moris
rollback: clarifies the message about the reverted state (issue2628)...
r13446 repository tip rolled back to revision 0 (undo commit)
working directory now based on revision 0
Matt Mackall
tests: unify test-diff-color
r12415
qrecord
Pierre-Yves David
color: add a 'ui.color' option to control color behavior...
r31110 $ hg qrecord -m moda patch <<EOF
Matt Mackall
tests: unify test-diff-color
r12415 > y
> y
> EOF
Mads Kiilerich
tests: use (esc) for all non-ASCII test output
r12942 \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
\x1b[0;36;1mold mode 100644\x1b[0m (esc)
\x1b[0;36;1mnew mode 100755\x1b[0m (esc)
Matt Mackall
tests: unify test-diff-color
r12415 1 hunks, 1 lines changed
Kyle Lippincott
patch: use a short, fixed-size message for last line of prompt (issue6158)...
r42766 \x1b[0;33mexamine changes to 'a'?\x1b[0m (esc)
\x1b[0;33m(enter ? for help) [Ynesfdaq?]\x1b[0m y (esc)
Mads Kiilerich
ui: show prompt choice if input is not a tty but is forced to be interactive...
r22589
timeless
record: turn on showfunc...
r27411 \x1b[0;35m@@ -2,7 +2,7 @@ c\x1b[0m (esc)
Matt Mackall
tests: unify test-diff-color
r12415 c
a
a
Mads Kiilerich
tests: use (esc) for all non-ASCII test output
r12942 \x1b[0;31m-b\x1b[0m (esc)
\x1b[0;32m+dd\x1b[0m (esc)
Matt Mackall
tests: unify test-diff-color
r12415 a
a
c
Kyle Lippincott
patch: use a short, fixed-size message for last line of prompt (issue6158)...
r42766 \x1b[0;33mrecord this change to 'a'?\x1b[0m (esc)
\x1b[0;33m(enter ? for help) [Ynesfdaq?]\x1b[0m y (esc)
Mads Kiilerich
ui: show prompt choice if input is not a tty but is forced to be interactive...
r22589
Mads Kiilerich
tests: convert some 'hghave execbit' to #if...
r16899
FUJIWARA Katsunori
subrepo: add argument to "diff()" to pass "ui" of caller side (issue3712) (API)...
r18006 $ hg qpop -a
popping patch
patch queue now empty
Mads Kiilerich
tests: convert some 'hghave execbit' to #if...
r16899 #endif
Mads Kiilerich
tests: add missing trailing 'cd ..'...
r16913
FUJIWARA Katsunori
subrepo: add argument to "diff()" to pass "ui" of caller side (issue3712) (API)...
r18006 issue3712: test colorization of subrepo diff
$ hg init sub
$ echo b > sub/b
$ hg -R sub commit -Am 'create sub'
Boris Feld
addremove: add associated color for the new labels...
r39126 \x1b[0;32madding b\x1b[0m (esc)
FUJIWARA Katsunori
subrepo: add argument to "diff()" to pass "ui" of caller side (issue3712) (API)...
r18006 $ echo 'sub = sub' > .hgsub
$ hg add .hgsub
$ hg commit -m 'add subrepo sub'
$ echo aa >> a
$ echo bb >> sub/b
Pierre-Yves David
color: add a 'ui.color' option to control color behavior...
r31110 $ hg diff -S
FUJIWARA Katsunori
subrepo: add argument to "diff()" to pass "ui" of caller side (issue3712) (API)...
r18006 \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
\x1b[0;31;1m--- a/a\x1b[0m (esc)
\x1b[0;32;1m+++ b/a\x1b[0m (esc)
\x1b[0;35m@@ -7,3 +7,4 @@\x1b[0m (esc)
a
c
c
\x1b[0;32m+aa\x1b[0m (esc)
Simon Heimberg
tests: remove glob lines which unnecessary match / for \ on windows...
r18720 \x1b[0;1mdiff --git a/sub/b b/sub/b\x1b[0m (esc)
FUJIWARA Katsunori
subrepo: add argument to "diff()" to pass "ui" of caller side (issue3712) (API)...
r18006 \x1b[0;31;1m--- a/sub/b\x1b[0m (esc)
\x1b[0;32;1m+++ b/sub/b\x1b[0m (esc)
\x1b[0;35m@@ -1,1 +1,2 @@\x1b[0m (esc)
b
\x1b[0;32m+bb\x1b[0m (esc)
Jordi Gutiérrez Hermoso
patch: enable diff.tab markup for the color extension...
r22460 test tabs
$ cat >> a <<EOF
> one tab
> two tabs
> end tab
> mid tab
> all tabs
> EOF
Pierre-Yves David
color: add a 'ui.color' option to control color behavior...
r31110 $ hg diff --nodates
Jordi Gutiérrez Hermoso
patch: enable diff.tab markup for the color extension...
r22460 \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
\x1b[0;31;1m--- a/a\x1b[0m (esc)
\x1b[0;32;1m+++ b/a\x1b[0m (esc)
\x1b[0;35m@@ -7,3 +7,9 @@\x1b[0m (esc)
a
c
c
\x1b[0;32m+aa\x1b[0m (esc)
\x1b[0;32m+\x1b[0m \x1b[0;32mone tab\x1b[0m (esc)
\x1b[0;32m+\x1b[0m \x1b[0;32mtwo tabs\x1b[0m (esc)
\x1b[0;32m+end tab\x1b[0m\x1b[0;1;41m \x1b[0m (esc)
\x1b[0;32m+mid\x1b[0m \x1b[0;32mtab\x1b[0m (esc)
\x1b[0;32m+\x1b[0m \x1b[0;32mall\x1b[0m \x1b[0;32mtabs\x1b[0m\x1b[0;1;41m \x1b[0m (esc)
$ echo "[color]" >> $HGRCPATH
$ echo "diff.tab = bold magenta" >> $HGRCPATH
Pierre-Yves David
color: add a 'ui.color' option to control color behavior...
r31110 $ hg diff --nodates
Jordi Gutiérrez Hermoso
patch: enable diff.tab markup for the color extension...
r22460 \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
\x1b[0;31;1m--- a/a\x1b[0m (esc)
\x1b[0;32;1m+++ b/a\x1b[0m (esc)
\x1b[0;35m@@ -7,3 +7,9 @@\x1b[0m (esc)
a
c
c
\x1b[0;32m+aa\x1b[0m (esc)
\x1b[0;32m+\x1b[0m\x1b[0;1;35m \x1b[0m\x1b[0;32mone tab\x1b[0m (esc)
\x1b[0;32m+\x1b[0m\x1b[0;1;35m \x1b[0m\x1b[0;32mtwo tabs\x1b[0m (esc)
\x1b[0;32m+end tab\x1b[0m\x1b[0;1;41m \x1b[0m (esc)
\x1b[0;32m+mid\x1b[0m\x1b[0;1;35m \x1b[0m\x1b[0;32mtab\x1b[0m (esc)
\x1b[0;32m+\x1b[0m\x1b[0;1;35m \x1b[0m\x1b[0;32mall\x1b[0m\x1b[0;1;35m \x1b[0m\x1b[0;32mtabs\x1b[0m\x1b[0;1;41m \x1b[0m (esc)
Mads Kiilerich
tests: add missing trailing 'cd ..'...
r16913 $ cd ..
Matthieu Laneuville
patch: add within-line color diff capacity...
r35278
test inline color diff
$ hg init inline
$ cd inline
$ cat > file1 << EOF
> this is the first line
> this is the second line
> third line starts with space
> + starts with a plus sign
Matthieu Laneuville
patch: move part of tabsplitter logic in _inlinediff...
r35329 > this one with one tab
> now with full two tabs
> now tabs everywhere, much fun
Matthieu Laneuville
patch: add within-line color diff capacity...
r35278 >
> this line won't change
>
> two lines are going to
> be changed into three!
>
> three of those lines will
> collapse onto one
> (to see if it works)
> EOF
$ hg add file1
$ hg ci -m 'commit'
Matthieu Laneuville
patch: move part of tabsplitter logic in _inlinediff...
r35329
Matthieu Laneuville
patch: add within-line color diff capacity...
r35278 $ cat > file1 << EOF
> that is the first paragraph
> this is the second line
> third line starts with space
> - starts with a minus sign
Matthieu Laneuville
patch: move part of tabsplitter logic in _inlinediff...
r35329 > this one with two tab
> now with full three tabs
> now there are tabs everywhere, much fun
Matthieu Laneuville
patch: add within-line color diff capacity...
r35278 >
> this line won't change
>
> two lines are going to
> (entirely magically,
> assuming this works)
> be changed into four!
>
> three of those lines have
> collapsed onto one
> EOF
Yuya Nishihara
diff: graduate word-diff option from experimental...
r38610 $ hg diff --config diff.word-diff=False --color=debug
Matthieu Laneuville
patch: add within-line color diff capacity...
r35278 [diff.diffline|diff --git a/file1 b/file1]
[diff.file_a|--- a/file1]
[diff.file_b|+++ b/file1]
Matthieu Laneuville
patch: move part of tabsplitter logic in _inlinediff...
r35329 [diff.hunk|@@ -1,16 +1,17 @@]
Matthieu Laneuville
patch: add within-line color diff capacity...
r35278 [diff.deleted|-this is the first line]
[diff.deleted|-this is the second line]
[diff.deleted|- third line starts with space]
[diff.deleted|-+ starts with a plus sign]
Matthieu Laneuville
patch: move part of tabsplitter logic in _inlinediff...
r35329 [diff.deleted|-][diff.tab| ][diff.deleted|this one with one tab]
[diff.deleted|-][diff.tab| ][diff.deleted|now with full two tabs]
[diff.deleted|-][diff.tab| ][diff.deleted|now tabs][diff.tab| ][diff.deleted|everywhere, much fun]
Matthieu Laneuville
patch: add within-line color diff capacity...
r35278 [diff.inserted|+that is the first paragraph]
[diff.inserted|+ this is the second line]
[diff.inserted|+third line starts with space]
[diff.inserted|+- starts with a minus sign]
Matthieu Laneuville
patch: move part of tabsplitter logic in _inlinediff...
r35329 [diff.inserted|+][diff.tab| ][diff.inserted|this one with two tab]
[diff.inserted|+][diff.tab| ][diff.inserted|now with full three tabs]
[diff.inserted|+][diff.tab| ][diff.inserted|now there are tabs][diff.tab| ][diff.inserted|everywhere, much fun]
Matthieu Laneuville
patch: add within-line color diff capacity...
r35278
this line won't change
two lines are going to
[diff.deleted|-be changed into three!]
[diff.inserted|+(entirely magically,]
[diff.inserted|+ assuming this works)]
[diff.inserted|+be changed into four!]
[diff.deleted|-three of those lines will]
[diff.deleted|-collapse onto one]
[diff.deleted|-(to see if it works)]
[diff.inserted|+three of those lines have]
[diff.inserted|+collapsed onto one]
Yuya Nishihara
diff: graduate word-diff option from experimental...
r38610 $ hg diff --config diff.word-diff=True --color=debug
Matthieu Laneuville
patch: add within-line color diff capacity...
r35278 [diff.diffline|diff --git a/file1 b/file1]
[diff.file_a|--- a/file1]
[diff.file_b|+++ b/file1]
Matthieu Laneuville
patch: move part of tabsplitter logic in _inlinediff...
r35329 [diff.hunk|@@ -1,16 +1,17 @@]
Jun Wu
patch: implement a new worddiff algorithm...
r37750 [diff.deleted|-][diff.deleted.changed|this][diff.deleted.unchanged| is the first ][diff.deleted.changed|line]
[diff.deleted|-][diff.deleted.unchanged|this is the second line]
[diff.deleted|-][diff.deleted.changed| ][diff.deleted.unchanged|third line starts with space]
[diff.deleted|-][diff.deleted.changed|+][diff.deleted.unchanged| starts with a ][diff.deleted.changed|plus][diff.deleted.unchanged| sign]
[diff.deleted|-][diff.tab| ][diff.deleted.unchanged|this one with ][diff.deleted.changed|one][diff.deleted.unchanged| tab]
[diff.deleted|-][diff.tab| ][diff.deleted.unchanged|now with full ][diff.deleted.changed|two][diff.deleted.unchanged| tabs]
[diff.deleted|-][diff.tab| ][diff.deleted.unchanged|now ][diff.deleted.unchanged|tabs][diff.tab| ][diff.deleted.unchanged|everywhere, much fun]
[diff.inserted|+][diff.inserted.changed|that][diff.inserted.unchanged| is the first ][diff.inserted.changed|paragraph]
[diff.inserted|+][diff.inserted.changed| ][diff.inserted.unchanged|this is the second line]
[diff.inserted|+][diff.inserted.unchanged|third line starts with space]
[diff.inserted|+][diff.inserted.changed|-][diff.inserted.unchanged| starts with a ][diff.inserted.changed|minus][diff.inserted.unchanged| sign]
[diff.inserted|+][diff.tab| ][diff.inserted.unchanged|this one with ][diff.inserted.changed|two][diff.inserted.unchanged| tab]
[diff.inserted|+][diff.tab| ][diff.inserted.unchanged|now with full ][diff.inserted.changed|three][diff.inserted.unchanged| tabs]
[diff.inserted|+][diff.tab| ][diff.inserted.unchanged|now ][diff.inserted.changed|there are ][diff.inserted.unchanged|tabs][diff.tab| ][diff.inserted.unchanged|everywhere, much fun]
Matthieu Laneuville
patch: add within-line color diff capacity...
r35278
this line won't change
two lines are going to
Jun Wu
patch: implement a new worddiff algorithm...
r37750 [diff.deleted|-][diff.deleted.unchanged|be changed into ][diff.deleted.changed|three][diff.deleted.unchanged|!]
[diff.inserted|+][diff.inserted.changed|(entirely magically,]
[diff.inserted|+][diff.inserted.changed| assuming this works)]
[diff.inserted|+][diff.inserted.unchanged|be changed into ][diff.inserted.changed|four][diff.inserted.unchanged|!]
Matthieu Laneuville
patch: add within-line color diff capacity...
r35278
Jun Wu
patch: implement a new worddiff algorithm...
r37750 [diff.deleted|-][diff.deleted.unchanged|three of those lines ][diff.deleted.changed|will]
[diff.deleted|-][diff.deleted.changed|collapse][diff.deleted.unchanged| onto one]
[diff.deleted|-][diff.deleted.changed|(to see if it works)]
[diff.inserted|+][diff.inserted.unchanged|three of those lines ][diff.inserted.changed|have]
[diff.inserted|+][diff.inserted.changed|collapsed][diff.inserted.unchanged| onto one]
Yuya Nishihara
patch: do not break up multibyte character when highlighting word...
r35384
multibyte character shouldn't be broken up in word diff:
Matt Harbison
tests: quote PYTHON usage...
r39743 $ "$PYTHON" <<'EOF'
Yuya Nishihara
patch: do not break up multibyte character when highlighting word...
r35384 > with open("utf8", "wb") as f:
> f.write(b"blah \xe3\x82\xa2 blah\n")
> EOF
$ hg ci -Am 'add utf8 char' utf8
Matt Harbison
tests: quote PYTHON usage...
r39743 $ "$PYTHON" <<'EOF'
Yuya Nishihara
patch: do not break up multibyte character when highlighting word...
r35384 > with open("utf8", "wb") as f:
> f.write(b"blah \xe3\x82\xa4 blah\n")
> EOF
$ hg ci -m 'slightly change utf8 char' utf8
Jun Wu
patch: buffer lines for a same hunk...
r37749
Yuya Nishihara
diff: graduate word-diff option from experimental...
r38610 $ hg diff --config diff.word-diff=True --color=debug -c.
Yuya Nishihara
patch: do not break up multibyte character when highlighting word...
r35384 [diff.diffline|diff --git a/utf8 b/utf8]
[diff.file_a|--- a/utf8]
[diff.file_b|+++ b/utf8]
[diff.hunk|@@ -1,1 +1,1 @@]
Jun Wu
patch: implement a new worddiff algorithm...
r37750 [diff.deleted|-][diff.deleted.unchanged|blah ][diff.deleted.changed|\xe3\x82\xa2][diff.deleted.unchanged| blah] (esc)
[diff.inserted|+][diff.inserted.unchanged|blah ][diff.inserted.changed|\xe3\x82\xa4][diff.inserted.unchanged| blah] (esc)