/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/tests/test_grep.py

  • Committer: Jelmer Vernooij
  • Date: 2020-04-05 19:11:34 UTC
  • mto: (7490.7.16 work)
  • mto: This revision was merged to the branch mainline in revision 7501.
  • Revision ID: jelmer@jelmer.uk-20200405191134-0aebh8ikiwygxma5
Populate the .gitignore file.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2010, 2011, 2012, 2016 Canonical Ltd
 
2
#
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
 
7
#
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU General Public License
 
14
# along with this program; if not, write to the Free Software
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
16
 
 
17
from __future__ import absolute_import
 
18
 
 
19
import os
 
20
import re
 
21
import unicodedata as ud
 
22
 
 
23
from .. import tests, osutils
 
24
from ..sixish import PY3
 
25
from .._termcolor import color_string, FG
 
26
 
 
27
from ..tests.features import (
 
28
    UnicodeFilenameFeature,
 
29
    )
 
30
 
 
31
# NOTE: As bzr-grep optimizes PATTERN search to -F/--fixed-string
 
32
# for patterns that are not alphanumeric+whitespace, we test grep
 
33
# specfically with patterns that have special characters so that
 
34
# regex path is tested. alphanumeric patterns test the -F path.
 
35
 
 
36
 
 
37
class GrepTestBase(tests.TestCaseWithTransport):
 
38
    """Base class for testing grep.
 
39
 
 
40
    Provides support methods for creating directory and file revisions.
 
41
    """
 
42
    _reflags = re.MULTILINE | re.DOTALL
 
43
 
 
44
    def _mk_file(self, path, line_prefix, total_lines, versioned):
 
45
        text = ''
 
46
        for i in range(total_lines):
 
47
            text += line_prefix + str(i + 1) + "\n"
 
48
 
 
49
        with open(path, 'w') as f:
 
50
            f.write(text)
 
51
        if versioned:
 
52
            self.run_bzr(['add', path])
 
53
            self.run_bzr(['ci', '-m', '"' + path + '"'])
 
54
 
 
55
    def _update_file(self, path, text, checkin=True):
 
56
        """append text to file 'path' and check it in"""
 
57
        with open(path, 'a') as f:
 
58
            f.write(text)
 
59
        if checkin:
 
60
            self.run_bzr(['ci', path, '-m', '"' + path + '"'])
 
61
 
 
62
    def _mk_unknown_file(self, path, line_prefix='line', total_lines=10):
 
63
        self._mk_file(path, line_prefix, total_lines, versioned=False)
 
64
 
 
65
    def _mk_versioned_file(self, path, line_prefix='line', total_lines=10):
 
66
        self._mk_file(path, line_prefix, total_lines, versioned=True)
 
67
 
 
68
    def _mk_dir(self, path, versioned):
 
69
        os.mkdir(path)
 
70
        if versioned:
 
71
            self.run_bzr(['add', path])
 
72
            self.run_bzr(['ci', '-m', '"' + path + '"'])
 
73
 
 
74
    def _mk_unknown_dir(self, path):
 
75
        self._mk_dir(path, versioned=False)
 
76
 
 
77
    def _mk_versioned_dir(self, path):
 
78
        self._mk_dir(path, versioned=True)
 
79
 
 
80
 
 
81
class TestGrep(GrepTestBase):
 
82
    """Core functional tests for grep."""
 
83
 
 
84
    def test_basic_unknown_file(self):
 
85
        """Search for pattern in specfic file.
 
86
 
 
87
        If specified file is unknown, grep it anyway."""
 
88
        wd = 'foobar0'
 
89
        self.make_branch_and_tree(wd)
 
90
        os.chdir(wd)
 
91
        self._mk_unknown_file('file0.txt')
 
92
 
 
93
        out, err = self.run_bzr(['grep', 'line1', 'file0.txt'])
 
94
        self.assertContainsRe(out, "file0.txt:line1", flags=TestGrep._reflags)
 
95
        self.assertEqual(len(out.splitlines()), 2)  # finds line1 and line10
 
96
 
 
97
        out, err = self.run_bzr(['grep', 'line\\d+', 'file0.txt'])
 
98
        self.assertContainsRe(out, "file0.txt:line1", flags=TestGrep._reflags)
 
99
        self.assertEqual(len(out.splitlines()), 10)
 
100
 
 
101
        # unknown file is not grepped unless explicitely specified
 
102
        out, err = self.run_bzr(['grep', 'line1'])
 
103
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
104
        self.assertEqual(len(out.splitlines()), 0)
 
105
 
 
106
        # unknown file is not grepped unless explicitely specified
 
107
        out, err = self.run_bzr(['grep', 'line1$'])
 
108
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
109
        self.assertEqual(len(out.splitlines()), 0)
 
110
 
 
111
    def test_ver_basic_file(self):
 
112
        """(versioned) Search for pattern in specfic file.
 
113
        """
 
114
        wd = 'foobar0'
 
115
        self.make_branch_and_tree(wd)
 
116
        os.chdir(wd)
 
117
        self._mk_versioned_file('file0.txt')
 
118
 
 
119
        out, err = self.run_bzr(['grep', '-r', '1', 'line1', 'file0.txt'])
 
120
        self.assertContainsRe(out, "file0.txt~1:line1",
 
121
                              flags=TestGrep._reflags)
 
122
        self.assertEqual(len(out.splitlines()), 2)  # finds line1 and line10
 
123
 
 
124
        out, err = self.run_bzr(['grep', '-r', '1', 'line[0-9]$', 'file0.txt'])
 
125
        self.assertContainsRe(out, "file0.txt~1:line1",
 
126
                              flags=TestGrep._reflags)
 
127
        self.assertEqual(len(out.splitlines()), 9)
 
128
 
 
129
        # finds all the lines
 
130
        out, err = self.run_bzr(['grep', '-r', '1', 'line[0-9]', 'file0.txt'])
 
131
        self.assertContainsRe(out, "file0.txt~1:line1",
 
132
                              flags=TestGrep._reflags)
 
133
        self.assertEqual(len(out.splitlines()), 10)
 
134
 
 
135
    def test_wtree_basic_file(self):
 
136
        """(wtree) Search for pattern in specfic file.
 
137
        """
 
138
        wd = 'foobar0'
 
139
        self.make_branch_and_tree(wd)
 
140
        os.chdir(wd)
 
141
        self._mk_versioned_file('file0.txt')
 
142
        self._update_file('file0.txt', 'ABC\n', checkin=False)
 
143
 
 
144
        out, err = self.run_bzr(['grep', 'ABC', 'file0.txt'])
 
145
        self.assertContainsRe(out, "file0.txt:ABC", flags=TestGrep._reflags)
 
146
        self.assertEqual(len(out.splitlines()), 1)
 
147
 
 
148
        out, err = self.run_bzr(['grep', '[A-Z]{3}', 'file0.txt'])
 
149
        self.assertContainsRe(out, "file0.txt:ABC", flags=TestGrep._reflags)
 
150
        self.assertEqual(len(out.splitlines()), 1)
 
151
 
 
152
        out, err = self.run_bzr(['grep', '-r', 'last:1', 'ABC', 'file0.txt'])
 
153
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
154
        self.assertEqual(len(out.splitlines()), 0)
 
155
 
 
156
        out, err = self.run_bzr(
 
157
            ['grep', '-r', 'last:1', '[A-Z]{3}', 'file0.txt'])
 
158
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
159
        self.assertEqual(len(out.splitlines()), 0)
 
160
 
 
161
    def test_ver_basic_include(self):
 
162
        """(versioned) Ensure that -I flag is respected.
 
163
        """
 
164
        wd = 'foobar0'
 
165
        self.make_branch_and_tree(wd)
 
166
        os.chdir(wd)
 
167
        self._mk_versioned_file('file0.aa')
 
168
        self._mk_versioned_file('file0.bb')
 
169
        self._mk_versioned_file('file0.cc')
 
170
 
 
171
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
172
                                 '--include', '*.aa', '--include', '*.bb', 'line1'])
 
173
        self.assertContainsRe(out, "file0.aa~.:line1", flags=TestGrep._reflags)
 
174
        self.assertContainsRe(out, "file0.bb~.:line1", flags=TestGrep._reflags)
 
175
        self.assertNotContainsRe(out, "file0.cc", flags=TestGrep._reflags)
 
176
        # two lines each (line1, line10) from file0.aa and file0.bb
 
177
        self.assertEqual(len(out.splitlines()), 4)
 
178
 
 
179
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
180
                                 '--include', '*.aa', '--include', '*.bb', 'line1$'])
 
181
        self.assertContainsRe(out, "file0.aa~.:line1", flags=TestGrep._reflags)
 
182
        self.assertContainsRe(out, "file0.bb~.:line1", flags=TestGrep._reflags)
 
183
        self.assertNotContainsRe(out, "file0.cc", flags=TestGrep._reflags)
 
184
        # one lines each (line1) from file0.aa and file0.bb
 
185
        self.assertEqual(len(out.splitlines()), 2)
 
186
 
 
187
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
188
                                 '-I', '*.aa', '-I', '*.bb', 'line1'])
 
189
        self.assertContainsRe(out, "file0.aa~.:line1", flags=TestGrep._reflags)
 
190
        self.assertContainsRe(out, "file0.bb~.:line1", flags=TestGrep._reflags)
 
191
        self.assertNotContainsRe(out, "file0.cc", flags=TestGrep._reflags)
 
192
        # two lines each (line1, line10) from file0.aa and file0.bb
 
193
        self.assertEqual(len(out.splitlines()), 4)
 
194
 
 
195
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
196
                                 '-I', '*.aa', '-I', '*.bb', 'line1$'])
 
197
        self.assertContainsRe(out, "file0.aa~.:line1", flags=TestGrep._reflags)
 
198
        self.assertContainsRe(out, "file0.bb~.:line1", flags=TestGrep._reflags)
 
199
        self.assertNotContainsRe(out, "file0.cc", flags=TestGrep._reflags)
 
200
        # one lines each (line1) from file0.aa and file0.bb
 
201
        self.assertEqual(len(out.splitlines()), 2)
 
202
 
 
203
    def test_wtree_basic_include(self):
 
204
        """(wtree) Ensure that --include flag is respected.
 
205
        """
 
206
        wd = 'foobar0'
 
207
        self.make_branch_and_tree(wd)
 
208
        os.chdir(wd)
 
209
        self._mk_versioned_file('file0.aa')
 
210
        self._mk_versioned_file('file0.bb')
 
211
        self._mk_versioned_file('file0.cc')
 
212
 
 
213
        out, err = self.run_bzr(['grep', '--include', '*.aa',
 
214
                                 '--include', '*.bb', 'line1'])
 
215
        self.assertContainsRe(out, "file0.aa:line1", flags=TestGrep._reflags)
 
216
        self.assertContainsRe(out, "file0.bb:line1", flags=TestGrep._reflags)
 
217
        self.assertNotContainsRe(out, "file0.cc", flags=TestGrep._reflags)
 
218
        # two lines each (line1, line10) from file0.aa and file0.bb
 
219
        self.assertEqual(len(out.splitlines()), 4)
 
220
 
 
221
        out, err = self.run_bzr(['grep', '--include', '*.aa',
 
222
                                 '--include', '*.bb', 'line1$'])
 
223
        self.assertContainsRe(out, "file0.aa:line1", flags=TestGrep._reflags)
 
224
        self.assertContainsRe(out, "file0.bb:line1", flags=TestGrep._reflags)
 
225
        self.assertNotContainsRe(out, "file0.cc", flags=TestGrep._reflags)
 
226
        # one line each (line1) from file0.aa and file0.bb
 
227
        self.assertEqual(len(out.splitlines()), 2)
 
228
 
 
229
    def test_ver_basic_exclude(self):
 
230
        """(versioned) Ensure that --exclude flag is respected.
 
231
        """
 
232
        wd = 'foobar0'
 
233
        self.make_branch_and_tree(wd)
 
234
        os.chdir(wd)
 
235
        self._mk_versioned_file('file0.aa')
 
236
        self._mk_versioned_file('file0.bb')
 
237
        self._mk_versioned_file('file0.cc')
 
238
 
 
239
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
240
                                 '--exclude', '*.cc', 'line1'])
 
241
        self.assertContainsRe(out, "file0.aa~.:line1$",
 
242
                              flags=TestGrep._reflags)
 
243
        self.assertContainsRe(out, "file0.bb~.:line1$",
 
244
                              flags=TestGrep._reflags)
 
245
        self.assertContainsRe(out, "file0.aa~.:line10",
 
246
                              flags=TestGrep._reflags)
 
247
        self.assertContainsRe(out, "file0.bb~.:line10",
 
248
                              flags=TestGrep._reflags)
 
249
        self.assertNotContainsRe(out, "file0.cc", flags=TestGrep._reflags)
 
250
        # two lines each (line1, line10) from file0.aa and file0.bb
 
251
        self.assertEqual(len(out.splitlines()), 4)
 
252
 
 
253
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
254
                                 '--exclude', '*.cc', 'line1$'])
 
255
        self.assertContainsRe(out, "file0.aa~.:line1", flags=TestGrep._reflags)
 
256
        self.assertContainsRe(out, "file0.bb~.:line1", flags=TestGrep._reflags)
 
257
        self.assertNotContainsRe(out, "file0.cc", flags=TestGrep._reflags)
 
258
        # one line each (line1) from file0.aa and file0.bb
 
259
        self.assertEqual(len(out.splitlines()), 2)
 
260
 
 
261
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
262
                                 '-X', '*.cc', 'line1'])
 
263
        self.assertContainsRe(out, "file0.aa~.:line1", flags=TestGrep._reflags)
 
264
        self.assertContainsRe(out, "file0.bb~.:line1", flags=TestGrep._reflags)
 
265
        self.assertNotContainsRe(out, "file0.cc", flags=TestGrep._reflags)
 
266
        # two lines each (line1, line10) from file0.aa and file0.bb
 
267
        self.assertEqual(len(out.splitlines()), 4)
 
268
 
 
269
    def test_wtree_basic_exclude(self):
 
270
        """(wtree) Ensure that --exclude flag is respected.
 
271
        """
 
272
        wd = 'foobar0'
 
273
        self.make_branch_and_tree(wd)
 
274
        os.chdir(wd)
 
275
        self._mk_versioned_file('file0.aa')
 
276
        self._mk_versioned_file('file0.bb')
 
277
        self._mk_versioned_file('file0.cc')
 
278
 
 
279
        out, err = self.run_bzr(['grep', '--exclude', '*.cc', 'line1'])
 
280
        self.assertContainsRe(out, "file0.aa:line1", flags=TestGrep._reflags)
 
281
        self.assertContainsRe(out, "file0.bb:line1", flags=TestGrep._reflags)
 
282
        self.assertNotContainsRe(out, "file0.cc", flags=TestGrep._reflags)
 
283
        # two lines each (line1, line10) from file0.aa and file0.bb
 
284
        self.assertEqual(len(out.splitlines()), 4)
 
285
 
 
286
        out, err = self.run_bzr(['grep', '--exclude', '*.cc', 'lin.1$'])
 
287
        self.assertContainsRe(out, "file0.aa:line1", flags=TestGrep._reflags)
 
288
        self.assertContainsRe(out, "file0.bb:line1", flags=TestGrep._reflags)
 
289
        self.assertNotContainsRe(out, "file0.cc", flags=TestGrep._reflags)
 
290
        # one line each (line1) from file0.aa and file0.bb
 
291
        self.assertEqual(len(out.splitlines()), 2)
 
292
 
 
293
    def test_ver_multiple_files(self):
 
294
        """(versioned) Search for pattern in multiple files.
 
295
        """
 
296
        wd = 'foobar0'
 
297
        self.make_branch_and_tree(wd)
 
298
        os.chdir(wd)
 
299
        self._mk_versioned_file('file0.txt', total_lines=2)
 
300
        self._mk_versioned_file('file1.txt', total_lines=2)
 
301
        self._mk_versioned_file('file2.txt', total_lines=2)
 
302
 
 
303
        out, err = self.run_bzr(['grep', '-r', 'last:1', 'line[1-2]$'])
 
304
        self.assertContainsRe(out, "file0.txt~.:line1",
 
305
                              flags=TestGrep._reflags)
 
306
        self.assertContainsRe(out, "file0.txt~.:line2",
 
307
                              flags=TestGrep._reflags)
 
308
        self.assertContainsRe(out, "file1.txt~.:line1",
 
309
                              flags=TestGrep._reflags)
 
310
        self.assertContainsRe(out, "file1.txt~.:line2",
 
311
                              flags=TestGrep._reflags)
 
312
        self.assertContainsRe(out, "file2.txt~.:line1",
 
313
                              flags=TestGrep._reflags)
 
314
        self.assertContainsRe(out, "file2.txt~.:line2",
 
315
                              flags=TestGrep._reflags)
 
316
        self.assertEqual(len(out.splitlines()), 6)
 
317
 
 
318
        out, err = self.run_bzr(['grep', '-r', 'last:1', 'line'])
 
319
        self.assertContainsRe(out, "file0.txt~.:line1",
 
320
                              flags=TestGrep._reflags)
 
321
        self.assertContainsRe(out, "file0.txt~.:line2",
 
322
                              flags=TestGrep._reflags)
 
323
        self.assertContainsRe(out, "file1.txt~.:line1",
 
324
                              flags=TestGrep._reflags)
 
