47
57
self.assertTrue('message:\n message2\n' in self.full_log)
48
58
self.assertTrue('message:\n message3\n' in self.full_log)
50
log = self.runbzr("log -r 1..")[0]
51
self.assertEquals(log, self.full_log)
60
log = self.run_bzr("log -r 1..")[0]
61
self.assertEqualDiff(log, self.full_log)
53
63
def test_log_null_begin_revspec(self):
55
log = self.runbzr("log -r ..3")[0]
56
self.assertEquals(self.full_log, log)
65
log = self.run_bzr("log -r ..3")[0]
66
self.assertEqualDiff(self.full_log, log)
58
68
def test_log_null_both_revspecs(self):
60
log = self.runbzr("log -r ..")[0]
61
self.assertEquals(self.full_log, log)
70
log = self.run_bzr("log -r ..")[0]
71
self.assertEqualDiff(self.full_log, log)
73
def test_log_zero_revspec(self):
75
self.run_bzr_error('bzr: ERROR: Logging revision 0 is invalid.',
78
def test_log_zero_begin_revspec(self):
80
self.run_bzr_error('bzr: ERROR: Logging revision 0 is invalid.',
83
def test_log_zero_end_revspec(self):
85
self.run_bzr_error('bzr: ERROR: Logging revision 0 is invalid.',
88
def test_log_unsupported_timezone(self):
90
self.run_bzr_error('bzr: ERROR: Unsupported timezone format "foo", '
91
'options are "utc", "original", "local".',
92
['log', '--timezone', 'foo'])
63
94
def test_log_negative_begin_revspec_full_log(self):
65
log = self.runbzr("log -r -3..")[0]
66
self.assertEquals(self.full_log, log)
96
log = self.run_bzr("log -r -3..")[0]
97
self.assertEqualDiff(self.full_log, log)
68
99
def test_log_negative_both_revspec_full_log(self):
70
log = self.runbzr("log -r -3..-1")[0]
71
self.assertEquals(self.full_log, log)
101
log = self.run_bzr("log -r -3..-1")[0]
102
self.assertEqualDiff(self.full_log, log)
73
104
def test_log_negative_both_revspec_partial(self):
75
log = self.runbzr("log -r -3..-2")[0]
106
log = self.run_bzr("log -r -3..-2")[0]
76
107
self.assertTrue('revno: 1\n' in log)
77
108
self.assertTrue('revno: 2\n' in log)
78
109
self.assertTrue('revno: 3\n' not in log)
80
111
def test_log_negative_begin_revspec(self):
82
log = self.runbzr("log -r -2..")[0]
113
log = self.run_bzr("log -r -2..")[0]
83
114
self.assertTrue('revno: 1\n' not in log)
84
115
self.assertTrue('revno: 2\n' in log)
85
116
self.assertTrue('revno: 3\n' in log)
87
def test_log_postive_revspecs(self):
89
log = self.runbzr("log -r 1..3")[0]
90
self.assertEquals(self.full_log, log)
93
class TestLogMerges(ExternalBase):
118
def test_log_positive_revspecs(self):
120
log = self.run_bzr("log -r 1..3")[0]
121
self.assertEqualDiff(self.full_log, log)
123
def test_log_reversed_revspecs(self):
125
self.run_bzr_error(('bzr: ERROR: Start revision must be older than '
126
'the end revision.\n',),
129
def test_log_revno_n_path(self):
130
self._prepare(path='branch1')
131
self._prepare(path='branch2')
132
log = self.run_bzr("log -r revno:2:branch1..revno:3:branch2",
134
log = self.run_bzr("log -r revno:1:branch2..revno:3:branch2")[0]
135
self.assertEqualDiff(self.full_log, log)
136
log = self.run_bzr("log -r revno:1:branch2")[0]
137
self.assertTrue('revno: 1\n' in log)
138
self.assertTrue('revno: 2\n' not in log)
139
self.assertTrue('branch nick: branch2\n' in log)
140
self.assertTrue('branch nick: branch1\n' not in log)
142
def test_log_nonexistent_file(self):
143
# files that don't exist in either the basis tree or working tree
144
# should give an error
145
wt = self.make_branch_and_tree('.')
146
out, err = self.run_bzr('log does-not-exist', retcode=3)
147
self.assertContainsRe(
148
err, 'Path does not have any revision history: does-not-exist')
150
def test_log_with_tags(self):
151
tree = self._prepare(format='dirstate-tags')
153
branch.tags.set_tag('tag1', branch.get_rev_id(1))
154
branch.tags.set_tag('tag1.1', branch.get_rev_id(1))
155
branch.tags.set_tag('tag3', branch.last_revision())
157
log = self.run_bzr("log -r-1")[0]
158
self.assertTrue('tags: tag3' in log)
160
log = self.run_bzr("log -r1")[0]
161
# I guess that we can't know the order of tags in the output
162
# since dicts are unordered, need to check both possibilities
163
self.assertContainsRe(log, r'tags: (tag1, tag1\.1|tag1\.1, tag1)')
165
def test_merged_log_with_tags(self):
166
branch1_tree = self._prepare(path='branch1', format='dirstate-tags')
167
branch1 = branch1_tree.branch
168
branch2_tree = branch1_tree.bzrdir.sprout('branch2').open_workingtree()
169
branch1_tree.commit(message='foobar', allow_pointless=True)
170
branch1.tags.set_tag('tag1', branch1.last_revision())
172
self.run_bzr('merge ../branch1') # tags don't propagate otherwise
173
branch2_tree.commit(message='merge branch 1')
174
log = self.run_bzr("log -r-1")[0]
175
self.assertContainsRe(log, r' tags: tag1')
176
log = self.run_bzr("log -r3.1.1")[0]
177
self.assertContainsRe(log, r'tags: tag1')
179
def test_log_limit(self):
181
log = self.run_bzr("log --limit 2")[0]
182
self.assertNotContainsRe(log, r'revno: 1\n')
183
self.assertContainsRe(log, r'revno: 2\n')
184
self.assertContainsRe(log, r'revno: 3\n')
186
def test_log_limit_short(self):
188
log = self.run_bzr("log -l 2")[0]
189
self.assertNotContainsRe(log, r'revno: 1\n')
190
self.assertContainsRe(log, r'revno: 2\n')
191
self.assertContainsRe(log, r'revno: 3\n')
194
class TestLogMerges(TestCaseWithoutPropsHandler):
197
parent_tree = self.make_branch_and_tree('parent')
198
parent_tree.commit(message='first post', allow_pointless=True)
199
child_tree = parent_tree.bzrdir.sprout('child').open_workingtree()
200
child_tree.commit(message='branch 1', allow_pointless=True)
202
child_tree.bzrdir.sprout('smallerchild').open_workingtree()
203
smaller_tree.commit(message='branch 2', allow_pointless=True)
204
child_tree.merge_from_branch(smaller_tree.branch)
205
child_tree.commit(message='merge branch 2')
206
parent_tree.merge_from_branch(child_tree.branch)
207
parent_tree.commit(message='merge branch 1')
95
210
def test_merges_are_indented_by_level(self):
96
self.build_tree(['parent/'])
97
self.run_bzr('init', 'parent')
98
self.run_bzr('commit', '-m', 'first post', '--unchanged', 'parent')
99
self.run_bzr('branch', 'parent', 'child')
100
self.run_bzr('commit', '-m', 'branch 1', '--unchanged', 'child')
101
self.run_bzr('branch', 'child', 'smallerchild')
102
self.run_bzr('commit', '-m', 'branch 2', '--unchanged', 'smallerchild')
104
self.run_bzr('merge', '../smallerchild')
105
self.run_bzr('commit', '-m', 'merge branch 2')
106
os.chdir('../parent')
107
self.run_bzr('merge', '../child')
108
self.run_bzr('commit', '-m', 'merge branch 1')
109
212
out,err = self.run_bzr('log')
110
# the log will look something like:
111
# self.assertEqual("""\
112
#------------------------------------------------------------
114
#committer: Robert Collins <foo@example.com>
116
#timestamp: Tue 2006-03-28 22:31:40 +1100
119
# ------------------------------------------------------------
120
# merged: foo@example.com-20060328113140-91f43cfb46dc2863
121
# committer: Robert Collins <foo@example.com>
123
# timestamp: Tue 2006-03-28 22:31:40 +1100
126
# ------------------------------------------------------------
127
# merged: foo@example.com-20060328113140-1ba24f850a0ef573
128
# committer: Robert Collins <foo@example.com>
129
# branch nick: smallerchild
130
# timestamp: Tue 2006-03-28 22:31:40 +1100
133
# ------------------------------------------------------------
134
# merged: foo@example.com-20060328113140-5749a4757a8ac792
135
# committer: Robert Collins <foo@example.com>
137
# timestamp: Tue 2006-03-28 22:31:40 +1100
140
#------------------------------------------------------------
142
#committer: Robert Collins <foo@example.com>
144
#timestamp: Tue 2006-03-28 22:31:39 +1100
148
# but we dont have a nice pattern matcher hooked up yet, so:
149
# we check for the indenting of the commit message:
150
self.assertTrue(' merge branch 1' in out)
151
self.assertTrue(' merge branch 2' in out)
152
self.assertTrue(' branch 2' in out)
153
self.assertTrue(' branch 1' in out)
154
self.assertTrue(' first post' in out)
155
self.assertEqual('', err)
213
self.assertEqual('', err)
214
log = normalize_log(out)
215
self.assertEqualDiff(log, """\
216
------------------------------------------------------------
218
committer: Lorem Ipsum <test@example.com>
223
------------------------------------------------------------
225
committer: Lorem Ipsum <test@example.com>
230
------------------------------------------------------------
232
committer: Lorem Ipsum <test@example.com>
233
branch nick: smallerchild
237
------------------------------------------------------------
239
committer: Lorem Ipsum <test@example.com>
244
------------------------------------------------------------
246
committer: Lorem Ipsum <test@example.com>
253
def test_merges_single_merge_rev(self):
255
out,err = self.run_bzr('log -r1.1.2')
256
self.assertEqual('', err)
257
log = normalize_log(out)
258
self.assertEqualDiff(log, """\
259
------------------------------------------------------------
261
committer: Lorem Ipsum <test@example.com>
266
------------------------------------------------------------
268
committer: Lorem Ipsum <test@example.com>
269
branch nick: smallerchild
275
def test_merges_partial_range(self):
277
out,err = self.run_bzr('log -r1.1.1..1.1.2')
278
self.assertEqual('', err)
279
log = normalize_log(out)
280
self.assertEqualDiff(log, """\
281
------------------------------------------------------------
283
committer: Lorem Ipsum <test@example.com>
288
------------------------------------------------------------
290
committer: Lorem Ipsum <test@example.com>
291
branch nick: smallerchild
295
------------------------------------------------------------
297
committer: Lorem Ipsum <test@example.com>
304
def test_merges_nonsupporting_formatter(self):
306
err_msg = 'Selected log formatter only supports mainline revisions.'
307
# The single revision case is tested in the core tests
308
# since all standard formatters support single merge revisions.
309
out,err = self.run_bzr('log --short -r1..1.1.2', retcode=3)
310
self.assertContainsRe(err, err_msg)
311
out,err = self.run_bzr('log --short -r1.1.1..1.1.2', retcode=3)
312
self.assertContainsRe(err, err_msg)
158
315
class TestLogEncodings(TestCaseInTempDir):
255
412
# Make sure the cp1251 string is not found anywhere
256
413
self.assertEquals(-1, stdout.find(test_in_cp1251))
416
class TestLogFile(TestCaseWithTransport):
418
def test_log_local_branch_file(self):
419
"""We should be able to log files in local treeless branches"""
420
tree = self.make_branch_and_tree('tree')
421
self.build_tree(['tree/file'])
423
tree.commit('revision 1')
424
tree.bzrdir.destroy_workingtree()
425
self.run_bzr('log tree/file')
427
def test_log_file(self):
428
"""The log for a particular file should only list revs for that file"""
429
tree = self.make_branch_and_tree('parent')
430
self.build_tree(['parent/file1', 'parent/file2', 'parent/file3'])
432
tree.commit('add file1')
434
tree.commit('add file2')
436
tree.commit('add file3')
437
child_tree = tree.bzrdir.sprout('child').open_workingtree()
438
self.build_tree_contents([('child/file2', 'hello')])
439
child_tree.commit(message='branch 1')
440
tree.merge_from_branch(child_tree.branch)
441
tree.commit(message='merge child branch')
443
log = self.run_bzr('log file1')[0]
444
self.assertContainsRe(log, 'revno: 1\n')
445
self.assertNotContainsRe(log, 'revno: 2\n')
446
self.assertNotContainsRe(log, 'revno: 3\n')
447
self.assertNotContainsRe(log, 'revno: 3.1.1\n')
448
self.assertNotContainsRe(log, 'revno: 4\n')
449
log = self.run_bzr('log file2')[0]
450
self.assertNotContainsRe(log, 'revno: 1\n')
451
self.assertContainsRe(log, 'revno: 2\n')
452
self.assertNotContainsRe(log, 'revno: 3\n')
453
self.assertContainsRe(log, 'revno: 3.1.1\n')
454
self.assertContainsRe(log, 'revno: 4\n')
455
log = self.run_bzr('log file3')[0]
456
self.assertNotContainsRe(log, 'revno: 1\n')
457
self.assertNotContainsRe(log, 'revno: 2\n')
458
self.assertContainsRe(log, 'revno: 3\n')
459
self.assertNotContainsRe(log, 'revno: 3.1.1\n')
460
self.assertNotContainsRe(log, 'revno: 4\n')
461
log = self.run_bzr('log -r3.1.1 file2')[0]
462
self.assertNotContainsRe(log, 'revno: 1\n')
463
self.assertNotContainsRe(log, 'revno: 2\n')
464
self.assertNotContainsRe(log, 'revno: 3\n')
465
self.assertContainsRe(log, 'revno: 3.1.1\n')
466
self.assertNotContainsRe(log, 'revno: 4\n')
467
log = self.run_bzr('log -r4 file2')[0]
468
self.assertNotContainsRe(log, 'revno: 1\n')
469
self.assertNotContainsRe(log, 'revno: 2\n')
470
self.assertNotContainsRe(log, 'revno: 3\n')
471
self.assertContainsRe(log, 'revno: 3.1.1\n')
472
self.assertContainsRe(log, 'revno: 4\n')
473
log = self.run_bzr('log -r3.. file2')[0]
474
self.assertNotContainsRe(log, 'revno: 1\n')
475
self.assertNotContainsRe(log, 'revno: 2\n')
476
self.assertNotContainsRe(log, 'revno: 3\n')
477
self.assertContainsRe(log, 'revno: 3.1.1\n')
478
self.assertContainsRe(log, 'revno: 4\n')
479
log = self.run_bzr('log -r..3 file2')[0]
480
self.assertNotContainsRe(log, 'revno: 1\n')
481
self.assertContainsRe(log, 'revno: 2\n')
482
self.assertNotContainsRe(log, 'revno: 3\n')
483
self.assertNotContainsRe(log, 'revno: 3.1.1\n')
484
self.assertNotContainsRe(log, 'revno: 4\n')