diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py --- a/mercurial/cmdutil.py +++ b/mercurial/cmdutil.py @@ -122,6 +122,8 @@ _('ignore changes in the amount of white space')), ('B', 'ignore-blank-lines', None, _('ignore changes whose lines are all blank')), + ('e', 'ignore-space-at-eol', None, + _('ignore changes in whitespace at EOL')), ] diffopts2 = [ diff --git a/mercurial/help/config.txt b/mercurial/help/config.txt --- a/mercurial/help/config.txt +++ b/mercurial/help/config.txt @@ -313,6 +313,9 @@ ``ignorews`` Ignore white space when comparing lines. +``ignorewseol`` + Ignore white space at the end of a line when comparing lines. + ``ignorewsamount`` Ignore changes in the amount of white space. diff --git a/mercurial/mdiff.py b/mercurial/mdiff.py --- a/mercurial/mdiff.py +++ b/mercurial/mdiff.py @@ -63,6 +63,7 @@ 'index': 0, 'ignorews': False, 'ignorewsamount': False, + 'ignorewseol': False, 'ignoreblanklines': False, 'upgrade': False, 'showsimilarity': False, @@ -97,6 +98,8 @@ text = bdiff.fixws(text, 0) if blank and opts.ignoreblanklines: text = re.sub('\n+', '\n', text).strip('\n') + if opts.ignorewseol: + text = re.sub(r'\s+\n', r'\n', text) return text def splitblock(base1, lines1, base2, lines2, opts): @@ -199,7 +202,7 @@ """ if opts is None: opts = defaultopts - if opts.ignorews or opts.ignorewsamount: + if opts.ignorews or opts.ignorewsamount or opts.ignorewseol: text1 = wsclean(opts, text1, False) text2 = wsclean(opts, text2, False) diff = bdiff.blocks(text1, text2) diff --git a/mercurial/patch.py b/mercurial/patch.py --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -2282,6 +2282,7 @@ 'ignorewsamount') buildopts['ignoreblanklines'] = get('ignore_blank_lines', 'ignoreblanklines') + buildopts['ignorewseol'] = get('ignore_space_at_eol', 'ignorewseol') if formatchanging: buildopts['text'] = opts and opts.get('text') binary = None if opts is None else opts.get('binary') diff --git a/tests/test-diff-ignore-whitespace.t b/tests/test-diff-ignore-whitespace.t --- a/tests/test-diff-ignore-whitespace.t +++ b/tests/test-diff-ignore-whitespace.t @@ -407,8 +407,16 @@ +goodbye\r (no-eol) (esc) world +Test \r (carriage return) as used in "DOS" line endings: + + $ printf 'hello world \r\ngoodbye world\n' >foo + + $ hg ndiff --ignore-space-at-eol + No completely blank lines to ignore: + $ printf 'hello world\r\n\r\ngoodbye\rworld\n' >foo + $ hg ndiff --ignore-blank-lines diff -r 540c40a65b78 foo --- a/foo