325
        self.assertContainsRe(out, "file1.txt~.:line2",
 
326
                              flags=TestGrep._reflags)
 
327
        self.assertContainsRe(out, "file2.txt~.:line1",
 
328
                              flags=TestGrep._reflags)
 
329
        self.assertContainsRe(out, "file2.txt~.:line2",
 
330
                              flags=TestGrep._reflags)
 
331
        self.assertEqual(len(out.splitlines()), 6)
 
332
 
 
333
    def test_multiple_wtree_files(self):
 
334
        """(wtree) Search for pattern in multiple files in working tree.
 
335
        """
 
336
        wd = 'foobar0'
 
337
        self.make_branch_and_tree(wd)
 
338
        os.chdir(wd)
 
339
        self._mk_versioned_file('file0.txt', total_lines=2)
 
340
        self._mk_versioned_file('file1.txt', total_lines=2)
 
341
        self._mk_versioned_file('file2.txt', total_lines=2)
 
342
        self._update_file('file0.txt', 'HELLO\n', checkin=False)
 
343
        self._update_file('file1.txt', 'HELLO\n', checkin=True)
 
344
        self._update_file('file2.txt', 'HELLO\n', checkin=False)
 
345
 
 
346
        out, err = self.run_bzr(['grep', 'HELLO',
 
347
                                 'file0.txt', 'file1.txt', 'file2.txt'])
 
348
 
 
349
        self.assertContainsRe(out, "file0.txt:HELLO", flags=TestGrep._reflags)
 
350
        self.assertContainsRe(out, "file1.txt:HELLO", flags=TestGrep._reflags)
 
351
        self.assertContainsRe(out, "file2.txt:HELLO", flags=TestGrep._reflags)
 
352
        self.assertEqual(len(out.splitlines()), 3)
 
353
 
 
354
        out, err = self.run_bzr(['grep', 'HELLO', '-r', 'last:1',
 
355
                                 'file0.txt', 'file1.txt', 'file2.txt'])
 
356
 
 
357
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
358
        self.assertContainsRe(out, "file1.txt~.:HELLO",
 
359
                              flags=TestGrep._reflags)
 
360
        self.assertNotContainsRe(out, "file2.txt", flags=TestGrep._reflags)
 
361
        self.assertEqual(len(out.splitlines()), 1)
 
362
 
 
363
        out, err = self.run_bzr(['grep', 'HE..O',
 
364
                                 'file0.txt', 'file1.txt', 'file2.txt'])
 
365
 
 
366
        self.assertContainsRe(out, "file0.txt:HELLO", flags=TestGrep._reflags)
 
367
        self.assertContainsRe(out, "file1.txt:HELLO", flags=TestGrep._reflags)
 
368
        self.assertContainsRe(out, "file2.txt:HELLO", flags=TestGrep._reflags)
 
369
        self.assertEqual(len(out.splitlines()), 3)
 
370
 
 
371
        out, err = self.run_bzr(['grep', 'HE..O', '-r', 'last:1',
 
372
                                 'file0.txt', 'file1.txt', 'file2.txt'])
 
373
 
 
374
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
375
        self.assertContainsRe(out, "file1.txt~.:HELLO",
 
376
                              flags=TestGrep._reflags)
 
377
        self.assertNotContainsRe(out, "file2.txt", flags=TestGrep._reflags)
 
378
        self.assertEqual(len(out.splitlines()), 1)
 
379
 
 
380
    def test_ver_null_option(self):
 
381
        """(versioned) --null option should use NUL instead of newline.
 
382
        """
 
383
        wd = 'foobar0'
 
384
        self.make_branch_and_tree(wd)
 
385
        os.chdir(wd)
 
386
        self._mk_versioned_file('file0.txt', total_lines=3)
 
387
 
 
388
        nref = ud.normalize(
 
389
            u'NFC', u"file0.txt~1:line1\0file0.txt~1:line2\0file0.txt~1:line3\0")
 
390
 
 
391
        out, err = self.run_bzr(
 
392
            ['grep', '-r', 'last:1', '--null', 'line[1-3]'])
 
393
        if not PY3:
 
394
            out = out.decode('utf-8', 'ignore')
 
395
        nout = ud.normalize(u'NFC', out)
 
396
        self.assertEqual(nout, nref)
 
397
        self.assertEqual(len(out.splitlines()), 1)
 
398
 
 
399
        out, err = self.run_bzr(['grep', '-r', 'last:1', '-Z', 'line[1-3]'])
 
400
        if not PY3:
 
401
            out = out.decode('utf-8', 'ignore')
 
402
        nout = ud.normalize(u'NFC', out)
 
403
        self.assertEqual(nout, nref)
 
404
        self.assertEqual(len(out.splitlines()), 1)
 
405
 
 
406
        out, err = self.run_bzr(['grep', '-r', 'last:1', '--null', 'line'])
 
407
        if not PY3:
 
408
            out = out.decode('utf-8', 'ignore')
 
409
        nout = ud.normalize(u'NFC', out)
 
410
        self.assertEqual(nout, nref)
 
411
        self.assertEqual(len(out.splitlines()), 1)
 
412
 
 
413
    def test_wtree_null_option(self):
 
414
        """(wtree) --null option should use NUL instead of newline.
 
415
        """
 
416
        wd = 'foobar0'
 
417
        self.make_branch_and_tree(wd)
 
418
        os.chdir(wd)
 
419
        self._mk_versioned_file('file0.txt', total_lines=3)
 
420
 
 
421
        out, err = self.run_bzr(['grep', '--null', 'line[1-3]'])
 
422
        self.assertEqual(
 
423
            out, "file0.txt:line1\0file0.txt:line2\0file0.txt:line3\0")
 
424
        self.assertEqual(len(out.splitlines()), 1)
 
425
 
 
426
        out, err = self.run_bzr(['grep', '-Z', 'line[1-3]'])
 
427
        self.assertEqual(
 
428
            out, "file0.txt:line1\0file0.txt:line2\0file0.txt:line3\0")
 
429
        self.assertEqual(len(out.splitlines()), 1)
 
430
 
 
431
        out, err = self.run_bzr(['grep', '-Z', 'line'])
 
432
        self.assertEqual(
 
433
            out, "file0.txt:line1\0file0.txt:line2\0file0.txt:line3\0")
 
434
        self.assertEqual(len(out.splitlines()), 1)
 
435
 
 
436
    def test_versioned_file_in_dir_no_recursive(self):
 
437
        """(versioned) Should not recurse with --no-recursive"""
 
438
        wd = 'foobar0'
 
439
        self.make_branch_and_tree(wd)
 
440
        os.chdir(wd)
 
441
        self._mk_versioned_file('fileX.txt', line_prefix='lin')
 
442
        self._mk_versioned_dir('dir0')
 
443
        self._mk_versioned_file('dir0/file0.txt')
 
444
 
 
445
        out, err = self.run_bzr(
 
446
            ['grep', '-r', 'last:1', '--no-recursive', 'line1'])
 
447
        self.assertNotContainsRe(
 
448
            out, "file0.txt~.:line1", flags=TestGrep._reflags)
 
449
        self.assertEqual(len(out.splitlines()), 0)
 
450
 
 
451
        out, err = self.run_bzr(
 
452
            ['grep', '-r', 'last:1', '--no-recursive', 'line1$'])
 
453
        self.assertNotContainsRe(
 
454
            out, "file0.txt~.:line1", flags=TestGrep._reflags)
 
455
        self.assertEqual(len(out.splitlines()), 0)
 
456
 
 
457
    def test_wtree_file_in_dir_no_recursive(self):
 
458
        """(wtree) Should not recurse with --no-recursive"""
 
459
        wd = 'foobar0'
 
460
        self.make_branch_and_tree(wd)
 
461
        os.chdir(wd)
 
462
        self._mk_versioned_file('fileX.txt', line_prefix='lin')
 
463
        self._mk_versioned_dir('dir0')
 
464
        self._mk_versioned_file('dir0/file0.txt')
 
465
 
 
466
        out, err = self.run_bzr(['grep', '--no-recursive', 'line1'])
 
467
        self.assertNotContainsRe(
 
468
            out, "file0.txt:line1", flags=TestGrep._reflags)
 
469
        self.assertEqual(len(out.splitlines()), 0)
 
470
 
 
471
        out, err = self.run_bzr(['grep', '--no-recursive', 'lin.1'])
 
472
        self.assertNotContainsRe(
 
473
            out, "file0.txt:line1", flags=TestGrep._reflags)
 
474
        self.assertEqual(len(out.splitlines()), 0)
 
475
 
 
476
    def test_versioned_file_in_dir_recurse(self):
 
477
        """(versioned) Should recurse by default.
 
478
        """
 
479
        wd = 'foobar0'
 
480
        self.make_branch_and_tree(wd)
 
481
        os.chdir(wd)
 
482
        self._mk_versioned_dir('dir0')
 
483
        self._mk_versioned_file('dir0/file0.txt')
 
484
 
 
485
        out, err = self.run_bzr(['grep', '-r', '-1', '.i.e1'])
 
486
        self.assertContainsRe(
 
487
            out, "^dir0/file0.txt~.:line1", flags=TestGrep._reflags)
 
488
        # find line1 and line10
 
489
        self.assertEqual(len(out.splitlines()), 2)
 
490
 
 
491
        out, err = self.run_bzr(['grep', '-r', '-1', 'line1'])
 
492
        self.assertContainsRe(
 
493
            out, "^dir0/file0.txt~.:line1", flags=TestGrep._reflags)
 
494
        # find line1 and line10
 
495
        self.assertEqual(len(out.splitlines()), 2)
 
496
 
 
497
    def test_wtree_file_in_dir_recurse(self):
 
498
        """(wtree) Should recurse by default.
 
499
        """
 
500
        wd = 'foobar0'
 
501
        self.make_branch_and_tree(wd)
 
502
        os.chdir(wd)
 
503
        self._mk_versioned_dir('dir0')
 
504
        self._mk_versioned_file('dir0/file0.txt')
 
505
 
 
506
        out, err = self.run_bzr(['grep', 'line1'])
 
507
        self.assertContainsRe(out, "^dir0/file0.txt:line1",
 
508
                              flags=TestGrep._reflags)
 
509
        # find line1 and line10
 
510
        self.assertEqual(len(out.splitlines()), 2)
 
511
 
 
512
        out, err = self.run_bzr(['grep', 'lin.1'])
 
513
        self.assertContainsRe(out, "^dir0/file0.txt:line1",
 
514
                              flags=TestGrep._reflags)
 
515
        # find line1 and line10
 
516
        self.assertEqual(len(out.splitlines()), 2)
 
517
 
 
518
    def test_versioned_file_within_dir(self):
 
519
        """(versioned) Search for pattern while in nested dir.
 
520
        """
 
521
        wd = 'foobar0'
 
522
        self.make_branch_and_tree(wd)
 
523
        os.chdir(wd)
 
524
        self._mk_versioned_dir('dir0')
 
525
        self._mk_versioned_file('dir0/file0.txt')
 
526
        os.chdir('dir0')
 
527
 
 
528
        out, err = self.run_bzr(['grep', '-r', 'last:1', 'line1'])
 
529
        self.assertContainsRe(out, "^file0.txt~.:line1",
 
530
                              flags=TestGrep._reflags)
 
531
        # finds line1 and line10
 
532
        self.assertEqual(len(out.splitlines()), 2)
 
533
 
 
534
        out, err = self.run_bzr(['grep', '-r', 'last:1', '.i.e1'])
 
535
        self.assertContainsRe(out, "^file0.txt~.:line1",
 
536
                              flags=TestGrep._reflags)
 
537
        # finds line1 and line10
 
538
        self.assertEqual(len(out.splitlines()), 2)
 
539
 
 
540
    def test_versioned_include_file_within_dir(self):
 
541
        """(versioned) Ensure --include is respected with file within dir.
 
542
        """
 
543
        wd = 'foobar0'
 
544
        self.make_branch_and_tree(wd)
 
545
        os.chdir(wd)
 
546
        self._mk_versioned_dir('dir0')                  # revno 1
 
547
        self._mk_versioned_file('dir0/file0.txt')       # revno 2
 
548
        self._mk_versioned_file('dir0/file1.aa')        # revno 3
 
549
        self._update_file('dir0/file1.aa', 'hello\n')   # revno 4
 
550
        self._update_file('dir0/file0.txt', 'hello\n')  # revno 5
 
551
        os.chdir('dir0')
 
552
 
 
553
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
554
                                 '--include', '*.aa', 'line1'])
 
555
        self.assertContainsRe(out, "^file1.aa~5:line1$",
 
556
                              flags=TestGrep._reflags)
 
557
        self.assertContainsRe(out, "^file1.aa~5:line10$",
 
558
                              flags=TestGrep._reflags)
 
559
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
560
        # finds line1 and line10
 
561
        self.assertEqual(len(out.splitlines()), 2)
 
562
 
 
563
        out, err = self.run_bzr(['grep', '-r', 'last:2..last:1',
 
564
                                 '--include', '*.aa', 'line1'])
 
565
        self.assertContainsRe(out, "^file1.aa~4:line1$",
 
566
                              flags=TestGrep._reflags)
 
567
        self.assertContainsRe(out, "^file1.aa~4:line10$",
 
568
                              flags=TestGrep._reflags)
 
569
        self.assertContainsRe(out, "^file1.aa~5:line1$",
 
570
                              flags=TestGrep._reflags)
 
571
        self.assertContainsRe(out, "^file1.aa~5:line10$",
 
572
                              flags=TestGrep._reflags)
 
573
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
574
        # finds line1 and line10 over two revisions
 
575
        self.assertEqual(len(out.splitlines()), 4)
 
576
 
 
577
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
578
                                 '--include', '*.aa', 'lin.1'])
 
579
        self.assertContainsRe(out, "^file1.aa~5:line1$",
 
580
                              flags=TestGrep._reflags)
 
581
        self.assertContainsRe(out, "^file1.aa~5:line10$",
 
582
                              flags=TestGrep._reflags)
 
583
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
584
        # finds line1 and line10
 
585
        self.assertEqual(len(out.splitlines()), 2)
 
586
 
 
587
        out, err = self.run_bzr(['grep', '-r', 'last:3..last:1',
 
588
                                 '--include', '*.aa', 'lin.1'])
 
589
        self.assertContainsRe(out, "^file1.aa~3:line1$",
 
590
                              flags=TestGrep._reflags)
 
591
        self.assertContainsRe(out, "^file1.aa~4:line1$",
 
592
                              flags=TestGrep._reflags)
 
593
        self.assertContainsRe(out, "^file1.aa~5:line1$",
 
594
                              flags=TestGrep._reflags)
 
595
        self.assertContainsRe(out, "^file1.aa~3:line10$",
 
596
                              flags=TestGrep._reflags)
 
597
        self.assertContainsRe(out, "^file1.aa~4:line10$",
 
598
                              flags=TestGrep._reflags)
 
599
        self.assertContainsRe(out, "^file1.aa~5:line10$",
 
600
                              flags=TestGrep._reflags)
 
601
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
602
        # finds line1 and line10 over 3 revisions
 
603
        self.assertEqual(len(out.splitlines()), 6)
 
604
 
 
605
    def test_versioned_exclude_file_within_dir(self):
 
606
        """(versioned) Ensure --exclude is respected with file within dir.
 
607
        """
 
608
        wd = 'foobar0'
 
609
        self.make_branch_and_tree(wd)
 
610
        os.chdir(wd)
 
611
        self._mk_versioned_dir('dir0')
 
612
        self._mk_versioned_file('dir0/file0.txt')
 
613
        self._mk_versioned_file('dir0/file1.aa')
 
614
        os.chdir('dir0')
 
615
 
 
616
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
617
                                 '--exclude', '*.txt', 'line1'])
 
618
        self.assertContainsRe(out, "^file1.aa~.:line1",
 
619
                              flags=TestGrep._reflags)
 
620
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
621
        # finds line1 and line10
 
622
        self.assertEqual(len(out.splitlines()), 2)
 
623
 
 
624
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
625
                                 '--exclude', '*.txt', 'l[a-z]ne1'])
 
626
        self.assertContainsRe(out, "^file1.aa~.:line1",
 
627
                              flags=TestGrep._reflags)
 
628
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
629
        # finds line1 and line10
 
630
        self.assertEqual(len(out.splitlines()), 2)
 
631
 
 
632
    def test_wtree_file_within_dir(self):
 
633
        """(wtree) Search for pattern while in nested dir.
 
634
        """
 
635
        wd = 'foobar0'
 
636
        self.make_branch_and_tree(wd)
 
637
        os.chdir(wd)
 
638
        self._mk_versioned_dir('dir0')
 
639
        self._mk_versioned_file('dir0/file0.txt')
 
640
        os.chdir('dir0')
 
641
 
 
642
        out, err = self.run_bzr(['grep', 'line1'])
 
643
        self.assertContainsRe(out, "^file0.txt:line1", flags=TestGrep._reflags)
 
644
        # finds line1 and line10
 
645
        self.assertEqual(len(out.splitlines()), 2)
 
646
 
 
647
        out, err = self.run_bzr(['grep', 'l[aeiou]ne1'])
 
648
        self.assertContainsRe(out, "^file0.txt:line1", flags=TestGrep._reflags)
 
649
        # finds line1 and line10
 
650
        self.assertEqual(len(out.splitlines()), 2)
 
651
 
 
652
    def test_wtree_include_file_within_dir(self):
 
