diff options
author | gandalf3 <gandalf3@blendermonkey.com> | 2017-08-29 11:44:09 +0300 |
---|---|---|
committer | gandalf3 <gandalf3@blendermonkey.com> | 2017-08-29 11:50:58 +0300 |
commit | 2cccd9341b7fc74ea395c042913e57cc914f4da7 (patch) | |
tree | 802af03b2a942c4f32421df12d5e7d540c3b420f /release | |
parent | c2ed14532265a85cf46c45b03e4b90a2a1ee6046 (diff) |
Actually display progress
Diffstat (limited to 'release')
-rw-r--r-- | release/scripts/modules/bpkg/actions.py | 36 | ||||
-rw-r--r-- | release/scripts/modules/bpkg/subproc.py | 21 | ||||
-rw-r--r-- | release/scripts/modules/bpkg/types.py | 1 | ||||
-rw-r--r-- | release/scripts/modules/bpkg/utils.py | 1 | ||||
-rw-r--r-- | release/scripts/startup/bl_operators/package.py | 26 |
5 files changed, 53 insertions, 32 deletions
diff --git a/release/scripts/modules/bpkg/actions.py b/release/scripts/modules/bpkg/actions.py index f419df04b8d..a8378a9d252 100644 --- a/release/scripts/modules/bpkg/actions.py +++ b/release/scripts/modules/bpkg/actions.py @@ -35,6 +35,7 @@ def download(url: str, destination: Path, progress_callback=None) -> Path: if resp.status_code == requests.codes.not_modified: log.info("Server responded 'Not Modified', not downloading") + progress_callback(1) return None # determine destination filename from url, but only after we've determined it works as a real url @@ -50,24 +51,31 @@ def download(url: str, destination: Path, progress_callback=None) -> Path: local_fpath = destination try: - # Use float so that we can also use infinity - content_length = float(resp.headers['content-length']) + content_length = int(resp.headers['content-length']) except KeyError: log.warning( 'Server did not send content length, cannot report progress.') - content_length = float('inf') + content_length = 0 - # TODO: check if there's enough disk space. - - downloaded_length = 0 - with local_fpath.open('wb') as outfile: - for chunk in resp.iter_content(chunk_size=1024 ** 2): - if not chunk: # filter out keep-alive new chunks - continue - - outfile.write(chunk) - downloaded_length += len(chunk) - progress_callback(downloaded_length / content_length) + try: + downloaded_length = 0 + with local_fpath.open('wb') as outfile: + for chunk in resp.iter_content(chunk_size=1024 ** 2): + if not chunk: # filter out keep-alive new chunks + continue + + outfile.write(chunk) + downloaded_length += len(chunk) + try: + progress_callback(downloaded_length / content_length) + except ZeroDivisionError: + pass + except OSError as err: + raise exceptions.DownloadException("Encountered an error while writing file to '%s', are you sure there's enough space?" % local_fpath) from err + except PermissionError as err: + raise exceptions.DownloadException("No permissions to write to '%s'" % local_fpath) + + progress_callback(1) return local_fpath diff --git a/release/scripts/modules/bpkg/subproc.py b/release/scripts/modules/bpkg/subproc.py index 5c8b9cfb0c8..a1b3894e490 100644 --- a/release/scripts/modules/bpkg/subproc.py +++ b/release/scripts/modules/bpkg/subproc.py @@ -19,11 +19,14 @@ def download_and_install_package(pipe_to_blender, package: Package, install_path log = logging.getLogger(__name__ + '.download_and_install') + def prog(p: float) -> float: + pipe_to_blender.send(messages.Progress(p)) + from . import cache cache_dir = cache.cache_directory('downloads') try: - package.install(install_path, cache_dir) + package.install(install_path, cache_dir, progress_callback=prog) except exceptions.DownloadException as err: pipe_to_blender.send(messages.DownloadError(err)) log.exception(err) @@ -58,19 +61,20 @@ def uninstall_package(pipe_to_blender, package: Package, install_path: Path): pipe_to_blender.send(messages.Success()) -def refresh_repositories(pipe_to_blender, repo_storage_path: Path, repository_urls: str, progress_callback=None): +def refresh_repositories(pipe_to_blender, repo_storage_path: Path, repository_urls: str): """Downloads and stores the given repository""" log = logging.getLogger(__name__ + '.refresh_repository') - if progress_callback is None: - progress_callback = lambda x: None - progress_callback(0.0) + def progress_callback(p: float) -> float: + progress_callback._progress += p + pipe_to_blender.send(messages.Progress(progress_callback._progress)) + progress_callback._progress = 0.0 repos = utils.load_repositories(repo_storage_path) - def prog(progress: float): - progress_callback(progress/len(repos)) + def prog(p: float): + progress_callback(p/len(repos)) known_repo_urls = [repo.url for repo in repos] for repo_url in repository_urls: @@ -78,8 +82,6 @@ def refresh_repositories(pipe_to_blender, repo_storage_path: Path, repository_ur repos.append(Repository(repo_url)) for repo in repos: - log.debug("repo name: %s, url: %s", repo.name, repo.url) - for repo in repos: try: repo.refresh(repo_storage_path, progress_callback=prog) except exceptions.DownloadException as err: @@ -89,6 +91,5 @@ def refresh_repositories(pipe_to_blender, repo_storage_path: Path, repository_ur pipe_to_blender.send(messages.BadRepositoryError(err)) log.exception("Bad repository") - progress_callback(1.0) pipe_to_blender.send(messages.Success()) diff --git a/release/scripts/modules/bpkg/types.py b/release/scripts/modules/bpkg/types.py index c5eacc7f02e..15699f090a7 100644 --- a/release/scripts/modules/bpkg/types.py +++ b/release/scripts/modules/bpkg/types.py @@ -482,6 +482,7 @@ class Repository: if resp.status_code == requests.codes.not_modified: self.log.debug("Packagelist not modified") + progress_callback(1.0) return resp_headers = {} diff --git a/release/scripts/modules/bpkg/utils.py b/release/scripts/modules/bpkg/utils.py index 416321fb381..b898b25de12 100644 --- a/release/scripts/modules/bpkg/utils.py +++ b/release/scripts/modules/bpkg/utils.py @@ -92,7 +92,6 @@ class InplaceBackup: def remove(self): """Remove 'path~'""" - print("removing") rm(self.backup_path) diff --git a/release/scripts/startup/bl_operators/package.py b/release/scripts/startup/bl_operators/package.py index 1e8bb8ca83d..cf093e2fd31 100644 --- a/release/scripts/startup/bl_operators/package.py +++ b/release/scripts/startup/bl_operators/package.py @@ -197,6 +197,9 @@ else: messages.Aborted: self._subproc_aborted, } + wm = bpy.context.window_manager + wm.progress_begin(0, 1) + package = bpkg.packages[self.package_name].get_latest_version() import pathlib @@ -212,8 +215,9 @@ else: args=(self.pipe_subproc, package, install_path)) return proc - def _subproc_progress(self, progress: messages.Progress): - self.log.info('Task progress at %i%%', progress.progress * 100) + def _subproc_progress(self, progmsg: messages.Progress): + wm = bpy.context.window_manager + wm.progress_update(progmsg.progress) def _subproc_download_error(self, error: messages.DownloadError): self.report({'ERROR'}, 'Unable to download package: %s' % @@ -229,6 +233,8 @@ else: self.report({'INFO'}, 'Package installed successfully') bpkg.refresh_packages() bpy.context.area.tag_redraw() + wm = bpy.context.window_manager + wm.progress_end() self.quit() def _subproc_aborted(self, aborted: messages.Aborted): @@ -344,6 +350,9 @@ else: :rtype: multiprocessing.Process """ + wm = bpy.context.window_manager + wm.progress_begin(0, 1) + self.msg_handlers = { messages.Progress: self._subproc_progress, messages.SubprocError: self._subproc_error, @@ -364,8 +373,9 @@ else: args=(self.pipe_subproc, storage_path, repository_urls)) return proc - def _subproc_progress(self, progress: messages.Progress): - self.log.info('Task progress at %i%%', progress.progress * 100) + def _subproc_progress(self, progmsg: messages.Progress): + wm = bpy.context.window_manager + wm.progress_update(progmsg.progress) def _subproc_error(self, error: messages.SubprocError): self.report( @@ -385,6 +395,8 @@ else: self.report({'INFO'}, 'Finished refreshing lists') bpkg.refresh_repository_props() bpkg.refresh_packages() + wm = bpy.context.window_manager + wm.progress_end() self.quit() def _subproc_aborted(self, aborted: messages.Aborted): @@ -527,10 +539,10 @@ else: ) def invoke(self, context, event): - if USERPREF_PT_packages.preference_package == self.package_name: - USERPREF_PT_packages.preference_package = None + if bpkg.display.preference_package == self.package_name: + bpkg.display.preference_package = None else: - USERPREF_PT_packages.preference_package = self.package_name + bpkg.display.preference_package = self.package_name return {'FINISHED'} class PACKAGE_OT_toggle_enabled(Operator): |