24
24
from bzrlib.tests.blackbox import ExternalBase
25
from bzrlib.tests import TestCaseInTempDir
25
from bzrlib.tests import TestCaseInTempDir, TestCaseWithTransport
28
28
class TestLog(ExternalBase):
30
def _prepare(self, format=None):
32
self.run_bzr(["init", "--format="+format])
32
35
self.build_tree(['hello.txt', 'goodbye.txt', 'meep.txt'])
33
self.runbzr("add hello.txt")
34
self.runbzr("commit -m message1 hello.txt")
35
self.runbzr("add goodbye.txt")
36
self.runbzr("commit -m message2 goodbye.txt")
37
self.runbzr("add meep.txt")
38
self.runbzr("commit -m message3 meep.txt")
39
self.full_log = self.runbzr("log")[0]
36
self.run_bzr("add hello.txt")
37
self.run_bzr("commit -m message1 hello.txt")
38
self.run_bzr("add goodbye.txt")
39
self.run_bzr("commit -m message2 goodbye.txt")
40
self.run_bzr("add meep.txt")
41
self.run_bzr("commit -m message3 meep.txt")
42
self.full_log = self.run_bzr("log")[0]
41
44
def test_log_null_end_revspec(self):
47
50
self.assertTrue('message:\n message2\n' in self.full_log)
48
51
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)
53
log = self.run_bzr("log -r 1..")[0]
54
self.assertEqualDiff(log, self.full_log)
53
56
def test_log_null_begin_revspec(self):
55
log = self.runbzr("log -r ..3")[0]
56
self.assertEquals(self.full_log, log)
58
log = self.run_bzr("log -r ..3")[0]
59
self.assertEqualDiff(self.full_log, log)
58
61
def test_log_null_both_revspecs(self):
60
log = self.runbzr("log -r ..")[0]
63
log = self.run_bzr("log -r ..")[0]
61
64
self.assertEquals(self.full_log, log)
65
self.assertEqualDiff(self.full_log, log)
63
67
def test_log_negative_begin_revspec_full_log(self):
65
log = self.runbzr("log -r -3..")[0]
66
self.assertEquals(self.full_log, log)
69
log = self.run_bzr("log -r -3..")[0]
70
self.assertEqualDiff(self.full_log, log)
68
72
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)
74
log = self.run_bzr("log -r -3..-1")[0]
75
self.assertEqualDiff(self.full_log, log)
73
77
def test_log_negative_both_revspec_partial(self):
75
log = self.runbzr("log -r -3..-2")[0]
79
log = self.run_bzr("log -r -3..-2")[0]
76
80
self.assertTrue('revno: 1\n' in log)
77
81
self.assertTrue('revno: 2\n' in log)
78
82
self.assertTrue('revno: 3\n' not in log)
80
84
def test_log_negative_begin_revspec(self):
82
log = self.runbzr("log -r -2..")[0]
86
log = self.run_bzr("log -r -2..")[0]
83
87
self.assertTrue('revno: 1\n' not in log)
84
88
self.assertTrue('revno: 2\n' in log)
85
89
self.assertTrue('revno: 3\n' in log)
87
91
def test_log_postive_revspecs(self):
89
log = self.runbzr("log -r 1..3")[0]
90
self.assertEquals(self.full_log, log)
93
log = self.run_bzr("log -r 1..3")[0]
94
self.assertEqualDiff(self.full_log, log)
92
96
def test_log_revno_n_path(self):
93
97
os.mkdir('branch1')
98
102
os.chdir('branch2')
101
log = self.runbzr("log -r revno:2:branch1..revno:3:branch2",
105
log = self.run_bzr("log -r revno:2:branch1..revno:3:branch2",
103
log = self.runbzr("log -r revno:1:branch2..revno:3:branch2")[0]
104
self.assertEquals(self.full_log, log)
105
log = self.runbzr("log -r revno:1:branch2")[0]
107
log = self.run_bzr("log -r revno:1:branch2..revno:3:branch2")[0]
108
self.assertEqualDiff(self.full_log, log)
109
log = self.run_bzr("log -r revno:1:branch2")[0]
106
110
self.assertTrue('revno: 1\n' in log)
107
111
self.assertTrue('revno: 2\n' not in log)
108
112
self.assertTrue('branch nick: branch2\n' in log)
109
113
self.assertTrue('branch nick: branch1\n' not in log)
112
class TestLogMerges(ExternalBase):
114
def test_merges_are_indented_by_level(self):
115
self.build_tree(['parent/'])
116
self.run_bzr('init', 'parent')
117
self.run_bzr('commit', '-m', 'first post', '--unchanged', 'parent')
118
self.run_bzr('branch', 'parent', 'child')
119
self.run_bzr('commit', '-m', 'branch 1', '--unchanged', 'child')
120
self.run_bzr('branch', 'child', 'smallerchild')
121
self.run_bzr('commit', '-m', 'branch 2', '--unchanged', 'smallerchild')
123
self.run_bzr('merge', '../smallerchild')
124
self.run_bzr('commit', '-m', 'merge branch 2')
125
os.chdir('../parent')
126
self.run_bzr('merge', '../child')
127
self.run_bzr('commit', '-m', 'merge branch 1')
128
out,err = self.run_bzr('log')
129
# the log will look something like:
130
# self.assertEqual("""\
131
#------------------------------------------------------------
133
#committer: Robert Collins <foo@example.com>
135
#timestamp: Tue 2006-03-28 22:31:40 +1100
138
# ------------------------------------------------------------
139
# merged: foo@example.com-20060328113140-91f43cfb46dc2863
140
# committer: Robert Collins <foo@example.com>
142
# timestamp: Tue 2006-03-28 22:31:40 +1100
145
# ------------------------------------------------------------
146
# merged: foo@example.com-20060328113140-1ba24f850a0ef573
147
# committer: Robert Collins <foo@example.com>
148
# branch nick: smallerchild
149
# timestamp: Tue 2006-03-28 22:31:40 +1100
152
# ------------------------------------------------------------
153
# merged: foo@example.com-20060328113140-5749a4757a8ac792
154
# committer: Robert Collins <foo@example.com>
156
# timestamp: Tue 2006-03-28 22:31:40 +1100
159
#------------------------------------------------------------
161
#committer: Robert Collins <foo@example.com>
163
#timestamp: Tue 2006-03-28 22:31:39 +1100
167
# but we dont have a nice pattern matcher hooked up yet, so:
168
# we check for the indenting of the commit message:
169
self.assertTrue(' merge branch 1' in out)
170
self.assertTrue(' merge branch 2' in out)
171
self.assertTrue(' branch 2' in out)
172
self.assertTrue(' branch 1' in out)
173
self.assertTrue(' first post' in out)
174
self.assertEqual('', err)
115
def test_log_nonexistent_file(self):
116
# files that don't exist in either the basis tree or working tree
117
# should give an error
118
wt = self.make_branch_and_tree('.')
119
out, err = self.run_bzr('log', 'does-not-exist', retcode=3)
120
self.assertContainsRe(
121
err, 'Path does not have any revision history: does-not-exist')
123
def test_log_with_tags(self):
124
self._prepare(format='dirstate-tags')
125
self.run_bzr('tag -r1 tag1')
126
self.run_bzr('tag -r1 tag1.1')
127
self.run_bzr('tag tag3')
129
log = self.run_bzr("log -r-1")[0]
130
self.assertTrue('tags: tag3' in log)
132
log = self.run_bzr("log -r1")[0]
133
# I guess that we can't know the order of tags in the output
134
# since dicts are unordered, need to check both possibilities
135
self.assertContainsRe(log, r'tags: (tag1, tag1\.1|tag1\.1, tag1)')
137
def test_merged_log_with_tags(self):
140
self._prepare(format='dirstate-tags')
142
self.run_bzr('branch branch1 branch2')
144
self.run_bzr('commit -m foobar --unchanged')
145
self.run_bzr('tag tag1')
146
os.chdir('../branch2')
147
self.run_bzr('merge ../branch1')
148
self.run_bzr('commit -m merge_branch_1')
149
log = self.run_bzr("log -r-1")[0]
150
self.assertContainsRe(log, r' tags: tag1')
152
def test_log_limit(self):
154
log = self.run_bzr("log --limit 2")[0]
155
self.assertTrue('revno: 1\n' not in log)
156
self.assertTrue('revno: 2\n' in log)
157
self.assertTrue('revno: 3\n' in log)
177
160
class TestLogEncodings(TestCaseInTempDir):
274
257
# Make sure the cp1251 string is not found anywhere
275
258
self.assertEquals(-1, stdout.find(test_in_cp1251))
261
class TestLogFile(TestCaseWithTransport):
263
def test_log_local_branch_file(self):
264
"""We should be able to log files in local treeless branches"""
265
tree = self.make_branch_and_tree('tree')
266
self.build_tree(['tree/file'])
268
tree.commit('revision 1')
269
tree.bzrdir.destroy_workingtree()
270
self.run_bzr('log', 'tree/file')
272
def test_log_file(self):
273
"""The log for a particular file should only list revs for that file"""
274
tree = self.make_branch_and_tree('parent')
275
self.build_tree(['parent/file1', 'parent/file2', 'parent/file3'])
277
tree.commit('add file1')
279
tree.commit('add file2')
281
tree.commit('add file3')
282
self.run_bzr('branch', 'parent', 'child')
283
print >> file('child/file2', 'wb'), 'hello'
284
self.run_bzr('commit', '-m', 'branch 1', 'child')
286
self.run_bzr('merge', '../child')
287
self.run_bzr('commit', '-m', 'merge child branch')
289
log = self.run_bzr('log', 'file1')[0]
290
self.assertContainsRe(log, 'revno: 1\n')
291
self.assertNotContainsRe(log, 'revno: 2\n')
292
self.assertNotContainsRe(log, 'revno: 3\n')
293
self.assertNotContainsRe(log, 'revno: 3.1.1\n')
294
self.assertNotContainsRe(log, 'revno: 4\n')
295
log = self.run_bzr('log', 'file2')[0]
296
self.assertNotContainsRe(log, 'revno: 1\n')
297
self.assertContainsRe(log, 'revno: 2\n')
298
self.assertNotContainsRe(log, 'revno: 3\n')
299
self.assertContainsRe(log, 'revno: 3.1.1\n')
300
self.assertContainsRe(log, 'revno: 4\n')
301
log = self.run_bzr('log', 'file3')[0]
302
self.assertNotContainsRe(log, 'revno: 1\n')
303
self.assertNotContainsRe(log, 'revno: 2\n')
304
self.assertContainsRe(log, 'revno: 3\n')
305
self.assertNotContainsRe(log, 'revno: 3.1.1\n')
306
self.assertNotContainsRe(log, 'revno: 4\n')