653
        """(wtree) Ensure --include is respected with file within dir.
 
654
        """
 
655
        wd = 'foobar0'
 
656
        self.make_branch_and_tree(wd)
 
657
        os.chdir(wd)
 
658
        self._mk_versioned_dir('dir0')
 
659
        self._mk_versioned_file('dir0/file0.txt')
 
660
        self._mk_versioned_file('dir0/file1.aa')
 
661
        os.chdir('dir0')
 
662
 
 
663
        out, err = self.run_bzr(['grep', '--include', '*.aa', 'line1'])
 
664
        self.assertContainsRe(out, "^file1.aa:line1", flags=TestGrep._reflags)
 
665
        # finds line1 and line10
 
666
        self.assertEqual(len(out.splitlines()), 2)
 
667
 
 
668
        out, err = self.run_bzr(['grep', '--include', '*.aa', 'l[ixn]ne1'])
 
669
        self.assertContainsRe(out, "^file1.aa:line1", flags=TestGrep._reflags)
 
670
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
671
        # finds line1 and line10
 
672
        self.assertEqual(len(out.splitlines()), 2)
 
673
 
 
674
    def test_wtree_exclude_file_within_dir(self):
 
675
        """(wtree) Ensure --exclude is respected with file within dir.
 
676
        """
 
677
        wd = 'foobar0'
 
678
        self.make_branch_and_tree(wd)
 
679
        os.chdir(wd)
 
680
        self._mk_versioned_dir('dir0')
 
681
        self._mk_versioned_file('dir0/file0.txt')
 
682
        self._mk_versioned_file('dir0/file1.aa')
 
683
        os.chdir('dir0')
 
684
 
 
685
        out, err = self.run_bzr(['grep', '--exclude', '*.txt', 'li.e1'])
 
686
        self.assertContainsRe(out, "^file1.aa:line1$", flags=TestGrep._reflags)
 
687
        self.assertContainsRe(out, "^file1.aa:line10$",
 
688
                              flags=TestGrep._reflags)
 
689
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
690
        # finds line1 and line10
 
691
        self.assertEqual(len(out.splitlines()), 2)
 
692
 
 
693
        out, err = self.run_bzr(['grep', '--exclude', '*.txt', 'line1'])
 
694
        self.assertContainsRe(out, "^file1.aa:line1$", flags=TestGrep._reflags)
 
695
        self.assertContainsRe(out, "^file1.aa:line10$",
 
696
                              flags=TestGrep._reflags)
 
697
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
698
        # finds line1 and line10
 
699
        self.assertEqual(len(out.splitlines()), 2)
 
700
 
 
701
    def test_versioned_include_from_outside_dir(self):
 
702
        """(versioned) Ensure --include is respected during recursive search.
 
703
        """
 
704
        wd = 'foobar0'
 
705
        self.make_branch_and_tree(wd)
 
706
        os.chdir(wd)
 
707
 
 
708
        self._mk_versioned_dir('dir0')
 
709
        self._mk_versioned_file('dir0/file0.aa')
 
710
 
 
711
        self._mk_versioned_dir('dir1')
 
712
        self._mk_versioned_file('dir1/file1.bb')
 
713
 
 
714
        self._mk_versioned_dir('dir2')
 
715
        self._mk_versioned_file('dir2/file2.cc')
 
716
 
 
717
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
718
                                 '--include', '*.aa', '--include', '*.bb', 'l..e1'])
 
719
        self.assertContainsRe(
 
720
            out, "^dir0/file0.aa~.:line1$", flags=TestGrep._reflags)
 
721
        self.assertContainsRe(
 
722
            out, "^dir1/file1.bb~.:line1$", flags=TestGrep._reflags)
 
723
        self.assertContainsRe(
 
724
            out, "^dir0/file0.aa~.:line10$", flags=TestGrep._reflags)
 
725
        self.assertContainsRe(
 
726
            out, "^dir1/file1.bb~.:line10$", flags=TestGrep._reflags)
 
727
        self.assertNotContainsRe(out, "file1.cc", flags=TestGrep._reflags)
 
728
        # finds line1 and line10
 
729
        self.assertEqual(len(out.splitlines()), 4)
 
730
 
 
731
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
732
                                 '--include', '*.aa', '--include', '*.bb', 'line1'])
 
733
        self.assertContainsRe(
 
734
            out, "^dir0/file0.aa~.:line1$", flags=TestGrep._reflags)
 
735
        self.assertContainsRe(
 
736
            out, "^dir1/file1.bb~.:line1$", flags=TestGrep._reflags)
 
737
        self.assertContainsRe(
 
738
            out, "^dir0/file0.aa~.:line10$", flags=TestGrep._reflags)
 
739
        self.assertContainsRe(
 
740
            out, "^dir1/file1.bb~.:line10$", flags=TestGrep._reflags)
 
741
        self.assertNotContainsRe(out, "file1.cc", flags=TestGrep._reflags)
 
742
        # finds line1 and line10
 
743
        self.assertEqual(len(out.splitlines()), 4)
 
744
 
 
745
    def test_wtree_include_from_outside_dir(self):
 
746
        """(wtree) Ensure --include is respected during recursive search.
 
747
        """
 
748
        wd = 'foobar0'
 
749
        self.make_branch_and_tree(wd)
 
750
        os.chdir(wd)
 
751
 
 
752
        self._mk_versioned_dir('dir0')
 
753
        self._mk_versioned_file('dir0/file0.aa')
 
754
 
 
755
        self._mk_versioned_dir('dir1')
 
756
        self._mk_versioned_file('dir1/file1.bb')
 
757
 
 
758
        self._mk_versioned_dir('dir2')
 
759
        self._mk_versioned_file('dir2/file2.cc')
 
760
 
 
761
        out, err = self.run_bzr(['grep', '--include', '*.aa',
 
762
                                 '--include', '*.bb', 'l.n.1'])
 
763
        self.assertContainsRe(out, "^dir0/file0.aa:line1$",
 
764
                              flags=TestGrep._reflags)
 
765
        self.assertContainsRe(out, "^dir1/file1.bb:line1$",
 
766
                              flags=TestGrep._reflags)
 
767
        self.assertContainsRe(
 
768
            out, "^dir0/file0.aa:line10$", flags=TestGrep._reflags)
 
769
        self.assertContainsRe(
 
770
            out, "^dir1/file1.bb:line10$", flags=TestGrep._reflags)
 
771
        self.assertNotContainsRe(out, "file1.cc", flags=TestGrep._reflags)
 
772
        # finds line1 and line10
 
773
        self.assertEqual(len(out.splitlines()), 4)
 
774
 
 
775
        out, err = self.run_bzr(['grep', '--include', '*.aa',
 
776
                                 '--include', '*.bb', 'line1'])
 
777
        self.assertContainsRe(out, "^dir0/file0.aa:line1$",
 
778
                              flags=TestGrep._reflags)
 
779
        self.assertContainsRe(out, "^dir1/file1.bb:line1$",
 
780
                              flags=TestGrep._reflags)
 
781
        self.assertContainsRe(
 
782
            out, "^dir0/file0.aa:line10$", flags=TestGrep._reflags)
 
783
        self.assertContainsRe(
 
784
            out, "^dir1/file1.bb:line10$", flags=TestGrep._reflags)
 
785
        self.assertNotContainsRe(out, "file1.cc", flags=TestGrep._reflags)
 
786
        # finds line1 and line10
 
787
        self.assertEqual(len(out.splitlines()), 4)
 
788
 
 
789
    def test_versioned_exclude_from_outside_dir(self):
 
790
        """(versioned) Ensure --exclude is respected during recursive search.
 
791
        """
 
792
        wd = 'foobar0'
 
793
        self.make_branch_and_tree(wd)
 
794
        os.chdir(wd)
 
795
 
 
796
        self._mk_versioned_dir('dir0')
 
797
        self._mk_versioned_file('dir0/file0.aa')
 
798
 
 
799
        self._mk_versioned_dir('dir1')
 
800
        self._mk_versioned_file('dir1/file1.bb')
 
801
 
 
802
        self._mk_versioned_dir('dir2')
 
803
        self._mk_versioned_file('dir2/file2.cc')
 
804
 
 
805
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
806
                                 '--exclude', '*.cc', 'l..e1'])
 
807
        self.assertContainsRe(
 
808
            out, "^dir0/file0.aa~.:line1", flags=TestGrep._reflags)
 
809
        self.assertContainsRe(
 
810
            out, "^dir1/file1.bb~.:line1", flags=TestGrep._reflags)
 
811
        self.assertNotContainsRe(out, "file1.cc", flags=TestGrep._reflags)
 
812
 
 
813
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
814
                                 '--exclude', '*.cc', 'line1'])
 
815
        self.assertContainsRe(
 
816
            out, "^dir0/file0.aa~.:line1", flags=TestGrep._reflags)
 
817
        self.assertContainsRe(
 
818
            out, "^dir1/file1.bb~.:line1", flags=TestGrep._reflags)
 
819
        self.assertNotContainsRe(out, "file1.cc", flags=TestGrep._reflags)
 
820
 
 
821
    def test_wtree_exclude_from_outside_dir(self):
 
822
        """(wtree) Ensure --exclude is respected during recursive search.
 
823
        """
 
824
        wd = 'foobar0'
 
825
        self.make_branch_and_tree(wd)
 
826
        os.chdir(wd)
 
827
 
 
828
        self._mk_versioned_dir('dir0')
 
829
        self._mk_versioned_file('dir0/file0.aa')
 
830
 
 
831
        self._mk_versioned_dir('dir1')
 
832
        self._mk_versioned_file('dir1/file1.bb')
 
833
 
 
834
        self._mk_versioned_dir('dir2')
 
835
        self._mk_versioned_file('dir2/file2.cc')
 
836
 
 
837
        out, err = self.run_bzr(['grep', '--exclude', '*.cc', 'l[hijk]ne1'])
 
838
        self.assertContainsRe(out, "^dir0/file0.aa:line1",
 
839
                              flags=TestGrep._reflags)
 
840
        self.assertContainsRe(out, "^dir1/file1.bb:line1",
 
841
                              flags=TestGrep._reflags)
 
842
        self.assertNotContainsRe(out, "file1.cc", flags=TestGrep._reflags)
 
843
 
 
844
        out, err = self.run_bzr(['grep', '--exclude', '*.cc', 'line1'])
 
845
        self.assertContainsRe(out, "^dir0/file0.aa:line1",
 
846
                              flags=TestGrep._reflags)
 
847
        self.assertContainsRe(out, "^dir1/file1.bb:line1",
 
848
                              flags=TestGrep._reflags)
 
849
        self.assertNotContainsRe(out, "file1.cc", flags=TestGrep._reflags)
 
850
 
 
851
    def test_workingtree_files_from_outside_dir(self):
 
852
        """(wtree) Grep for pattern with dirs passed as argument.
 
853
        """
 
854
        wd = 'foobar0'
 
855
        self.make_branch_and_tree(wd)
 
856
        os.chdir(wd)
 
857
 
 
858
        self._mk_versioned_dir('dir0')
 
859
        self._mk_versioned_file('dir0/file0.txt')
 
860
 
 
861
        self._mk_versioned_dir('dir1')
 
862
        self._mk_versioned_file('dir1/file1.txt')
 
863
 
 
864
        out, err = self.run_bzr(['grep', 'l[aeiou]ne1', 'dir0', 'dir1'])
 
865
        self.assertContainsRe(out, "^dir0/file0.txt:line1",
 
866
                              flags=TestGrep._reflags)
 
867
        self.assertContainsRe(out, "^dir1/file1.txt:line1",
 
868
                              flags=TestGrep._reflags)
 
869
 
 
870
        out, err = self.run_bzr(['grep', 'line1', 'dir0', 'dir1'])
 
871
        self.assertContainsRe(out, "^dir0/file0.txt:line1",
 
872
                              flags=TestGrep._reflags)
 
873
        self.assertContainsRe(out, "^dir1/file1.txt:line1",
 
874
                              flags=TestGrep._reflags)
 
875
 
 
876
    def test_versioned_files_from_outside_dir(self):
 
877
        """(versioned) Grep for pattern with dirs passed as argument.
 
878
        """
 
879
        wd = 'foobar0'
 
880
        self.make_branch_and_tree(wd)
 
881
        os.chdir(wd)
 
882
 
 
883
        self._mk_versioned_dir('dir0')
 
884
        self._mk_versioned_file('dir0/file0.txt')
 
885
 
 
886
        self._mk_versioned_dir('dir1')
 
887
        self._mk_versioned_file('dir1/file1.txt')
 
888
 
 
889
        out, err = self.run_bzr(
 
890
            ['grep', '-r', 'last:1', '.ine1', 'dir0', 'dir1'])
 
891
        self.assertContainsRe(
 
892
            out, "^dir0/file0.txt~.:line1", flags=TestGrep._reflags)
 
893
        self.assertContainsRe(
 
894
            out, "^dir1/file1.txt~.:line1", flags=TestGrep._reflags)
 
895
 
 
896
        out, err = self.run_bzr(
 
897
            ['grep', '-r', 'last:1', 'line1', 'dir0', 'dir1'])
 
898
        self.assertContainsRe(
 
899
            out, "^dir0/file0.txt~.:line1", flags=TestGrep._reflags)
 
900
        self.assertContainsRe(
 
901
            out, "^dir1/file1.txt~.:line1", flags=TestGrep._reflags)
 
902
 
 
903
    def test_wtree_files_from_outside_dir(self):
 
904
        """(wtree) Grep for pattern with dirs passed as argument.
 
905
        """
 
906
        wd = 'foobar0'
 
907
        self.make_branch_and_tree(wd)
 
908
        os.chdir(wd)
 
909
 
 
910
        self._mk_versioned_dir('dir0')
 
911
        self._mk_versioned_file('dir0/file0.txt')
 
912
 
 
913
        self._mk_versioned_dir('dir1')
 
914
        self._mk_versioned_file('dir1/file1.txt')
 
915
 
 
916
        out, err = self.run_bzr(['grep', 'li.e1', 'dir0', 'dir1'])
 
917
        self.assertContainsRe(out, "^dir0/file0.txt:line1",
 
918
                              flags=TestGrep._reflags)
 
919
        self.assertContainsRe(out, "^dir1/file1.txt:line1",
 
920
                              flags=TestGrep._reflags)
 
921
 
 
922
        out, err = self.run_bzr(['grep', 'line1', 'dir0', 'dir1'])
 
923
        self.assertContainsRe(out, "^dir0/file0.txt:line1",
 
924
                              flags=TestGrep._reflags)
 
925
        self.assertContainsRe(out, "^dir1/file1.txt:line1",
 
926
                              flags=TestGrep._reflags)
 
927
 
 
928
    def test_versioned_files_from_outside_two_dirs(self):
 
929
        """(versioned) Grep for pattern with two levels of nested dir.
 
930
        """
 
931
        wd = 'foobar0'
 
932
        self.make_branch_and_tree(wd)
 
933
        os.chdir(wd)
 
934
 
 
935
        self._mk_versioned_dir('dir0')
 
936
        self._mk_versioned_file('dir0/file0.txt')
 
937
 
 
938
        self._mk_versioned_dir('dir1')
 
939
        self._mk_versioned_file('dir1/file1.txt')
 
940
 
 
941
        self._mk_versioned_dir('dir0/dir00')
 
942
        self._mk_versioned_file('dir0/dir00/file0.txt')
 
943
 
 
944
        out, err = self.run_bzr(
 
945
            ['grep', '-r', 'last:1', 'l.ne1', 'dir0/dir00'])
 
946
        self.assertContainsRe(
 
947
            out, "^dir0/dir00/file0.txt~.:line1", flags=TestGrep._reflags)
 
948
 
 
949
        out, err = self.run_bzr(['grep', '-r', 'last:1', 'l.ne1'])
 
950
        self.assertContainsRe(
 
951
            out, "^dir0/dir00/file0.txt~.:line1", flags=TestGrep._reflags)
 
952
 
 
953
        out, err = self.run_bzr(
 
954
            ['grep', '-r', 'last:1', 'line1', 'dir0/dir00'])
 
955
        self.assertContainsRe(
 
956
            out, "^dir0/dir00/file0.txt~.:line1", flags=TestGrep._reflags)
 
957
 
 
958
        out, err = self.run_bzr(['grep', '-r', 'last:1', 'line1'])
 
959
        self.assertContainsRe(
 
960
            out, "^dir0/dir00/file0.txt~.:line1", flags=TestGrep._reflags)
 
961
 
 
962
    def test_wtree_files_from_outside_two_dirs(self):
 
963
        """(wtree) Grep for pattern with two levels of nested dir.
 
964
        """
 
965
        wd = 'foobar0'
 
966
        self.make_branch_and_tree(wd)
 
967
        os.chdir(wd)
 
968
 
 
969
        self._mk_versioned_dir('dir0')
 
970
        self._mk_versioned_file('dir0/file0.txt')
 
971
 
 
972
        self._mk_versioned_dir('dir1')
 
973
        self._mk_versioned_file('dir1/file1.txt')
 
974
 
 
975
        self._mk_versioned_dir('dir0/dir00')
 
976
        self._mk_versioned_file('dir0/dir00/file0.txt')
 
977
 
 
978
        out, err = self.run_bzr(['grep', 'lin.1', 'dir0/dir00'])
 
979
        self.assertContainsRe(
 
980
            out, "^dir0/dir00/file0.txt:line1", flags=TestGrep._reflags)
 
