summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--subcmds/sync.py196
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)