1
# Copyright (C) 2006 Canonical Ltd
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.
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.
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
17
"""Blackbox tests of 'bzr xmlls'"""
21
from bzrlib import ignores
22
from bzrlib.tests import TestCaseWithTransport
23
from bzrlib.xml_serializer import elementtree as elementtree
24
fromstring = elementtree.ElementTree.fromstring
27
class TestLSXML(TestCaseWithTransport):
30
super(TestLSXML, self).setUp()
32
# Create a simple branch that can be used in testing
33
ignores._set_user_ignores(['user-ignore'])
35
self.wt = self.make_branch_and_tree('.')
36
self.build_tree_contents([
37
('.bzrignore', '*.pyo\n'),
41
def run_xmlls(self, args=None):
45
out, err = self.run_bzr(command)
46
self.assertEqual('', err)
47
# parse the output and convert it into more usable structure:
48
# [ { 'kind': 'file, 'path': 'foo', ... }, ... ]
51
for item_elem in lst.findall('item'):
53
for attr in item_elem:
54
item[attr.tag] = attr.text
58
#def test_lsxml_null_verbose(self):
60
# self.run_bzr_error(['Cannot set both --verbose and --null'],
61
# 'xmlls --verbose --null')
63
def test_null_arg(self):
64
"""Test that null arg is accepted."""
65
command = 'xmlls --null'
66
out, err = self.run_bzr(command)
67
self.assertEqual('', err)
68
self.assertEqual(out[-2], '\0')
70
def test_lsxml_basic(self):
71
"""Test the abilities of 'bzr xmlls'"""
72
expected_items = [{'kind': 'file',
74
'status_kind': 'unknown'},
77
'status_kind': 'unknown'}]
78
self.assertEquals(expected_items, self.run_xmlls())
79
self.assertEquals(expected_items, self.run_xmlls('--unknown'))
80
self.assertEquals([], self.run_xmlls('--ignored'))
81
self.assertEquals([], self.run_xmlls('--versioned'))
82
self.assertEquals([], self.run_xmlls('-V'))
83
self.assertEquals(expected_items,
84
self.run_xmlls('--unknown --ignored --version'))
85
self.assertEquals(expected_items,
86
self.run_xmlls('--unknown --ignored -V'))
87
self.assertEquals([], self.run_xmlls('--ignored -V'))
89
def test_lsxml_added(self):
90
self.wt.add(['a'], ['a-id'])
91
expected_items = [{'kind': 'file',
93
'status_kind': 'unknown'},
97
'status_kind': 'versioned'}]
98
self.assertEquals(expected_items, self.run_xmlls())
100
self.wt.commit('add')
101
self.build_tree(['subdir/'])
102
expected_items = [{'kind': 'file',
103
'path': '.bzrignore',
104
'status_kind': 'unknown'},
108
'status_kind': 'versioned'},
109
{'kind': 'directory',
111
'status_kind': 'unknown'}]
112
self.assertEquals(expected_items, self.run_xmlls())
114
self.build_tree(['subdir/b'])
115
self.wt.add(['subdir/', 'subdir/b', '.bzrignore'],
116
['subdir-id', 'subdirb-id', 'bzrignore-id'])
117
expected_items = [{'id': 'bzrignore-id',
119
'path': '.bzrignore',
120
'status_kind': 'versioned'},
124
'status_kind': 'versioned'},
128
'status_kind': 'versioned'},
132
'status_kind': 'versioned'}]
133
self.assertEquals(expected_items, self.run_xmlls())
135
def test_lsxml_non_recursive(self):
136
self.build_tree(['subdir/', 'subdir/b'])
137
self.wt.add(['a', 'subdir/', 'subdir/b', '.bzrignore'],
138
['a-id', 'subdir-id', 'subdirb-id', 'bzrignore-id'])
139
expected_items = [{'id': 'bzrignore-id',
141
'path': '.bzrignore',
142
'status_kind': 'versioned'},
146
'status_kind': 'versioned'},
150
'status_kind': 'versioned'}]
151
self.assertEquals(expected_items, self.run_xmlls('--non-recursive'))
153
# Check what happens in a sub-directory
155
expcted_items = [{'id': 'subdirb-id',
158
'status_kind': 'versioned'}]
159
self.assertEquals(expcted_items, self.run_xmlls())
160
expcted_items = [{'id': 'subdirb-id',
163
'status_kind': 'versioned'}]
164
self.assertEquals(expcted_items, self.run_xmlls('--from-root'))
165
expected_items = [{'id': 'subdirb-id',
168
'status_kind': 'versioned'}]
169
self.assertEquals(expected_items,
170
self.run_xmlls('--from-root --non-recursive'))
172
def test_lsxml_path(self):
173
"""If a path is specified, files are listed with that prefix"""
174
self.build_tree(['subdir/', 'subdir/b'])
175
self.wt.add(['subdir', 'subdir/b'], ['subdir-id', 'subdirb-id'])
176
expected_items = [{'id': 'subdirb-id',
179
'status_kind': 'versioned'}]
180
self.assertEquals(expected_items, self.run_xmlls('subdir'))
182
# Check what happens in a sub-directory, referring to parent
184
expected_items = [{'kind': 'file',
185
'path': '../.bzrignore',
186
'status_kind': 'unknown'},
189
'status_kind': 'unknown'},
193
'status_kind': 'versioned'},
196
'path': '../subdir/b',
197
'status_kind': 'versioned'}]
198
self.assertEquals(expected_items, self.run_xmlls('..'))
199
self.run_bzr_error(['cannot specify both --from-root and PATH'],
200
'xmlls --from-root ..')
202
def test_lsxml_revision(self):
203
self.wt.add(['a'], ['a-id'])
204
self.wt.commit('add')
206
self.build_tree(['subdir/'])
208
# Check what happens when we supply a specific revision
209
expected_items = [{'id': 'a-id',
212
'status_kind': 'versioned'}]
213
self.assertEquals(expected_items, self.run_xmlls('--revision 1'))
216
self.assertEquals([], self.run_xmlls('--revision 1'))
218
def test_lsxml_branch(self):
219
"""If a branch is specified, files are listed from it"""
220
self.build_tree(['subdir/', 'subdir/b'])
221
self.wt.add(['subdir', 'subdir/b'], ['subdir-id', 'subdirb-id'])
222
self.wt.commit('committing')
223
branch = self.make_branch('branchdir')
224
branch.pull(self.wt.branch)
225
expected_items = [{'id': 'subdir-id',
227
'path': 'branchdir/subdir',
228
'status_kind': 'versioned'},
231
'path': 'branchdir/subdir/b',
232
'status_kind': 'versioned'}]
233
self.assertEquals(expected_items, self.run_xmlls('branchdir'))
234
self.assertEquals(expected_items,
235
self.run_xmlls('branchdir --revision 1'))
237
def test_lsxml_ignored(self):
238
# Now try to do ignored files.
239
self.wt.add(['a', '.bzrignore'], ['a-id', 'bzrignore-id'])
240
self.build_tree(['blah.py', 'blah.pyo', 'user-ignore'])
241
expected_items = [{'id': 'bzrignore-id',
243
'path': '.bzrignore',
244
'status_kind': 'versioned'},
248
'status_kind': 'versioned'},
251
'status_kind': 'unknown'},
254
'status_kind': 'ignored'},
256
'path': 'user-ignore',
257
'status_kind': 'ignored'}]
258
self.assertEquals(expected_items, self.run_xmlls())
259
expected_items = [{'kind': 'file',
262
'status_kind': 'ignored'},
264
'path': 'user-ignore',
265
'pattern': 'user-ignore',
266
'status_kind': 'ignored'}]
267
self.assertEquals(expected_items, self.run_xmlls('--ignored'))
268
expected_items = [{'kind': 'file',
270
'status_kind': 'unknown'}]
271
self.assertEquals(expected_items, self.run_xmlls('--unknown'))
272
expected_items = [{'id': 'bzrignore-id',
274
'path': '.bzrignore',
275
'status_kind': 'versioned'},
279
'status_kind': 'versioned'}]
280
self.assertEquals(expected_items, self.run_xmlls('--versioned'))
282
def test_lsxml_kinds(self):
283
self.build_tree(['subdir/'])
284
expected_items = [{'kind': 'file',
285
'path': '.bzrignore',
286
'status_kind': 'unknown'},
289
'status_kind': 'unknown'}]
290
self.assertEquals(expected_items, self.run_xmlls('--kind=file'))
291
expected_items = [{'kind': 'directory',
293
'status_kind': 'unknown'}]
294
self.assertEquals(expected_items, self.run_xmlls('--kind=directory'))
295
self.assertEquals([], self.run_xmlls('--kind=symlink'))
296
self.run_bzr_error(['invalid kind specified'], 'xmlls --kind=pile')
298
def test_lsxml_path_nonrecursive(self):
299
expected_items = [{'kind': 'file',
300
'path': '%s/.bzrignore' % self.test_dir,
301
'status_kind': 'unknown'},
303
'path': '%s/a' % self.test_dir,
304
'status_kind': 'unknown'}]
305
self.assertEquals(expected_items,
306
self.run_xmlls('%s --non-recursive' % self.test_dir))
308
def test_escape_id(self):
309
"""Test that the id is properly escaped."""
310
self.wt.add(['a'], ['Hola_<user@foobar>_Mundo'])
311
self.wt.commit('add')
313
self.build_tree(['subdir/'])
315
# Check what happens if the id contains <, @ and >
316
expected_items = [{'id': 'Hola_<user@foobar>_Mundo',
319
'status_kind': 'versioned'}]
320
self.assertEquals(expected_items, self.run_xmlls('--revision 1'))