981
 
 
982
        out, err = self.run_bzr(['grep', 'li.e1'])
 
983
        self.assertContainsRe(
 
984
            out, "^dir0/dir00/file0.txt:line1", flags=TestGrep._reflags)
 
985
 
 
986
        out, err = self.run_bzr(['grep', 'line1', 'dir0/dir00'])
 
987
        self.assertContainsRe(
 
988
            out, "^dir0/dir00/file0.txt:line1", flags=TestGrep._reflags)
 
989
 
 
990
        out, err = self.run_bzr(['grep', 'line1'])
 
991
        self.assertContainsRe(
 
992
            out, "^dir0/dir00/file0.txt:line1", flags=TestGrep._reflags)
 
993
 
 
994
    def test_versioned_file_within_dir_two_levels(self):
 
995
        """(versioned) Search for pattern while in nested dir (two levels).
 
996
        """
 
997
        wd = 'foobar0'
 
998
        self.make_branch_and_tree(wd)
 
999
        os.chdir(wd)
 
1000
        self._mk_versioned_dir('dir0')
 
1001
        self._mk_versioned_dir('dir0/dir1')
 
1002
        self._mk_versioned_file('dir0/dir1/file0.txt')
 
1003
        os.chdir('dir0')
 
1004
 
 
1005
        out, err = self.run_bzr(['grep', '-r', 'last:1', '.ine1'])
 
1006
        self.assertContainsRe(
 
1007
            out, "^dir1/file0.txt~.:line1", flags=TestGrep._reflags)
 
1008
 
 
1009
        out, err = self.run_bzr(
 
1010
            ['grep', '-r', 'last:1', '--from-root', 'l.ne1'])
 
1011
        self.assertContainsRe(
 
1012
            out, "^dir0/dir1/file0.txt~.:line1", flags=TestGrep._reflags)
 
1013
 
 
1014
        out, err = self.run_bzr(
 
1015
            ['grep', '-r', 'last:1', '--no-recursive', 'line1'])
 
1016
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
1017
 
 
1018
        out, err = self.run_bzr(['grep', '-r', 'last:1', 'lin.1'])
 
1019
        self.assertContainsRe(
 
1020
            out, "^dir1/file0.txt~.:line1", flags=TestGrep._reflags)
 
1021
 
 
1022
        out, err = self.run_bzr(
 
1023
            ['grep', '-r', 'last:1', '--from-root', 'line1'])
 
1024
        self.assertContainsRe(
 
1025
            out, "^dir0/dir1/file0.txt~.:line1", flags=TestGrep._reflags)
 
1026
 
 
1027
        out, err = self.run_bzr(
 
1028
            ['grep', '-r', 'last:1', '--no-recursive', 'line1'])
 
1029
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
1030
        self.assertEqual(len(out.splitlines()), 0)
 
1031
 
 
1032
    def test_wtree_file_within_dir_two_levels(self):
 
1033
        """(wtree) Search for pattern while in nested dir (two levels).
 
1034
        """
 
1035
        wd = 'foobar0'
 
1036
        self.make_branch_and_tree(wd)
 
1037
        os.chdir(wd)
 
1038
        self._mk_versioned_dir('dir0')
 
1039
        self._mk_versioned_dir('dir0/dir1')
 
1040
        self._mk_versioned_file('dir0/dir1/file0.txt')
 
1041
        os.chdir('dir0')
 
1042
 
 
1043
        out, err = self.run_bzr(['grep', 'l[hij]ne1'])
 
1044
        self.assertContainsRe(out, "^dir1/file0.txt:line1",
 
1045
                              flags=TestGrep._reflags)
 
1046
 
 
1047
        out, err = self.run_bzr(['grep', '--from-root', 'l.ne1'])
 
1048
        self.assertContainsRe(
 
1049
            out, "^dir0/dir1/file0.txt:line1", flags=TestGrep._reflags)
 
1050
 
 
1051
        out, err = self.run_bzr(['grep', '--no-recursive', 'lin.1'])
 
1052
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
1053
 
 
1054
        out, err = self.run_bzr(['grep', 'line1'])
 
1055
        self.assertContainsRe(out, "^dir1/file0.txt:line1",
 
1056
                              flags=TestGrep._reflags)
 
1057
 
 
1058
        out, err = self.run_bzr(['grep', '--from-root', 'line1'])
 
1059
        self.assertContainsRe(
 
1060
            out, "^dir0/dir1/file0.txt:line1", flags=TestGrep._reflags)
 
1061
 
 
1062
        out, err = self.run_bzr(['grep', '--no-recursive', 'line1'])
 
1063
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
1064
 
 
1065
    def test_versioned_ignore_case_no_match(self):
 
1066
        """(versioned) Match fails without --ignore-case.
 
1067
        """
 
1068
        wd = 'foobar0'
 
1069
        self.make_branch_and_tree(wd)
 
1070
        os.chdir(wd)
 
1071
        self._mk_versioned_file('file0.txt')
 
1072
 
 
1073
        out, err = self.run_bzr(['grep', '-r', 'last:1', 'LinE1', 'file0.txt'])
 
1074
        self.assertNotContainsRe(
 
1075
            out, "file0.txt~.:line1", flags=TestGrep._reflags)
 
1076
 
 
1077
        out, err = self.run_bzr(['grep', '-r', 'last:1', 'Li.E1', 'file0.txt'])
 
1078
        self.assertNotContainsRe(
 
1079
            out, "file0.txt~.:line1", flags=TestGrep._reflags)
 
1080
 
 
1081
    def test_wtree_ignore_case_no_match(self):
 
1082
        """(wtree) Match fails without --ignore-case.
 
1083
        """
 
1084
        wd = 'foobar0'
 
1085
        self.make_branch_and_tree(wd)
 
1086
        os.chdir(wd)
 
1087
        self._mk_versioned_file('file0.txt')
 
1088
 
 
1089
        out, err = self.run_bzr(['grep', 'LinE1', 'file0.txt'])
 
1090
        self.assertNotContainsRe(
 
1091
            out, "file0.txt:line1", flags=TestGrep._reflags)
 
1092
 
 
1093
        out, err = self.run_bzr(['grep', '.inE1', 'file0.txt'])
 
1094
        self.assertNotContainsRe(
 
1095
            out, "file0.txt:line1", flags=TestGrep._reflags)
 
1096
 
 
1097
    def test_versioned_ignore_case_match(self):
 
1098
        """(versioned) Match fails without --ignore-case.
 
1099
        """
 
1100
        wd = 'foobar0'
 
1101
        self.make_branch_and_tree(wd)
 
1102
        os.chdir(wd)
 
1103
        self._mk_versioned_file('file0.txt')
 
1104
 
 
1105
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
1106
                                 '-i', 'Li.E1', 'file0.txt'])
 
1107
        self.assertContainsRe(out, "file0.txt~.:line1",
 
1108
                              flags=TestGrep._reflags)
 
1109
 
 
1110
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
1111
                                 '-i', 'LinE1', 'file0.txt'])
 
1112
        self.assertContainsRe(out, "file0.txt~.:line1",
 
1113
                              flags=TestGrep._reflags)
 
1114
 
 
1115
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
1116
                                 '--ignore-case', 'LinE1', 'file0.txt'])
 
1117
        self.assertContainsRe(out, "^file0.txt~.:line1",
 
1118
                              flags=TestGrep._reflags)
 
1119
 
 
1120
    def test_wtree_ignore_case_match(self):
 
1121
        """(wtree) Match fails without --ignore-case.
 
1122
        """
 
1123
        wd = 'foobar0'
 
1124
        self.make_branch_and_tree(wd)
 
1125
        os.chdir(wd)
 
1126
        self._mk_versioned_file('file0.txt')
 
1127
 
 
1128
        out, err = self.run_bzr(['grep', '-i', 'LinE1', 'file0.txt'])
 
1129
        self.assertContainsRe(out, "file0.txt:line1", flags=TestGrep._reflags)
 
1130
 
 
1131
        out, err = self.run_bzr(
 
1132
            ['grep', '--ignore-case', 'LinE1', 'file0.txt'])
 
1133
        self.assertContainsRe(out, "^file0.txt:line1", flags=TestGrep._reflags)
 
1134
 
 
1135
        out, err = self.run_bzr(
 
1136
            ['grep', '--ignore-case', 'Li.E1', 'file0.txt'])
 
1137
        self.assertContainsRe(out, "^file0.txt:line1", flags=TestGrep._reflags)
 
1138
 
 
1139
    def test_versioned_from_root_fail(self):
 
1140
        """(versioned) Match should fail without --from-root.
 
1141
        """
 
1142
        wd = 'foobar0'
 
1143
        self.make_branch_and_tree(wd)
 
1144
        os.chdir(wd)
 
1145
        self._mk_versioned_file('file0.txt')
 
1146
        self._mk_versioned_dir('dir0')
 
1147
        os.chdir('dir0')
 
1148
 
 
1149
        out, err = self.run_bzr(['grep', '-r', 'last:1', 'li.e1'])
 
1150
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
1151
 
 
1152
        out, err = self.run_bzr(['grep', '-r', 'last:1', 'line1'])
 
1153
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
1154
 
 
1155
    def test_wtree_from_root_fail(self):
 
1156
        """(wtree) Match should fail without --from-root.
 
1157
        """
 
1158
        wd = 'foobar0'
 
1159
        self.make_branch_and_tree(wd)
 
1160
        os.chdir(wd)
 
1161
        self._mk_versioned_file('file0.txt')
 
1162
        self._mk_versioned_dir('dir0')
 
1163
        os.chdir('dir0')
 
1164
 
 
1165
        out, err = self.run_bzr(['grep', 'line1'])
 
1166
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
1167
 
 
1168
        out, err = self.run_bzr(['grep', 'li.e1'])
 
1169
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
1170
 
 
1171
    def test_versioned_from_root_pass(self):
 
1172
        """(versioned) Match pass with --from-root.
 
1173
        """
 
1174
        wd = 'foobar0'
 
1175
        self.make_branch_and_tree(wd)
 
1176
        os.chdir(wd)
 
1177
        self._mk_versioned_file('file0.txt')
 
1178
        self._mk_versioned_dir('dir0')
 
1179
        os.chdir('dir0')
 
1180
 
 
1181
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
1182
                                 '--from-root', 'l.ne1'])
 
1183
        self.assertContainsRe(out, "file0.txt~.:line1",
 
1184
                              flags=TestGrep._reflags)
 
1185
 
 
1186
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
1187
                                 '--from-root', 'line1'])
 
1188
        self.assertContainsRe(out, "file0.txt~.:line1",
 
1189
                              flags=TestGrep._reflags)
 
1190
 
 
1191
    def test_wtree_from_root_pass(self):
 
1192
        """(wtree) Match pass with --from-root.
 
1193
        """
 
1194
        wd = 'foobar0'
 
1195
        self.make_branch_and_tree(wd)
 
1196
        os.chdir(wd)
 
1197
        self._mk_versioned_file('file0.txt')
 
1198
        self._mk_versioned_dir('dir0')
 
1199
        os.chdir('dir0')
 
1200
 
 
1201
        out, err = self.run_bzr(['grep', '--from-root', 'lin.1'])
 
1202
        self.assertContainsRe(out, "file0.txt:line1", flags=TestGrep._reflags)
 
1203
 
 
1204
        out, err = self.run_bzr(['grep', '--from-root', 'line1'])
 
1205
        self.assertContainsRe(out, "file0.txt:line1", flags=TestGrep._reflags)
 
1206
 
 
1207
    def test_versioned_with_line_number(self):
 
1208
        """(versioned) Search for pattern with --line-number.
 
1209
        """
 
1210
        wd = 'foobar0'
 
1211
        self.make_branch_and_tree(wd)
 
1212
        os.chdir(wd)
 
1213
        self._mk_versioned_file('file0.txt')
 
1214
 
 
1215
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
1216
                                 '--line-number', 'li.e3', 'file0.txt'])
 
1217
        self.assertContainsRe(out, "file0.txt~.:3:line3",
 
1218
                              flags=TestGrep._reflags)
 
1219
 
 
1220
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
1221
                                 '--line-number', 'line3', 'file0.txt'])
 
1222
        self.assertContainsRe(out, "file0.txt~.:3:line3",
 
1223
                              flags=TestGrep._reflags)
 
1224
 
 
1225
        out, err = self.run_bzr(['grep', '-r', 'last:1',
 
1226
                                 '-n', 'line1', 'file0.txt'])
 
1227
        self.assertContainsRe(out, "file0.txt~.:1:line1",
 
1228
                              flags=TestGrep._reflags)
 
1229
 
 
1230
        out, err = self.run_bzr(['grep', '-n', 'line[0-9]', 'file0.txt'])
 
1231
        self.assertContainsRe(out, "file0.txt:3:line3",
 
1232
                              flags=TestGrep._reflags)
 
1233
 
 
1234
    def test_wtree_with_line_number(self):
 
1235
        """(wtree) Search for pattern with --line-number.
 
1236
        """
 
1237
        wd = 'foobar0'
 
1238
        self.make_branch_and_tree(wd)
 
1239
        os.chdir(wd)
 
1240
        self._mk_versioned_file('file0.txt')
 
1241
 
 
1242
        out, err = self.run_bzr(
 
1243
            ['grep', '--line-number', 'line3', 'file0.txt'])
 
1244
        self.assertContainsRe(out, "file0.txt:3:line3",
 
1245
                              flags=TestGrep._reflags)
 
1246
 
 
1247
        out, err = self.run_bzr(['grep', '-n', 'line1', 'file0.txt'])
 
1248
        self.assertContainsRe(out, "file0.txt:1:line1",
 
1249
                              flags=TestGrep._reflags)
 
1250
 
 
1251
        out, err = self.run_bzr(['grep', '-n', '[hjkl]ine1', 'file0.txt'])
 
1252
        self.assertContainsRe(out, "file0.txt:1:line1",
 
1253
                              flags=TestGrep._reflags)
 
1254
 
 
1255
        out, err = self.run_bzr(['grep', '-n', 'line[0-9]', 'file0.txt'])
 
1256
        self.assertContainsRe(out, "file0.txt:3:line3",
 
1257
                              flags=TestGrep._reflags)
 
1258
 
 
1259
    def test_revno_basic_history_grep_file(self):
 
1260
        """Search for pattern in specific revision number in a file.
 
1261
        """
 
1262
        wd = 'foobar0'
 
1263
        fname = 'file0.txt'
 
1264
        self.make_branch_and_tree(wd)
 
1265
        os.chdir(wd)
 
1266
        self._mk_versioned_file(fname, total_lines=0)
 
1267
        self._update_file(fname, text="v2 text\n")
 
1268
        self._update_file(fname, text="v3 text\n")
 
1269
        self._update_file(fname, text="v4 text\n")
 
1270
 
 
1271
        # rev 2 should not have text 'v3'
 
1272
        out, err = self.run_bzr(['grep', '-r', '2', 'v3', fname])
 
1273
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
1274
 
 
1275
        # rev 3 should not have text 'v3'
 
1276
        out, err = self.run_bzr(['grep', '-r', '3', 'v3', fname])
 
1277
        self.assertContainsRe(out, "file0.txt~3:v3.*", flags=TestGrep._reflags)
 
1278
 
 
1279
        # rev 3 should not have text 'v3' with line number
 
1280
        out, err = self.run_bzr(['grep', '-r', '3', '-n', 'v3', fname])
 
1281
        self.assertContainsRe(out, "file0.txt~3:2:v3.*",
 
1282
                              flags=TestGrep._reflags)
 
1283
 
 
1284
        # rev 2 should not have text 'v3'
 
1285
        out, err = self.run_bzr(['grep', '-r', '2', '[tuv]3', fname])
 
1286
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
1287
 
 
1288
        # rev 3 should not have text 'v3'
 
1289
        out, err = self.run_bzr(['grep', '-r', '3', '[tuv]3', fname])
 
1290
        self.assertContainsRe(out, "file0.txt~3:v3.*", flags=TestGrep._reflags)
 
1291
 
 
1292
        # rev 3 should not have text 'v3' with line number
 
1293
        out, err = self.run_bzr(['grep', '-r', '3', '-n', '[tuv]3', fname])
 
1294
        self.assertContainsRe(out, "file0.txt~3:2:v3.*",
 
1295
                              flags=TestGrep._reflags)
 
1296
 
 
1297
    def test_revno_basic_history_grep_full(self):
 
1298
        """Search for pattern in specific revision number in a file.
 
1299
        """
 
1300
        wd = 'foobar0'
 
1301
        fname = 'file0.txt'
 
1302
        self.make_branch_and_tree(wd)
 
1303
        os.chdir(wd)
 
1304
        self._mk_versioned_file(fname, total_lines=0)  # rev1
 
1305
        self._mk_versioned_file('file1.txt')          # rev2
 
1306
        self._update_file(fname, text="v3 text\n")    # rev3
 
1307
        self._update_file(fname, text="v4 text\n")    # rev4
 
1308
        self._update_file(fname, text="v5 text\n")    # rev5
 
1309
 
 
1310
        # rev 2 should not have text 'v3'
 
1311
        out, err = self.run_bzr(['grep', '-r', '2', 'v3'])
 
1312
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
1313
 
 
1314
        # rev 3 should not have text 'v3'
 
1315
        out, err = self.run_bzr(['grep', '-r', '3', 'v3'])
 
