~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_log.py

  • Committer: John Arbash Meinel
  • Date: 2006-01-23 22:33:23 UTC
  • mto: This revision was merged to the branch mainline in revision 1551.
  • Revision ID: john@arbash-meinel.com-20060123223323-16eb865383bf650a
From Jari Alto: Makefile fixes (clean target error suppression)

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
import os
 
18
from cStringIO import StringIO
18
19
 
19
 
from bzrlib.selftest import BzrTestBase
20
 
from bzrlib.log import LogFormatter, show_log, LongLogFormatter
 
20
from bzrlib.tests import BzrTestBase, TestCaseInTempDir
 
21
from bzrlib.log import LogFormatter, show_log, LongLogFormatter, ShortLogFormatter
21
22
from bzrlib.branch import Branch
 
23
from bzrlib.errors import InvalidRevisionNumber
22
24
 
23
25
class _LogEntry(object):
24
26
    # should probably move into bzrlib.log?
47
49
        self.logs.append(le)
48
50
 
49
51
 
50
 
class SimpleLogTest(BzrTestBase):
 
52
class SimpleLogTest(TestCaseInTempDir):
51
53
 
52
54
    def checkDelta(self, delta, **kw):
53
55
        """Check the filenames touched by a delta are as expected."""
55
57
            expected = kw.get(n, [])
56
58
 
57
59
            # tests are written with unix paths; fix them up for windows
58
 
            if os.sep != '/':
59
 
                expected = [x.replace('/', os.sep) for x in expected]
 
60
            #if os.sep != '/':
 
61
            #    expected = [x.replace('/', os.sep) for x in expected]
60
62
 
61
63
            # strip out only the path components
62
64
            got = [x[0] for x in getattr(delta, n)]
63
65
            self.assertEquals(expected, got)
64
66
 
 
67
    def test_cur_revno(self):
 
68
        b = Branch(u'.', init=True)
 
69
 
 
70
        lf = LogCatcher()
 
71
        b.working_tree().commit('empty commit')
 
72
        show_log(b, lf, verbose=True, start_revision=1, end_revision=1)
 
73
        self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
 
74
                          start_revision=2, end_revision=1) 
 
75
        self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
 
76
                          start_revision=1, end_revision=2) 
 
77
        self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
 
78
                          start_revision=0, end_revision=2) 
 
79
        self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
 
80
                          start_revision=1, end_revision=0) 
 
81
        self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
 
82
                          start_revision=-1, end_revision=1) 
 
83
        self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
 
84
                          start_revision=1, end_revision=-1) 
 
85
 
 
86
    def test_cur_revno(self):
 
87
        b = Branch.initialize(u'.')
 
88
 
 
89
        lf = LogCatcher()
 
90
        b.working_tree().commit('empty commit')
 
91
        show_log(b, lf, verbose=True, start_revision=1, end_revision=1)
 
92
        self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
 
93
                          start_revision=2, end_revision=1) 
 
94
        self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
 
95
                          start_revision=1, end_revision=2) 
 
96
        self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
 
97
                          start_revision=0, end_revision=2) 
 
98
        self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
 
99
                          start_revision=1, end_revision=0) 
 
100
        self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
 
101
                          start_revision=-1, end_revision=1) 
 
102
        self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
 
103
                          start_revision=1, end_revision=-1) 
 
104
 
65
105
    def test_simple_log(self):
66
106
        eq = self.assertEquals
67
 
        ass = self.assert_
68
107
        
69
 
        b = Branch('.', init=True)
 
108
        b = Branch.initialize(u'.')
70
109
 
71
110
        lf = LogCatcher()
72
111
        show_log(b, lf)
73
112
        # no entries yet
74
113
        eq(lf.logs, [])
75
114
 
76
 
 
77
 
        b.commit('empty commit')
 
115
        b.working_tree().commit('empty commit')
78
116
        lf = LogCatcher()
79
117
        show_log(b, lf, verbose=True)
80
118
        eq(len(lf.logs), 1)
84
122
        self.log('log delta: %r' % d)
85
123
        self.checkDelta(d)
86
124
 
87
 
 
88
125
        self.build_tree(['hello'])
89
 
        b.add('hello')
90
 
        b.commit('add one file')
 
126
        b.working_tree().add('hello')
 
127
        b.working_tree().commit('add one file')
 
128
 
 
129
        lf = StringIO()
91
130
        # log using regular thing
92
 
        show_log(b, LongLogFormatter(self.TEST_LOG))
 
131
        show_log(b, LongLogFormatter(lf))
 
132
        lf.seek(0)
 
133
        for l in lf.readlines():
 
134
            self.log(l)
93
135
 
94
136
        # get log as data structure
95
137
        lf = LogCatcher()
107
149
        self.log('log 2 delta: %r' % d)
108
150
        # self.checkDelta(d, added=['hello'])
109
151
        
 
152
        # commit a log message with control characters
 
153
        msg = "All 8-bit chars: " +  ''.join([unichr(x) for x in range(256)])
 
154
        self.log("original commit message: %r", msg)
 
155
        b.working_tree().commit(msg)
 
156
        lf = LogCatcher()
 
