~bzr/ubuntu/lucid/bzr/beta-ppa

« back to all changes in this revision

Viewing changes to bzrlib/tests/per_workingtree/test_views.py

  • Committer: Martin Pool
  • Date: 2010-07-02 07:29:40 UTC
  • mfrom: (129.1.7 packaging-karmic)
  • Revision ID: mbp@sourcefrog.net-20100702072940-hpzq5elg8wjve8rh
* PPA rebuild.
* PPA rebuild for Karmic.
* PPA rebuild for Jaunty.
* PPA rebuild for Hardy.
* From postinst, actually remove the example bash completion scripts.
  (LP: #249452)
* New upstream release.
* New upstream release.
* New upstream release.
* Revert change to Build-depends: Dapper does not have python-central.
  Should be python-support..
* Target ppa..
* Target ppa..
* Target ppa..
* Target ppa..
* New upstream release.
* Switch to dpkg-source 3.0 (quilt) format.
* Bump standards version to 3.8.4.
* Remove embedded copy of python-configobj. Closes: #555336
* Remove embedded copy of python-elementtree. Closes: #555343
* Change section from 'Devel' to 'Vcs'..
* Change section from 'Devel' to 'Vcs'..
* Change section from 'Devel' to 'Vcs'..
* Change section from 'Devel' to 'Vcs'..
* Change section from 'Devel' to 'Vcs'..
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* debian/control: Fix obsolete-relation-form-in-source
  lintian warning. 
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Split out docs into bzr-doc package.
* New upstream release.
* Added John Francesco Ferlito to Uploaders.
* Fix install path to quick-reference guide
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Fix FTBFS due to path changes, again.
* Fix FTBFS due to doc paths changing
* New upstream release.
* Fix FTBFS due to path changes, again.
* Fix FTBFS due to doc paths changing
* New upstream release.
* Fix FTBFS due to path changes, again.
* Fix FTBFS due to doc paths changing
* New upstream release.
* Fix FTBFS due to path changes, again, again.
* Fix FTBFS due to path changes, again.
* Fix FTBFS due to path changes.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Bump standards version to 3.8.3.
* Remove unused patch system.
* New upstream release.
* New upstream release.
* New upstream release.
* Fix copy and paste tab error in .install file
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
 + Fixes compatibility with Python 2.4. Closes: #537708
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream version.
* Bump standards version to 3.8.2.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Add python-pyrex to build-deps to ensure C extensions are always build.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Split documentation into bzr-doc package. ((LP: #385074)
* Multiple packaging changes to make us more linitan clean.
* New upstream release.
* Split documentation into bzr-doc package. ((LP: #385074)
* Multiple packaging changes to make us more linitan clean.
* New upstream release.
* Split documentation into bzr-doc package. ((LP: #385074)
* Multiple packaging changes to make us more linitan clean.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Fix API compatibility version. (Closes: #526233)
* New upstream release.
  + Fixes default format for upgrade command. (Closes: #464688)
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Add missing dependency on zlib development library. (Closes:
  #523595)
* Add zlib build-depends.
* Add zlib build-depends.
* Add zlib build-depends.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Move to section vcs.
* Bump standards version to 3.8.1.
* New upstream release.
* Remove temporary patch for missing .c files from distribution
* New upstream release.
* Remove temporary patch for missing .c files from distribution
* New upstream release.
* Remove temporary patch for missing .c files from distribution
* Add temporary patch for missing .c files from distribution
* Add temporary patch for missing .c files from distribution
* Add temporary patch for missing .c files from distribution
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Recommend ca-certificates. (Closes: #452024)
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Update watch file. bazaar now uses launchpad to host its sources.
* Remove patch for inventory root revision copy, applied upstream.
* New upstream release.
* New upstream release.
* New upstream release
* Force removal of files installed in error to /etc/bash_completion.d/
  (LP: #249452)
* New upstream release.
* New upstream release
* New upstream release.
* Bump standards version.
* Include patch for inventory root revision copy, required for bzr-svn.
* New upstream release.
* Remove unused lintian overrides.
* Correct the package version not to be native.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Final 1.5 release.
* New upstream release.
* New upstream release.
* New upstream release.
* Add myself as a co-maintainer.
* Add a Dm-Upload-Allowed: yes header.
* New upstream bugfix release.
* New upstream release.
* Final 1.3 release.
* New upstream release.
* First release candidate of the upcoming 1.3 release.
* Rebuild to fix the problem caused by a build with a broken python-central.
* New upstream release.
* Rebuild for dapper PPA.
* Apply Lamont's patches to fix build-dependencies on dapper.
  (See: https://bugs.launchpad.net/bzr/+bug/189915)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2008 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
"""Views stored within a working tree.
 
18
 
 
19
The views are actually in the WorkingTree.views namespace, but these are
 
20
1:1 with WorkingTree implementations so can be tested from here.
 
21
"""
 
22
 
 
23
 
 
24
from bzrlib import views, errors
 
25
from bzrlib.tests import TestSkipped
 
26
from bzrlib.workingtree import WorkingTree
 
27
 
 
28
from bzrlib.tests.per_workingtree import TestCaseWithWorkingTree
 
29
 
 
30
 
 
31
class TestTreeViews(TestCaseWithWorkingTree):
 
32
 
 
33
    def setUp(self):
 
34
        # formats that don't support views can skip the rest of these
 
35
        # tests...
 
36
        fmt = self.workingtree_format
 
37
        f = getattr(fmt, 'supports_views')
 
38
        if f is None:
 
39
            raise TestSkipped("format %s doesn't declare whether it "
 
40
                "supports views, assuming not" % fmt)
 
41
        if not f():
 
42
            raise TestSkipped("format %s doesn't support views" % fmt)
 
43
        TestCaseWithWorkingTree.setUp(self)
 
44
 
 
45
    def test_views_initially_empty(self):
 
46
        wt = self.make_branch_and_tree('wt')
 
47
        current, views = wt.views.get_view_info()
 
48
        self.assertEqual(None, current)
 
49
        self.assertEqual({}, views)
 
50
 
 
51
    def test_set_and_get_view_info(self):
 
52
        wt = self.make_branch_and_tree('wt')
 
53
        view_current = 'view-name'
 
54
        view_dict = {
 
55
            view_current: ['dir-1'],
 
56
            'other-name': ['dir-2']}
 
57
        wt.views.set_view_info(view_current, view_dict)
 
58
        current, views = wt.views.get_view_info()
 
59
        self.assertEquals(view_current, current)
 
60
        self.assertEquals(view_dict, views)
 
61
        # then reopen the tree and see they're still there
 
62
        wt = WorkingTree.open('wt')
 
63
        current, views = wt.views.get_view_info()
 
64
        self.assertEquals(view_current, current)
 
65
        self.assertEquals(view_dict, views)
 
66
        # test setting a current view which does not exist
 
67
        self.assertRaises(errors.NoSuchView,
 
68
            wt.views.set_view_info, 'yet-another', view_dict)
 
69
        current, views = wt.views.get_view_info()
 
70
        self.assertEquals(view_current, current)
 
71
        self.assertEquals(view_dict, views)
 
72
        # test clearing the current view
 
73
        wt.views.set_view_info(None, view_dict)
 
74
        current, views = wt.views.get_view_info()
 
75
        self.assertEquals(None, current)
 
76
        self.assertEquals(view_dict, views)
 
77
 
 
78
    def test_lookup_view(self):
 
79
        wt = self.make_branch_and_tree('wt')
 
80
        view_current = 'view-name'
 
81
        view_dict = {
 
82
            view_current: ['dir-1'],
 
83
            'other-name': ['dir-2']}
 
84
        wt.views.set_view_info(view_current, view_dict)
 
85
        # test lookup of the default view
 
86
        result = wt.views.lookup_view()
 
87
        self.assertEqual(result, ['dir-1'])
 
88
        # test lookup of a named view
 
89
        result = wt.views.lookup_view('other-name')
 
90
        self.assertEqual(result, ['dir-2'])
 
91
 
 
92
    def test_set_view(self):
 
93
        wt = self.make_branch_and_tree('wt')
 
94
        # test that set_view sets the current view by default
 
95
        wt.views.set_view('view-1', ['dir-1'])
 
96
        current, views = wt.views.get_view_info()
 
97
        self.assertEquals('view-1', current)
 
98
        self.assertEquals({'view-1': ['dir-1']}, views)
 
99
        # test adding a view and not making it the current one
 
100
        wt.views.set_view('view-2', ['dir-2'], make_current=False)
 
101
        current, views = wt.views.get_view_info()
 
102
        self.assertEquals('view-1', current)
 
103
        self.assertEquals({'view-1': ['dir-1'], 'view-2': ['dir-2']}, views)
 
104
 
 
105
    def test_unicode_view(self):
 
106
        wt = self.make_branch_and_tree('wt')
 
107
        view_name = u'\u3070'
 
108
        view_files = ['foo', 'bar/']
 
109
        view_dict = {view_name: view_files}
 
110
        wt.views.set_view_info(view_name, view_dict)
 
111
        current, views = wt.views.get_view_info()
 
112
        self.assertEquals(view_name, current)
 
113
        self.assertEquals(view_dict, views)
 
114
 
 
115
    def test_no_such_view(self):
 
116
        wt = self.make_branch_and_tree('wt')
 
117
        try:
 
118
            wt.views.lookup_view('opaque')
 
119
        except errors.NoSuchView, e:
 
120
            self.assertEquals(e.view_name, 'opaque')
 
121
            self.assertEquals(str(e), 'No such view: opaque.')
 
122
        else:
 
123
            self.fail("didn't get expected exception")
 
124
 
 
125
    def test_delete_view(self):
 
126
        wt = self.make_branch_and_tree('wt')
 
127
        view_name = u'\N{GREEK SMALL LETTER ALPHA}'
 
128
        view_files = ['alphas/']
 
129
        wt.views.set_view(view_name, view_files)
 
130
        # now try to delete it
 
131
        wt.views.delete_view(view_name)
 
132
        # now you can't look it up
 
133
        self.assertRaises(errors.NoSuchView,
 
134
            wt.views.lookup_view, view_name)
 
135
        # and it's not in the dictionary
 
136
        self.assertEquals(wt.views.get_view_info()[1], {})
 
137
        # and you can't remove it a second time
 
138
        self.assertRaises(errors.NoSuchView,
 
139
            wt.views.delete_view, view_name)
 
140
        # or remove a view that never existed
 
141
        self.assertRaises(errors.NoSuchView,
 
142
            wt.views.delete_view, view_name + '2')
 
143
 
 
144
    def test_check_path_in_view(self):
 
145
        wt = self.make_branch_and_tree('wt')
 
146
        view_current = 'view-name'
 
147
        view_dict = {
 
148
            view_current: ['dir-1'],
 
149
            'other-name': ['dir-2']}
 
150
        wt.views.set_view_info(view_current, view_dict)
 
151
        self.assertEqual(views.check_path_in_view(wt, 'dir-1'), None)
 
152
        self.assertEqual(views.check_path_in_view(wt, 'dir-1/sub'), None)
 
153
        self.assertRaises(errors.FileOutsideView,
 
154
                          views.check_path_in_view, wt, 'dir-2')
 
155
        self.assertRaises(errors.FileOutsideView,
 
156
                          views.check_path_in_view, wt, 'dir-2/sub')
 
157
        self.assertRaises(errors.FileOutsideView,
 
158
                          views.check_path_in_view, wt, 'other')
 
159
 
 
160
 
 
161
class TestUnsupportedViews(TestCaseWithWorkingTree):
 
162
    """Formats that don't support views should give reasonable errors."""
 
163
 
 
164
    def setUp(self):
 
165
        fmt = self.workingtree_format
 
166
        supported = getattr(fmt, 'supports_views')
 
167
        if supported is None:
 
168
            warn("Format %s doesn't declare whether it supports views or not"
 
169
                 % fmt)
 
170
            raise TestSkipped('No view support at all')
 
171
        if supported():
 
172
            raise TestSkipped("Format %s declares that views are supported"
 
173
                              % fmt)
 
174
            # it's covered by TestTreeViews
 
175
        TestCaseWithWorkingTree.setUp(self)
 
176
 
 
177
    def test_view_methods_raise(self):
 
178
        wt = self.make_branch_and_tree('wt')
 
179
        self.assertRaises(errors.ViewsNotSupported,
 
180
                wt.views.set_view_info, 'bar', {'bar': ['bars/']})
 
181
        self.assertRaises(errors.ViewsNotSupported,
 
182
                wt.views.get_view_info)
 
183
        self.assertRaises(errors.ViewsNotSupported,
 
184
            wt.views.lookup_view, 'foo')
 
185
        self.assertRaises(errors.ViewsNotSupported,
 
186
            wt.views.set_view, 'foo', 'bar')
 
187
        self.assertRaises(errors.ViewsNotSupported,
 
188
            wt.views.delete_view, 'foo')