def install(self): if not os.path.isdir(os.path.join(sublime.packages_path(),"User","MavensMate")): os.makedirs(os.path.join(sublime.packages_path(),"User","MavensMate")) if os.path.isdir(os.path.join(sublime.packages_path(),"User","MavensMate","mm")): platform_util.rmtree(os.path.join(sublime.packages_path(),"User","MavensMate","mm")) if self.printer != None: self.printer.show() self.printer.writeln(' ') self.printer.writeln(' ') if self.release != None: self.printer.writeln('Installing MavensMate API (mm) '+self.release['tag_name']+' to the User plugin directory.') else: self.printer.writeln('Installing the MavensMate API (mm) to the User plugin directory.') self.printer.writeln('Timestamp: '+self.process_id) self.printer.writeln(' Result: ') self.calculate_process_region() PanelThreadProgress(self) if os.path.isfile(os.path.join(sublime.packages_path(),"User","MavensMate","mm.zip")): os.remove(os.path.join(sublime.packages_path(),"User","MavensMate","mm.zip")) if self.release == None: release_to_install = self.latest_release else: # installing a specific release release_to_install = self.release debug(release_to_install) file_name_platform_flag = get_platform_flag() latest_asset = None for a in release_to_install['assets']: if file_name_platform_flag in a['name']: latest_asset = a debug('latest asset ---->') debug(latest_asset) download_url = latest_asset['browser_download_url'] debug('attempting to download: ',latest_asset['browser_download_url']) if 'linux' in sys.platform: import subprocess zip_name = 'mm.tar.gz' command = "wget -O '"+os.path.join(sublime.packages_path(),"User","MavensMate",zip_name)+"' '"+download_url+"'" process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) download_result = '' response_body = '' if process.stdout is not None: download_result = process.stdout.readlines() elif process.stderr is not None: download_result = process.stderr.readlines() try: response_body = '\n'.join(download_result) except: strs = [] for line in download_result: strs.append(line.decode('utf-8')) response_body = '\n'.join(strs) debug('result of wget download::: ') debug(response_body) else: zip_name = 'mm.zip' with urllib.request.urlopen(download_url) as response, open(os.path.join(sublime.packages_path(),"User","MavensMate",zip_name), 'wb') as out_file: data = response.read() # a `bytes` object out_file.write(data) extract_mm_zip() f = open(os.path.join(sublime.packages_path(),"User","MavensMate","mm","version.txt"), 'wb') f.write(bytes(release_to_install['tag_name'], 'UTF-8')) f.close() ensure_executable_perms() if os.path.isfile(os.path.join(sublime.packages_path(),"User","MavensMate",zip_name)): os.remove(os.path.join(sublime.packages_path(),"User","MavensMate",zip_name))
def run(self): try: debug('mm_installer -->') if self.release != None: ThreadProgress(self, "Installing MavensMate API (mm) "+self.release['tag_name']+". This could take a few minutes.", '') else: ThreadProgress(self, "Ensuring MavensMate API (mm) is up to date. This could take a few minutes.", '') mm_path = self.settings.get('mm_path', 'default') if self.force: debug('forcing mm installation') self.install() elif not os.path.isdir(os.path.join(sublime.packages_path(),"User","MavensMate","mm")) and mm_path == 'default': # need to download and install debug('user mm_path value is default, but mm not installed, forcing install') self.install() elif mm_path == 'default' and os.path.isdir(os.path.join(sublime.packages_path(),"User","MavensMate","mm")): # check version debug('checking for updated mm version') # here we check for version.txt in the User/mm directory try: with open (os.path.join(sublime.packages_path(),"User","MavensMate","mm","version.txt"), "r") as version_file: version_data=version_file.read().replace('\n', '') current_version_data = version_data.replace('v','') installed_version_int = int(float(current_version_data.replace(".", ""))) except: self.install() self.result = 'Success. Please restart Sublime Text -- Happy coding!!' if self.printer != None: self.calculate_process_region() ThreadTracker.remove(self) return # compare local version to server (github release) version latest_version = self.latest_release['tag_name'].replace('v','') server_version_int = int(float(latest_version.replace(".", ""))) if server_version_int > installed_version_int: debug('mm is out of date, prompting for an update') #if sublime.ok_cancel_dialog("A new version ("+self.latest_release['tag_name']+") of the MavensMate API (mm) is available, you are running "+version_data+". Would you like to update (recommended)? \n\nIf you no longer wish to see these notifications, toggle mm_check_for_updates to false.\n\nIf you would like MavensMate to automatically install updates to mm, set mm_auto_install_mm_updates to true."): if sublime.ok_cancel_dialog("A new version ("+self.latest_release['tag_name']+") of the MavensMate API (mm) is available, you are running "+version_data+". Would you like to update (recommended)? \n\nIf you no longer wish to see these notifications, toggle mm_check_for_updates to false."): if os.path.isdir(os.path.join(sublime.packages_path(),"User","MavensMate","mm")): platform_util.rmtree(os.path.join(sublime.packages_path(),"User","MavensMate","mm")) self.install() else: debug('mm is up to date ('+latest_version+'), no further action needed') self.result = 'Success. Please restart Sublime Text -- Happy coding!!' if self.printer != None: self.calculate_process_region() ThreadTracker.remove(self) except BaseException as e: import traceback import sys traceback.print_exc(file=sys.stdout) debug('[MAVENSMATE] could not install mm') debug(e) self.result = '[OPERATION FAILED]: could not install mm, please generate/check logs and report GitHub issue' if self.printer != None: self.calculate_process_region() ThreadTracker.remove(self)