diff options
-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) |