try: import concurrent.futures as futures except ImportError: try: import futures # type: ignore except ImportError: futures = None # type: ignore try: from urllib.request import urlopen except ImportError: from urllib2 import urlopen # type: ignore import re import shutil import tempfile import zipfile from contextlib import closing from io import BytesIO from os import listdir, path # --- Globals ---------------------------------------------- PLUGINS = """ auto-pairs https://github.com/jiangmiao/auto-pairs ale https://github.com/dense-analysis/ale vim-yankstack https://github.com/maxbrunsfeld/vim-yankstack ack.vim https://github.com/mileszs/ack.vim bufexplorer https://github.com/jlanzarotta/bufexplorer ctrlp.vim https://github.com/ctrlpvim/ctrlp.vim mayansmoke https://github.com/vim-scripts/mayansmoke nerdtree https://github.com/preservim/nerdtree nginx.vim https://github.com/chr4/nginx.vim open_file_under_cursor.vim https://github.com/amix/open_file_under_cursor.vim tlib https://github.com/tomtom/tlib_vim vim-addon-mw-utils https://github.com/MarcWeber/vim-addon-mw-utils vim-bundle-mako https://github.com/sophacles/vim-bundle-mako vim-coffee-script https://github.com/kchmck/vim-coffee-script vim-colors-solarized https://github.com/altercation/vim-colors-solarized vim-indent-object https://github.com/michaeljsmith/vim-indent-object vim-less https://github.com/groenewege/vim-less vim-pyte https://github.com/therubymug/vim-pyte vim-snipmate https://github.com/garbas/vim-snipmate vim-snippets https://github.com/honza/vim-snippets vim-surround https://github.com/tpope/vim-surround vim-expand-region https://github.com/terryma/vim-expand-region vim-multiple-cursors https://github.com/terryma/vim-multiple-cursors vim-fugitive https://github.com/tpope/vim-fugitive vim-rhubarb https://github.com/tpope/vim-rhubarb goyo.vim https://github.com/junegunn/goyo.vim vim-zenroom2 https://github.com/amix/vim-zenroom2 vim-repeat https://github.com/tpope/vim-repeat vim-commentary https://github.com/tpope/vim-commentary vim-gitgutter https://github.com/airblade/vim-gitgutter gruvbox https://github.com/morhetz/gruvbox vim-flake8 https://github.com/nvie/vim-flake8 vim-pug https://github.com/digitaltoad/vim-pug lightline.vim https://github.com/itchyny/lightline.vim lightline-ale https://github.com/maximbaz/lightline-ale vim-abolish https://github.com/tpope/vim-abolish rust.vim https://github.com/rust-lang/rust.vim vim-markdown https://github.com/plasticboy/vim-markdown vim-gist https://github.com/mattn/vim-gist vim-ruby https://github.com/vim-ruby/vim-ruby typescript-vim https://github.com/leafgarland/typescript-vim vim-javascript https://github.com/pangloss/vim-javascript vim-python-pep8-indent https://github.com/Vimjas/vim-python-pep8-indent vim-indent-guides https://github.com/nathanaelkane/vim-indent-guides mru.vim https://github.com/vim-scripts/mru.vim editorconfig-vim https://github.com/editorconfig/editorconfig-vim dracula https://github.com/dracula/vim co-pilot.vim https://github.com/github/copilot.vim """.strip() GITHUB_ZIP = "%s/archive/master.zip" FALLBACK_SOURCE_DIR = path.join(path.dirname(__file__), "sources_non_forked") SOURCE_DIR = path.join(path.dirname(__file__), "sources_non_forked_cache") def download_extract_replace(plugin_name, zip_path, temp_dir, source_dir): # Download and extract file in temp dir with closing(urlopen(zip_path)) as req: zip_f = zipfile.ZipFile(BytesIO(req.read())) zip_f.extractall(temp_dir) content_disp = req.headers.get("Content-Disposition") filename = re.findall("filename=(.+).zip", content_disp)[0] plugin_temp_path = path.join(temp_dir, path.join(temp_dir, filename)) # Remove the current plugin and replace it with the extracted plugin_dest_path = path.join(source_dir, plugin_name) try: shutil.rmtree(plugin_dest_path) except OSError: pass shutil.move(plugin_temp_path, plugin_dest_path) print("Updated {0}".format(plugin_name)) def update(plugin): name, github_url = plugin.split(" ") zip_path = GITHUB_ZIP % github_url try: download_extract_replace(name, zip_path, temp_directory, SOURCE_DIR) except Exception as exp: print("Could not update {}. Error was: {}".format(name, str(exp))) if __name__ == "__main__": temp_directory = tempfile.mkdtemp() try: if not path.isdir(SOURCE_DIR) or not listdir(SOURCE_DIR): shutil.copytree(FALLBACK_SOURCE_DIR, SOURCE_DIR) if futures: with futures.ThreadPoolExecutor(16) as executor: executor.map(update, PLUGINS.splitlines()) else: [update(x) for x in PLUGINS.splitlines()] finally: shutil.rmtree(temp_directory)