Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: tests/git_cl_test.py

Issue 11195012: Allow users of git cl to disable git copy detection entirely. (Closed) Base URL: https://git.chromium.org/chromium/tools/depot_tools.git@upload
Patch Set: use string format for better bug catching :) Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « git_cl.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Unit tests for git_cl.py.""" 6 """Unit tests for git_cl.py."""
7 7
8 import os 8 import os
9 import StringIO 9 import StringIO
10 import stat 10 import stat
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 expected_args, result = self.calls.pop(0) 86 expected_args, result = self.calls.pop(0)
87 self.assertEquals( 87 self.assertEquals(
88 expected_args, 88 expected_args,
89 args, 89 args,
90 '@%d Expected: %r Actual: %r' % ( 90 '@%d Expected: %r Actual: %r' % (
91 self._calls_done, expected_args, args)) 91 self._calls_done, expected_args, args))
92 self._calls_done += 1 92 self._calls_done += 1
93 return result 93 return result
94 94
95 @classmethod 95 @classmethod
96 def _upload_calls(cls, similarity): 96 def _upload_calls(cls, similarity, find_copies):
97 return cls._git_base_calls(similarity) + cls._git_upload_calls() 97 return (cls._git_base_calls(similarity, find_copies) +
98 cls._git_upload_calls())
98 99
99 @staticmethod 100 @staticmethod
100 def _git_base_calls(similarity): 101 def _git_base_calls(similarity, find_copies):
101 if similarity is None: 102 if similarity is None:
102 similarity = '50' 103 similarity = '50'
103 similarity_call = ((['git', 'config', '--int', '--get', 104 similarity_call = ((['git', 'config', '--int', '--get',
104 'branch.master.git-cl-similarity'],), '') 105 'branch.master.git-cl-similarity'],), '')
105 else: 106 else:
106 similarity_call = ((['git', 'config', '--int', 107 similarity_call = ((['git', 'config', '--int',
107 'branch.master.git-cl-similarity', similarity],), '') 108 'branch.master.git-cl-similarity', similarity],), '')
109
110 if find_copies is None:
111 find_copies = True
112 find_copies_call = ((['git', 'config', '--int', '--get',
113 'branch.master.git-find-copies'],), '')
114 else:
115 val = str(int(find_copies))
116 find_copies_call = ((['git', 'config', '--int',
117 'branch.master.git-find-copies', val],), '')
118
119 if find_copies:
120 stat_call = ((['git', 'diff', '--no-ext-diff', '--stat',
121 '--find-copies-harder', '-l100000', '-C'+similarity,
122 'master...'],), '+dat')
123 else:
124 stat_call = ((['git', 'diff', '--no-ext-diff', '--stat',
125 '-M'+similarity, 'master...'],), '+dat')
126
108 return [ 127 return [
109 ((['git', 'config', 'gerrit.host'],), ''), 128 ((['git', 'config', 'gerrit.host'],), ''),
110 ((['git', 'config', 'rietveld.server'],), 'codereview.example.com'), 129 ((['git', 'config', 'rietveld.server'],), 'codereview.example.com'),
111 ((['git', 'symbolic-ref', 'HEAD'],), 'master'), 130 ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
112 similarity_call, 131 similarity_call,
132 ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
133 find_copies_call,
113 ((['git', 'update-index', '--refresh', '-q'],), ''), 134 ((['git', 'update-index', '--refresh', '-q'],), ''),
114 ((['git', 'diff-index', 'HEAD'],), ''), 135 ((['git', 'diff-index', 'HEAD'],), ''),
115 ((['git', 'symbolic-ref', 'HEAD'],), 'master'), 136 ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
116 ((['git', 'config', 'branch.master.merge'],), 'master'), 137 ((['git', 'config', 'branch.master.merge'],), 'master'),
117 ((['git', 'config', 'branch.master.remote'],), 'origin'), 138 ((['git', 'config', 'branch.master.remote'],), 'origin'),
118 ((['git', 'rev-parse', '--show-cdup'],), ''), 139 ((['git', 'rev-parse', '--show-cdup'],), ''),
119 ((['git', 'rev-parse', 'HEAD'],), '12345'), 140 ((['git', 'rev-parse', 'HEAD'],), '12345'),
120 ((['git', 'diff', '--name-status', '-r', 'master...', '.'],), 141 ((['git', 'diff', '--name-status', '-r', 'master...', '.'],),
121 'M\t.gitignore\n'), 142 'M\t.gitignore\n'),
122 ((['git', 'config', 'branch.master.rietveldissue'],), ''), 143 ((['git', 'config', 'branch.master.rietveldissue'],), ''),
123 ((['git', 'config', 'branch.master.rietveldpatchset'],), ''), 144 ((['git', 'config', 'branch.master.rietveldpatchset'],), ''),
124 ((['git', 'log', '--pretty=format:%s%n%n%b', 'master...'],), 'foo'), 145 ((['git', 'log', '--pretty=format:%s%n%n%b', 'master...'],), 'foo'),
125 ((['git', 'config', 'user.email'],), 'me@example.com'), 146 ((['git', 'config', 'user.email'],), 'me@example.com'),
126 ((['git', 'diff', '--no-ext-diff', '--stat', '--find-copies-harder', 147 stat_call,
127 '-C'+similarity, '-l100000', 'master...'],),
128 '+dat'),
129 ((['git', 'log', '--pretty=format:%s\n\n%b', 'master..'],), 'desc\n'), 148 ((['git', 'log', '--pretty=format:%s\n\n%b', 'master..'],), 'desc\n'),
130 ] 149 ]
131 150
132 @staticmethod 151 @staticmethod
133 def _git_upload_calls(): 152 def _git_upload_calls():
134 return [ 153 return [
135 ((['git', 'config', 'rietveld.cc'],), ''), 154 ((['git', 'config', 'rietveld.cc'],), ''),
136 ((['git', 'config', 'branch.master.base-url'],), ''), 155 ((['git', 'config', 'branch.master.base-url'],), ''),
137 ((['git', 'config', '--get-regexp', '^svn-remote\\.'],), 156 ((['git', 'config', '--get-regexp', '^svn-remote\\.'],),
138 (('', None), 0)), 157 (('', None), 0)),
(...skipping 11 matching lines...) Expand all
150 ((['git', 'config', '--get-regexp', '^svn-remote\\.'],), 169 ((['git', 'config', '--get-regexp', '^svn-remote\\.'],),
151 ((('svn-remote.svn.url svn://svn.chromium.org/chrome\n' 170 ((('svn-remote.svn.url svn://svn.chromium.org/chrome\n'
152 'svn-remote.svn.fetch trunk/src:refs/remotes/origin/master'), 171 'svn-remote.svn.fetch trunk/src:refs/remotes/origin/master'),
153 None), 172 None),
154 0)), 173 0)),
155 ((['git', 'config', 'rietveld.server'],), 'codereview.example.com'), 174 ((['git', 'config', 'rietveld.server'],), 'codereview.example.com'),
156 ((['git', 'symbolic-ref', 'HEAD'],), 'refs/heads/working'), 175 ((['git', 'symbolic-ref', 'HEAD'],), 'refs/heads/working'),
157 ((['git', 'config', '--int', '--get', 176 ((['git', 'config', '--int', '--get',
158 'branch.working.git-cl-similarity'],), ''), 177 'branch.working.git-cl-similarity'],), ''),
159 ((['git', 'symbolic-ref', 'HEAD'],), 'refs/heads/working'), 178 ((['git', 'symbolic-ref', 'HEAD'],), 'refs/heads/working'),
179 ((['git', 'config', '--int', '--get',
180 'branch.working.git-find-copies'],), ''),
181 ((['git', 'symbolic-ref', 'HEAD'],), 'refs/heads/working'),
160 ((['git', 'config', 'branch.working.merge'],), 'refs/heads/master'), 182 ((['git', 'config', 'branch.working.merge'],), 'refs/heads/master'),
161 ((['git', 'config', 'branch.working.remote'],), 'origin'), 183 ((['git', 'config', 'branch.working.remote'],), 'origin'),
162 ((['git', 'rev-list', '--merges', 184 ((['git', 'rev-list', '--merges',
163 '--grep=^SVN changes up to revision [0-9]*$', 185 '--grep=^SVN changes up to revision [0-9]*$',
164 'refs/remotes/origin/master^!'],), ''), 186 'refs/remotes/origin/master^!'],), ''),
165 ((['git', 'update-index', '--refresh', '-q'],), ''), 187 ((['git', 'update-index', '--refresh', '-q'],), ''),
166 ((['git', 'diff-index', 'HEAD'],), ''), 188 ((['git', 'diff-index', 'HEAD'],), ''),
167 ((['git', 'rev-list', '^refs/heads/working', 189 ((['git', 'rev-list', '^refs/heads/working',
168 'refs/remotes/origin/master'],), 190 'refs/remotes/origin/master'],),
169 ''), 191 ''),
(...skipping 28 matching lines...) Expand all
198 'codereview.example.com'), 220 'codereview.example.com'),
199 (('GitClHooksBypassedCommit', 221 (('GitClHooksBypassedCommit',
200 'Issue https://codereview.example.com/12345 bypassed hook when ' 222 'Issue https://codereview.example.com/12345 bypassed hook when '
201 'committing'), None), 223 'committing'), None),
202 ] 224 ]
203 225
204 @classmethod 226 @classmethod
205 def _dcommit_calls_3(cls): 227 def _dcommit_calls_3(cls):
206 return [ 228 return [
207 ((['git', 'diff', '--no-ext-diff', '--stat', '--find-copies-harder', 229 ((['git', 'diff', '--no-ext-diff', '--stat', '--find-copies-harder',
208 '-C50', '-l100000', 'refs/remotes/origin/master', 230 '-l100000', '-C50', 'refs/remotes/origin/master',
209 'refs/heads/working'],), 231 'refs/heads/working'],),
210 (' PRESUBMIT.py | 2 +-\n' 232 (' PRESUBMIT.py | 2 +-\n'
211 ' 1 files changed, 1 insertions(+), 1 deletions(-)\n')), 233 ' 1 files changed, 1 insertions(+), 1 deletions(-)\n')),
212 (('About to commit; enter to confirm.',), None), 234 (('About to commit; enter to confirm.',), None),
213 ((['git', 'show-ref', '--quiet', '--verify', 235 ((['git', 'show-ref', '--quiet', '--verify',
214 'refs/heads/git-cl-commit'],), 236 'refs/heads/git-cl-commit'],),
215 (('', None), 0)), 237 (('', None), 0)),
216 ((['git', 'branch', '-D', 'git-cl-commit'],), ''), 238 ((['git', 'branch', '-D', 'git-cl-commit'],), ''),
217 ((['git', 'show-ref', '--quiet', '--verify', 239 ((['git', 'show-ref', '--quiet', '--verify',
218 'refs/heads/git-cl-cherry-pick'],), ''), 240 'refs/heads/git-cl-cherry-pick'],), ''),
219 ((['git', 'rev-parse', '--show-cdup'],), '\n'), 241 ((['git', 'rev-parse', '--show-cdup'],), '\n'),
220 ((['git', 'checkout', '-q', '-b', 'git-cl-commit'],), ''), 242 ((['git', 'checkout', '-q', '-b', 'git-cl-commit'],), ''),
221 ((['git', 'reset', '--soft', 'refs/remotes/origin/master'],), ''), 243 ((['git', 'reset', '--soft', 'refs/remotes/origin/master'],), ''),
222 ((['git', 'commit', '-m', 244 ((['git', 'commit', '-m',
223 'Issue: 12345\n\nReview URL: https://codereview.example.com/12345'],), 245 'Issue: 12345\n\nReview URL: https://codereview.example.com/12345'],),
224 ''), 246 ''),
225 ((['git', 'svn', 'dcommit', '-C50', '--no-rebase', '--rmdir'],), 247 ((['git', 'svn', 'dcommit', '-C50', '--no-rebase', '--rmdir'],),
226 (('', None), 0)), 248 (('', None), 0)),
227 ((['git', 'checkout', '-q', 'working'],), ''), 249 ((['git', 'checkout', '-q', 'working'],), ''),
228 ((['git', 'branch', '-D', 'git-cl-commit'],), ''), 250 ((['git', 'branch', '-D', 'git-cl-commit'],), ''),
229 ] 251 ]
230 252
231 @staticmethod 253 @staticmethod
232 def _cmd_line(description, args, similarity): 254 def _cmd_line(description, args, similarity, find_copies):
233 """Returns the upload command line passed to upload.RealMain().""" 255 """Returns the upload command line passed to upload.RealMain()."""
234 return [ 256 return [
235 'upload', '--assume_yes', '--server', 257 'upload', '--assume_yes', '--server',
236 'https://codereview.example.com', 258 'https://codereview.example.com',
237 '--message', description 259 '--message', description
238 ] + args + [ 260 ] + args + [
239 '--cc', 'joe@example.com', 261 '--cc', 'joe@example.com',
240 '--git_similarity', similarity or '50', 262 '--git_similarity', similarity or '50'
263 ] + (['--git_no_find_copies'] if find_copies == False else []) + [
241 'master...' 264 'master...'
242 ] 265 ]
243 266
244 def _run_reviewer_test( 267 def _run_reviewer_test(
245 self, 268 self,
246 upload_args, 269 upload_args,
247 expected_description, 270 expected_description,
248 returned_description, 271 returned_description,
249 final_description, 272 final_description,
250 reviewers): 273 reviewers):
251 """Generic reviewer test framework.""" 274 """Generic reviewer test framework."""
252 try: 275 try:
253 similarity = upload_args[upload_args.index('--similarity')+1] 276 similarity = upload_args[upload_args.index('--similarity')+1]
254 except ValueError: 277 except ValueError:
255 similarity = None 278 similarity = None
256 self.calls = self._upload_calls(similarity) 279
280 if '--find-copies' in upload_args:
281 find_copies = True
282 elif '--no-find-copies' in upload_args:
283 find_copies = False
284 else:
285 find_copies = None
286
287 self.calls = self._upload_calls(similarity, find_copies)
257 def RunEditor(desc, _): 288 def RunEditor(desc, _):
258 self.assertEquals( 289 self.assertEquals(
259 '# Enter a description of the change.\n' 290 '# Enter a description of the change.\n'
260 '# This will displayed on the codereview site.\n' 291 '# This will displayed on the codereview site.\n'
261 '# The first line will also be used as the subject of the review.\n' + 292 '# The first line will also be used as the subject of the review.\n' +
262 expected_description, 293 expected_description,
263 desc) 294 desc)
264 return returned_description 295 return returned_description
265 self.mock(git_cl.gclient_utils, 'RunEditor', RunEditor) 296 self.mock(git_cl.gclient_utils, 'RunEditor', RunEditor)
266 def check_upload(args): 297 def check_upload(args):
267 cmd_line = self._cmd_line(final_description, reviewers, similarity) 298 cmd_line = self._cmd_line(final_description, reviewers, similarity,
299 find_copies)
268 self.assertEquals(cmd_line, args) 300 self.assertEquals(cmd_line, args)
269 return 1, 2 301 return 1, 2
270 self.mock(git_cl.upload, 'RealMain', check_upload) 302 self.mock(git_cl.upload, 'RealMain', check_upload)
271 git_cl.main(['upload'] + upload_args) 303 git_cl.main(['upload'] + upload_args)
272 304
273 def test_no_reviewer(self): 305 def test_no_reviewer(self):
274 self._run_reviewer_test( 306 self._run_reviewer_test(
275 [], 307 [],
276 'desc\n\nBUG=\n', 308 'desc\n\nBUG=\n',
277 '# Blah blah comment.\ndesc\n\nBUG=\n', 309 '# Blah blah comment.\ndesc\n\nBUG=\n',
278 'desc\n\nBUG=\n', 310 'desc\n\nBUG=\n',
279 []) 311 [])
280 312
281 def test_keep_similarity(self): 313 def test_keep_similarity(self):
282 self._run_reviewer_test( 314 self._run_reviewer_test(
283 ['--similarity', '70'], 315 ['--similarity', '70'],
284 'desc\n\nBUG=\n', 316 'desc\n\nBUG=\n',
285 '# Blah blah comment.\ndesc\n\nBUG=\n', 317 '# Blah blah comment.\ndesc\n\nBUG=\n',
286 'desc\n\nBUG=\n', 318 'desc\n\nBUG=\n',
287 []) 319 [])
288 320
321 def test_keep_find_copies(self):
322 self._run_reviewer_test(
323 ['--no-find-copies'],
324 'desc\n\nBUG=\n',
325 '# Blah blah comment.\ndesc\n\nBUG=\n',
326 'desc\n\nBUG=\n',
327 [])
328
289 def test_reviewers_cmd_line(self): 329 def test_reviewers_cmd_line(self):
290 # Reviewer is passed as-is 330 # Reviewer is passed as-is
291 description = 'desc\n\nR=foo@example.com\nBUG=\n' 331 description = 'desc\n\nR=foo@example.com\nBUG=\n'
292 self._run_reviewer_test( 332 self._run_reviewer_test(
293 ['-r' 'foo@example.com'], 333 ['-r' 'foo@example.com'],
294 description, 334 description,
295 '\n%s\n' % description, 335 '\n%s\n' % description,
296 description, 336 description,
297 ['--reviewers', 'foo@example.com']) 337 ['--reviewers', 'foo@example.com'])
298 338
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 370
331 def test_reviewer_send_mail_no_rev(self): 371 def test_reviewer_send_mail_no_rev(self):
332 # Fails without a reviewer. 372 # Fails without a reviewer.
333 class FileMock(object): 373 class FileMock(object):
334 buf = StringIO.StringIO() 374 buf = StringIO.StringIO()
335 def write(self, content): 375 def write(self, content):
336 self.buf.write(content) 376 self.buf.write(content)
337 377
338 mock = FileMock() 378 mock = FileMock()
339 try: 379 try:
340 self.calls = self._git_base_calls(None) 380 self.calls = self._git_base_calls(None, None)
341 def RunEditor(desc, _): 381 def RunEditor(desc, _):
342 return desc 382 return desc
343 self.mock(git_cl.gclient_utils, 'RunEditor', RunEditor) 383 self.mock(git_cl.gclient_utils, 'RunEditor', RunEditor)
344 self.mock(sys, 'stderr', mock) 384 self.mock(sys, 'stderr', mock)
345 git_cl.main(['upload', '--send-mail']) 385 git_cl.main(['upload', '--send-mail'])
346 self.fail() 386 self.fail()
347 except SystemExit: 387 except SystemExit:
348 self.assertEquals( 388 self.assertEquals(
349 'Must specify reviewers to send email.\n', mock.buf.getvalue()) 389 'Must specify reviewers to send email.\n', mock.buf.getvalue())
350 390
(...skipping 13 matching lines...) Expand all
364 404
365 405
366 @staticmethod 406 @staticmethod
367 def _gerrit_base_calls(): 407 def _gerrit_base_calls():
368 return [ 408 return [
369 ((['git', 'config', 'gerrit.host'],), 'gerrit.example.com'), 409 ((['git', 'config', 'gerrit.host'],), 'gerrit.example.com'),
370 ((['git', 'config', 'rietveld.server'],), 'codereview.example.com'), 410 ((['git', 'config', 'rietveld.server'],), 'codereview.example.com'),
371 ((['git', 'symbolic-ref', 'HEAD'],), 'master'), 411 ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
372 ((['git', 'config', '--int', '--get', 412 ((['git', 'config', '--int', '--get',
373 'branch.master.git-cl-similarity'],), ''), 413 'branch.master.git-cl-similarity'],), ''),
414 ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
415 ((['git', 'config', '--int', '--get',
416 'branch.master.git-find-copies'],), ''),
374 ((['git', 'update-index', '--refresh', '-q'],), ''), 417 ((['git', 'update-index', '--refresh', '-q'],), ''),
375 ((['git', 'diff-index', 'HEAD'],), ''), 418 ((['git', 'diff-index', 'HEAD'],), ''),
376 ((['git', 'symbolic-ref', 'HEAD'],), 'master'), 419 ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
377 ((['git', 'config', 'branch.master.merge'],), 'master'), 420 ((['git', 'config', 'branch.master.merge'],), 'master'),
378 ((['git', 'config', 'branch.master.remote'],), 'origin'), 421 ((['git', 'config', 'branch.master.remote'],), 'origin'),
379 ((['git', 'rev-parse', '--show-cdup'],), ''), 422 ((['git', 'rev-parse', '--show-cdup'],), ''),
380 ((['git', 'rev-parse', 'HEAD'],), '12345'), 423 ((['git', 'rev-parse', 'HEAD'],), '12345'),
381 ((['git', 'diff', '--name-status', '-r', 'master...', '.'],), 424 ((['git', 'diff', '--name-status', '-r', 'master...', '.'],),
382 'M\t.gitignore\n'), 425 'M\t.gitignore\n'),
383 ((['git', 'config', 'branch.master.rietveldissue'],), ''), 426 ((['git', 'config', 'branch.master.rietveldissue'],), ''),
384 ((['git', 'config', 'branch.master.rietveldpatchset'],), ''), 427 ((['git', 'config', 'branch.master.rietveldpatchset'],), ''),
385 ((['git', 'log', '--pretty=format:%s%n%n%b', 'master...'],), 'foo'), 428 ((['git', 'log', '--pretty=format:%s%n%n%b', 'master...'],), 'foo'),
386 ((['git', 'config', 'user.email'],), 'me@example.com'), 429 ((['git', 'config', 'user.email'],), 'me@example.com'),
387 ((['git', 'diff', '--no-ext-diff', '--stat', '--find-copies-harder', 430 ((['git', 'diff', '--no-ext-diff', '--stat', '--find-copies-harder',
388 '-C50', '-l100000', 'master...'],), 431 '-l100000', '-C50', 'master...'],),
389 '+dat'), 432 '+dat'),
390 ] 433 ]
391 434
392 @staticmethod 435 @staticmethod
393 def _gerrit_upload_calls(description, reviewers): 436 def _gerrit_upload_calls(description, reviewers):
394 calls = [ 437 calls = [
395 ((['git', 'log', '--pretty=format:%s\n\n%b', 'master..'],), 438 ((['git', 'log', '--pretty=format:%s\n\n%b', 'master..'],),
396 description), 439 description),
397 ((['git', 'config', 'rietveld.cc'],), '') 440 ((['git', 'config', 'rietveld.cc'],), '')
398 ] 441 ]
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 ((['git', 'config', 'rietveld.viewvc-url'],), ''), 532 ((['git', 'config', 'rietveld.viewvc-url'],), ''),
490 (('ViewVC URL:',), ''), 533 (('ViewVC URL:',), ''),
491 # DownloadHooks(True) 534 # DownloadHooks(True)
492 ((commit_msg_path, os.X_OK,), True), 535 ((commit_msg_path, os.X_OK,), True),
493 ] 536 ]
494 git_cl.main(['config']) 537 git_cl.main(['config'])
495 538
496 539
497 if __name__ == '__main__': 540 if __name__ == '__main__':
498 unittest.main() 541 unittest.main()
OLDNEW
« no previous file with comments | « git_cl.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698