1316
        self.assertContainsRe(out, "file0.txt~3:v3", flags=TestGrep._reflags)
 
1317
 
 
1318
        # rev 3 should not have text 'v3' with line number
 
1319
        out, err = self.run_bzr(['grep', '-r', '3', '-n', 'v3'])
 
1320
        self.assertContainsRe(out, "file0.txt~3:1:v3", flags=TestGrep._reflags)
 
1321
 
 
1322
        # rev 2 should not have text 'v3'
 
1323
        out, err = self.run_bzr(['grep', '-r', '2', '[tuv]3'])
 
1324
        self.assertNotContainsRe(out, "file0.txt", flags=TestGrep._reflags)
 
1325
 
 
1326
        # rev 3 should not have text 'v3'
 
1327
        out, err = self.run_bzr(['grep', '-r', '3', '[tuv]3'])
 
1328
        self.assertContainsRe(out, "file0.txt~3:v3", flags=TestGrep._reflags)
 
1329
 
 
1330
        # rev 3 should not have text 'v3' with line number
 
1331
        out, err = self.run_bzr(['grep', '-r', '3', '-n', '[tuv]3'])
 
1332
        self.assertContainsRe(out, "file0.txt~3:1:v3", flags=TestGrep._reflags)
 
1333
 
 
1334
    def test_revno_versioned_file_in_dir(self):
 
1335
        """Grep specific version of file withing dir.
 
1336
        """
 
1337
        wd = 'foobar0'
 
1338
        self.make_branch_and_tree(wd)
 
1339
        os.chdir(wd)
 
1340
        self._mk_versioned_dir('dir0')                      # rev1
 
1341
        self._mk_versioned_file('dir0/file0.txt')           # rev2
 
1342
        self._update_file('dir0/file0.txt', "v3 text\n")    # rev3
 
1343
        self._update_file('dir0/file0.txt', "v4 text\n")    # rev4
 
1344
        self._update_file('dir0/file0.txt', "v5 text\n")    # rev5
 
1345
 
 
1346
        # v4 should not be present in revno 3
 
1347
        out, err = self.run_bzr(['grep', '-r', 'last:3', 'v4'])
 
1348
        self.assertNotContainsRe(
 
1349
            out, "^dir0/file0.txt", flags=TestGrep._reflags)
 
1350
 
 
1351
        # v4 should be present in revno 4
 
1352
        out, err = self.run_bzr(['grep', '-r', 'last:2', 'v4'])
 
1353
        self.assertContainsRe(out, "^dir0/file0.txt~4:v4",
 
1354
                              flags=TestGrep._reflags)
 
1355
 
 
1356
        # v4 should not be present in revno 3
 
1357
        out, err = self.run_bzr(['grep', '-r', 'last:3', '[tuv]4'])
 
1358
        self.assertNotContainsRe(
 
1359
            out, "^dir0/file0.txt", flags=TestGrep._reflags)
 
1360
 
 
1361
        # v4 should be present in revno 4
 
1362
        out, err = self.run_bzr(['grep', '-r', 'last:2', '[tuv]4'])
 
1363
        self.assertContainsRe(out, "^dir0/file0.txt~4:v4",
 
1364
                              flags=TestGrep._reflags)
 
1365
 
 
1366
    def test_revno_range_basic_history_grep(self):
 
1367
        """Search for pattern in revision range for file.
 
1368
        """
 
1369
        wd = 'foobar0'
 
1370
        fname = 'file0.txt'
 
1371
        self.make_branch_and_tree(wd)
 
1372
        os.chdir(wd)
 
1373
        self._mk_versioned_file(fname, total_lines=0)  # rev1
 
1374
        self._mk_versioned_file('file1.txt')          # rev2
 
1375
        self._update_file(fname, text="v3 text\n")    # rev3
 
1376
        self._update_file(fname, text="v4 text\n")    # rev4
 
1377
        self._update_file(fname, text="v5 text\n")    # rev5
 
1378
        self._update_file(fname, text="v6 text\n")    # rev6
 
1379
 
 
1380
        out, err = self.run_bzr(['grep', '-r', '1..', 'v3'])
 
1381
        self.assertContainsRe(out, "file0.txt~3:v3", flags=TestGrep._reflags)
 
1382
        self.assertContainsRe(out, "file0.txt~4:v3", flags=TestGrep._reflags)
 
1383
        self.assertContainsRe(out, "file0.txt~5:v3", flags=TestGrep._reflags)
 
1384
        self.assertContainsRe(out, "file0.txt~6:v3", flags=TestGrep._reflags)
 
1385
        self.assertEqual(len(out.splitlines()), 4)
 
1386
 
 
1387
        out, err = self.run_bzr(['grep', '-r', '..1', 'v3'])
 
1388
        # searching only rev1 gives nothing
 
1389
        self.assertEqual(len(out.splitlines()), 0)
 
1390
 
 
1391
        out, err = self.run_bzr(['grep', '-r', '..6', 'v3'])
 
1392
        self.assertContainsRe(out, "file0.txt~3:v3", flags=TestGrep._reflags)
 
1393
        self.assertContainsRe(out, "file0.txt~4:v3", flags=TestGrep._reflags)
 
1394
        self.assertContainsRe(out, "file0.txt~5:v3", flags=TestGrep._reflags)
 
1395
        self.assertContainsRe(out, "file0.txt~6:v3", flags=TestGrep._reflags)
 
1396
        self.assertEqual(len(out.splitlines()), 4)
 
1397
 
 
1398
        out, err = self.run_bzr(['grep', '-r', '..', 'v3'])
 
1399
        self.assertContainsRe(out, "file0.txt~3:v3", flags=TestGrep._reflags)
 
1400
        self.assertContainsRe(out, "file0.txt~4:v3", flags=TestGrep._reflags)
 
1401
        self.assertContainsRe(out, "file0.txt~5:v3", flags=TestGrep._reflags)
 
1402
        self.assertContainsRe(out, "file0.txt~6:v3", flags=TestGrep._reflags)
 
1403
        self.assertEqual(len(out.splitlines()), 4)
 
1404
 
 
1405
        out, err = self.run_bzr(['grep', '-r', '1..5', 'v3'])
 
1406
        self.assertContainsRe(out, "file0.txt~3:v3", flags=TestGrep._reflags)
 
1407
        self.assertContainsRe(out, "file0.txt~4:v3", flags=TestGrep._reflags)
 
1408
        self.assertContainsRe(out, "file0.txt~5:v3", flags=TestGrep._reflags)
 
1409
        self.assertNotContainsRe(
 
1410
            out, "file0.txt~6:v3", flags=TestGrep._reflags)
 
1411
        self.assertEqual(len(out.splitlines()), 3)
 
1412
 
 
1413
        out, err = self.run_bzr(['grep', '-r', '5..1', 'v3'])
 
1414
        self.assertContainsRe(out, "file0.txt~3:v3", flags=TestGrep._reflags)
 
1415
        self.assertContainsRe(out, "file0.txt~4:v3", flags=TestGrep._reflags)
 
1416
        self.assertContainsRe(out, "file0.txt~5:v3", flags=TestGrep._reflags)
 
1417
        self.assertNotContainsRe(
 
1418
            out, "file0.txt~6:v3", flags=TestGrep._reflags)
 
1419
        self.assertEqual(len(out.splitlines()), 3)
 
1420
 
 
1421
        out, err = self.run_bzr(['grep', '-r', '1..', '[tuv]3'])
 
1422
        self.assertContainsRe(out, "file0.txt~3:v3", flags=TestGrep._reflags)
 
1423
        self.assertContainsRe(out, "file0.txt~4:v3", flags=TestGrep._reflags)
 
1424
        self.assertContainsRe(out, "file0.txt~5:v3", flags=TestGrep._reflags)
 
1425
        self.assertContainsRe(out, "file0.txt~6:v3", flags=TestGrep._reflags)
 
1426
        self.assertEqual(len(out.splitlines()), 4)
 
1427
 
 
1428
        out, err = self.run_bzr(['grep', '-r', '1..5', '[tuv]3'])
 
1429
        self.assertContainsRe(out, "file0.txt~3:v3", flags=TestGrep._reflags)
 
1430
        self.assertContainsRe(out, "file0.txt~4:v3", flags=TestGrep._reflags)
 
1431
        self.assertContainsRe(out, "file0.txt~5:v3", flags=TestGrep._reflags)
 
1432
        self.assertNotContainsRe(
 
1433
            out, "file0.txt~6:v3", flags=TestGrep._reflags)
 
1434
        self.assertEqual(len(out.splitlines()), 3)
 
1435
 
 
1436
        out, err = self.run_bzr(['grep', '-r', '5..1', '[tuv]3'])
 
1437
        self.assertContainsRe(out, "file0.txt~3:v3", flags=TestGrep._reflags)
 
1438
        self.assertContainsRe(out, "file0.txt~4:v3", flags=TestGrep._reflags)
 
1439
        self.assertContainsRe(out, "file0.txt~5:v3", flags=TestGrep._reflags)
 
1440
        self.assertNotContainsRe(
 
1441
            out, "file0.txt~6:v3", flags=TestGrep._reflags)
 
1442
        self.assertEqual(len(out.splitlines()), 3)
 
1443
 
 
1444
    def test_revno_range_versioned_file_in_dir(self):
 
1445
        """Grep rev-range for pattern for file withing a dir.
 
1446
        """
 
1447
        wd = 'foobar0'
 
1448
        self.make_branch_and_tree(wd)
 
1449
        os.chdir(wd)
 
1450
        self._mk_versioned_dir('dir0')                      # rev1
 
1451
        self._mk_versioned_file('dir0/file0.txt')           # rev2
 
1452
        self._update_file('dir0/file0.txt', "v3 text\n")    # rev3
 
1453
        self._update_file('dir0/file0.txt', "v4 text\n")    # rev4
 
1454
        self._update_file('dir0/file0.txt', "v5 text\n")    # rev5
 
1455
        self._update_file('dir0/file0.txt', "v6 text\n")    # rev6
 
1456
 
 
1457
        out, err = self.run_bzr(['grep', '-r', '2..5', 'v3'])
 
1458
        self.assertContainsRe(out, "^dir0/file0.txt~3:v3",
 
1459
                              flags=TestGrep._reflags)
 
1460
        self.assertContainsRe(out, "^dir0/file0.txt~4:v3",
 
1461
                              flags=TestGrep._reflags)
 
1462
        self.assertContainsRe(out, "^dir0/file0.txt~5:v3",
 
1463
                              flags=TestGrep._reflags)
 
1464
        self.assertNotContainsRe(
 
1465
            out, "^dir0/file0.txt~6:v3", flags=TestGrep._reflags)
 
1466
        self.assertEqual(len(out.splitlines()), 3)
 
1467
 
 
1468
        out, err = self.run_bzr(['grep', '-r', '2..5', '[tuv]3'])
 
1469
        self.assertContainsRe(out, "^dir0/file0.txt~3:v3",
 
1470
                              flags=TestGrep._reflags)
 
1471
        self.assertContainsRe(out, "^dir0/file0.txt~4:v3",
 
1472
                              flags=TestGrep._reflags)
 
1473
        self.assertContainsRe(out, "^dir0/file0.txt~5:v3",
 
1474
                              flags=TestGrep._reflags)
 
1475
        self.assertNotContainsRe(
 
1476
            out, "^dir0/file0.txt~6:v3", flags=TestGrep._reflags)
 
1477
        self.assertEqual(len(out.splitlines()), 3)
 
1478
 
 
1479
    def test_revno_range_versioned_file_from_outside_dir(self):
 
1480
        """Grep rev-range for pattern from outside dir.
 
1481
        """
 
1482
        wd = 'foobar0'
 
1483
        self.make_branch_and_tree(wd)
 
1484
        os.chdir(wd)
 
1485
        self._mk_versioned_dir('dir0')                      # rev1
 
1486
        self._mk_versioned_file('dir0/file0.txt')           # rev2
 
1487
        self._update_file('dir0/file0.txt', "v3 text\n")    # rev3
 
1488
        self._update_file('dir0/file0.txt', "v4 text\n")    # rev4
 
1489
        self._update_file('dir0/file0.txt', "v5 text\n")    # rev5
 
1490
        self._update_file('dir0/file0.txt', "v6 text\n")    # rev6
 
1491
 
 
1492
        out, err = self.run_bzr(['grep', '-r', '2..5', 'v3', 'dir0'])
 
1493
        self.assertContainsRe(out, "^dir0/file0.txt~3:v3",
 
1494
                              flags=TestGrep._reflags)
 
1495
        self.assertContainsRe(out, "^dir0/file0.txt~4:v3",
 
1496
                              flags=TestGrep._reflags)
 
1497
        self.assertContainsRe(out, "^dir0/file0.txt~5:v3",
 
1498
                              flags=TestGrep._reflags)
 
1499
        self.assertNotContainsRe(
 
1500
            out, "^dir0/file0.txt~6:v3", flags=TestGrep._reflags)
 
1501
 
 
1502
        out, err = self.run_bzr(['grep', '-r', '2..5', '[tuv]3', 'dir0'])
 
1503
        self.assertContainsRe(out, "^dir0/file0.txt~3:v3",
 
1504
                              flags=TestGrep._reflags)
 
1505
        self.assertContainsRe(out, "^dir0/file0.txt~4:v3",
 
1506
                              flags=TestGrep._reflags)
 
1507
        self.assertContainsRe(out, "^dir0/file0.txt~5:v3",
 
1508
                              flags=TestGrep._reflags)
 
1509
        self.assertNotContainsRe(
 
1510
            out, "^dir0/file0.txt~6:v3", flags=TestGrep._reflags)
 
1511
 
 
1512
    def test_levels(self):
 
1513
        """--levels=0 should show findings from merged revision.
 
1514
        """
 
1515
        wd0 = 'foobar0'
 
1516
        wd1 = 'foobar1'
 
1517
 
 
1518
        self.make_branch_and_tree(wd0)
 
1519
        os.chdir(wd0)
 
1520
        self._mk_versioned_file('file0.txt')
 
1521
        os.chdir('..')
 
1522
 
 
1523
        out, err = self.run_bzr(['branch', wd0, wd1])
 
1524
        os.chdir(wd1)
 
1525
        self._mk_versioned_file('file1.txt')
 
1526
        os.chdir(osutils.pathjoin('..', wd0))
 
1527
 
 
1528
        out, err = self.run_bzr(['merge', osutils.pathjoin('..', wd1)])
 
1529
        out, err = self.run_bzr(['ci', '-m', 'merged'])
 
1530
 
 
1531
        out, err = self.run_bzr(['grep', 'line1'])
 
1532
        self.assertContainsRe(out, "file0.txt:line1", flags=TestGrep._reflags)
 
1533
        self.assertContainsRe(out, "file1.txt:line1", flags=TestGrep._reflags)
 
1534
 
 
1535
        # levels should be ignored by wtree grep
 
1536
        out, err = self.run_bzr(['grep', '--levels=0', 'line1'])
 
1537
        self.assertContainsRe(out, "^file0.txt:line1$",
 
1538
                              flags=TestGrep._reflags)
 
1539
        self.assertContainsRe(out, "^file1.txt:line1$",
 
1540
                              flags=TestGrep._reflags)
 
1541
        self.assertContainsRe(out, "^file0.txt:line10$",
 
1542
                              flags=TestGrep._reflags)
 
1543
        self.assertContainsRe(out, "^file1.txt:line10$",
 
1544
                              flags=TestGrep._reflags)
 
1545
        self.assertEqual(len(out.splitlines()), 4)
 
1546
 
 
1547
        out, err = self.run_bzr(
 
1548
            ['grep', '-r', 'last:1..', '--levels=0', 'line1'])
 
1549
        self.assertContainsRe(out, "^file0.txt~2:line1$",
 
1550
                              flags=TestGrep._reflags)
 
1551
        self.assertContainsRe(out, "^file1.txt~2:line1$",
 
1552
                              flags=TestGrep._reflags)
 
1553
        self.assertContainsRe(
 
1554
            out, "^file0.txt~1.1.1:line1$", flags=TestGrep._reflags)
 
1555
        self.assertContainsRe(
 
1556
            out, "^file1.txt~1.1.1:line1$", flags=TestGrep._reflags)
 
1557
        self.assertContainsRe(out, "^file0.txt~2:line10$",
 
1558
                              flags=TestGrep._reflags)
 
1559
        self.assertContainsRe(out, "^file1.txt~2:line10$",
 
1560
                              flags=TestGrep._reflags)
 
1561
        self.assertContainsRe(
 
1562
            out, "^file0.txt~1.1.1:line10$", flags=TestGrep._reflags)
 
1563
        self.assertContainsRe(
 
1564
            out, "^file1.txt~1.1.1:line10$", flags=TestGrep._reflags)
 
1565
        self.assertEqual(len(out.splitlines()), 8)
 
1566
 
 
1567
        out, err = self.run_bzr(
 
1568
            ['grep', '-r', '-1..', '-n', '--levels=0', 'line1'])
 
1569
        self.assertContainsRe(out, "^file0.txt~2:1:line1$",
 
1570
                              flags=TestGrep._reflags)
 
1571
        self.assertContainsRe(out, "^file1.txt~2:1:line1$",
 
1572
                              flags=TestGrep._reflags)
 
1573
        self.assertContainsRe(
 
1574
            out, "^file0.txt~1.1.1:1:line1$", flags=TestGrep._reflags)
 
