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

Side by Side Diff: tests/git_cl_test.py

Issue 1835963003: Gerrit git cl: stop creating a shadow branch. (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/depot_tools.git@H150
Patch Set: review Created 4 years, 8 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 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 # diagnose. 119 # diagnose.
120 if expected_args != args: 120 if expected_args != args:
121 msg = '@%d Expected: %r Actual: %r' % ( 121 msg = '@%d Expected: %r Actual: %r' % (
122 self._calls_done, expected_args, args) 122 self._calls_done, expected_args, args)
123 git_cl.logging.error(msg) 123 git_cl.logging.error(msg)
124 self.fail(msg) 124 self.fail(msg)
125 self._calls_done += 1 125 self._calls_done += 1
126 return result 126 return result
127 127
128 @classmethod 128 @classmethod
129 def _is_gerrit_calls(cls, gerrit=False):
130 return [((['git', 'config', 'rietveld.autoupdate'],), ''),
131 ((['git', 'config', 'gerrit.host'],), 'True' if gerrit else '')]
132
133 @classmethod
129 def _upload_calls(cls, similarity, find_copies, private): 134 def _upload_calls(cls, similarity, find_copies, private):
130 return (cls._git_base_calls(similarity, find_copies) + 135 return (cls._git_base_calls(similarity, find_copies) +
131 cls._git_upload_calls(private)) 136 cls._git_upload_calls(private))
132 137
133 @classmethod 138 @classmethod
134 def _upload_no_rev_calls(cls, similarity, find_copies): 139 def _upload_no_rev_calls(cls, similarity, find_copies):
135 return (cls._git_base_calls(similarity, find_copies) + 140 return (cls._git_base_calls(similarity, find_copies) +
136 cls._git_upload_no_rev_calls()) 141 cls._git_upload_no_rev_calls())
137 142
138 @classmethod 143 @classmethod
(...skipping 21 matching lines...) Expand all
160 'fake_ancestor_sha', 'HEAD'],), '+dat') 165 'fake_ancestor_sha', 'HEAD'],), '+dat')
161 else: 166 else:
162 stat_call = ((['git', 'diff', '--no-ext-diff', '--stat', 167 stat_call = ((['git', 'diff', '--no-ext-diff', '--stat',
163 '-M'+similarity, 'fake_ancestor_sha', 'HEAD'],), '+dat') 168 '-M'+similarity, 'fake_ancestor_sha', 'HEAD'],), '+dat')
164 169
165 return [ 170 return [
166 ((['git', 'symbolic-ref', 'HEAD'],), 'master'), 171 ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
167 similarity_call, 172 similarity_call,
168 ((['git', 'symbolic-ref', 'HEAD'],), 'master'), 173 ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
169 find_copies_call, 174 find_copies_call,
175 ] + cls._is_gerrit_calls() + [
170 ((['git', 'symbolic-ref', 'HEAD'],), 'master'), 176 ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
171 ((['git', 'config', 'branch.master.rietveldissue'],), ''), 177 ((['git', 'config', 'branch.master.rietveldissue'],), ''),
172 ((['git', 'config', 'branch.master.gerritissue'],), ''), 178 ((['git', 'config', 'branch.master.gerritissue'],), ''),
173 ((['git', 'config', 'rietveld.autoupdate'],), ''),
174 ((['git', 'config', 'gerrit.host'],), ''),
175 ((['git', 'config', 'rietveld.server'],), 179 ((['git', 'config', 'rietveld.server'],),
176 'codereview.example.com'), 180 'codereview.example.com'),
177 ((['git', 'config', 'branch.master.merge'],), 'master'), 181 ((['git', 'config', 'branch.master.merge'],), 'master'),
178 ((['git', 'config', 'branch.master.remote'],), 'origin'), 182 ((['git', 'config', 'branch.master.remote'],), 'origin'),
179 ((['get_or_create_merge_base', 'master', 'master'],), 183 ((['get_or_create_merge_base', 'master', 'master'],),
180 'fake_ancestor_sha'), 184 'fake_ancestor_sha'),
181 ] + cls._git_sanity_checks('fake_ancestor_sha', 'master') + [ 185 ] + cls._git_sanity_checks('fake_ancestor_sha', 'master') + [
182 ((['git', 'rev-parse', '--show-cdup'],), ''), 186 ((['git', 'rev-parse', '--show-cdup'],), ''),
183 ((['git', 'rev-parse', 'HEAD'],), '12345'), 187 ((['git', 'rev-parse', 'HEAD'],), '12345'),
184 ((['git', 'diff', '--name-status', '--no-renames', '-r', 188 ((['git', 'diff', '--name-status', '--no-renames', '-r',
185 'fake_ancestor_sha...', '.'],), 189 'fake_ancestor_sha...', '.'],),
186 'M\t.gitignore\n'), 190 'M\t.gitignore\n'),
187 ((['git', 'config', 'branch.master.rietveldpatchset'],), 191 ((['git', 'config', 'branch.master.rietveldpatchset'],),
188 ''), 192 ''),
189 ((['git', 'log', '--pretty=format:%s%n%n%b', 193 ((['git', 'log', '--pretty=format:%s%n%n%b',
190 'fake_ancestor_sha...'],), 194 'fake_ancestor_sha...'],),
191 'foo'), 195 'foo'),
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 539
536 def test_dcommit_bypass_hooks(self): 540 def test_dcommit_bypass_hooks(self):
537 self.calls = ( 541 self.calls = (
538 self._dcommit_calls_1() + 542 self._dcommit_calls_1() +
539 self._dcommit_calls_bypassed() + 543 self._dcommit_calls_bypassed() +
540 self._dcommit_calls_3()) 544 self._dcommit_calls_3())
541 git_cl.main(['dcommit', '--bypass-hooks']) 545 git_cl.main(['dcommit', '--bypass-hooks'])
542 546
543 547
544 @classmethod 548 @classmethod
545 def _gerrit_base_calls(cls): 549 def _gerrit_base_calls(cls, issue=None):
546 return [ 550 return [
547 ((['git', 'symbolic-ref', 'HEAD'],), 'master'), 551 ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
548 ((['git', 'config', '--int', '--get', 552 ((['git', 'config', '--int', '--get',
549 'branch.master.git-cl-similarity'],), ''), 553 'branch.master.git-cl-similarity'],), ''),
550 ((['git', 'symbolic-ref', 'HEAD'],), 'master'), 554 ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
551 ((['git', 'config', '--int', '--get', 555 ((['git', 'config', '--int', '--get',
552 'branch.master.git-find-copies'],), ''), 556 'branch.master.git-find-copies'],), ''),
557 ] + cls._is_gerrit_calls(True) + [
553 ((['git', 'symbolic-ref', 'HEAD'],), 'master'), 558 ((['git', 'symbolic-ref', 'HEAD'],), 'master'),
554 ((['git', 'config', 'branch.master.rietveldissue'],), ''), 559 ((['git', 'config', 'branch.master.rietveldissue'],), ''),
555 ((['git', 'config', 'branch.master.gerritissue'],), ''), 560 ((['git', 'config', 'branch.master.gerritissue'],),
556 ((['git', 'config', 'rietveld.autoupdate'],), ''), 561 '' if issue is None else str(issue)),
557 ((['git', 'config', 'gerrit.host'],), 'True'),
558 ((['git', 'config', 'branch.master.merge'],), 'master'), 562 ((['git', 'config', 'branch.master.merge'],), 'master'),
559 ((['git', 'config', 'branch.master.remote'],), 'origin'), 563 ((['git', 'config', 'branch.master.remote'],), 'origin'),
560 ((['get_or_create_merge_base', 'master', 'master'],), 564 ((['get_or_create_merge_base', 'master', 'master'],),
561 'fake_ancestor_sha'), 565 'fake_ancestor_sha'),
562 ] + cls._git_sanity_checks('fake_ancestor_sha', 'master') + [ 566 ] + cls._git_sanity_checks('fake_ancestor_sha', 'master') + [
563 ((['git', 'rev-parse', '--show-cdup'],), ''), 567 ((['git', 'rev-parse', '--show-cdup'],), ''),
564 ((['git', 'rev-parse', 'HEAD'],), '12345'), 568 ((['git', 'rev-parse', 'HEAD'],), '12345'),
565 ((['git', 569 ((['git',
566 'diff', '--name-status', '--no-renames', '-r', 570 'diff', '--name-status', '--no-renames', '-r',
567 'fake_ancestor_sha...', '.'],), 571 'fake_ancestor_sha...', '.'],),
568 'M\t.gitignore\n'), 572 'M\t.gitignore\n'),
569 ((['git', 'config', 'branch.master.gerritpatchset'],), ''), 573 ((['git', 'config', 'branch.master.gerritpatchset'],), ''),
574 ] + ([] if issue else [
570 ((['git', 575 ((['git',
571 'log', '--pretty=format:%s%n%n%b', 'fake_ancestor_sha...'],), 576 'log', '--pretty=format:%s%n%n%b', 'fake_ancestor_sha...'],),
572 'foo'), 577 'foo'),
578 ]) + [
573 ((['git', 'config', 'user.email'],), 'me@example.com'), 579 ((['git', 'config', 'user.email'],), 'me@example.com'),
574 ((['git', 580 ((['git',
575 'diff', '--no-ext-diff', '--stat', '--find-copies-harder', 581 'diff', '--no-ext-diff', '--stat', '--find-copies-harder',
576 '-l100000', '-C50', 'fake_ancestor_sha', 'HEAD'],), 582 '-l100000', '-C50', 'fake_ancestor_sha', 'HEAD'],),
577 '+dat'), 583 '+dat'),
578 ] 584 ]
579 585
580 @classmethod 586 @classmethod
581 def _gerrit_upload_calls(cls, description, reviewers, squash, 587 def _gerrit_upload_calls(cls, description, reviewers, squash,
582 expected_upstream_ref='origin/refs/heads/master', 588 expected_upstream_ref='origin/refs/heads/master',
583 post_amend_description=None): 589 post_amend_description=None, issue=None):
584 if post_amend_description is None: 590 if post_amend_description is None:
585 post_amend_description = description 591 post_amend_description = description
592
586 calls = [ 593 calls = [
587 ((['git', 'config', '--bool', 'gerrit.squash-uploads'],), 'false'), 594 ((['git', 'config', '--bool', 'gerrit.squash-uploads'],), 'false'),
588 ((['git', 'log', '--pretty=format:%s\n\n%b', 595 ]
589 'fake_ancestor_sha..HEAD'],), 596 # If issue is given, then description is fetched from Gerrit instead.
590 description) 597 if issue is None:
591 ] 598 if squash:
599 calls += [
600 ((['git', 'show', '--format=%B', '-s',
601 'refs/heads/git_cl_uploads/master'],), '')]
602 calls += [
603 ((['git', 'log', '--pretty=format:%s\n\n%b',
604 'fake_ancestor_sha..HEAD'],),
605 description)]
592 if not git_footers.get_footer_change_id(description) and not squash: 606 if not git_footers.get_footer_change_id(description) and not squash:
593 calls += [ 607 calls += [
594 # DownloadGerritHook(False) 608 # DownloadGerritHook(False)
595 ((False, ), 609 ((False, ),
596 ''), 610 ''),
597 # Amending of commit message to get the Change-Id. 611 # Amending of commit message to get the Change-Id.
598 ((['git', 'log', '--pretty=format:%s\n\n%b', 612 ((['git', 'log', '--pretty=format:%s\n\n%b',
599 'fake_ancestor_sha..HEAD'],), 613 'fake_ancestor_sha..HEAD'],),
600 description), 614 description),
601 ((['git', 'commit', '--amend', '-m', description],), 615 ((['git', 'commit', '--amend', '-m', description],),
602 ''), 616 ''),
603 ((['git', 'log', '--pretty=format:%s\n\n%b', 617 ((['git', 'log', '--pretty=format:%s\n\n%b',
604 'fake_ancestor_sha..HEAD'],), 618 'fake_ancestor_sha..HEAD'],),
605 post_amend_description) 619 post_amend_description)
606 ] 620 ]
607 if squash: 621 if squash:
622 if not issue:
623 # Prompting to edit description on first upload.
624 calls += [
625 ((['git', 'config', 'core.editor'],), ''),
626 ((['RunEditor'],), description),
627 ]
608 ref_to_push = 'abcdef0123456789' 628 ref_to_push = 'abcdef0123456789'
609 calls += [ 629 calls += [
610 ((['git', 'show', '--format=%B', '-s',
611 'refs/heads/git_cl_uploads/master'],),
612 (description, 0)),
613 ((['git', 'config', 'branch.master.merge'],), 630 ((['git', 'config', 'branch.master.merge'],),
614 'refs/heads/master'), 631 'refs/heads/master'),
615 ((['git', 'config', 'branch.master.remote'],), 632 ((['git', 'config', 'branch.master.remote'],),
616 'origin'), 633 'origin'),
617 ((['get_or_create_merge_base', 'master', 'master'],), 634 ((['get_or_create_merge_base', 'master', 'master'],),
618 'origin/master'), 635 'origin/master'),
619 ((['git', 'rev-parse', 'HEAD:'],), 636 ((['git', 'rev-parse', 'HEAD:'],),
620 '0123456789abcdef'), 637 '0123456789abcdef'),
621 ((['git', 'commit-tree', '0123456789abcdef', '-p', 638 ((['git', 'commit-tree', '0123456789abcdef', '-p',
622 'origin/master', '-m', 'd'],), 639 'origin/master', '-m', description],),
623 ref_to_push), 640 ref_to_push),
624 ] 641 ]
625 else: 642 else:
626 ref_to_push = 'HEAD' 643 ref_to_push = 'HEAD'
627 644
628 calls += [ 645 calls += [
629 ((['git', 'rev-list', 646 ((['git', 'rev-list',
630 expected_upstream_ref + '..' + ref_to_push],), ''), 647 expected_upstream_ref + '..' + ref_to_push],), ''),
631 ((['git', 'config', 'rietveld.cc'],), '') 648 ((['git', 'config', 'rietveld.cc'],), '')
632 ] 649 ]
(...skipping 23 matching lines...) Expand all
656 ' * [new branch] hhhh -> refs/for/refs/heads/master\n')), 673 ' * [new branch] hhhh -> refs/for/refs/heads/master\n')),
657 ] 674 ]
658 if squash: 675 if squash:
659 calls += [ 676 calls += [
660 ((['git', 'config', 'branch.master.gerritissue', '123456'],), ''), 677 ((['git', 'config', 'branch.master.gerritissue', '123456'],), ''),
661 ((['git', 'config', 'branch.master.gerritserver'],), ''), 678 ((['git', 'config', 'branch.master.gerritserver'],), ''),
662 ((['git', 'config', 'remote.origin.url'],), 679 ((['git', 'config', 'remote.origin.url'],),
663 'https://chromium.googlesource.com/my/repo.git'), 680 'https://chromium.googlesource.com/my/repo.git'),
664 ((['git', 'config', 'branch.master.gerritserver', 681 ((['git', 'config', 'branch.master.gerritserver',
665 'https://chromium-review.googlesource.com'],), ''), 682 'https://chromium-review.googlesource.com'],), ''),
666 ((['git', 'rev-parse', 'HEAD'],), 'abcdef0123456789'), 683 ((['git', 'config', 'branch.master.gerritsquashhash',
667 ((['git', 'update-ref', '-m', 'Uploaded abcdef0123456789', 684 'abcdef0123456789'],), ''),
668 'refs/heads/git_cl_uploads/master', 'abcdef0123456789'],),
669 '')
670 ] 685 ]
671 calls += cls._git_post_upload_calls() 686 calls += cls._git_post_upload_calls()
672 return calls 687 return calls
673 688
674 def _run_gerrit_upload_test( 689 def _run_gerrit_upload_test(
675 self, 690 self,
676 upload_args, 691 upload_args,
677 description, 692 description,
678 reviewers, 693 reviewers,
679 squash=False, 694 squash=False,
680 expected_upstream_ref='origin/refs/heads/master', 695 expected_upstream_ref='origin/refs/heads/master',
681 post_amend_description=None): 696 post_amend_description=None,
697 issue=None):
682 """Generic gerrit upload test framework.""" 698 """Generic gerrit upload test framework."""
683 self.calls = self._gerrit_base_calls() 699 self.calls = self._gerrit_base_calls(issue=issue)
684 self.calls += self._gerrit_upload_calls( 700 self.calls += self._gerrit_upload_calls(
685 description, reviewers, squash, 701 description, reviewers, squash,
686 expected_upstream_ref=expected_upstream_ref, 702 expected_upstream_ref=expected_upstream_ref,
687 post_amend_description=post_amend_description) 703 post_amend_description=post_amend_description,
704 issue=issue)
688 # Uncomment when debugging. 705 # Uncomment when debugging.
689 # print '\n'.join(map(lambda x: '%2i: %s' % x, enumerate(self.calls))) 706 # print '\n'.join(map(lambda x: '%2i: %s' % x, enumerate(self.calls)))
690 git_cl.main(['upload'] + upload_args) 707 git_cl.main(['upload'] + upload_args)
691 708
692 def test_gerrit_upload_without_change_id(self): 709 def test_gerrit_upload_without_change_id(self):
693 self.mock(git_cl, 'DownloadGerritHook', self._mocked_call) 710 self.mock(git_cl, 'DownloadGerritHook', self._mocked_call)
694 self._run_gerrit_upload_test( 711 self._run_gerrit_upload_test(
695 [], 712 [],
696 'desc\n\nBUG=\n', 713 'desc\n\nBUG=\n',
697 [], 714 [],
(...skipping 11 matching lines...) Expand all
709 'desc\n\nBUG=\n\nChange-Id: I123456789', 726 'desc\n\nBUG=\n\nChange-Id: I123456789',
710 ['foo@example.com']) 727 ['foo@example.com'])
711 728
712 def test_gerrit_reviewer_multiple(self): 729 def test_gerrit_reviewer_multiple(self):
713 self._run_gerrit_upload_test( 730 self._run_gerrit_upload_test(
714 [], 731 [],
715 'desc\nTBR=reviewer@example.com\nBUG=\nR=another@example.com\n\n' 732 'desc\nTBR=reviewer@example.com\nBUG=\nR=another@example.com\n\n'
716 'Change-Id: 123456789\n', 733 'Change-Id: 123456789\n',
717 ['reviewer@example.com', 'another@example.com']) 734 ['reviewer@example.com', 'another@example.com'])
718 735
719 def test_gerrit_upload_squash(self): 736 def test_gerrit_upload_squash_first(self):
737 # Mock Gerrit CL description to indicate the first upload.
738 self.mock(git_cl.Changelist, 'GetDescription',
739 lambda *_: None)
740 self.mock(git_cl.gclient_utils, 'RunEditor',
741 lambda *_, **__: self._mocked_call(['RunEditor']))
720 self._run_gerrit_upload_test( 742 self._run_gerrit_upload_test(
721 ['--squash'], 743 ['--squash'],
722 'desc\n\nBUG=\nChange-Id:123456789\n', 744 'desc\nBUG=\n\nChange-Id: 123456789',
723 [], 745 [],
724 squash=True, 746 squash=True,
725 expected_upstream_ref='origin/master') 747 expected_upstream_ref='origin/master')
726 748
749 def test_gerrit_upload_squash_reupload(self):
750 description = 'desc\nBUG=\n\nChange-Id: 123456789'
751 # Mock Gerrit CL description to indicate re-upload.
752 self.mock(git_cl.Changelist, 'GetDescription',
753 lambda *args: description)
754 self.mock(git_cl.Changelist, 'GetMostRecentPatchset',
755 lambda *args: 1)
756 self.mock(git_cl._GerritChangelistImpl, '_GetChangeDetail',
757 lambda *args: {'change_id': '123456789'})
758 self._run_gerrit_upload_test(
759 ['--squash'],
760 description,
761 [],
762 squash=True,
763 expected_upstream_ref='origin/master',
764 issue=123456)
765
727 def test_upload_branch_deps(self): 766 def test_upload_branch_deps(self):
728 def mock_run_git(*args, **_kwargs): 767 def mock_run_git(*args, **_kwargs):
729 if args[0] == ['for-each-ref', 768 if args[0] == ['for-each-ref',
730 '--format=%(refname:short) %(upstream:short)', 769 '--format=%(refname:short) %(upstream:short)',
731 'refs/heads']: 770 'refs/heads']:
732 # Create a local branch dependency tree that looks like this: 771 # Create a local branch dependency tree that looks like this:
733 # test1 -> test2 -> test3 -> test4 -> test5 772 # test1 -> test2 -> test3 -> test4 -> test5
734 # -> test3.1 773 # -> test3.1
735 # test6 -> test0 774 # test6 -> test0
736 branch_deps = [ 775 branch_deps = [
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
921 self.calls += [ 960 self.calls += [
922 ((['git', 'apply', '--index', '-p0', '--3way'],), '', 961 ((['git', 'apply', '--index', '-p0', '--3way'],), '',
923 subprocess2.CalledProcessError(1, '', '', '', '')), 962 subprocess2.CalledProcessError(1, '', '', '', '')),
924 ] 963 ]
925 self.assertNotEqual(git_cl.main(['patch', '123456']), 0) 964 self.assertNotEqual(git_cl.main(['patch', '123456']), 0)
926 965
927 if __name__ == '__main__': 966 if __name__ == '__main__':
928 git_cl.logging.basicConfig( 967 git_cl.logging.basicConfig(
929 level=git_cl.logging.DEBUG if '-v' in sys.argv else git_cl.logging.ERROR) 968 level=git_cl.logging.DEBUG if '-v' in sys.argv else git_cl.logging.ERROR)
930 unittest.main() 969 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