sublime 自动升级 脚本

该插件为Sublime Text提供了一个自动检查并下载最新版本的功能,通过后台线程下载更新文件,并能根据不同操作系统进行适配。
import sublime, sublime_plugin  
import urllib2
import shutil
import os
import threading 
import json
import sys
import formatter, htmllib
import subprocess
import zipfile
from urllib import quote


UPDATE_URL = "http://www.padpeek.com/sublime/update.txt" #url to check for latest st2 version

class LinksParser(htmllib.HTMLParser): #helper class for scraping the site for download links
    
    def __init__(self, formatter):
        htmllib.HTMLParser.__init__(self, formatter)
        self.links = []

    def start_a(self, attrs):
        if len(attrs) > 0 :
            for attr in attrs :
                if attr[0] == "href":
                    # if attr[1].find("rackcdn") != -1:
                    self.links.append(attr[1])

    def get_links(self):
        return self.links

class BackgroundDownloader(threading.Thread):  
        
    def __init__(self, url, install_path, download_link):  
        self.url = url 
        self.result = None
        self.download_link = download_link
        self.install_path = install_path
        threading.Thread.__init__(self)  

    def startInstaller(self):
        file_name = self.download_link[self.download_link.find("sublimeExt"):]
        fullfilename  = sublime.packages_path() + "\\meetrice\\" + file_name
        unzipdir = sublime.packages_path()
        zip = zipfile.ZipFile(fullfilename,'r')
        zip.extractall(unzipdir)
        zip.close()
        os.remove(fullfilename)

    def run(self):  
        try:  
            file_name = self.url.split('/')[-1]
            u = urllib2.urlopen(self.url)
            print sublime.packages_path()
            f = open(sublime.packages_path() + "\\meetrice\\" + file_name, 'wb')
            meta = u.info()
            file_size = int(meta.getheaders("Content-Length")[0])
            print "Downloading: %s Bytes: %s" % (file_name, file_size)
            f.write(u.read())
            f.close()  
            self.result = True
            self.startInstaller()

            return
  
        except (urllib2.HTTPError) as (e):  
            err = '%s: HTTP error %s contacting URL' % (__name__, str(e.code))  
        except (urllib2.URLError) as (e):  
            err = '%s: URL error %s contacting URL' % (__name__, str(e.reason))  

        self.result = False  

class SublimeUpdaterCommand(sublime_plugin.ApplicationCommand):  

    def getLatestVersion(self):
        data = urllib2.urlopen(UPDATE_URL).read()
        data = json.loads(data)
        return data['latest_version']

    def get_package_dir(self, package):
        return os.path.join(sublime.packages_path(), package)

    def get_metadata(self, package):
        metadata_filename = os.path.join(self.get_package_dir(package),
            'package-metadata.json')
        if os.path.exists(metadata_filename):
            with open(metadata_filename) as f:
                try:
                    return json.load(f)
                except (ValueError):
                    return {}
        return {}

    def run(self):
        old_version = self.get_metadata('meetrice').get('version')
        if int(self.getLatestVersion()) == int(old_version):
            print ("currently on latest version")
        else:
            print ("new version available")
            if sublime.platform() == "windows":
                #download the latest installer
                s = sublime.load_settings("Preferences.sublime-settings") #get the install path from preferences
                install_path = s.get("install_path", "")
                f = urllib2.urlopen("http://www.padpeek.com/sublime/")
                format = formatter.NullFormatter()
                parser = LinksParser(format)
                html = f.read() 
                parser.feed(html) #get the list of latest installer urls
                parser.close()
                urls = parser.get_links()
                download_link=urls[0]
                download_link = quote(download_link, safe="%/:=&?~#+!$,;'@()*[]")
                sublime.status_message('SublimeUpdater is downloading update')
                thr = BackgroundDownloader(download_link, install_path, download_link) #start the download thread
                threads = []
                threads.append(thr)
                thr.start()

            elif sublime.platform() == "linux":
                print "linux detected"
        
            elif sublime.platform() == "osx":
                print "mac detected"

 

通用自动更新NSIS安装包程序 检查本地的配置版本与服务器配置的版本, 如果服务器比较新则进行下载并更新文件. 注意: 需要结合NSIS安装包进行安装. 升级时采用/S静默安装方式进行安装. 配置中, "name"属性指定的应用程序, 将最后被安装. 程序目前只支持更新一个主程序和一个插件程序, 其他功能自行完善 带源码, 带完整配置文件, 各项主要设置均可通过配置文件修改, 并包含程序逻辑简要描述说明文件. 功能不复杂, 主要是不想重复开发. 7. 程序逻辑: a. CommonAutoUpdate启动后, 将检查和加载本地配置文件, 加载成功后, 将判断"run"中指定的程序是否正在运行. 如果在运行, 则给出错误提示后, 退出更新程序; b. 如果"run"中的程序没有在运行, 则根据svrurl + "/commonAutoUpdate.xml" 地址, 加载服务器上的配置文件; c. 在加载配置文件过程中, 任何的异常, 均会提示"检查自动更新失败, 请稍后再试", 并退出; (不会启动"run"中配置的文件) d. 如果加载成功, 则会对比本地"version"中的版本号与服务器"cv"节点中的"v"属性的版本号; e. 如果服务器版本号小于或等于本地版本号, 则不进行更新, 直接运行"run"中指定的程序, 并传递"cau"参数作为标记; f. 如果服务器版本号大于本地版本号, 则会显示提示更新的界面, 在点击确定按钮后, 开始下载服务器"cv"节点中的"p"属性指定的文件; g. 待下载完成, 则会退出, 并运行下载的安装包进行安装.
检查本地的配置版本与服务器配置的版本, 如果服务器比较新则进行下载并更新文件. 注意: 需要结合NSIS安装包进行安装. 升级时采用/S静默安装方式进行安装. 配置中, "name"属性指定的应用程序, 将最后被安装. 程序目前只支持更新一个主程序和一个插件程序, 其他功能自行完善 带源码, 带完整配置文件, 各项主要设置均可通过配置文件修改, 并包含程序逻辑简要描述说明文件. 功能不复杂, 主要是不想重复开发. 7. 程序逻辑: a. CommonAutoUpdate启动后, 将检查和加载本地配置文件, 加载成功后, 将判断"run"中指定的程序是否正在运行. 如果在运行, 则给出错误提示后, 退出更新程序; b. 如果"run"中的程序没有在运行, 则根据svrurl + "/commonAutoUpdate.xml" 地址, 加载服务器上的配置文件; c. 在加载配置文件过程中, 任何的异常, 均会提示"检查自动更新失败, 请稍后再试", 并退出; (不会启动"run"中配置的文件) d. 如果加载成功, 则会对比本地"version"中的版本号与服务器"cv"节点中的"v"属性的版本号; e. 如果服务器版本号小于或等于本地版本号, 则不进行更新, 直接运行"run"中指定的程序, 并传递"cau"参数作为标记; f. 如果服务器版本号大于本地版本号, 则会显示提示更新的界面, 在点击确定按钮后, 开始下载服务器"cv"节点中的"p"属性指定的文件; g. 待下载完成, 则会退出, 并运行下载的安装包进行安装.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值