1575
        self.assertContainsRe(
 
1576
            out, "^file1.txt~1.1.1:1:line1$", flags=TestGrep._reflags)
 
1577
        self.assertContainsRe(
 
1578
            out, "^file0.txt~2:10:line10$", flags=TestGrep._reflags)
 
1579
        self.assertContainsRe(
 
1580
            out, "^file1.txt~2:10:line10$", flags=TestGrep._reflags)
 
1581
        self.assertContainsRe(
 
1582
            out, "^file0.txt~1.1.1:10:line10$", flags=TestGrep._reflags)
 
1583
        self.assertContainsRe(
 
1584
            out, "^file1.txt~1.1.1:10:line10$", flags=TestGrep._reflags)
 
1585
        self.assertEqual(len(out.splitlines()), 8)
 
1586
 
 
1587
        # levels should be ignored by wtree grep
 
1588
        out, err = self.run_bzr(['grep', '--levels=0', 'l.ne1'])
 
1589
        self.assertContainsRe(out, "^file0.txt:line1$",
 
1590
                              flags=TestGrep._reflags)
 
1591
        self.assertContainsRe(out, "^file1.txt:line1$",
 
1592
                              flags=TestGrep._reflags)
 
1593
        self.assertContainsRe(out, "^file0.txt:line10$",
 
1594
                              flags=TestGrep._reflags)
 
1595
        self.assertContainsRe(out, "^file1.txt:line10$",
 
1596
                              flags=TestGrep._reflags)
 
1597
        self.assertEqual(len(out.splitlines()), 4)
 
1598
 
 
1599
        out, err = self.run_bzr(
 
1600
            ['grep', '-r', 'last:1..', '--levels=0', 'lin.1'])
 
1601
        self.assertContainsRe(out, "^file0.txt~2:line1$",
 
1602
                              flags=TestGrep._reflags)
 
1603
        self.assertContainsRe(out, "^file1.txt~2:line1$",
 
1604
                              flags=TestGrep._reflags)
 
1605
        self.assertContainsRe(
 
1606
            out, "^file0.txt~1.1.1:line1$", flags=TestGrep._reflags)
 
1607
        self.assertContainsRe(
 
1608
            out, "^file1.txt~1.1.1:line1$", flags=TestGrep._reflags)
 
1609
        self.assertContainsRe(out, "^file0.txt~2:line10$",
 
1610
                              flags=TestGrep._reflags)
 
1611
        self.assertContainsRe(out, "^file1.txt~2:line10$",
 
1612
                              flags=TestGrep._reflags)
 
1613
        self.assertContainsRe(
 
1614
            out, "^file0.txt~1.1.1:line10$", flags=TestGrep._reflags)
 
1615
        self.assertContainsRe(
 
1616
            out, "^file1.txt~1.1.1:line10$", flags=TestGrep._reflags)
 
1617
        self.assertEqual(len(out.splitlines()), 8)
 
1618
 
 
1619
        out, err = self.run_bzr(
 
1620
            ['grep', '-r', '-1..', '-n', '--levels=0', '.ine1'])
 
1621
        self.assertContainsRe(out, "file0.txt~2:1:line1",
 
1622
                              flags=TestGrep._reflags)
 
1623
        self.assertContainsRe(out, "file1.txt~2:1:line1",
 
1624
                              flags=TestGrep._reflags)
 
1625
        self.assertContainsRe(
 
1626
            out, "file0.txt~1.1.1:1:line1", flags=TestGrep._reflags)
 
1627
        self.assertContainsRe(
 
1628
            out, "file1.txt~1.1.1:1:line1", flags=TestGrep._reflags)
 
1629
 
 
1630
    def test_dotted_rev_grep(self):
 
1631
        """Grep in dotted revs
 
1632
        """
 
1633
        wd0 = 'foobar0'
 
1634
        wd1 = 'foobar1'
 
1635
 
 
1636
        self.make_branch_and_tree(wd0)
 
1637
        os.chdir(wd0)
 
1638
        self._mk_versioned_file('file0.txt')
 
1639
        os.chdir('..')
 
1640
 
 
1641
        out, err = self.run_bzr(['branch', wd0, wd1])
 
1642
        os.chdir(wd1)
 
1643
        self._mk_versioned_file('file1.txt')        # revno 1.1.1
 
1644
        self._update_file('file1.txt', "text 0\n")  # revno 1.1.2
 
1645
        self._update_file('file1.txt', "text 1\n")  # revno 1.1.3
 
1646
        self._update_file('file1.txt', "text 2\n")  # revno 1.1.4
 
1647
        os.chdir(osutils.pathjoin('..', wd0))
 
1648
 
 
1649
        out, err = self.run_bzr(['merge', osutils.pathjoin('..', wd1)])
 
1650
        out, err = self.run_bzr(['ci', '-m', 'merged'])
 
1651
 
 
1652
        out, err = self.run_bzr(['grep', '-r', '1.1.1..1.1.4', 'text'])
 
1653
        self.assertContainsRe(
 
1654
            out, "file1.txt~1.1.2:text 0", flags=TestGrep._reflags)
 
1655
        self.assertContainsRe(
 
1656
            out, "file1.txt~1.1.3:text 1", flags=TestGrep._reflags)
 
1657
        self.assertContainsRe(
 
1658
            out, "file1.txt~1.1.3:text 1", flags=TestGrep._reflags)
 
1659
        self.assertContainsRe(
 
1660
            out, "file1.txt~1.1.4:text 0", flags=TestGrep._reflags)
 
1661
        self.assertContainsRe(
 
1662
            out, "file1.txt~1.1.4:text 1", flags=TestGrep._reflags)
 
1663
        self.assertContainsRe(
 
1664
            out, "file1.txt~1.1.4:text 2", flags=TestGrep._reflags)
 
1665
        self.assertEqual(len(out.splitlines()), 6)
 
1666
 
 
1667
    def test_versioned_binary_file_grep(self):
 
1668
        """(versioned) Grep for pattern in binary file.
 
1669
        """
 
1670
        wd = 'foobar0'
 
1671
        self.make_branch_and_tree(wd)
 
1672
        os.chdir(wd)
 
1673
        self._mk_versioned_file('file.txt')
 
1674
        self._mk_versioned_file('file0.bin')
 
1675
        self._update_file('file0.bin', "\x00lineNN\x00\n")
 
1676
 
 
1677
        # note: set --verbose/-v flag to get the skip message.
 
1678
        out, err = self.run_bzr(['grep', '-v', '-r', 'last:1',
 
1679
                                 'lineNN', 'file0.bin'])
 
1680
        self.assertNotContainsRe(out, "file0.bin", flags=TestGrep._reflags)
 
1681
        self.assertContainsRe(
 
1682
            err, "Binary file.*file0.bin.*skipped", flags=TestGrep._reflags)
 
1683
        self.assertEqual(len(out.splitlines()), 0)
 
1684
        self.assertEqual(len(err.splitlines()), 1)
 
1685
 
 
1686
        out, err = self.run_bzr(['grep', '-v', '-r', 'last:1',
 
1687
                                 'line.N', 'file0.bin'])
 
1688
        self.assertNotContainsRe(out, "file0.bin", flags=TestGrep._reflags)
 
1689
        self.assertContainsRe(
 
1690
            err, "Binary file.*file0.bin.*skipped", flags=TestGrep._reflags)
 
1691
        self.assertEqual(len(out.splitlines()), 0)
 
1692
        self.assertEqual(len(err.splitlines()), 1)
 
1693
 
 
1694
    def test_wtree_binary_file_grep(self):
 
1695
        """(wtree) Grep for pattern in binary file.
 
1696
        """
 
1697
        wd = 'foobar0'
 
1698
        self.make_branch_and_tree(wd)
 
1699
        os.chdir(wd)
 
1700
        self._mk_versioned_file('file0.bin')
 
1701
        self._update_file('file0.bin', "\x00lineNN\x00\n")
 
1702
 
 
1703
        # note: set --verbose/-v flag to get the skip message.
 
1704
        out, err = self.run_bzr(['grep', '-v', 'lineNN', 'file0.bin'])
 
1705
        self.assertNotContainsRe(
 
1706
            out, "file0.bin:line1", flags=TestGrep._reflags)
 
1707
        self.assertContainsRe(
 
1708
            err, "Binary file.*file0.bin.*skipped", flags=TestGrep._reflags)
 
1709
 
 
1710
        # binary warning should not be shown without --verbose
 
1711
        out, err = self.run_bzr(['grep', 'lineNN', 'file0.bin'])
 
1712
        self.assertNotContainsRe(
 
1713
            out, "file0.bin:line1", flags=TestGrep._reflags)
 
1714
        self.assertNotContainsRe(err, "Binary file", flags=TestGrep._reflags)
 
1715
 
 
1716
    def test_revspec(self):
 
1717
        """Ensure various revspecs work
 
1718
        """
 
1719
        wd = 'foobar0'
 
1720
        self.make_branch_and_tree(wd)
 
1721
        os.chdir(wd)
 
1722
        self._mk_versioned_dir('dir0')                      # rev1
 
1723
        self._mk_versioned_file('dir0/file0.txt')           # rev2
 
1724
        self._update_file('dir0/file0.txt', "v3 text\n")    # rev3
 
1725
        self._update_file('dir0/file0.txt', "v4 text\n")    # rev4
 
1726
        self._update_file('dir0/file0.txt', "v5 text\n")    # rev5
 
1727
 
 
1728
        out, err = self.run_bzr(['grep', '-r', 'revno:1..2', 'v3'])
 
1729
        self.assertNotContainsRe(out, "file0", flags=TestGrep._reflags)
 
1730
        self.assertEqual(len(out.splitlines()), 0)
 
1731
 
 
1732
        out, err = self.run_bzr(['grep', '-r', 'revno:4..', 'v4'])
 
1733
        self.assertContainsRe(out, "^dir0/file0.txt", flags=TestGrep._reflags)
 
1734
        self.assertEqual(len(out.splitlines()), 2)  # find v4 in rev4 and rev5
 
1735
 
 
1736
        out, err = self.run_bzr(['grep', '-r', '..revno:3', 'v4'])
 
1737
        self.assertNotContainsRe(out, "file0", flags=TestGrep._reflags)
 
1738
        self.assertEqual(len(out.splitlines()), 0)
 
1739
 
 
1740
        out, err = self.run_bzr(['grep', '-r', '..revno:3', 'v3'])
 
1741
        self.assertContainsRe(out, "^dir0/file0.txt", flags=TestGrep._reflags)
 
1742
        self.assertEqual(len(out.splitlines()), 1)
 
1743
 
 
1744
    def test_wtree_files_with_matches(self):
 
1745
        """(wtree) Ensure --files-with-matches, -l works
 
1746
        """
 
1747
        wd = 'foobar0'
 
1748
        self.make_branch_and_tree(wd)
 
1749
        os.chdir(wd)
 
1750
 
 
1751
        self._mk_versioned_file('file0.txt', total_lines=2)
 
1752
        self._mk_versioned_file('file1.txt', total_lines=2)
 
1753
        self._mk_versioned_dir('dir0')
 
1754
        self._mk_versioned_file('dir0/file00.txt', total_lines=2)
 
1755
        self._mk_versioned_file('dir0/file01.txt', total_lines=2)
 
1756
 
 
1757
        self._update_file('file0.txt', 'HELLO\n', checkin=False)
 
1758
        self._update_file('dir0/file00.txt', 'HELLO\n', checkin=False)
 
1759
 
 
1760
        # fixed-string
 
1761
        out, err = self.run_bzr(['grep', '--files-with-matches', 'HELLO'])
 
1762
 
 
1763
        self.assertContainsRe(out, "^file0.txt$", flags=TestGrep._reflags)
 
1764
        self.assertContainsRe(out, "^dir0/file00.txt$",
 
1765
                              flags=TestGrep._reflags)
 
1766
        self.assertEqual(len(out.splitlines()), 2)
 
1767
 
 
1768
        # regex
 
1769
        out, err = self.run_bzr(['grep', '--files-with-matches', 'HE.LO'])
 
1770
 
 
1771
        self.assertContainsRe(out, "^file0.txt$", flags=TestGrep._reflags)
 
1772
        self.assertContainsRe(out, "^dir0/file00.txt$",
 
1773
                              flags=TestGrep._reflags)
 
1774
        self.assertEqual(len(out.splitlines()), 2)
 
1775
 
 
1776
        # fixed-string
 
1777
        out, err = self.run_bzr(['grep', '-l', 'HELLO'])
 
1778
 
 
1779
        self.assertContainsRe(out, "^file0.txt$", flags=TestGrep._reflags)
 
1780
        self.assertContainsRe(out, "^dir0/file00.txt$",
 
1781
                              flags=TestGrep._reflags)
 
1782
        self.assertEqual(len(out.splitlines()), 2)
 
1783
 
 
1784
        # regex
 
1785
        out, err = self.run_bzr(['grep', '-l', 'HE.LO'])
 
1786
 
 
1787
        self.assertContainsRe(out, "^file0.txt$", flags=TestGrep._reflags)
 
1788
        self.assertContainsRe(out, "^dir0/file00.txt$",
 
1789
                              flags=TestGrep._reflags)
 
1790
        self.assertEqual(len(out.splitlines()), 2)
 
1791
 
 
1792
        # fixed-string
 
1793
        out, err = self.run_bzr(['grep', '-l', 'HELLO', 'dir0', 'file1.txt'])
 
1794
 
 
1795
        self.assertContainsRe(out, "^dir0/file00.txt$",
 
1796
                              flags=TestGrep._reflags)
 
1797
        self.assertEqual(len(out.splitlines()), 1)
 
1798
 
 
1799
        # regex
 
1800
        out, err = self.run_bzr(['grep', '-l', '.ELLO', 'dir0', 'file1.txt'])
 
1801
 
 
1802
        self.assertContainsRe(out, "^dir0/file00.txt$",
 
1803
                              flags=TestGrep._reflags)
 
1804
        self.assertEqual(len(out.splitlines()), 1)
 
1805
 
 
1806
        # fixed-string
 
1807
        out, err = self.run_bzr(['grep', '-l', 'HELLO', 'file0.txt'])
 
1808
 
 
1809
        self.assertContainsRe(out, "^file0.txt$", flags=TestGrep._reflags)
 
1810
        self.assertEqual(len(out.splitlines()), 1)
 
1811
 
 
1812
        # regex
 
1813
        out, err = self.run_bzr(['grep', '-l', '.ELLO', 'file0.txt'])
 
1814
 
 
1815
        self.assertContainsRe(out, "^file0.txt$", flags=TestGrep._reflags)
 
1816
        self.assertEqual(len(out.splitlines()), 1)
 
1817
 
 
1818
        # fixed-string
 
1819
        out, err = self.run_bzr(['grep', '--no-recursive', '-l', 'HELLO'])
 
1820
 
 
1821
        self.assertContainsRe(out, "^file0.txt$", flags=TestGrep._reflags)
 
1822
        self.assertEqual(len(out.splitlines()), 1)
 
1823
 
 
1824
        # regex
 
1825
        out, err = self.run_bzr(['grep', '--no-recursive', '-l', '.ELLO'])
 
1826
 
 
1827
        self.assertContainsRe(out, "^file0.txt$", flags=TestGrep._reflags)
 
1828
        self.assertEqual(len(out.splitlines()), 1)
 
1829
 
 
1830
    def test_ver_files_with_matches(self):
 
1831
        """(ver) Ensure --files-with-matches, -l works
 
1832
        """
 
1833
        wd = 'foobar0'
 
1834
        self.make_branch_and_tree(wd)
 
1835
        os.chdir(wd)
 
1836
 
 
1837
        self._mk_versioned_file('file0.txt', total_lines=2)         # rev 1
 
1838
        self._mk_versioned_file('file1.txt', total_lines=2)         # rev 2
 
1839
        self._mk_versioned_dir('dir0')                              # rev 3
 
1840
        self._mk_versioned_file('dir0/file00.txt', total_lines=2)   # rev 4
 
1841
        self._mk_versioned_file('dir0/file01.txt', total_lines=2)   # rev 5
 
1842
 
 
1843
        self._update_file('file0.txt', 'HELLO\n')                   # rev 6
 
1844
        self._update_file('dir0/file00.txt', 'HELLO\n')             # rev 7
 
1845
 
 
1846
        # fixed-string
 
1847
        out, err = self.run_bzr(['grep', '-r', '-1', '--files-with-matches',
 
1848
                                 'HELLO'])
 
1849
 
 
1850
        self.assertContainsRe(out, "^file0.txt~7$", flags=TestGrep._reflags)
 
1851
        self.assertContainsRe(out, "^dir0/file00.txt~7$",
 
1852
                              flags=TestGrep._reflags)
 
1853
        self.assertEqual(len(out.splitlines()), 2)
 
1854
 
 
1855
        # regex
 
1856
        out, err = self.run_bzr(['grep', '-r', '-1', '--files-with-matches',
 
1857
                                 'H.LLO'])
 
1858
 
 
1859
        self.assertContainsRe(out, "^file0.txt~7$", flags=TestGrep._reflags)
 
1860
        self.assertContainsRe(out, "^dir0/file00.txt~7$",
 
1861
                              flags=TestGrep._reflags)
 
1862
        self.assertEqual(len(out.splitlines()), 2)
 
1863
 
 
1864
        # fixed-string
 
1865
        out, err = self.run_bzr(['grep', '-r', '6..7', '--files-with-matches',
 
1866
                                 'HELLO'])
 
