15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
from cStringIO import StringIO
19
from bzrlib.selftest import BzrTestBase
20
from bzrlib.log import LogFormatter, show_log, LongLogFormatter
20
from bzrlib.tests import BzrTestBase, TestCaseWithTransport
21
from bzrlib.log import LogFormatter, show_log, LongLogFormatter, ShortLogFormatter
21
22
from bzrlib.branch import Branch
23
from bzrlib.errors import InvalidRevisionNumber
23
25
class _LogEntry(object):
24
26
# should probably move into bzrlib.log?
47
49
self.logs.append(le)
50
class SimpleLogTest(BzrTestBase):
52
class SimpleLogTest(TestCaseWithTransport):
51
54
def checkDelta(self, delta, **kw):
52
55
"""Check the filenames touched by a delta are as expected."""
53
56
for n in 'added', 'removed', 'renamed', 'modified', 'unchanged':
54
57
expected = kw.get(n, [])
56
59
# tests are written with unix paths; fix them up for windows
58
expected = [x.replace('/', os.sep) for x in expected]
61
# expected = [x.replace('/', os.sep) for x in expected]
60
63
# strip out only the path components
61
64
got = [x[0] for x in getattr(delta, n)]
62
65
self.assertEquals(expected, got)
67
def test_cur_revno(self):
68
wt = self.make_branch_and_tree('.')
72
wt.commit('empty commit')
73
show_log(b, lf, verbose=True, start_revision=1, end_revision=1)
74
self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
75
start_revision=2, end_revision=1)
76
self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
77
start_revision=1, end_revision=2)
78
self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
79
start_revision=0, end_revision=2)
80
self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
81
start_revision=1, end_revision=0)
82
self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
83
start_revision=-1, end_revision=1)
84
self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
85
start_revision=1, end_revision=-1)
87
def test_cur_revno(self):
88
wt = self.make_branch_and_tree('.')
92
wt.commit('empty commit')
93
show_log(b, lf, verbose=True, start_revision=1, end_revision=1)
94
self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
95
start_revision=2, end_revision=1)
96
self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
97
start_revision=1, end_revision=2)
98
self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
99
start_revision=0, end_revision=2)
100
self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
101
start_revision=1, end_revision=0)
102
self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
103
start_revision=-1, end_revision=1)
104
self.assertRaises(InvalidRevisionNumber, show_log, b, lf,
105
start_revision=1, end_revision=-1)
107
def test_simple_log(self):
66
108
eq = self.assertEquals
69
b = Branch('.', init=True)
110
wt = self.make_branch_and_tree('.')
77
b.commit('empty commit')
118
b.working_tree().commit('empty commit')
79
120
show_log(b, lf, verbose=True)
80
121
eq(len(lf.logs), 1)
107
152
self.log('log 2 delta: %r' % d)
108
153
# self.checkDelta(d, added=['hello'])
155
# commit a log message with control characters
156
msg = "All 8-bit chars: " + ''.join([unichr(x) for x in range(256)])
157
self.log("original commit message: %r", msg)
158
b.working_tree().commit(msg)
160
show_log(b, lf, verbose=True)
161
committed_msg = lf.logs[0].rev.message
162
self.log("escaped commit message: %r", committed_msg)
163
self.assert_(msg != committed_msg)
164
self.assert_(len(committed_msg) > len(msg))
166
# Check that log message with only XML-valid characters isn't
167
# escaped. As ElementTree apparently does some kind of
168
# newline conversion, neither LF (\x0A) nor CR (\x0D) are
169
# included in the test commit message, even though they are
170
# valid XML 1.0 characters.
171
msg = "\x09" + ''.join([unichr(x) for x in range(0x20, 256)])
172
self.log("original commit message: %r", msg)
173
b.working_tree().commit(msg)
175
show_log(b, lf, verbose=True)
176
committed_msg = lf.logs[0].rev.message
177
self.log("escaped commit message: %r", committed_msg)
178
self.assert_(msg == committed_msg)
180
def test_trailing_newlines(self):
181
wt = self.make_branch_and_tree('.')
184
wt = b.working_tree()
185
open('a', 'wb').write('hello moto\n')
187
wt.commit('simple log message', rev_id='a1'
188
, timestamp=1132586655.459960938, timezone=-6*3600
189
, committer='Joe Foo <joe@foo.com>')
190
open('b', 'wb').write('goodbye\n')
192
wt.commit('multiline\nlog\nmessage\n', rev_id='a2'
193
, timestamp=1132586842.411175966, timezone=-6*3600
194
, committer='Joe Foo <joe@foo.com>')
196
open('c', 'wb').write('just another manic monday\n')
198
wt.commit('single line with trailing newline\n', rev_id='a3'
199
, timestamp=1132587176.835228920, timezone=-6*3600
200
, committer = 'Joe Foo <joe@foo.com>')
203
lf = ShortLogFormatter(to_file=sio)
205
self.assertEquals(sio.getvalue(), """\
206
3 Joe Foo\t2005-11-21
207
single line with trailing newline
209
2 Joe Foo\t2005-11-21
214
1 Joe Foo\t2005-11-21
220
lf = LongLogFormatter(to_file=sio)
222
self.assertEquals(sio.getvalue(), """\
223
------------------------------------------------------------
225
committer: Joe Foo <joe@foo.com>
227
timestamp: Mon 2005-11-21 09:32:56 -0600
229
single line with trailing newline
230
------------------------------------------------------------
232
committer: Joe Foo <joe@foo.com>
234
timestamp: Mon 2005-11-21 09:27:22 -0600
239
------------------------------------------------------------
241
committer: Joe Foo <joe@foo.com>
243
timestamp: Mon 2005-11-21 09:24:15 -0600
248
def test_verbose_log(self):
249
"""Verbose log includes changed files
253
wt = self.make_branch_and_tree('.')
255
self.build_tree(['a'])
257
# XXX: why does a longer nick show up?
258
b.nick = 'test_verbose_log'
259
wt.commit(message='add a',
260
timestamp=1132711707,
262
committer='Lorem Ipsum <test@example.com>')
263
logfile = file('out.tmp', 'w+')
264
formatter = LongLogFormatter(to_file=logfile)
265
show_log(b, formatter, verbose=True)
268
log_contents = logfile.read()
269
self.assertEqualDiff(log_contents, '''\
270
------------------------------------------------------------
272
committer: Lorem Ipsum <test@example.com>
273
branch nick: test_verbose_log
274
timestamp: Wed 2005-11-23 12:08:27 +1000