From 28f01f7e3570206c42ff64f90abba015125e7e96 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sun, 6 Mar 2016 15:38:55 +0100 Subject: [PATCH] get plugins via zip files instead of file by file --- plugin_installer/plugin_installer.py | 65 +++++++--------------------- 1 file changed, 15 insertions(+), 50 deletions(-) diff --git a/plugin_installer/plugin_installer.py b/plugin_installer/plugin_installer.py index 7b63958..9061495 100644 --- a/plugin_installer/plugin_installer.py +++ b/plugin_installer/plugin_installer.py @@ -81,7 +81,7 @@ class PluginInstaller(GajimPlugin): if gajim.version.startswith('0.15'): self.server_folder = 'plugins_0.15' elif gajim.version.startswith('0.16.10'): - self.server_folder = 'plugins_gtk3' + self.server_folder = 'plugins_1' else: self.server_folder = 'plugins_0.16' @@ -586,29 +586,7 @@ class Ftp(threading.Thread): self.pulse = GLib.timeout_add(150, self.progressbar_pulse) GLib.idle_add(self.progressbar.set_text, _('Creating a list of files')) for remote_dir in self.remote_dirs: - - def nlstr(dir_, subdir=None): - if subdir: - dir_ = dir_ + '/' + subdir - list_ = self.ftp.nlst(dir_) - for i in list_: - name = i.split('/')[-1] - if '.' not in name: - try: - if i == self.ftp.nlst(i)[0]: - files.append(i[1:]) - del dirs[i[1:]] - except Exception as e: - # empty dir or file - continue - dirs.append(i[1:]) - subdirs = name - nlstr(dir_, subdirs) - else: - files.append(i[1:]) - dirs, files = [], [] - nlstr('/%s/%s' % (self.plugin.server_folder, remote_dir)) - + filename = remote_dir + '.zip' base_dir, user_dir = gajim.PLUGINS_DIRS if not os.path.isdir(user_dir): os.mkdir(user_dir) @@ -617,34 +595,21 @@ class Ftp(threading.Thread): os.mkdir(local_dir) local_dir = os.path.split(user_dir)[0] - # creating dirs - for dir_ in dirs: - dir_ = dir_.replace(self.plugin.server_folder, 'plugins') - try: - os.mkdir(os.path.join(local_dir, dir_)) - except OSError as e: - if str(e).startswith('[Errno 17]'): - continue - raise + # downloading zip file + GLib.idle_add(self.progressbar.set_text, + _('Downloading "%s"') % filename) + full_filename = os.path.join(local_dir, 'plugins', filename) + self.buffer_ = io.BytesIO() + try: + self.ftp.retrbinary('RETR %s' % filename, self.handleDownload) + except ftplib.all_errors as e: + print (str(e)) - # downloading files - for filename in files: - GLib.idle_add(self.progressbar.set_text, - _('Downloading "%s"') % filename) - full_filename = os.path.join(local_dir, filename.replace( - self.plugin.server_folder, 'plugins')) - try: - file_ = open(full_filename, 'wb') - - self.ftp.retrbinary('RETR /%s' % filename, - file_.write) - file_.close() - except ftplib.all_errors as e: - print (str(e)) - os.unlink(filename) + with zipfile.ZipFile(self.buffer_) as zip_file: + zip_file.extractall(os.path.join(local_dir, 'plugins')) + self.ftp.quit() - GLib.idle_add(self.window.emit, 'plugin_downloaded', - self.remote_dirs) + GLib.idle_add(self.window.emit, 'plugin_downloaded', self.remote_dirs) GLib.source_remove(self.pulse)