1867
 
 
1868
        self.assertContainsRe(out, "^file0.txt~6$", flags=TestGrep._reflags)
 
1869
        self.assertContainsRe(out, "^file0.txt~7$", flags=TestGrep._reflags)
 
1870
        self.assertContainsRe(out, "^dir0/file00.txt~7$",
 
1871
                              flags=TestGrep._reflags)
 
1872
        self.assertEqual(len(out.splitlines()), 3)
 
1873
 
 
1874
        # regex
 
1875
        out, err = self.run_bzr(['grep', '-r', '6..7', '--files-with-matches',
 
1876
                                 'H.LLO'])
 
1877
 
 
1878
        self.assertContainsRe(out, "^file0.txt~6$", flags=TestGrep._reflags)
 
1879
        self.assertContainsRe(out, "^file0.txt~7$", flags=TestGrep._reflags)
 
1880
        self.assertContainsRe(out, "^dir0/file00.txt~7$",
 
1881
                              flags=TestGrep._reflags)
 
1882
        self.assertEqual(len(out.splitlines()), 3)
 
1883
 
 
1884
        # fixed-string
 
1885
        out, err = self.run_bzr(['grep', '-r', '-1', '-l', 'HELLO'])
 
1886
 
 
1887
        self.assertContainsRe(out, "^file0.txt~7$", flags=TestGrep._reflags)
 
1888
        self.assertContainsRe(out, "^dir0/file00.txt~7$",
 
1889
                              flags=TestGrep._reflags)
 
1890
        self.assertEqual(len(out.splitlines()), 2)
 
1891
 
 
1892
        # regex
 
1893
        out, err = self.run_bzr(['grep', '-r', '-1', '-l', 'H.LLO'])
 
1894
 
 
1895
        self.assertContainsRe(out, "^file0.txt~7$", flags=TestGrep._reflags)
 
1896
        self.assertContainsRe(out, "^dir0/file00.txt~7$",
 
1897
                              flags=TestGrep._reflags)
 
1898
        self.assertEqual(len(out.splitlines()), 2)
 
1899
 
 
1900
        # fixed-string
 
1901
        out, err = self.run_bzr(['grep', '-l', 'HELLO', '-r', '-1',
 
1902
                                 'dir0', 'file1.txt'])
 
1903
 
 
1904
        self.assertContainsRe(out, "^dir0/file00.txt~7$",
 
1905
                              flags=TestGrep._reflags)
 
1906
        self.assertEqual(len(out.splitlines()), 1)
 
1907
 
 
1908
        # regex
 
1909
        out, err = self.run_bzr(['grep', '-l', 'H.LLO', '-r', '-1',
 
1910
                                 'dir0', 'file1.txt'])
 
1911
 
 
1912
        self.assertContainsRe(out, "^dir0/file00.txt~7$",
 
1913
                              flags=TestGrep._reflags)
 
1914
        self.assertEqual(len(out.splitlines()), 1)
 
1915
 
 
1916
        # fixed-string
 
1917
        out, err = self.run_bzr(['grep', '-l', 'HELLO',
 
1918
                                 '-r', '-2', 'file0.txt'])
 
1919
 
 
1920
        self.assertContainsRe(out, "^file0.txt~6$", flags=TestGrep._reflags)
 
1921
        self.assertEqual(len(out.splitlines()), 1)
 
1922
 
 
1923
        # regex
 
1924
        out, err = self.run_bzr(['grep', '-l', 'HE.LO',
 
1925
                                 '-r', '-2', 'file0.txt'])
 
1926
 
 
1927
        self.assertContainsRe(out, "^file0.txt~6$", flags=TestGrep._reflags)
 
1928
        self.assertEqual(len(out.splitlines()), 1)
 
1929
 
 
1930
        # fixed-string
 
1931
        out, err = self.run_bzr(['grep', '--no-recursive', '-r', '-1',
 
1932
                                 '-l', 'HELLO'])
 
1933
 
 
1934
        self.assertContainsRe(out, "^file0.txt~7$", flags=TestGrep._reflags)
 
1935
        self.assertEqual(len(out.splitlines()), 1)
 
1936
 
 
1937
        # regex
 
1938
        out, err = self.run_bzr(['grep', '--no-recursive', '-r', '-1',
 
1939
                                 '-l', '.ELLO'])
 
1940
 
 
1941
        self.assertContainsRe(out, "^file0.txt~7$", flags=TestGrep._reflags)
 
1942
        self.assertEqual(len(out.splitlines()), 1)
 
1943
 
 
1944
    def test_wtree_files_without_matches(self):
 
1945
        """(wtree) Ensure --files-without-match, -L works
 
1946
        """
 
1947
        wd = 'foobar0'
 
1948
        self.make_branch_and_tree(wd)
 
1949
        os.chdir(wd)
 
1950
 
 
1951
        self._mk_versioned_file('file0.txt', total_lines=2)
 
1952
        self._mk_versioned_file('file1.txt', total_lines=2)
 
1953
        self._mk_versioned_dir('dir0')
 
1954
        self._mk_versioned_file('dir0/file00.txt', total_lines=2)
 
1955
        self._mk_versioned_file('dir0/file01.txt', total_lines=2)
 
1956
 
 
1957
        self._update_file('file0.txt', 'HELLO\n', checkin=False)
 
1958
        self._update_file('dir0/file00.txt', 'HELLO\n', checkin=False)
 
1959
 
 
1960
        # fixed-string
 
1961
        out, err = self.run_bzr(['grep', '--files-without-match', 'HELLO'])
 
1962
 
 
1963
        self.assertContainsRe(out, "^file1.txt$", flags=TestGrep._reflags)
 
1964
        self.assertContainsRe(out, "^dir0/file01.txt$",
 
1965
                              flags=TestGrep._reflags)
 
1966
        self.assertEqual(len(out.splitlines()), 2)
 
1967
 
 
1968
        # regex
 
1969
        out, err = self.run_bzr(['grep', '--files-without-match', 'HE.LO'])
 
1970
 
 
1971
        self.assertContainsRe(out, "^file1.txt$", flags=TestGrep._reflags)
 
1972
        self.assertContainsRe(out, "^dir0/file01.txt$",
 
1973
                              flags=TestGrep._reflags)
 
1974
        self.assertEqual(len(out.splitlines()), 2)
 
1975
 
 
1976
        # fixed-string
 
1977
        out, err = self.run_bzr(['grep', '-L', 'HELLO'])
 
1978
 
 
1979
        self.assertContainsRe(out, "^file1.txt$", flags=TestGrep._reflags)
 
1980
        self.assertContainsRe(out, "^dir0/file01.txt$",
 
1981
                              flags=TestGrep._reflags)
 
1982
        self.assertEqual(len(out.splitlines()), 2)
 
1983
 
 
1984
        # regex
 
1985
        out, err = self.run_bzr(['grep', '-L', 'HE.LO'])
 
1986
 
 
1987
        self.assertContainsRe(out, "^file1.txt$", flags=TestGrep._reflags)
 
1988
        self.assertContainsRe(out, "^dir0/file01.txt$",
 
1989
                              flags=TestGrep._reflags)
 
1990
        self.assertEqual(len(out.splitlines()), 2)
 
1991
 
 
1992
        # fixed-string
 
1993
        out, err = self.run_bzr(['grep', '-L', 'HELLO', 'dir0', 'file1.txt'])
 
1994
 
 
1995
        self.assertContainsRe(out, "^file1.txt$", flags=TestGrep._reflags)
 
1996
        self.assertContainsRe(out, "^dir0/file01.txt$",
 
1997
                              flags=TestGrep._reflags)
 
1998
        self.assertEqual(len(out.splitlines()), 2)
 
1999
 
 
2000
        # regex
 
2001
        out, err = self.run_bzr(['grep', '-L', '.ELLO', 'dir0', 'file1.txt'])
 
2002
 
 
2003
        self.assertContainsRe(out, "^file1.txt$", flags=TestGrep._reflags)
 
2004
        self.assertContainsRe(out, "^dir0/file01.txt$",
 
2005
                              flags=TestGrep._reflags)
 
2006
        self.assertEqual(len(out.splitlines()), 2)
 
2007
 
 
2008
        # fixed-string
 
2009
        out, err = self.run_bzr(['grep', '-L', 'HELLO', 'file1.txt'])
 
2010
 
 
2011
        self.assertContainsRe(out, "^file1.txt$", flags=TestGrep._reflags)
 
2012
        self.assertEqual(len(out.splitlines()), 1)
 
2013
 
 
2014
        # regex
 
2015
        out, err = self.run_bzr(['grep', '-L', '.ELLO', 'file1.txt'])
 
2016
 
 
2017
        self.assertContainsRe(out, "^file1.txt$", flags=TestGrep._reflags)
 
2018
        self.assertEqual(len(out.splitlines()), 1)
 
2019
 
 
2020
        # fixed-string
 
2021
        out, err = self.run_bzr(['grep', '--no-recursive', '-L', 'HELLO'])
 
2022
 
 
2023
        self.assertContainsRe(out, "^file1.txt$", flags=TestGrep._reflags)
 
2024
        self.assertEqual(len(out.splitlines()), 1)
 
2025
 
 
2026
        # regex
 
2027
        out, err = self.run_bzr(['grep', '--no-recursive', '-L', '.ELLO'])
 
2028
 
 
2029
        self.assertContainsRe(out, "^file1.txt$", flags=TestGrep._reflags)
 
2030
        self.assertEqual(len(out.splitlines()), 1)
 
2031
 
 
2032
    def test_ver_files_without_matches(self):
 
2033
        """(ver) Ensure --files-without-match, -L works
 
2034
        """
 
2035
        wd = 'foobar0'
 
2036
        self.make_branch_and_tree(wd)
 
2037
        os.chdir(wd)
 
2038
 
 
2039
        self._mk_versioned_file('file0.txt', total_lines=2)         # rev 1
 
2040
        self._mk_versioned_file('file1.txt', total_lines=2)         # rev 2
 
2041
        self._mk_versioned_dir('dir0')                              # rev 3
 
2042
        self._mk_versioned_file('dir0/file00.txt', total_lines=2)   # rev 4
 
2043
        self._mk_versioned_file('dir0/file01.txt', total_lines=2)   # rev 5
 
2044
 
 
2045
        self._update_file('file0.txt', 'HELLO\n')                   # rev 6
 
2046
        self._update_file('dir0/file00.txt', 'HELLO\n')             # rev 7
 
2047
 
 
2048
        # fixed-string
 
2049
        out, err = self.run_bzr(['grep', '-r', '-1', '--files-without-match',
 
2050
                                 'HELLO'])
 
2051
 
 
2052
        self.assertContainsRe(out, "^file1.txt~7$", flags=TestGrep._reflags)
 
2053
        self.assertContainsRe(out, "^dir0/file01.txt~7$",
 
2054
                              flags=TestGrep._reflags)
 
2055
        self.assertEqual(len(out.splitlines()), 2)
 
2056
 
 
2057
        # regex
 
2058
        out, err = self.run_bzr(['grep', '-r', '-1', '--files-without-match',
 
2059
                                 'H.LLO'])
 
2060
 
 
2061
        self.assertContainsRe(out, "^file1.txt~7$", flags=TestGrep._reflags)
 
2062
        self.assertContainsRe(out, "^dir0/file01.txt~7$",
 
2063
                              flags=TestGrep._reflags)
 
2064
        self.assertEqual(len(out.splitlines()), 2)
 
2065
 
 
2066
        # fixed-string
 
2067
        out, err = self.run_bzr(['grep', '-r', '6..7', '--files-without-match',
 
2068
                                 'HELLO'])
 
2069
 
 
2070
        self.assertContainsRe(out, "^file1.txt~6$", flags=TestGrep._reflags)
 
2071
        self.assertContainsRe(out, "^dir0/file00.txt~6$",
 
2072
                              flags=TestGrep._reflags)
 
2073
        self.assertContainsRe(out, "^dir0/file01.txt~6$",
 
2074
                              flags=TestGrep._reflags)
 
2075
        self.assertContainsRe(out, "^file1.txt~7$", flags=TestGrep._reflags)
 
2076
        self.assertContainsRe(out, "^dir0/file01.txt~7$",
 
2077
                              flags=TestGrep._reflags)
 
2078
        self.assertEqual(len(out.splitlines()), 5)
 
2079
 
 
2080
        # regex
 
2081
        out, err = self.run_bzr(['grep', '-r', '6..7', '--files-without-match',
 
2082
                                 'H.LLO'])
 
2083
 
 
2084
        self.assertContainsRe(out, "^file1.txt~6$", flags=TestGrep._reflags)
 
2085
        self.assertContainsRe(out, "^dir0/file00.txt~6$",
 
2086
                              flags=TestGrep._reflags)
 
2087
        self.assertContainsRe(out, "^dir0/file01.txt~6$",
 
2088
                              flags=TestGrep._reflags)
 
2089
        self.assertContainsRe(out, "^file1.txt~7$", flags=TestGrep._reflags)
 
2090
        self.assertContainsRe(out, "^dir0/file01.txt~7$",
 
2091
                              flags=TestGrep._reflags)
 
2092
        self.assertEqual(len(out.splitlines()), 5)
 
2093
 
 
2094
        # fixed-string
 
2095
        out, err = self.run_bzr(['grep', '-r', '-1', '-L', 'HELLO'])
 
2096
 
 
2097
        self.assertContainsRe(out, "^file1.txt~7$", flags=TestGrep._reflags)
 
2098
        self.assertContainsRe(out, "^dir0/file01.txt~7$",
 
2099
                              flags=TestGrep._reflags)
 
2100
        self.assertEqual(len(out.splitlines()), 2)
 
2101
 
 
2102
        # regex
 
2103
        out, err = self.run_bzr(['grep', '-r', '-1', '-L', 'H.LLO'])
 
2104
 
 
2105
        self.assertContainsRe(out, "^file1.txt~7$", flags=TestGrep._reflags)
 
2106
        self.assertContainsRe(out, "^dir0/file01.txt~7$",
 
2107
                              flags=TestGrep._reflags)
 
2108
        self.assertEqual(len(out.splitlines()), 2)
 
2109
 
 
2110
        # fixed-string
 
2111
        out, err = self.run_bzr(['grep', '-L', 'HELLO', '-r', '-1',
 
2112
                                 'dir0', 'file1.txt'])
 
2113
 
 
2114
        self.assertContainsRe(out, "^file1.txt~7$", flags=TestGrep._reflags)
 
2115
        self.assertContainsRe(out, "^dir0/file01.txt~7$",
 
2116
                              flags=TestGrep._reflags)
 
2117
        self.assertEqual(len(out.splitlines()), 2)
 
2118
 
 
2119
        # regex
 
2120
        out, err = self.run_bzr(['grep', '-L', 'H.LLO', '-r', '-1',
 
2121
                                 'dir0', 'file1.txt'])
 
2122
 
 
2123
        self.assertContainsRe(out, "^file1.txt~7$", flags=TestGrep._reflags)
 
2124
        self.assertContainsRe(out, "^dir0/file01.txt~7$",
 
2125
                              flags=TestGrep._reflags)
 
2126
        self.assertEqual(len(out.splitlines()), 2)
 
2127
 
 
2128
        # fixed-string
 
2129
        out, err = self.run_bzr(['grep', '-L', 'HELLO',
 
2130
                                 '-r', '-2', 'file1.txt'])
 
2131
 
 
2132
        self.assertContainsRe(out, "^file1.txt~6$", flags=TestGrep._reflags)
 
2133
        self.assertEqual(len(out.splitlines()), 1)
 
2134
 
 
2135
        # regex
 
2136
        out, err = self.run_bzr(['grep', '-L', 'HE.LO',
 
2137
                                 '-r', '-2', 'file1.txt'])
 
2138
 
 
2139
        self.assertContainsRe(out, "^file1.txt~6$", flags=TestGrep._reflags)
 
2140
        self.assertEqual(len(out.splitlines()), 1)
 
2141
 
 
2142
        # fixed-string
 
2143
        out, err = self.run_bzr(['grep', '--no-recursive', '-r', '-1',
 
2144
                                 '-L', 'HELLO'])
 
2145
 
 
2146
        self.assertContainsRe(out, "^file1.txt~7$", flags=TestGrep._reflags)
 
2147
        self.assertEqual(len(out.splitlines()), 1)
 
2148
 
 
2149
        # regex
 
2150
        out, err = self.run_bzr(['grep', '--no-recursive', '-r', '-1',
 
2151
                                 '-L', '.ELLO'])
 
2152
 
 
2153
        self.assertContainsRe(out, "^file1.txt~7$", flags=TestGrep._reflags)
 
2154
        self.assertEqual(len(out.splitlines()), 1)
 
2155
 
 
2156
    def test_no_tree(self):
 
2157
        """Ensure grep works without working tree.
 
2158
        """
 
2159
        wd0 = 'foobar0'
 
2160
        wd1 = 'foobar1'
 
2161
        self.make_branch_and_tree(wd0)
 
2162
        os.chdir(wd0)
 
2163
        self._mk_versioned_file('file0.txt')
 
2164
        os.chdir('..')
 
2165
        out, err = self.run_bzr(['branch', '--no-tree', wd0, wd1])
 
2166
        os.chdir(wd1)
 
2167
 
 
2168
        out, err = self.run_bzr(['grep', 'line1'], 3)
 
