91
92
self.assertEqualDiff(expected, test_log.normalize_log(out))
94
class TestLogRevSpecs(TestLog):
95
class TestLogWithLogCatcher(TestLog):
98
super(TestLogWithLogCatcher, self).setUp()
99
# Install a default log formatter that captures the revisions but
101
self.log_catcher = test_log.LogCatcher()
102
class MyLogFormatter(test_log.LogCatcher):
104
def __new__(klass, *args, **kwargs):
105
# Always return our own log formatter acting as a singleton
106
return self.log_catcher
108
orig = log.log_formatter_registry.get_default
110
log.log_formatter_registry.get_default = orig
111
self.addCleanup(restore)
114
# Always return our own log formatter class hijacking the
115
# default behavior (which requires setting up a config
117
return MyLogFormatter
118
log.log_formatter_registry.get_default = getme
120
def get_captured_revnos(self):
121
return [r.revno for r in self.log_catcher.revisions]
123
def assertLogRevnos(self, args, expected_revnos):
124
self.run_bzr(['log'] + args)
125
self.assertEqual(expected_revnos, self.get_captured_revnos())
128
class TestLogRevSpecs(TestLogWithLogCatcher):
130
def test_log_no_revspec(self):
131
self.make_linear_branch()
132
self.assertLogRevnos([], ['3', '2', '1'])
96
134
def test_log_null_end_revspec(self):
97
135
self.make_linear_branch()
98
log = self.run_bzr(['log'])[0]
99
self.assertTrue('revno: 1\n' in log)
100
self.assertTrue('revno: 2\n' in log)
101
self.assertTrue('revno: 3\n' in log)
102
self.assertTrue('message:\n message1\n' in log)
103
self.assertTrue('message:\n message2\n' in log)
104
self.assertTrue('message:\n message3\n' in log)
106
full_log = self.run_bzr(['log'])[0]
107
log = self.run_bzr("log -r 1..")[0]
108
self.assertEqualDiff(log, full_log)
136
self.assertLogRevnos(['-r1..'], ['3', '2', '1'])
110
138
def test_log_null_begin_revspec(self):
111
139
self.make_linear_branch()
112
full_log = self.run_bzr(['log'])[0]
113
log = self.run_bzr("log -r ..3")[0]
114
self.assertEqualDiff(full_log, log)
140
self.assertLogRevnos(['-r..3'], ['3', '2', '1'])
116
142
def test_log_null_both_revspecs(self):
117
143
self.make_linear_branch()
118
full_log = self.run_bzr(['log'])[0]
119
log = self.run_bzr("log -r ..")[0]
120
self.assertEqualDiff(full_log, log)
122
def test_log_zero_revspec(self):
123
self.make_minimal_branch()
124
self.run_bzr_error(['bzr: ERROR: Logging revision 0 is invalid.'],
127
def test_log_zero_begin_revspec(self):
128
self.make_linear_branch()
129
self.run_bzr_error(['bzr: ERROR: Logging revision 0 is invalid.'],
132
def test_log_zero_end_revspec(self):
133
self.make_linear_branch()
134
self.run_bzr_error(['bzr: ERROR: Logging revision 0 is invalid.'],
144
self.assertLogRevnos(['-r..'], ['3', '2', '1'])
137
146
def test_log_negative_begin_revspec_full_log(self):
138
147
self.make_linear_branch()
139
full_log = self.run_bzr(['log'])[0]
140
log = self.run_bzr("log -r -3..")[0]
141
self.assertEqualDiff(full_log, log)
148
self.assertLogRevnos(['-r-3..'], ['3', '2', '1'])
143
150
def test_log_negative_both_revspec_full_log(self):
144
151
self.make_linear_branch()
145
full_log = self.run_bzr(['log'])[0]
146
log = self.run_bzr("log -r -3..-1")[0]
147
self.assertEqualDiff(full_log, log)
152
self.assertLogRevnos(['-r-3..-1'], ['3', '2', '1'])
149
154
def test_log_negative_both_revspec_partial(self):
150
155
self.make_linear_branch()
151
log = self.run_bzr("log -r -3..-2")[0]
152
self.assertTrue('revno: 1\n' in log)
153
self.assertTrue('revno: 2\n' in log)
154
self.assertTrue('revno: 3\n' not in log)
156
self.assertLogRevnos(['-r-3..-2'], ['2', '1'])
156
158
def test_log_negative_begin_revspec(self):
157
159
self.make_linear_branch()
158
log = self.run_bzr("log -r -2..")[0]
159
self.assertTrue('revno: 1\n' not in log)
160
self.assertTrue('revno: 2\n' in log)
161
self.assertTrue('revno: 3\n' in log)
160
self.assertLogRevnos(['-r-2..'], ['3', '2'])
163
162
def test_log_positive_revspecs(self):
164
163
self.make_linear_branch()
165
full_log = self.run_bzr(['log'])[0]
166
log = self.run_bzr("log -r 1..3")[0]
167
self.assertEqualDiff(full_log, log)
164
self.assertLogRevnos(['-r1..3'], ['3', '2', '1'])
169
166
def test_log_dotted_revspecs(self):
170
167
self.make_merged_branch()
171
log = self.run_bzr("log -n0 -r 1..1.1.1")[0]
172
self.assertRevnos(log, (1, '1.1.1'), (2, 3, '1.1.2', 4))
174
def test_log_reversed_revspecs(self):
175
self.make_linear_branch()
176
self.run_bzr_error(('bzr: ERROR: Start revision must be older than '
177
'the end revision.\n',),
180
def test_log_reversed_dotted_revspecs(self):
181
self.make_merged_branch()
182
self.run_bzr_error(('bzr: ERROR: Start revision not found in '
183
'left-hand history of end revision.\n',),
186
def test_log_revno_n_path(self):
187
self.make_linear_branch('branch1')
188
self.make_linear_branch('branch2')
190
self.run_bzr("log -r revno:2:branch1..revno:3:branch2", retcode=3)[0]
192
log = self.run_bzr("log -r revno:1:branch2..revno:3:branch2")[0]
193
full_log = self.run_bzr(['log'], working_dir='branch2')[0]
194
self.assertEqualDiff(full_log, log)
195
log = self.run_bzr("log -r revno:1:branch2")[0]
196
self.assertTrue('revno: 1\n' in log)
197
self.assertTrue('revno: 2\n' not in log)
198
self.assertTrue('branch nick: branch2\n' in log)
199
self.assertTrue('branch nick: branch1\n' not in log)
168
self.assertLogRevnos(['-n0', '-r1..1.1.1'], ['1.1.1', '1'])
201
170
def test_log_limit(self):
202
171
tree = self.make_branch_and_tree('.')
203
172
# We want more commits than our batch size starts at
204
173
for pos in range(10):
205
174
tree.commit("%s" % pos)
206
log = self.run_bzr("log --limit 2")[0]
207
self.assertNotContainsRe(log, r'revno: 1\n')
208
self.assertNotContainsRe(log, r'revno: 2\n')
209
self.assertNotContainsRe(log, r'revno: 3\n')
210
self.assertNotContainsRe(log, r'revno: 4\n')
211
self.assertNotContainsRe(log, r'revno: 5\n')
212
self.assertNotContainsRe(log, r'revno: 6\n')
213
self.assertNotContainsRe(log, r'revno: 7\n')
214
self.assertNotContainsRe(log, r'revno: 8\n')
215
self.assertContainsRe(log, r'revno: 9\n')
216
self.assertContainsRe(log, r'revno: 10\n')
175
self.assertLogRevnos(['--limit', '2'], ['10', '9'])
218
177
def test_log_limit_short(self):
219
178
self.make_linear_branch()
220
log = self.run_bzr("log -l 2")[0]
221
self.assertNotContainsRe(log, r'revno: 1\n')
222
self.assertContainsRe(log, r'revno: 2\n')
223
self.assertContainsRe(log, r'revno: 3\n')
179
self.assertLogRevnos(['-l', '2'], ['3', '2'])
182
class TestLogRevSpecsWithPaths(TestLogWithLogCatcher):
184
def test_log_revno_n_path_wrong_namespace(self):
185
self.make_linear_branch('branch1')
186
self.make_linear_branch('branch2')
187
# There is no guarantee that a path exist between two arbitrary
189
self.run_bzr("log -r revno:2:branch1..revno:3:branch2", retcode=3)
190
# But may be it's worth trying though ? -- vila 100115
192
def test_log_revno_n_path_correct_order(self):
193
self.make_linear_branch('branch2')
194
self.assertLogRevnos(['-rrevno:1:branch2..revno:3:branch2'],
197
def test_log_revno_n_path(self):
198
self.make_linear_branch('branch2')
199
self.assertLogRevnos(['-rrevno:1:branch2'],
201
rev_props = self.log_catcher.revisions[0].rev.properties
202
self.assertEqual('branch2', rev_props['branch-nick'])
226
205
class TestLogErrors(TestLog):
207
def test_log_zero_revspec(self):
208
self.make_minimal_branch()
209
self.run_bzr_error(['bzr: ERROR: Logging revision 0 is invalid.'],
212
def test_log_zero_begin_revspec(self):
213
self.make_linear_branch()
214
self.run_bzr_error(['bzr: ERROR: Logging revision 0 is invalid.'],
217
def test_log_zero_end_revspec(self):
218
self.make_linear_branch()
219
self.run_bzr_error(['bzr: ERROR: Logging revision 0 is invalid.'],
228
222
def test_log_nonexistent_revno(self):
229
223
self.make_minimal_branch()
230
224
(out, err) = self.run_bzr_error(