/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 bzrlib/selftest/whitebox.py

  • Committer: Martin Pool
  • Date: 2005-09-06 02:26:28 UTC
  • Revision ID: mbp@sourcefrog.net-20050906022628-66d65f0feb4a9e80
- implement version 5 xml storage, and tests

  This stores files identified by the version that introduced the 
  text, and the version that introduced the name.  Entry kinds are
  given by the xml tag not an explicit kind field.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#! /usr/bin/python
 
2
 
 
3
import os
 
4
import unittest
 
5
 
 
6
from bzrlib.selftest import TestCaseInTempDir, TestCase
 
7
from bzrlib.branch import ScratchBranch, Branch
 
8
from bzrlib.errors import NotBranchError, NotVersionedError
 
9
 
 
10
 
 
11
class TestBranch(TestCaseInTempDir):
 
12
 
 
13
    def test_unknowns(self):
 
14
        b = Branch('.', init=True)
 
15
 
 
16
        self.build_tree(['hello.txt',
 
17
                         'hello.txt~'])
 
18
 
 
19
        self.assertEquals(list(b.unknowns()),
 
20
                          ['hello.txt'])
 
21
 
 
22
    def test_no_changes(self):
 
23
        from bzrlib.errors import PointlessCommit
 
24
        
 
25
        b = Branch('.', init=True)
 
26
 
 
27
        self.build_tree(['hello.txt'])
 
28
 
 
29
        self.assertRaises(PointlessCommit,
 
30
                          b.commit,
 
31
                          'commit without adding',
 
32
                          allow_pointless=False)
 
33
 
 
34
        b.commit('commit pointless tree',
 
35
                 allow_pointless=True)
 
36
 
 
37
        b.add('hello.txt')
 
38
        
 
39
        b.commit('commit first added file',
 
40
                 allow_pointless=False)
 
41
        
 
42
        self.assertRaises(PointlessCommit,
 
43
                          b.commit,
 
44
                          'commit after adding file',
 
45
                          allow_pointless=False)
 
46
        
 
47
        b.commit('commit pointless revision with one file',
 
48
                 allow_pointless=True)
 
49
 
 
50
        b.add_pending_merge('mbp@892739123-2005-123123')
 
51
        b.commit('commit new merge with no text changes',
 
52
                 allow_pointless=False)
 
53
        
 
54
 
 
55
 
 
56
class TestRevisionId(TestCase):
 
57
    
 
58
    def test_validate_revision_id(self):
 
59
        from bzrlib.revision import validate_revision_id
 
60
        validate_revision_id('mbp@sourcefrog.net-20050311061123-96a255005c7c9dbe')
 
61
        self.assertRaises(ValueError,
 
62
                          validate_revision_id,
 
63
                          ' asdkjas')
 
64
        self.assertRaises(ValueError,
 
65
                          validate_revision_id,
 
66
                          'mbp@sourcefrog.net-20050311061123-96a255005c7c9dbe\n')
 
67
        self.assertRaises(ValueError,
 
68
                          validate_revision_id,
 
69
                          ' mbp@sourcefrog.net-20050311061123-96a255005c7c9dbe')
 
70
        self.assertRaises(ValueError,
 
71
                          validate_revision_id,
 
72
                          'Martin Pool <mbp@sourcefrog.net>-20050311061123-96a255005c7c9dbe')
 
73
 
 
74
 
 
75
class PendingMerges(TestCaseInTempDir):
 
76
 
 
77
    def test_pending_merges(self):
 
78
        """Tracking pending-merged revisions."""
 
79
        b = Branch('.', init=True)
 
80
 
 
81
        self.assertEquals(b.pending_merges(), [])
 
82
        b.add_pending_merge('foo@azkhazan-123123-abcabc')
 
83
        self.assertEquals(b.pending_merges(), ['foo@azkhazan-123123-abcabc'])
 
84
        b.add_pending_merge('foo@azkhazan-123123-abcabc')
 
85
        self.assertEquals(b.pending_merges(), ['foo@azkhazan-123123-abcabc'])
 
86
        b.add_pending_merge('wibble@fofof--20050401--1928390812')
 
87
        self.assertEquals(b.pending_merges(),
 
88
                          ['foo@azkhazan-123123-abcabc',
 
89
                           'wibble@fofof--20050401--1928390812'])
 
90
        b.commit("commit from base with two merges")
 
91
        rev = b.get_revision(b.revision_history()[0])
 
92
        self.assertEquals(len(rev.parents), 2)
 
93
        self.assertEquals(rev.parents[0].revision_id,
 
94
                          'foo@azkhazan-123123-abcabc')
 
95
        self.assertEquals(rev.parents[1].revision_id,
 
96
                           'wibble@fofof--20050401--1928390812')
 
97
        # list should be cleared when we do a commit
 
98
        self.assertEquals(b.pending_merges(), [])
 
99
        
 
100
    def test_revert(self):
 