2169
        self.assertContainsRe(
 
2170
            err, "Cannot search working tree", flags=TestGrep._reflags)
 
2171
        self.assertEqual(out, '')
 
2172
 
 
2173
        out, err = self.run_bzr(['grep', '-r', '1', 'line1'])
 
2174
        self.assertContainsRe(out, "file0.txt~1:line1",
 
2175
                              flags=TestGrep._reflags)
 
2176
        self.assertEqual(len(out.splitlines()), 2)  # finds line1 and line10
 
2177
 
 
2178
 
 
2179
class TestNonAscii(GrepTestBase):
 
2180
    """Tests for non-ascii filenames and file contents"""
 
2181
 
 
2182
    _test_needs_features = [UnicodeFilenameFeature]
 
2183
 
 
2184
    def test_unicode_only_file(self):
 
2185
        """Test filename and contents that requires a unicode encoding"""
 
2186
        tree = self.make_branch_and_tree(".")
 
2187
        contents = [u"\u1234"]
 
2188
        self.build_tree(contents)
 
2189
        tree.add(contents)
 
2190
        tree.commit("Initial commit")
 
2191
        as_utf8 = u"\u1234"
 
2192
 
 
2193
        # GZ 2010-06-07: Note we can't actually grep for \u1234 as the pattern
 
2194
        #                is mangled according to the user encoding.
 
2195
        streams = self.run_bzr_raw(["grep", "--files-with-matches",
 
2196
                                    u"contents"], encoding="UTF-8")
 
2197
        as_utf8 = as_utf8.encode("UTF-8")
 
2198
        self.assertEqual(streams, (as_utf8 + b"\n", b""))
 
2199
 
 
2200
        streams = self.run_bzr_raw(["grep", "-r", "1", "--files-with-matches",
 
2201
                                    u"contents"], encoding="UTF-8")
 
2202
        self.assertEqual(streams, (as_utf8 + b"~1\n", b""))
 
2203
 
 
2204
        fileencoding = osutils.get_user_encoding()
 
2205
        as_mangled = as_utf8.decode(fileencoding, "replace").encode("UTF-8")
 
2206
 
 
2207
        streams = self.run_bzr_raw(["grep", "-n",
 
2208
                                    u"contents"], encoding="UTF-8")
 
2209
        self.assertEqual(streams, (b"%s:1:contents of %s\n" %
 
2210
                                   (as_utf8, as_mangled), b""))
 
2211
 
 
2212
        streams = self.run_bzr_raw(["grep", "-n", "-r", "1",
 
2213
                                    u"contents"], encoding="UTF-8")
 
2214
        self.assertEqual(streams, (b"%s~1:1:contents of %s\n" %
 
2215
                                   (as_utf8, as_mangled), b""))
 
2216
 
 
2217
 
 
2218
class TestColorGrep(GrepTestBase):
 
2219
    """Tests for the --color option."""
 
2220
 
 
2221
    _rev_sep = color_string('~', fg=FG.BOLD_YELLOW)
 
2222
    _sep = color_string(':', fg=FG.BOLD_CYAN)
 
2223
 
 
2224
    def test_color_option(self):
 
2225
        """Ensure options for color are valid.
 
2226
        """
 
2227
        out, err = self.run_bzr(['grep', '--color', 'foo', 'bar'], 3)
 
2228
        self.assertEqual(out, '')
 
2229
        self.assertContainsRe(
 
2230
            err, 'Valid values for --color are', flags=TestGrep._reflags)
 
2231
 
 
2232
    def test_ver_matching_files(self):
 
2233
        """(versioned) Search for matches or no matches only"""
 
2234
        tree = self.make_branch_and_tree(".")
 
2235
        contents = ["d/", "d/aaa", "bbb"]
 
2236
        self.build_tree(contents)
 
2237
        tree.add(contents)
 
2238
        tree.commit("Initial commit")
 
2239
 
 
2240
        # GZ 2010-06-05: Maybe modify the working tree here
 
2241
 
 
2242
        streams = self.run_bzr(["grep", "--color", "always", "-r", "1",
 
2243
                                "--files-with-matches", "aaa"])
 
2244
        self.assertEqual(streams, ("".join([
 
2245
            FG.MAGENTA, "d/aaa", self._rev_sep, "1", "\n"
 
2246
            ]), ""))
 
2247
 
 
2248
        streams = self.run_bzr(["grep", "--color", "always", "-r", "1",
 
2249
                                "--files-without-match", "aaa"])
 
2250
        self.assertEqual(streams, ("".join([
 
2251
            FG.MAGENTA, "bbb", self._rev_sep, "1", "\n"
 
2252
            ]), ""))
 
2253
 
 
2254
    def test_wtree_matching_files(self):
 
2255
        """(wtree) Search for matches or no matches only"""
 
2256
        tree = self.make_branch_and_tree(".")
 
2257
        contents = ["d/", "d/aaa", "bbb"]
 
2258
        self.build_tree(contents)
 
2259
        tree.add(contents)
 
2260
        tree.commit("Initial commit")
 
2261
 
 
2262
        # GZ 2010-06-05: Maybe modify the working tree here
 
2263
 
 
2264
        streams = self.run_bzr(["grep", "--color", "always",
 
2265
                                "--files-with-matches", "aaa"])
 
2266
        self.assertEqual(streams, ("".join([
 
2267
            FG.MAGENTA, "d/aaa", FG.NONE, "\n"
 
2268
            ]), ""))
 
2269
 
 
2270
        streams = self.run_bzr(["grep", "--color", "always",
 
2271
                                "--files-without-match", "aaa"])
 
2272
        self.assertEqual(streams, ("".join([
 
2273
            FG.MAGENTA, "bbb", FG.NONE, "\n"
 
2274
            ]), ""))
 
2275
 
 
2276
    def test_ver_basic_file(self):
 
2277
        """(versioned) Search for pattern in specfic file.
 
2278
        """
 
2279
        wd = 'foobar0'
 
2280
        self.make_branch_and_tree(wd)
 
2281
        os.chdir(wd)
 
2282
        lp = 'foo is foobar'
 
2283
        self._mk_versioned_file('file0.txt', line_prefix=lp, total_lines=1)
 
2284
 
 
2285
        # prepare colored result
 
2286
        foo = color_string('foo', fg=FG.BOLD_RED)
 
2287
        res = (FG.MAGENTA + 'file0.txt'
 
2288
               + self._rev_sep + '1' + self._sep
 
2289
               + foo + ' is ' + foo + 'bar1' + '\n')
 
2290
        txt_res = 'file0.txt~1:foo is foobar1\n'
 
2291
 
 
2292
        nres = (FG.MAGENTA + 'file0.txt'
 
2293
                + self._rev_sep + '1' + self._sep + '1' + self._sep
 
2294
                + foo + ' is ' + foo + 'bar1' + '\n')
 
2295
 
 
2296
        out, err = self.run_bzr(['grep', '--color',
 
2297
                                 'always', '-r', '1', 'foo'])
 
2298
        self.assertEqual(out, res)
 
2299
        self.assertEqual(len(out.splitlines()), 1)
 
2300
 
 
2301
        # auto should produce plain text result
 
2302
        # as stdout is redireched here.
 
2303
        out, err = self.run_bzr(['grep', '--color',
 
2304
                                 'auto', '-r', '1', 'foo'])
 
2305
        self.assertEqual(out, txt_res)
 
2306
        self.assertEqual(len(out.splitlines()), 1)
 
2307
 
 
2308
        out, err = self.run_bzr(['grep', '-i', '--color',
 
2309
                                 'always', '-r', '1', 'FOO'])
 
2310
        self.assertEqual(out, res)
 
2311
        self.assertEqual(len(out.splitlines()), 1)
 
2312
 
 
2313
        out, err = self.run_bzr(['grep', '--color',
 
2314
                                 'always', '-r', '1', 'f.o'])
 
2315
        self.assertEqual(out, res)
 
2316
        self.assertEqual(len(out.splitlines()), 1)
 
2317
 
 
2318
        out, err = self.run_bzr(['grep', '-i', '--color',
 
2319
                                 'always', '-r', '1', 'F.O'])
 
2320
        self.assertEqual(out, res)
 
2321
        self.assertEqual(len(out.splitlines()), 1)
 
2322
 
 
2323
        out, err = self.run_bzr(['grep', '-n', '--color',
 
2324
                                 'always', '-r', '1', 'foo'])
 
2325
        self.assertEqual(out, nres)
 
2326
        self.assertEqual(len(out.splitlines()), 1)
 
2327
 
 
2328
        out, err = self.run_bzr(['grep', '-n', '-i', '--color',
 
2329
                                 'always', '-r', '1', 'FOO'])
 
2330
        self.assertEqual(out, nres)
 
2331
        self.assertEqual(len(out.splitlines()), 1)
 
2332
 
 
2333
        out, err = self.run_bzr(['grep', '-n', '--color',
 
2334
                                 'always', '-r', '1', 'f.o'])
 
2335
        self.assertEqual(out, nres)
 
2336
        self.assertEqual(len(out.splitlines()), 1)
 
2337
 
 
2338
        out, err = self.run_bzr(['grep', '-n', '-i', '--color',
 
2339
                                 'always', '-r', '1', 'F.O'])
 
2340
        self.assertEqual(out, nres)
 
2341
        self.assertEqual(len(out.splitlines()), 1)
 
2342
 
 
2343
    def test_wtree_basic_file(self):
 
2344
        """(wtree) Search for pattern in specfic file.
 
2345
        """
 
2346
        wd = 'foobar0'
 
2347
        self.make_branch_and_tree(wd)
 
2348
        os.chdir(wd)
 
2349
        lp = 'foo is foobar'
 
2350
        self._mk_versioned_file('file0.txt', line_prefix=lp, total_lines=1)
 
2351
 
 
2352
        # prepare colored result
 
2353
        foo = color_string('foo', fg=FG.BOLD_RED)
 
2354
        res = (FG.MAGENTA + 'file0.txt'
 
2355
               + self._sep + foo + ' is ' + foo + 'bar1' + '\n')
 
2356
 
 
2357
        nres = (FG.MAGENTA + 'file0.txt'
 
2358
                + self._sep + '1' + self._sep
 
2359
                + foo + ' is ' + foo + 'bar1' + '\n')
 
2360
 
 
2361
        out, err = self.run_bzr(['grep', '--color',
 
2362
                                 'always', 'foo'])
 
2363
        self.assertEqual(out, res)
 
2364
        self.assertEqual(len(out.splitlines()), 1)
 
2365
 
 
2366
        out, err = self.run_bzr(['grep', '-i', '--color',
 
2367
                                 'always', 'FOO'])
 
2368
        self.assertEqual(out, res)
 
2369
        self.assertEqual(len(out.splitlines()), 1)
 
2370
 
 
2371
        out, err = self.run_bzr(['grep', '--color',
 
2372
                                 'always', 'f.o'])
 
2373
        self.assertEqual(out, res)
 
2374
        self.assertEqual(len(out.splitlines()), 1)
 
2375
 
 
2376
        out, err = self.run_bzr(['grep', '-i', '--color',
 
2377
                                 'always', 'F.O'])
 
2378
        self.assertEqual(out, res)
 
2379
        self.assertEqual(len(out.splitlines()), 1)
 
2380
 
 
2381
        out, err = self.run_bzr(['grep', '-n', '--color',
 
2382
                                 'always', 'foo'])
 
2383
        self.assertEqual(out, nres)
 
2384
        self.assertEqual(len(out.splitlines()), 1)
 
2385
 
 
2386
        out, err = self.run_bzr(['grep', '-n', '-i', '--color',
 
2387
                                 'always', 'FOO'])
 
2388
        self.assertEqual(out, nres)
 
2389
        self.assertEqual(len(out.splitlines()), 1)
 
2390
 
 
2391
        out, err = self.run_bzr(['grep', '-n', '--color',
 
2392
                                 'always', 'f.o'])
 
2393
        self.assertEqual(out, nres)
 
2394
        self.assertEqual(len(out.splitlines()), 1)
 
2395
 
 
2396
        out, err = self.run_bzr(['grep', '-n', '-i', '--color',
 
2397
                                 'always', 'F.O'])
 
2398
        self.assertEqual(out, nres)
 
2399
        self.assertEqual(len(out.splitlines()), 1)
 
2400
 
 
2401
 
 
2402
# copied from breezy.tests.blackbox.test_diff
 
2403
def subst_dates(string):
 
2404
    """Replace date strings with constant values."""
 
2405
    return re.sub(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} [-\+]\d{4}',
 
2406
                  'YYYY-MM-DD HH:MM:SS +ZZZZ', string)
 
2407
 
 
2408
 
 
2409
class TestGrepDiff(tests.TestCaseWithTransport):
 
2410
 
 
2411
    def make_example_branch(self):
 
2412
        tree = self.make_branch_and_tree('.')
 
2413
        self.build_tree_contents([
 
2414
            ('hello', b'foo\n'),
 
2415
            ('goodbye', b'baz\n')])
 
2416
        tree.add(['hello'])
 
2417
        tree.commit('setup')
 
2418
        tree.add(['goodbye'])
 
2419
        tree.commit('setup')
 
2420
        return tree
 
2421
 
 
2422
    def test_grep_diff_basic(self):
 
2423
        """grep -p basic test."""
 
2424
        tree = self.make_example_branch()
 
2425
        self.build_tree_contents([('hello', b'hello world!\n')])
 
2426
        tree.commit('updated hello')
 
2427
        out, err = self.run_bzr(['grep', '-p', 'hello'])
 
2428
        self.assertEqual(err, '')
 
2429
        self.assertEqualDiff(subst_dates(out), '''\
 
2430
=== revno:3 ===
 
2431
  === modified file 'hello'
 
2432
    --- hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
2433
    +++ hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
2434
    +hello world!
 
2435
=== revno:1 ===
 
2436
  === added file 'hello'
 
2437
    --- hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
2438
    +++ hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
2439
''')
 
2440
 
 
2441
    def test_grep_diff_revision(self):
 
2442
        """grep -p specific revision."""
 
2443
        tree = self.make_example_branch()
 
2444
        self.build_tree_contents([('hello', b'hello world!\n')])
 
2445
        tree.commit('updated hello')
 
2446
        out, err = self.run_bzr(['grep', '-p', '-r', '3', 'hello'])
 
2447
        self.assertEqual(err, '')
 
2448
        self.assertEqualDiff(subst_dates(out), '''\
 
2449
=== revno:3 ===
 
2450
  === modified file 'hello'
 
2451
    --- hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
2452
    +++ hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
2453
    +hello world!
 
2454
''')
 
2455
 
 
2456
    def test_grep_diff_revision_range(self):
 
2457
        """grep -p revision range."""
 
2458
        tree = self.make_example_branch()
 
2459
        self.build_tree_contents([('hello', b'hello world!1\n')])  # rev 3
 
2460
        tree.commit('rev3')
 
2461
        self.build_tree_contents([('blah', b'hello world!2\n')])  # rev 4
 
2462
        tree.add('blah')
 
2463
        tree.commit('rev4')
 
2464
        with open('hello', 'a') as f:
 
2465
            f.write('hello world!3\n')
 
2466
        # self.build_tree_contents([('hello', 'hello world!3\n')]) # rev 5
 
2467
        tree.commit('rev5')
 
2468
        out, err = self.run_bzr(['grep', '-p', '-r', '2..5', 'hello'])
 
2469
        self.assertEqual(err, '')
 
2470
        self.assertEqualDiff(subst_dates(out), '''\
 
2471
=== revno:5 ===
 
2472
  === modified file 'hello'
 
2473
    --- hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
2474
    +++ hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
2475
    +hello world!3
 
2476
=== revno:4 ===
 
2477
  === added file 'blah'
 
2478
    +hello world!2
 
2479
=== revno:3 ===
 
2480
  === modified file 'hello'
 
2481
    --- hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
2482
    +++ hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
2483
    +hello world!1
 
2484
''')
 
2485
 
 
2486
    def test_grep_diff_color(self):
 
2487
        """grep -p color test."""
 
2488
        tree = self.make_example_branch()
 
2489
        self.build_tree_contents([('hello', b'hello world!\n')])
 
2490
        tree.commit('updated hello')
 
2491
        out, err = self.run_bzr(['grep', '--diff', '-r', '3',
 
2492
                                 '--color', 'always', 'hello'])
 
2493
        self.assertEqual(err, '')
 
2494
        revno = color_string('=== revno:3 ===', fg=FG.BOLD_BLUE) + '\n'
 
2495
        filename = color_string(
 
2496
            "  === modified file 'hello'", fg=FG.BOLD_MAGENTA) + '\n'
 
2497
        redhello = color_string('hello', fg=FG.BOLD_RED)
 
2498
        diffstr = '''\
 
2499
    --- hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
2500
    +++ hello\tYYYY-MM-DD HH:MM:SS +ZZZZ
 
2501
    +hello world!
 
2502
'''
 
2503
        diffstr = diffstr.replace('hello', redhello)
 
2504
        self.assertEqualDiff(subst_dates(out), revno + filename + diffstr)
 
2505
 
 
2506
    def test_grep_norevs(self):
 
2507
        """grep -p with zero revisions."""
 
2508
        out, err = self.run_bzr(['init'])
 
2509
        out, err = self.run_bzr(['grep', '--diff', 'foo'], 3)
 
2510
        self.assertEqual(out, '')
 
2511
        self.assertContainsRe(
 
2512
            err, "ERROR:.*revision.* does not exist in branch")