# HG changeset patch # User Matt Mackall # Date 1184438080 18000 # Node ID da8640113b5a7e495d7e8adb4c0d90eea64d08c5 # Parent 001e8a745834298a3d9f67473732575c7d012301# Parent 372d93f03d3aae749c5d523d8c33ce36581b8887 Merge with -stable diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -1107,7 +1107,11 @@ def grep(ui, repo, pattern, *pats, **opt reflags = 0 if opts['ignore_case']: reflags |= re.I - regexp = re.compile(pattern, reflags) + try: + regexp = re.compile(pattern, reflags) + except Exception, inst: + ui.warn(_("grep: invalid match pattern: %s!\n") % inst) + return None sep, eol = ':', '\n' if opts['print0']: sep = eol = '\0' diff --git a/mercurial/mdiff.py b/mercurial/mdiff.py --- a/mercurial/mdiff.py +++ b/mercurial/mdiff.py @@ -49,6 +49,16 @@ class diffopts(object): defaultopts = diffopts() +def wsclean(opts, text): + if opts.ignorews: + text = re.sub('[ \t]+', '', text) + elif opts.ignorewsamount: + text = re.sub('[ \t]+', ' ', text) + text = re.sub('[ \t]+\n', '\n', text) + if opts.ignoreblanklines: + text = re.sub('\n+', '', text) + return text + def unidiff(a, ad, b, bd, fn, r=None, opts=defaultopts): def datetag(date, addtab=True): if not opts.git and not opts.nodates: @@ -151,13 +161,6 @@ def bunidiff(t1, t2, l1, l2, header1, he if opts.showfunc: funcre = re.compile('\w') - if opts.ignorewsamount: - wsamountre = re.compile('[ \t]+') - wsappendedre = re.compile(' \n') - if opts.ignoreblanklines: - wsblanklinesre = re.compile('\n') - if opts.ignorews: - wsre = re.compile('[ \t]') # bdiff.blocks gives us the matching sequences in the files. The loop # below finds the spaces between those matching sequences and translates @@ -189,24 +192,8 @@ def bunidiff(t1, t2, l1, l2, header1, he if not old and not new: continue - if opts.ignoreblanklines: - wsold = wsblanklinesre.sub('', "".join(old)) - wsnew = wsblanklinesre.sub('', "".join(new)) - if wsold == wsnew: - continue - - if opts.ignorewsamount: - wsold = wsamountre.sub(' ', "".join(old)) - wsold = wsappendedre.sub('\n', wsold) - wsnew = wsamountre.sub(' ', "".join(new)) - wsnew = wsappendedre.sub('\n', wsnew) - if wsold == wsnew: - continue - - if opts.ignorews: - wsold = wsre.sub('', "".join(old)) - wsnew = wsre.sub('', "".join(new)) - if wsold == wsnew: + if opts.ignorews or opts.ignorewsamount or opts.ignoreblanklines: + if wsclean(opts, "".join(old)) == wsclean(opts, "".join(new)): continue astart = contextstart(a1) diff --git a/tests/test-diff-ignore-whitespace b/tests/test-diff-ignore-whitespace --- a/tests/test-diff-ignore-whitespace +++ b/tests/test-diff-ignore-whitespace @@ -3,6 +3,7 @@ # GNU diff is the reference for all of these results. hgdiff() { + echo hg diff $@ hg diff --nodates "$@" } @@ -72,6 +73,39 @@ test_added_blank_line_with_horizontal_wh hgdiff -Bb } +test_added_blank_line_with_other_whitespace() { + printf 'hello world\n \t\ngoodbye world \n' >foo + + echo '>>> three diffs showing added blank line w/other space <<<' + hgdiff + hgdiff -B + hgdiff -b + hgdiff -Bb +} + +test_whitespace_changes() { + printf 'helloworld\ngoodbye\tworld \n' >foo + + echo '>>> four diffs showing changed whitespace <<<' + hgdiff + hgdiff -B + hgdiff -b + hgdiff -Bb + hgdiff -w +} + +test_whitespace_changes_and_blank_lines() { + printf 'helloworld\n\n\n\ngoodbye\tworld \n' >foo + + echo '>>> five diffs showing changed whitespace <<<' + hgdiff + hgdiff -B + hgdiff -b + hgdiff -Bb + hgdiff -w + hgdiff -wB +} + hg init printf 'hello world\ngoodbye world\n' >foo hg ci -Amfoo -ufoo -d '0 0' @@ -82,3 +116,6 @@ test_added_horizontal_space_last_on_a_li test_added_horizontal_space_in_the_middle_of_a_word test_increased_horizontal_whitespace_amount test_added_blank_line_with_horizontal_whitespace +test_added_blank_line_with_other_whitespace +test_whitespace_changes +test_whitespace_changes_and_blank_lines diff --git a/tests/test-diff-ignore-whitespace.out b/tests/test-diff-ignore-whitespace.out --- a/tests/test-diff-ignore-whitespace.out +++ b/tests/test-diff-ignore-whitespace.out @@ -1,5 +1,6 @@ adding foo >>> two diffs showing three added lines <<< +hg diff diff -r 540c40a65b78 foo --- a/foo +++ b/foo @@ -9,6 +10,7 @@ diff -r 540c40a65b78 foo + goodbye world + +hg diff -b diff -r 540c40a65b78 foo --- a/foo +++ b/foo @@ -19,7 +21,10 @@ diff -r 540c40a65b78 foo goodbye world + >>> no diffs <<< +hg diff -B +hg diff -Bb >>> four diffs showing added space first on the first line <<< +hg diff diff -r 540c40a65b78 foo --- a/foo +++ b/foo @@ -27,6 +32,7 @@ diff -r 540c40a65b78 foo -hello world + hello world goodbye world +hg diff -b diff -r 540c40a65b78 foo --- a/foo +++ b/foo @@ -34,6 +40,7 @@ diff -r 540c40a65b78 foo -hello world + hello world goodbye world +hg diff -B diff -r 540c40a65b78 foo --- a/foo +++ b/foo @@ -41,6 +48,7 @@ diff -r 540c40a65b78 foo -hello world + hello world goodbye world +hg diff -Bb diff -r 540c40a65b78 foo --- a/foo +++ b/foo @@ -49,6 +57,7 @@ diff -r 540c40a65b78 foo + hello world goodbye world >>> two diffs showing space appended to the first line <<< +hg diff diff -r 540c40a65b78 foo --- a/foo +++ b/foo @@ -56,6 +65,7 @@ diff -r 540c40a65b78 foo -hello world +hello world goodbye world +hg diff -B diff -r 540c40a65b78 foo --- a/foo +++ b/foo @@ -64,7 +74,10 @@ diff -r 540c40a65b78 foo +hello world goodbye world >>> no diffs <<< +hg diff -b +hg diff -Bb >>> four diffs showing space inserted into "goodbye" <<< +hg diff diff -r 540c40a65b78 foo --- a/foo +++ b/foo @@ -72,6 +85,7 @@ diff -r 540c40a65b78 foo hello world -goodbye world +good bye world +hg diff -B diff -r 540c40a65b78 foo --- a/foo +++ b/foo @@ -79,6 +93,7 @@ diff -r 540c40a65b78 foo hello world -goodbye world +good bye world +hg diff -b diff -r 540c40a65b78 foo --- a/foo +++ b/foo @@ -86,6 +101,7 @@ diff -r 540c40a65b78 foo hello world -goodbye world +good bye world +hg diff -Bb diff -r 540c40a65b78 foo --- a/foo +++ b/foo @@ -94,6 +110,7 @@ diff -r 540c40a65b78 foo -goodbye world +good bye world >>> two diffs showing changed whitespace amount in the last line <<< +hg diff diff -r 540c40a65b78 foo --- a/foo +++ b/foo @@ -101,6 +118,7 @@ diff -r 540c40a65b78 foo hello world -goodbye world +goodbye world +hg diff -B diff -r 540c40a65b78 foo --- a/foo +++ b/foo @@ -109,7 +127,10 @@ diff -r 540c40a65b78 foo -goodbye world +goodbye world >>> no diffs <<< +hg diff -b +hg diff -Bb >>> four diffs showing added blank line w/horizontal space <<< +hg diff diff -r 540c40a65b78 foo --- a/foo +++ b/foo @@ -117,6 +138,15 @@ diff -r 540c40a65b78 foo hello world + goodbye world +hg diff -B +diff -r 540c40a65b78 foo +--- a/foo ++++ b/foo +@@ -1,2 +1,3 @@ hello world + hello world ++ + goodbye world +hg diff -b diff -r 540c40a65b78 foo --- a/foo +++ b/foo @@ -124,17 +154,136 @@ diff -r 540c40a65b78 foo hello world + goodbye world +hg diff -Bb +>>> three diffs showing added blank line w/other space <<< +hg diff +diff -r 540c40a65b78 foo +--- a/foo ++++ b/foo +@@ -1,2 +1,3 @@ hello world +-hello world +-goodbye world ++hello world ++ ++goodbye world +hg diff -B +diff -r 540c40a65b78 foo +--- a/foo ++++ b/foo +@@ -1,2 +1,3 @@ hello world +-hello world +-goodbye world ++hello world ++ ++goodbye world +hg diff -b diff -r 540c40a65b78 foo --- a/foo +++ b/foo @@ -1,2 +1,3 @@ hello world - hello world +-hello world +-goodbye world ++hello world + - goodbye world ++goodbye world +hg diff -Bb +>>> four diffs showing changed whitespace <<< +hg diff +diff -r 540c40a65b78 foo +--- a/foo ++++ b/foo +@@ -1,2 +1,2 @@ hello world +-hello world +-goodbye world ++helloworld ++goodbye world +hg diff -B +diff -r 540c40a65b78 foo +--- a/foo ++++ b/foo +@@ -1,2 +1,2 @@ hello world +-hello world +-goodbye world ++helloworld ++goodbye world +hg diff -b +diff -r 540c40a65b78 foo +--- a/foo ++++ b/foo +@@ -1,2 +1,2 @@ hello world +-hello world +-goodbye world ++helloworld ++goodbye world +hg diff -Bb +diff -r 540c40a65b78 foo +--- a/foo ++++ b/foo +@@ -1,2 +1,2 @@ hello world +-hello world +-goodbye world ++helloworld ++goodbye world +hg diff -w +>>> five diffs showing changed whitespace <<< +hg diff diff -r 540c40a65b78 foo --- a/foo +++ b/foo -@@ -1,2 +1,3 @@ hello world - hello world -+ - goodbye world +@@ -1,2 +1,5 @@ hello world +-hello world +-goodbye world ++helloworld ++ ++ ++ ++goodbye world +hg diff -B +diff -r 540c40a65b78 foo +--- a/foo ++++ b/foo +@@ -1,2 +1,5 @@ hello world +-hello world +-goodbye world ++helloworld ++ ++ ++ ++goodbye world +hg diff -b +diff -r 540c40a65b78 foo +--- a/foo ++++ b/foo +@@ -1,2 +1,5 @@ hello world +-hello world +-goodbye world ++helloworld ++ ++ ++ ++goodbye world +hg diff -Bb +diff -r 540c40a65b78 foo +--- a/foo ++++ b/foo +@@ -1,2 +1,5 @@ hello world +-hello world +-goodbye world ++helloworld ++ ++ ++ ++goodbye world +hg diff -w +diff -r 540c40a65b78 foo +--- a/foo ++++ b/foo +@@ -1,2 +1,5 @@ hello world +-hello world +-goodbye world ++helloworld ++ ++ ++ ++goodbye world +hg diff -wB diff --git a/tests/test-grep b/tests/test-grep --- a/tests/test-grep +++ b/tests/test-grep @@ -17,6 +17,8 @@ hg commit -m 3 -u eggs -d '3 0' head -n 3 port > port1 mv port1 port hg commit -m 4 -u spam -d '4 0' +echo % pattern error +hg grep '**test**' echo % simple hg grep port port echo % all diff --git a/tests/test-grep.out b/tests/test-grep.out --- a/tests/test-grep.out +++ b/tests/test-grep.out @@ -1,3 +1,5 @@ +% pattern error +grep: invalid match pattern: nothing to repeat! % simple port:4:export port:4:vaportight