101
        """Test selected-file revert"""
 
102
        b = Branch('.', init=True)
 
103
 
 
104
        self.build_tree(['hello.txt'])
 
105
        file('hello.txt', 'w').write('initial hello')
 
106
 
 
107
        self.assertRaises(NotVersionedError,
 
108
                          b.revert, ['hello.txt'])
 
109
        
 
110
        b.add(['hello.txt'])
 
111
        b.commit('create initial hello.txt')
 
112
 
 
113
        self.check_file_contents('hello.txt', 'initial hello')
 
114
        file('hello.txt', 'w').write('new hello')
 
115
        self.check_file_contents('hello.txt', 'new hello')
 
116
 
 
117
        # revert file modified since last revision
 
118
        b.revert(['hello.txt'])
 
119
        self.check_file_contents('hello.txt', 'initial hello')
 
120
        self.check_file_contents('hello.txt~', 'new hello')
 
121
 
 
122
        # reverting again clobbers the backup
 
123
        b.revert(['hello.txt'])
 
124
        self.check_file_contents('hello.txt', 'initial hello')
 
125
        self.check_file_contents('hello.txt~', 'initial hello')
 
126
 
 
127
    def test_rename_dirs(self):
 
128
        """Test renaming directories and the files within them."""
 
129
        b = Branch('.', init=True)
 
130
        self.build_tree(['dir/', 'dir/sub/', 'dir/sub/file'])
 
131
        b.add(['dir', 'dir/sub', 'dir/sub/file'])
 
132
 
 
133
        b.commit('create initial state')
 
134
 
 
135
        # TODO: lift out to a test helper that checks the shape of
 
136
        # an inventory
 
137
        
 
138
        revid = b.revision_history()[0]
 
139
        self.log('first revision_id is {%s}' % revid)
 
140
        
 
141
        inv = b.get_revision_inventory(revid)
 
142
        self.log('contents of inventory: %r' % inv.entries())
 
143
 
 
144
        self.check_inventory_shape(inv,
 
145
                                   ['dir', 'dir/sub', 'dir/sub/file'])
 
146
 
 
147
        b.rename_one('dir', 'newdir')
 
148
 
 
149
        self.check_inventory_shape(b.inventory,
 
150
                                   ['newdir', 'newdir/sub', 'newdir/sub/file'])
 
151
 
 
152
        b.rename_one('newdir/sub', 'newdir/newsub')
 
153
        self.check_inventory_shape(b.inventory,
 
154
                                   ['newdir', 'newdir/newsub',
 
155
                                    'newdir/newsub/file'])
 
156
 
 
157
    def test_relpath(self):
 
158
        """test for branch path lookups
 
159
    
 
160
        Branch.relpath and bzrlib.branch._relpath do a simple but subtle
 
161
        job: given a path (either relative to cwd or absolute), work out
 
162
        if it is inside a branch and return the path relative to the base.
 
163
        """
 
164
        from bzrlib.branch import _relpath
 
165
        import tempfile, shutil
 
166
        
 
167
        savedir = os.getcwdu()
 
168
        dtmp = tempfile.mkdtemp()
 
169
        # On Mac OSX, /tmp actually expands to /private/tmp
 
170
        dtmp = os.path.realpath(dtmp)
 
171
 
 
172
        def rp(p):
 
173
            return _relpath(dtmp, p)
 
174
        
 
175
        try:
 
176
            # check paths inside dtmp while standing outside it
 
177
            self.assertEqual(rp(os.path.join(dtmp, 'foo')), 'foo')
 
178
 
 
179
            # root = nothing
 
180
            self.assertEqual(rp(dtmp), '')
 
181
 
 
182
            self.assertRaises(NotBranchError,
 
183
                              rp,
 
184
                              '/etc')
 
185
 
 
186
            # now some near-miss operations -- note that
 
187
            # os.path.commonprefix gets these wrong!
 
188
            self.assertRaises(NotBranchError,
 
189
                              rp,
 
190
                              dtmp.rstrip('\\/') + '2')
 
191
 
 
192
            self.assertRaises(NotBranchError,
 
193
                              rp,
 
194
                              dtmp.rstrip('\\/') + '2/foo')
 
195
 
 
196
            # now operations based on relpath of files in current
 
197
            # directory, or nearby
 
198
            os.chdir(dtmp)
 
199
 
 
200
            self.assertEqual(rp('foo/bar/quux'), 'foo/bar/quux')
 
201
 
 
202
            self.assertEqual(rp('foo'), 'foo')
 
203
 
 
204
            self.assertEqual(rp('./foo'), 'foo')
 
205
 
 
206
            self.assertEqual(rp(os.path.abspath('foo')), 'foo')
 
207
 
 
208
            self.assertRaises(NotBranchError,
 
209
                              rp, '../foo')
 
210
 
 
211
        finally:
 
212
            os.chdir(savedir)
 
213
            shutil.rmtree(dtmp)