/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.40.11 by Parth Malwankar
added basic test
1
# Copyright (C) 2010 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
import os
18
import re
19
0.40.46 by Parth Malwankar
--levels=0 now implicitly prints revnos. added test for --levels=0.
20
from bzrlib import tests, osutils
0.40.11 by Parth Malwankar
added basic test
21
22
class TestGrep(tests.TestCaseWithTransport):
0.40.25 by Parth Malwankar
added test case for multilevel dir.
23
    def _str_contains(self, base, pattern, flags=re.MULTILINE|re.DOTALL):
0.40.26 by Parth Malwankar
test passing for multiple matches
24
        res = re.findall(pattern, base, flags)
25
        return res != []
0.40.11 by Parth Malwankar
added basic test
26
0.40.26 by Parth Malwankar
test passing for multiple matches
27
    def _mk_file(self, path, line_prefix, total_lines, versioned):
0.40.13 by Parth Malwankar
added tests for -R and -i
28
        text=''
29
        for i in range(total_lines):
30
            text += line_prefix + str(i+1) + "\n"
31
0.40.12 by Parth Malwankar
added test for versioned file
32
        open(path, 'w').write(text)
33
        if versioned:
34
            self.run_bzr(['add', path])
0.40.25 by Parth Malwankar
added test case for multilevel dir.
35
            self.run_bzr(['ci', '-m', '"' + path + '"'])
0.40.12 by Parth Malwankar
added test for versioned file
36
0.40.34 by Parth Malwankar
added tests for single revision history search
37
    def _update_file(self, path, text):
38
        """append text to file 'path' and check it in"""
39
        open(path, 'a').write(text)
40
        self.run_bzr(['ci', '-m', '"' + path + '"'])
41
0.40.37 by Parth Malwankar
grep now accepts rev range
42
    def _mk_unknown_file(self, path, line_prefix='line', total_lines=10):
0.40.26 by Parth Malwankar
test passing for multiple matches
43
        self._mk_file(path, line_prefix, total_lines, versioned=False)
0.40.13 by Parth Malwankar
added tests for -R and -i
44
45
    def _mk_versioned_file(self, path, line_prefix='line', total_lines=10):
0.40.26 by Parth Malwankar
test passing for multiple matches
46
        self._mk_file(path, line_prefix, total_lines, versioned=True)
0.40.13 by Parth Malwankar
added tests for -R and -i
47
48
    def _mk_dir(self, path, versioned):
49
        os.mkdir(path)
50
        if versioned:
51
            self.run_bzr(['add', path])
0.40.26 by Parth Malwankar
test passing for multiple matches
52
            self.run_bzr(['ci', '-m', '"' + path + '"'])
0.40.13 by Parth Malwankar
added tests for -R and -i
53
0.40.37 by Parth Malwankar
grep now accepts rev range
54
    def _mk_unknown_dir(self, path):
0.40.26 by Parth Malwankar
test passing for multiple matches
55
        self._mk_dir(path, versioned=False)
0.40.13 by Parth Malwankar
added tests for -R and -i
56
57
    def _mk_versioned_dir(self, path):
58
        self._mk_dir(path, versioned=True)
59
0.40.37 by Parth Malwankar
grep now accepts rev range
60
    def test_basic_unknown_file(self):
0.40.16 by Parth Malwankar
tree.get_file_lines is now used to get lines of text
61
        """search for pattern in specfic file. should issue warning."""
0.40.11 by Parth Malwankar
added basic test
62
        wd = 'foobar0'
63
        self.make_branch_and_tree(wd)
64
        os.chdir(wd)
0.40.37 by Parth Malwankar
grep now accepts rev range
65
        self._mk_versioned_file('filex.txt') # force rev to revno:1 and not revno:0
66
        self._mk_unknown_file('file0.txt')
