diff options
| author | Mike Frysinger <vapier@google.com> | 2019-08-27 01:56:43 -0400 |
|---|---|---|
| committer | David Pursehouse <dpursehouse@collab.net> | 2019-09-11 23:24:11 +0000 |
| commit | 01d6c3c0c5cfb9ccf6b60d4db78852dfbf1e3c39 (patch) | |
| tree | ee48008644f88b8991a961a21f515b76edf4d4f7 | |
| parent | 4c263b52e729d57e492017b481105af8a05240b6 (diff) | |
| download | git-repo-01d6c3c0c5cfb9ccf6b60d4db78852dfbf1e3c39.tar.gz | |
sync: create dedicated smart sync func
The smart sync logic takes up about 45% of the overall Execute func
and is about 100 lines of code. The only effect it has on the rest
of the code is to set the manifest_name variable. Since this func
is already quite huge, split the smart sync logic out.
Change-Id: Id861849b0011ab47387d74e92c2ac15afcc938ba
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/234835
Tested-by: Mike Frysinger <vapier@google.com>
Reviewed-by: David Pursehouse <dpursehouse@collab.net>
| -rw-r--r-- | subcmds/sync.py | 196 |
1 files changed, 100 insertions, 96 deletions
diff --git a/subcmds/sync.py b/subcmds/sync.py index f1fe88d8..d047b162 100644 --- a/subcmds/sync.py +++ b/subcmds/sync.py | |||
| @@ -739,6 +739,103 @@ later is required to fix a server side protocol bug. | |||
| 739 | fd.close() | 739 | fd.close() |
| 740 | return 0 | 740 | return 0 |
| 741 | 741 | ||
| 742 | def _SmartSyncSetup(self, opt, smart_sync_manifest_path): | ||
| 743 | if not self.manifest.manifest_server: | ||
| 744 | print('error: cannot smart sync: no manifest server defined in ' | ||
| 745 | 'manifest', file=sys.stderr) | ||
| 746 | sys.exit(1) | ||
| 747 | |||
| 748 | manifest_server = self.manifest.manifest_server | ||
| 749 | if not opt.quiet: | ||
| 750 | print('Using manifest server %s' % manifest_server) | ||
| 751 | |||
| 752 | if not '@' in manifest_server: | ||
| 753 | username = None | ||
| 754 | password = None | ||
| 755 | if opt.manifest_server_username and opt.manifest_server_password: | ||
| 756 | username = opt.manifest_server_username | ||
| 757 | password = opt.manifest_server_password | ||
| 758 | else: | ||
| 759 | try: | ||
| 760 | info = netrc.netrc() | ||
| 761 | except IOError: | ||
| 762 | # .netrc file does not exist or could not be opened | ||
| 763 | pass | ||
| 764 | else: | ||
| 765 | try: | ||
| 766 | parse_result = urllib.parse.urlparse(manifest_server) | ||
| 767 | if parse_result.hostname: | ||
| 768 | auth = info.authenticators(parse_result.hostname) | ||
| 769 | if auth: | ||
| 770 | username, _account, password = auth | ||
| 771 | else: | ||
| 772 | print('No credentials found for %s in .netrc' | ||
| 773 | % parse_result.hostname, file=sys.stderr) | ||
| 774 | except netrc.NetrcParseError as e: | ||
| 775 | print('Error parsing .netrc file: %s' % e, file=sys.stderr) | ||
| 776 | |||
| 777 | if (username and password): | ||
| 778 | manifest_server = manifest_server.replace('://', '://%s:%s@' % | ||
| 779 | (username, password), | ||
| 780 | 1) | ||
| 781 | |||
| 782 | transport = PersistentTransport(manifest_server) | ||
| 783 | if manifest_server.startswith('persistent-'): | ||
| 784 | manifest_server = manifest_server[len('persistent-'):] | ||
| 785 | |||
| 786 | try: | ||
| 787 | server = xmlrpc.client.Server(manifest_server, transport=transport) | ||
| 788 | if opt.smart_sync: | ||
| 789 | p = self.manifest.manifestProject | ||
| 790 | b = p.GetBranch(p.CurrentBranch) | ||
| 791 | branch = b.merge | ||
| 792 | if branch.startswith(R_HEADS): | ||
| 793 | branch = branch[len(R_HEADS):] | ||
| 794 | |||
| 795 | env = os.environ.copy() | ||
| 796 | if 'SYNC_TARGET' in env: | ||
| 797 | target = env['SYNC_TARGET'] | ||
| 798 | [success, manifest_str] = server.GetApprovedManifest(branch, target) | ||
| 799 | elif 'TARGET_PRODUCT' in env and 'TARGET_BUILD_VARIANT' in env: | ||
| 800 | target = '%s-%s' % (env['TARGET_PRODUCT'], | ||
| 801 | env['TARGET_BUILD_VARIANT']) | ||
| 802 | [success, manifest_str] = server.GetApprovedManifest(branch, target) | ||
| 803 | else: | ||
| 804 | [success, manifest_str] = server.GetApprovedManifest(branch) | ||
| 805 | else: | ||
| 806 | assert(opt.smart_tag) | ||
| 807 | [success, manifest_str] = server.GetManifest(opt.smart_tag) | ||
| 808 | |||
| 809 | if success: | ||
| 810 | manifest_name = os.path.basename(smart_sync_manifest_path) | ||
| 811 | try: | ||
| 812 | f = open(smart_sync_manifest_path, 'w') | ||
| 813 | try: | ||
| 814 | f.write(manifest_str) | ||
| 815 | finally: | ||
| 816 | f.close() | ||
| 817 | except IOError as e: | ||
| 818 | print('error: cannot write manifest to %s:\n%s' | ||
| 819 | % (smart_sync_manifest_path, e), | ||
| 820 | file=sys.stderr) | ||
| 821 | sys.exit(1) | ||
| 822 | self._ReloadManifest(manifest_name) | ||
| 823 | else: | ||
| 824 | print('error: manifest server RPC call failed: %s' % | ||
| 825 | manifest_str, file=sys.stderr) | ||
| 826 | sys.exit(1) | ||
| 827 | except (socket.error, IOError, xmlrpc.client.Fault) as e: | ||
| 828 | print('error: cannot connect to manifest server %s:\n%s' | ||
| 829 | % (self.manifest.manifest_server, e), file=sys.stderr) | ||
| 830 | sys.exit(1) | ||
| 831 | except xmlrpc.client.ProtocolError as e: | ||
| 832 | print('error: cannot connect to manifest server %s:\n%d %s' | ||
| 833 | % (self.manifest.manifest_server, e.errcode, e.errmsg), | ||
| 834 | file=sys.stderr) | ||
| 835 | sys.exit(1) | ||
| 836 | |||
| 837 | return manifest_name | ||
| 838 | |||
| 742 | def ValidateOptions(self, opt, args): | 839 | def ValidateOptions(self, opt, args): |
| 743 | if opt.force_broken: | 840 | if opt.force_broken: |
| 744 | print('warning: -f/--force-broken is now the default behavior, and the ' | 841 | print('warning: -f/--force-broken is now the default behavior, and the ' |
| @@ -768,105 +865,12 @@ later is required to fix a server side protocol bug. | |||
| 768 | self.manifest.Override(opt.manifest_name) | 865 | self.manifest.Override(opt.manifest_name) |
| 769 | 866 | ||
| 770 | manifest_name = opt.manifest_name | 867 | manifest_name = opt.manifest_name |
| 771 | smart_sync_manifest_name = "smart_sync_override.xml" | ||
| 772 | smart_sync_manifest_path = os.path.join( | 868 | smart_sync_manifest_path = os.path.join( |
| 773 | self.manifest.manifestProject.worktree, smart_sync_manifest_name) | 869 | self.manifest.manifestProject.worktree, 'smart_sync_override.xml') |
| 774 | 870 | ||
| 775 | if opt.smart_sync or opt.smart_tag: | 871 | if opt.smart_sync or opt.smart_tag: |
| 776 | if not self.manifest.manifest_server: | 872 | manifest_name = self._SmartSyncSetup(opt, smart_sync_manifest_path) |
| 777 | print('error: cannot smart sync: no manifest server defined in ' | 873 | else: |
| 778 | 'manifest', file=sys.stderr) | ||
| 779 | sys.exit(1) | ||
| 780 | |||
| 781 | manifest_server = self.manifest.manifest_server | ||
| 782 | if not opt.quiet: | ||
| 783 | print('Using manifest server %s' % manifest_server) | ||
| 784 | |||
| 785 | if not '@' in manifest_server: | ||
| 786 | username = None | ||
| 787 | password = None | ||
| 788 | if opt.manifest_server_username and opt.manifest_server_password: | ||
| 789 | username = opt.manifest_server_username | ||
| 790 | password = opt.manifest_server_password | ||
| 791 | else: | ||
| 792 | try: | ||
| 793 | info = netrc.netrc() | ||
| 794 | except IOError: | ||
| 795 | # .netrc file does not exist or could not be opened | ||
| 796 | pass | ||
| 797 | else: | ||
| 798 | try: | ||
| 799 | parse_result = urllib.parse.urlparse(manifest_server) | ||
| 800 | if parse_result.hostname: | ||
| 801 | auth = info.authenticators(parse_result.hostname) | ||
| 802 | if auth: | ||
| 803 | username, _account, password = auth | ||
| 804 | else: | ||
| 805 | print('No credentials found for %s in .netrc' | ||
| 806 | % parse_result.hostname, file=sys.stderr) | ||
| 807 | except netrc.NetrcParseError as e: | ||
| 808 | print('Error parsing .netrc file: %s' % e, file=sys.stderr) | ||
| 809 | |||
| 810 | if (username and password): | ||
| 811 | manifest_server = manifest_server.replace('://', '://%s:%s@' % | ||
| 812 | (username, password), | ||
| 813 | 1) | ||
| 814 | |||
| 815 | transport = PersistentTransport(manifest_server) | ||
| 816 | if manifest_server.startswith('persistent-'): | ||
| 817 | manifest_server = manifest_server[len('persistent-'):] | ||
| 818 | |||
| 819 | try: | ||
| 820 | server = xmlrpc.client.Server(manifest_server, transport=transport) | ||
| 821 | if opt.smart_sync: | ||
| 822 | p = self.manifest.manifestProject | ||
| 823 | b = p.GetBranch(p.CurrentBranch) | ||
| 824 | branch = b.merge | ||
| 825 | if branch.startswith(R_HEADS): | ||
| 826 | branch = branch[len(R_HEADS):] | ||
| 827 | |||
| 828 | env = os.environ.copy() | ||
| 829 | if 'SYNC_TARGET' in env: | ||
| 830 | target = env['SYNC_TARGET'] | ||
| 831 | [success, manifest_str] = server.GetApprovedManifest(branch, target) | ||
| 832 | elif 'TARGET_PRODUCT' in env and 'TARGET_BUILD_VARIANT' in env: | ||
| 833 | target = '%s-%s' % (env['TARGET_PRODUCT'], | ||
| 834 | env['TARGET_BUILD_VARIANT']) | ||
| 835 | [success, manifest_str] = server.GetApprovedManifest(branch, target) | ||
| 836 | else: | ||
| 837 | [success, manifest_str] = server.GetApprovedManifest(branch) | ||
| 838 | else: | ||
| 839 | assert(opt.smart_tag) | ||
| 840 | [success, manifest_str] = server.GetManifest(opt.smart_tag) | ||
| 841 | |||
| 842 | if success: | ||
| 843 | manifest_name = smart_sync_manifest_name | ||
| 844 | try: | ||
| 845 | f = open(smart_sync_manifest_path, 'w') | ||
| 846 | try: | ||
| 847 | f.write(manifest_str) | ||
| 848 | finally: | ||
| 849 | f.close() | ||
| 850 | except IOError as e: | ||
| 851 | print('error: cannot write manifest to %s:\n%s' | ||
| 852 | % (smart_sync_manifest_path, e), | ||
| 853 | file=sys.stderr) | ||
| 854 | sys.exit(1) | ||
| 855 | self._ReloadManifest(manifest_name) | ||
| 856 | else: | ||
| 857 | print('error: manifest server RPC call failed: %s' % | ||
| 858 | manifest_str, file=sys.stderr) | ||
| 859 | sys.exit(1) | ||
| 860 | except (socket.error, IOError, xmlrpc.client.Fault) as e: | ||
| 861 | print('error: cannot connect to manifest server %s:\n%s' | ||
| 862 | % (self.manifest.manifest_server, e), file=sys.stderr) | ||
| 863 | sys.exit(1) | ||
| 864 | except xmlrpc.client.ProtocolError as e: | ||
| 865 | print('error: cannot connect to manifest server %s:\n%d %s' | ||
| 866 | % (self.manifest.manifest_server, e.errcode, e.errmsg), | ||
| 867 | file=sys.stderr) | ||
| 868 | sys.exit(1) | ||
| 869 | else: # Not smart sync or smart tag mode | ||
| 870 | if os.path.isfile(smart_sync_manifest_path): | 874 | if os.path.isfile(smart_sync_manifest_path): |
| 871 | try: | 875 | try: |
| 872 | platform_utils.remove(smart_sync_manifest_path) | 876 | platform_utils.remove(smart_sync_manifest_path) |