157
        show_log(b, lf, verbose=True)
 
158
        committed_msg = lf.logs[0].rev.message
 
159
        self.log("escaped commit message: %r", committed_msg)
 
160
        self.assert_(msg != committed_msg)
 
161
        self.assert_(len(committed_msg) > len(msg))
 
162
 
 
163
        # Check that log message with only XML-valid characters isn't
 
164
        # escaped.  As ElementTree apparently does some kind of
 
165
        # newline conversion, neither LF (\x0A) nor CR (\x0D) are
 
166
        # included in the test commit message, even though they are
 
167
        # valid XML 1.0 characters.
 
168
        msg = "\x09" + ''.join([unichr(x) for x in range(0x20, 256)])
 
169
        self.log("original commit message: %r", msg)
 
170
        b.working_tree().commit(msg)
 
171
        lf = LogCatcher()
 
172
        show_log(b, lf, verbose=True)
 
173
        committed_msg = lf.logs[0].rev.message
 
174
        self.log("escaped commit message: %r", committed_msg)
 
175
        self.assert_(msg == committed_msg)
 
176
 
 
177
    def test_trailing_newlines(self):
 
178
        b = Branch.initialize(u'.')
 
179
        b.nick='test'
 
180
        wt = b.working_tree()
 
181
        open('a', 'wb').write('hello moto\n')
 
182
        wt.add('a')
 
183
        wt.commit('simple log message', rev_id='a1'
 
184
                , timestamp=1132586655.459960938, timezone=-6*3600
 
185
                , committer='Joe Foo <joe@foo.com>')
 
186
        open('b', 'wb').write('goodbye\n')
 
187
        wt.add('b')
 
188
        wt.commit('multiline\nlog\nmessage\n', rev_id='a2'
 
189
                , timestamp=1132586842.411175966, timezone=-6*3600
 
190
                , committer='Joe Foo <joe@foo.com>')
 
191
 
 
192
        open('c', 'wb').write('just another manic monday\n')
 
193
        wt.add('c')
 
194
        wt.commit('single line with trailing newline\n', rev_id='a3'
 
195
                , timestamp=1132587176.835228920, timezone=-6*3600
 
196
                , committer = 'Joe Foo <joe@foo.com>')
 
197
 
 
198
        sio = StringIO()
 
199
        lf = ShortLogFormatter(to_file=sio)
 
200
        show_log(b, lf)
 
201
        self.assertEquals(sio.getvalue(), """\
 
202
    3 Joe Foo\t2005-11-21
 
203
      single line with trailing newline
 
204
 
 
205
    2 Joe Foo\t2005-11-21
 
206
      multiline
 
207
      log
 
208
      message
 
209
 
 
210
    1 Joe Foo\t2005-11-21
 
211
      simple log message
 
212
 
 
213
""")
 
214
 
 
215
        sio = StringIO()
 
216
        lf = LongLogFormatter(to_file=sio)
 
217
        show_log(b, lf)
 
218
        self.assertEquals(sio.getvalue(), """\
 
219
------------------------------------------------------------
 
220
revno: 3
 
221
committer: Joe Foo <joe@foo.com>
 
222
branch nick: test
 
223
timestamp: Mon 2005-11-21 09:32:56 -0600
 
224
message:
 
225
  single line with trailing newline
 
226
------------------------------------------------------------
 
227
revno: 2
 
228
committer: Joe Foo <joe@foo.com>
 
229
branch nick: test
 
230
timestamp: Mon 2005-11-21 09:27:22 -0600
 
231
message:
 
232
  multiline
 
233
  log
 
234
  message
 
235
------------------------------------------------------------
 
236
revno: 1
 
237
committer: Joe Foo <joe@foo.com>
 
238
branch nick: test
 
239
timestamp: Mon 2005-11-21 09:24:15 -0600
 
240
message:
 
241
  simple log message
 
242
""")
 
243
        
 
244
    def test_verbose_log(self):
 
245
        """Verbose log includes changed files
 
246
        
 
247
        bug #4676
 
248
        """
 
249
        b = Branch.initialize(u'.')
 
250
        self.build_tree(['a'])
 
251
        wt = b.working_tree()
 
252
        wt.add('a')
 
253
        # XXX: why does a longer nick show up?
 
254
        b.nick = 'test_verbose_log'
 
255
        wt.commit(message='add a', 
 
256
                  timestamp=1132711707, 
 
257
                  timezone=36000,
 
258
                  committer='Lorem Ipsum <test@example.com>')
 
259
        logfile = file('out.tmp', 'w+')
 
260
        formatter = LongLogFormatter(to_file=logfile)
 
261
        show_log(b, formatter, verbose=True)
 
262
        logfile.flush()
 
263
        logfile.seek(0)
 
264
        log_contents = logfile.read()
 
265
        self.assertEqualDiff(log_contents, '''\
 
266
------------------------------------------------------------
 
267
revno: 1
 
268
committer: Lorem Ipsum <test@example.com>
 
269
branch nick: test_verbose_log
 
270
timestamp: Wed 2005-11-23 12:08:27 +1000
 
271
message:
 
272
  add a
 
273
added:
 
274
  a
 
275
''')