0.40.11 by Parth Malwankar
added basic test
67
        out, err = self.run_bzr(['grep', 'line1', 'file0.txt'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
68
        self.assertFalse(self._str_contains(out, "file0.txt:line1"))
69
        self.assertTrue(self._str_contains(err, "warning: skipped.*file0.txt.*\."))
0.40.11 by Parth Malwankar
added basic test
70
0.40.45 by Parth Malwankar
fixed case where only revno:0 is present. added test.
71
    def test_revno0(self):
72
        """search for pattern in when only revno0 is present"""
73
        wd = 'foobar0'
74
        self.make_branch_and_tree(wd)   # only revno 0 in branch
75
        os.chdir(wd)
76
        out, err = self.run_bzr(['grep', 'line1'], retcode=3)
77
        self.assertTrue(self._str_contains(err, "ERROR: No revisions found"))
78
0.40.13 by Parth Malwankar
added tests for -R and -i
79
    def test_basic_versioned_file(self):
0.40.12 by Parth Malwankar
added test for versioned file
80
        """search for pattern in specfic file"""
81
        wd = 'foobar0'
82
        self.make_branch_and_tree(wd)
83
        os.chdir(wd)
0.40.13 by Parth Malwankar
added tests for -R and -i
84
        self._mk_versioned_file('file0.txt')
0.40.12 by Parth Malwankar
added test for versioned file
85
        out, err = self.run_bzr(['grep', 'line1', 'file0.txt'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
86
        self.assertTrue(self._str_contains(out, "file0.txt:line1"))
87
        self.assertFalse(self._str_contains(err, "warning: skipped.*file0.txt.*\."))
0.40.12 by Parth Malwankar
added test for versioned file
88
0.40.26 by Parth Malwankar
test passing for multiple matches
89
    def test_multiple_files(self):
90
        """search for pattern in multiple files"""
0.40.25 by Parth Malwankar
added test case for multilevel dir.
91
        wd = 'foobar0'
92
        self.make_branch_and_tree(wd)
93
        os.chdir(wd)
0.40.26 by Parth Malwankar
test passing for multiple matches
94
        self._mk_versioned_file('file0.txt', total_lines=2)
95
        self._mk_versioned_file('file1.txt', total_lines=2)
96
        self._mk_versioned_file('file2.txt', total_lines=2)
97
        out, err = self.run_bzr(['grep', 'line[1-2]'])
98
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
99
        self.assertTrue(self._str_contains(out, "file0.txt:line1"))
100
        self.assertTrue(self._str_contains(out, "file0.txt:line2"))
101
        self.assertTrue(self._str_contains(out, "file1.txt:line1"))
102
        self.assertTrue(self._str_contains(out, "file1.txt:line2"))
103
        self.assertTrue(self._str_contains(out, "file2.txt:line1"))
104
        self.assertTrue(self._str_contains(out, "file2.txt:line2"))
0.40.25 by Parth Malwankar
added test case for multilevel dir.
105
0.40.27 by Parth Malwankar
added test for null option
106
    def test_null_option(self):
107
        """--null option should use NUL instead of newline"""
108
        wd = 'foobar0'
109
        self.make_branch_and_tree(wd)
110
        os.chdir(wd)
111
        self._mk_versioned_file('file0.txt', total_lines=3)
112
113
        out, err = self.run_bzr(['grep', '--null', 'line[1-3]'])
114
        self.assertTrue(out == "file0.txt:line1\0file0.txt:line2\0file0.txt:line3\0")
115
116
        out, err = self.run_bzr(['grep', '-Z', 'line[1-3]'])
117
        self.assertTrue(out == "file0.txt:line1\0file0.txt:line2\0file0.txt:line3\0")
118
0.40.13 by Parth Malwankar
added tests for -R and -i
119
    def test_versioned_file_in_dir_no_recurse(self):
120
        """should not recurse without -R"""
121
        wd = 'foobar0'
122
        self.make_branch_and_tree(wd)
123
        os.chdir(wd)
124
        self._mk_versioned_dir('dir0')
125
        self._mk_versioned_file('dir0/file0.txt')
126
        out, err = self.run_bzr(['grep', 'line1'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
127
        self.assertFalse(self._str_contains(out, "file0.txt:line1"))
0.40.13 by Parth Malwankar
added tests for -R and -i
128
129
    def test_versioned_file_in_dir_recurse(self):
130
        """should find pattern in hierarchy with -R"""
131
        wd = 'foobar0'
132
        self.make_branch_and_tree(wd)
133
        os.chdir(wd)
134
        self._mk_versioned_dir('dir0')
135
        self._mk_versioned_file('dir0/file0.txt')
136
        out, err = self.run_bzr(['grep', '-R', 'line1'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
137
        self.assertTrue(self._str_contains(out, "^dir0/file0.txt:line1"))
0.40.24 by Parth Malwankar
added support for --line-number.
138
        out, err = self.run_bzr(['grep', '--recursive', 'line1'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
139
        self.assertTrue(self._str_contains(out, "^dir0/file0.txt:line1"))
0.40.23 by Parth Malwankar
added test case for search while inside dir.
140
141
    def test_versioned_file_within_dir(self):
142
        """search for pattern while in nested dir"""
143
        wd = 'foobar0'
144
        self.make_branch_and_tree(wd)
145
        os.chdir(wd)
146
        self._mk_versioned_dir('dir0')
147
        self._mk_versioned_file('dir0/file0.txt')
148
        os.chdir('dir0')
149
        out, err = self.run_bzr(['grep', 'line1'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
150
        self.assertTrue(self._str_contains(out, "^file0.txt:line1"))
0.40.13 by Parth Malwankar
added tests for -R and -i
151
0.40.41 by Parth Malwankar
added test for dir arg provided by user
152
    def test_versioned_files_from_outside_dir(self):
153
        """grep for pattern with dirs passed as argument"""
154
        wd = 'foobar0'
155
        self.make_branch_and_tree(wd)
156
        os.chdir(wd)
157
158
        self._mk_versioned_dir('dir0')
159
        self._mk_versioned_file('dir0/file0.txt')
160
161
        self._mk_versioned_dir('dir1')
162
        self._mk_versioned_file('dir1/file1.txt')
163
164
        out, err = self.run_bzr(['grep', 'line1', 'dir0', 'dir1'])
0.40.44 by Parth Malwankar
improved display of path when dir is given as argument
165
        self.assertTrue(self._str_contains(out, "^dir0/file0.txt:line1"))
166
        self.assertTrue(self._str_contains(out, "^dir1/file1.txt:line1"))
167
0.40.45 by Parth Malwankar
fixed case where only revno:0 is present. added test.
168
    def test_versioned_files_from_outside_dir(self):
169
        """grep for pattern with dirs passed as argument"""
170
        wd = 'foobar0'
171
        self.make_branch_and_tree(wd)
172
        os.chdir(wd)
173
174
        self._mk_versioned_dir('dir0')
175
        self._mk_versioned_file('dir0/file0.txt')
176
177
        self._mk_versioned_dir('dir1')
178
        self._mk_versioned_file('dir1/file1.txt')
179
180
        out, err = self.run_bzr(['grep', 'line1', 'dir0', 'dir1'])
181
        self.assertTrue(self._str_contains(out, "^dir0/file0.txt:line1"))
182
        self.assertTrue(self._str_contains(out, "^dir1/file1.txt:line1"))
0.40.44 by Parth Malwankar
improved display of path when dir is given as argument
183
184
    def test_versioned_files_from_outside_two_dirs(self):
185
        """grep for pattern with two levels of nested dir"""
186
        wd = 'foobar0'
187
        self.make_branch_and_tree(wd)
188
        os.chdir(wd)
189
190
        self._mk_versioned_dir('dir0')
191
        self._mk_versioned_file('dir0/file0.txt')
192
193
        self._mk_versioned_dir('dir1')
194
        self._mk_versioned_file('dir1/file1.txt')
195
196
        self._mk_versioned_dir('dir0/dir00')
197
        self._mk_versioned_file('dir0/dir00/file0.txt')
198
199
        out, err = self.run_bzr(['grep', 'line1', 'dir0/dir00'])
200
        self.assertTrue(self._str_contains(out, "^dir0/dir00/file0.txt:line1"))
201
202
        out, err = self.run_bzr(['grep', '-R', 'line1'])
203
        self.assertTrue(self._str_contains(out, "^dir0/dir00/file0.txt:line1"))
0.40.41 by Parth Malwankar
added test for dir arg provided by user
204
0.40.25 by Parth Malwankar
added test case for multilevel dir.
205
    def test_versioned_file_within_dir_two_levels(self):
206
        """search for pattern while in nested dir (two levels)"""
207
        wd = 'foobar0'
208
        self.make_branch_and_tree(wd)
209
        os.chdir(wd)
210
        self._mk_versioned_dir('dir0')
211
        self._mk_versioned_dir('dir0/dir1')
212
        self._mk_versioned_file('dir0/dir1/file0.txt')
213
        os.chdir('dir0')
214
        out, err = self.run_bzr(['grep', '-R', 'line1'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
215
        self.assertTrue(self._str_contains(out, "^dir1/file0.txt:line1"))
0.40.25 by Parth Malwankar
added test case for multilevel dir.
216
        out, err = self.run_bzr(['grep', '--from-root', 'line1'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
217
        self.assertTrue(self._str_contains(out, "^dir0/dir1/file0.txt:line1"))
0.40.25 by Parth Malwankar
added test case for multilevel dir.
218
        out, err = self.run_bzr(['grep', 'line1'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
219
        self.assertFalse(self._str_contains(out, "file0.txt"))
0.40.25 by Parth Malwankar
added test case for multilevel dir.
220
0.40.13 by Parth Malwankar
added tests for -R and -i
221
    def test_ignore_case_no_match(self):
222
        """match fails without --ignore-case"""
223
        wd = 'foobar0'
224
        self.make_branch_and_tree(wd)
225
        os.chdir(wd)
226
        self._mk_versioned_file('file0.txt')
227
        out, err = self.run_bzr(['grep', 'LinE1', 'file0.txt'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
228
        self.assertFalse(self._str_contains(out, "file0.txt:line1"))
0.40.13 by Parth Malwankar
added tests for -R and -i
229
230
    def test_ignore_case_match(self):
231
        """match fails without --ignore-case"""
232
        wd = 'foobar0'
233
        self.make_branch_and_tree(wd)
234
        os.chdir(wd)
235
        self._mk_versioned_file('file0.txt')
236
        out, err = self.run_bzr(['grep', '-i', 'LinE1', 'file0.txt'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
237
        self.assertTrue(self._str_contains(out, "file0.txt:line1"))
0.40.24 by Parth Malwankar
added support for --line-number.
238
        out, err = self.run_bzr(['grep', '--ignore-case', 'LinE1', 'file0.txt'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
239
        self.assertTrue(self._str_contains(out, "^file0.txt:line1"))
0.40.13 by Parth Malwankar
added tests for -R and -i
240
0.40.15 by Parth Malwankar
some fixes and test updates
241
    def test_from_root_fail(self):
0.40.14 by Parth Malwankar
added test for --from-root
242
        """match should fail without --from-root"""
243
        wd = 'foobar0'
244
        self.make_branch_and_tree(wd)
245
        os.chdir(wd)
246
        self._mk_versioned_file('file0.txt')
247
        self._mk_versioned_dir('dir0')
248
        os.chdir('dir0')
249
        out, err = self.run_bzr(['grep', 'line1'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
250
        self.assertFalse(self._str_contains(out, ".*file0.txt:line1"))
0.40.14 by Parth Malwankar
added test for --from-root
251
0.40.15 by Parth Malwankar
some fixes and test updates
252
    def test_from_root_pass(self):
0.40.14 by Parth Malwankar
added test for --from-root
253
        """match pass with --from-root"""
254
        wd = 'foobar0'
255
        self.make_branch_and_tree(wd)
256
        os.chdir(wd)
257
        self._mk_versioned_file('file0.txt')
258
        self._mk_versioned_dir('dir0')
259
        os.chdir('dir0')
260
        out, err = self.run_bzr(['grep', '--from-root', 'line1'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
261
        self.assertTrue(self._str_contains(out, ".*file0.txt:line1"))
0.40.24 by Parth Malwankar
added support for --line-number.
262
263
    def test_with_line_number(self):
264
        """search for pattern with --line-number"""
265
        wd = 'foobar0'
266
        self.make_branch_and_tree(wd)
267
        os.chdir(wd)
268
        self._mk_versioned_file('file0.txt')
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
269
0.40.24 by Parth Malwankar
added support for --line-number.
270
        out, err = self.run_bzr(['grep', '--line-number', 'line3', 'file0.txt'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
271
        self.assertTrue(self._str_contains(out, "file0.txt:3:line3"))
272
0.40.24 by Parth Malwankar
added support for --line-number.
273
        out, err = self.run_bzr(['grep', '-n', 'line1', 'file0.txt'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
274
        self.assertTrue(self._str_contains(out, "file0.txt:1:line1"))
0.40.14 by Parth Malwankar
added test for --from-root
275
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
276
    def test_revno_basic_history_grep_file(self):
0.40.34 by Parth Malwankar
added tests for single revision history search
277
        """search for pattern in specific revision number in a file"""
278
        wd = 'foobar0'
279
        fname = 'file0.txt'
280
        self.make_branch_and_tree(wd)
281
        os.chdir(wd)
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
282
        self._mk_versioned_file(fname, total_lines=0)
0.40.34 by Parth Malwankar
added tests for single revision history search
283
        self._update_file(fname, text="v2 text\n")
284
        self._update_file(fname, text="v3 text\n")
285
        self._update_file(fname, text="v4 text\n")
286
287
        # rev 2 should not have text 'v3'
288
        out, err = self.run_bzr(['grep', '-r', '2', 'v3', fname])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
289
        self.assertFalse(self._str_contains(out, "file0.txt"))
0.40.34 by Parth Malwankar
added tests for single revision history search
290
291
        # rev 3 should not have text 'v3'
292
        out, err = self.run_bzr(['grep', '-r', '3', 'v3', fname])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
293
        self.assertTrue(self._str_contains(out, "file0.txt~3:v3.*"))
0.40.34 by Parth Malwankar
added tests for single revision history search
294
295
        # rev 3 should not have text 'v3' with line number
296
        out, err = self.run_bzr(['grep', '-r', '3', '-n', 'v3', fname])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
297
        self.assertTrue(self._str_contains(out, "file0.txt~3:2:v3.*"))
0.40.34 by Parth Malwankar
added tests for single revision history search
298
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
299
    def test_revno_basic_history_grep_full(self):
0.40.34 by Parth Malwankar
added tests for single revision history search
300
        """search for pattern in specific revision number in a file"""
301
        wd = 'foobar0'
302
        fname = 'file0.txt'
303
        self.make_branch_and_tree(wd)
304
        os.chdir(wd)
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
305
        self._mk_versioned_file(fname, total_lines=0) # rev1
306
        self._mk_versioned_file('file1.txt')          # rev2
307
        self._update_file(fname, text="v3 text\n")    # rev3
308
        self._update_file(fname, text="v4 text\n")    # rev4
309
        self._update_file(fname, text="v5 text\n")    # rev5
0.40.34 by Parth Malwankar
added tests for single revision history search
310
311
        # rev 2 should not have text 'v3'
312
        out, err = self.run_bzr(['grep', '-r', '2', 'v3'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
313
        self.assertFalse(self._str_contains(out, "file0.txt"))
0.40.34 by Parth Malwankar
added tests for single revision history search
314
315
        # rev 3 should not have text 'v3'
316
        out, err = self.run_bzr(['grep', '-r', '3', 'v3'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
317
        self.assertTrue(self._str_contains(out, "file0.txt~3:v3"))
0.40.34 by Parth Malwankar
added tests for single revision history search
318
319
        # rev 3 should not have text 'v3' with line number
320
        out, err = self.run_bzr(['grep', '-r', '3', '-n', 'v3'])
0.40.35 by Parth Malwankar
fixed asserts and added test for revno based grep
321
        self.assertTrue(self._str_contains(out, "file0.txt~3:1:v3"))
322
323
    def test_revno_versioned_file_in_dir(self):
324
        """we create a file 'foobar0/dir0/file0.txt' and grep specific version of content"""
325
        wd = 'foobar0'
326
        self.make_branch_and_tree(wd)
327
        os.chdir(wd)
328
        self._mk_versioned_dir('dir0')                      # rev1
329
        self._mk_versioned_file('dir0/file0.txt')           # rev2
330
        self._update_file('dir0/file0.txt', "v3 text\n")    # rev3
331
        self._update_file('dir0/file0.txt', "v4 text\n")    # rev4
332
        self._update_file('dir0/file0.txt', "v5 text\n")    # rev5
333
334
        # v4 should not be present in revno 3
335
        out, err = self.run_bzr(['grep', '-r', 'last:3', '-R', 'v4'])
336
        self.assertFalse(self._str_contains(out, "^dir0/file0.txt"))
337
338
        # v4 should be present in revno 4
339
        out, err = self.run_bzr(['grep', '-r', 'last:2', '-R', 'v4'])
340
        self.assertTrue(self._str_contains(out, "^dir0/file0.txt~4:v4"))
341
0.40.38 by Parth Malwankar
added --levels options. added tests for range search.
342
    def test_revno_range_basic_history_grep(self):
343
        """search for pattern in revision range for file"""
344
        wd = 'foobar0'
345
        fname = 'file0.txt'
346
        self.make_branch_and_tree(wd)
347
        os.chdir(wd)
348
        self._mk_versioned_file(fname, total_lines=0) # rev1
349
        self._mk_versioned_file('file1.txt')          # rev2
350
        self._update_file(fname, text="v3 text\n")    # rev3
351
        self._update_file(fname, text="v4 text\n")    # rev4
352
        self._update_file(fname, text="v5 text\n")    # rev5
353
        self._update_file(fname, text="v6 text\n")    # rev6
354
355
        out, err = self.run_bzr(['grep', '-r', '1..', 'v3'])
356
        self.assertTrue(self._str_contains(out, "file0.txt~3:v3"))
357
        self.assertTrue(self._str_contains(out, "file0.txt~4:v3"))
358
        self.assertTrue(self._str_contains(out, "file0.txt~5:v3"))
359
360
        out, err = self.run_bzr(['grep', '-r', '1..5', 'v3'])
361
        self.assertTrue(self._str_contains(out, "file0.txt~3:v3"))
362
        self.assertTrue(self._str_contains(out, "file0.txt~4:v3"))
363
        self.assertTrue(self._str_contains(out, "file0.txt~5:v3"))
364
        self.assertFalse(self._str_contains(out, "file0.txt~6:v3"))
365
366
    def test_revno_range_versioned_file_in_dir(self):
367
        """we create a file 'foobar0/dir0/file0.txt' and grep rev-range for pattern"""
368
        wd = 'foobar0'
369
        self.make_branch_and_tree(wd)
370
        os.chdir(wd)
371
        self._mk_versioned_dir('dir0')                      # rev1
372
        self._mk_versioned_file('dir0/file0.txt')           # rev2
373
        self._update_file('dir0/file0.txt', "v3 text\n")    # rev3
374
        self._update_file('dir0/file0.txt', "v4 text\n")    # rev4
375
        self._update_file('dir0/file0.txt', "v5 text\n")    # rev5
376
        self._update_file('dir0/file0.txt', "v6 text\n")    # rev6
377
378
        out, err = self.run_bzr(['grep', '-R', '-r', '2..5', 'v3'])
379
        self.assertTrue(self._str_contains(out, "^dir0/file0.txt~3:v3"))
380
        self.assertTrue(self._str_contains(out, "^dir0/file0.txt~4:v3"))
381
        self.assertTrue(self._str_contains(out, "^dir0/file0.txt~5:v3"))
382
        self.assertFalse(self._str_contains(out, "^dir0/file0.txt~6:v3"))
383
384
    def test_revno_range_versioned_file_from_outside_dir(self):
385
        """grep rev-range for pattern from outside dir"""
386
        wd = 'foobar0'
387
        self.make_branch_and_tree(wd)
388
        os.chdir(wd)
389
        self._mk_versioned_dir('dir0')                      # rev1
390
        self._mk_versioned_file('dir0/file0.txt')           # rev2
391
        self._update_file('dir0/file0.txt', "v3 text\n")    # rev3
392
        self._update_file('dir0/file0.txt', "v4 text\n")    # rev4
393
        self._update_file('dir0/file0.txt', "v5 text\n")    # rev5
394
        self._update_file('dir0/file0.txt', "v6 text\n")    # rev6
395
396
        out, err = self.run_bzr(['grep', '-r', '2..5', 'v3', 'dir0'])
0.40.44 by Parth Malwankar
improved display of path when dir is given as argument
397
        self.assertTrue(self._str_contains(out, "^dir0/file0.txt~3:v3"))
398
        self.assertTrue(self._str_contains(out, "^dir0/file0.txt~4:v3"))
399
        self.assertTrue(self._str_contains(out, "^dir0/file0.txt~5:v3"))
400
        self.assertFalse(self._str_contains(out, "^dir0/file0.txt~6:v3"))
0.40.13 by Parth Malwankar
added tests for -R and -i
401
0.40.46 by Parth Malwankar
--levels=0 now implicitly prints revnos. added test for --levels=0.
402
    def test_levels(self):
403
        """levels=0 should show findings from merged revision"""
404
        wd0 = 'foobar0'
405
        wd1 = 'foobar1'
406
407
        self.make_branch_and_tree(wd0)
408
        os.chdir(wd0)
409
        self._mk_versioned_file('file0.txt')
410
        os.chdir('..')
411
412
        out, err = self.run_bzr(['branch', wd0, wd1])
413
        os.chdir(wd1)
414
        self._mk_versioned_file('file1.txt')
415
        os.chdir(osutils.pathjoin('..', wd0))
416
417
        out, err = self.run_bzr(['merge', osutils.pathjoin('..', wd1)])
418
        out, err = self.run_bzr(['ci', '-m', 'merged'])
419
420
        out, err = self.run_bzr(['grep', 'line1'])
421
        self.assertTrue(self._str_contains(out, "file0.txt:line1"))
422
        self.assertTrue(self._str_contains(out, "file1.txt:line1"))
423
424
        out, err = self.run_bzr(['grep', '--levels=0', 'line1'])
425
        self.assertTrue(self._str_contains(out, "file0.txt~2:line1"))
426
        self.assertTrue(self._str_contains(out, "file1.txt~2:line1"))
427
        self.assertTrue(self._str_contains(out, "file0.txt~1.1.1:line1"))
428
        self.assertTrue(self._str_contains(out, "file1.txt~1.1.1:line1"))
429
430
        out, err = self.run_bzr(['grep', '-n', '--levels=0', 'line1'])
431
        self.assertTrue(self._str_contains(out, "file0.txt~2:1:line1"))
432
        self.assertTrue(self._str_contains(out, "file1.txt~2:1:line1"))
433
        self.assertTrue(self._str_contains(out, "file0.txt~1.1.1:1:line1"))
434
        self.assertTrue(self._str_contains(out, "file1.txt~1.1.1:1:line1"))
435
0.40.47 by Parth Malwankar
fixes bug #531336. binary files are now skipped.
436
    def test_binary_file_grep(self):
437
        """grep for pattern in binary file"""
438
        wd = 'foobar0'
439
        self.make_branch_and_tree(wd)
440
        os.chdir(wd)
441
        self._mk_versioned_file('file0.txt')
442
        self._update_file('file0.txt', "\x00lineNN\x00\n")
443
        out, err = self.run_bzr(['grep', 'lineNN', 'file0.txt'])
444
        self.assertFalse(self._str_contains(out, "file0.txt:line1"))
445
        self.assertTrue(self._str_contains(err, "Binary file.*file0.txt.*skipped"))
446
447