[Bf-blender-cvs] [2cccd9341b7] soc-2017-package_manager: Actually display progress

gandalf3 noreply at git.blender.org
Tue Aug 29 11:46:26 CEST 2017


Commit: 2cccd9341b7fc74ea395c042913e57cc914f4da7
Author: gandalf3
Date:   Tue Aug 29 01:44:09 2017 -0700
Branches: soc-2017-package_manager
https://developer.blender.org/rB2cccd9341b7fc74ea395c042913e57cc914f4da7

Actually display progress

===================================================================

M	release/scripts/modules/bpkg/actions.py
M	release/scripts/modules/bpkg/subproc.py
M	release/scripts/modules/bpkg/types.py
M	release/scripts/modules/bpkg/utils.py
M	release/scripts/startup/bl_operators/package.py

===================================================================

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,27 +61,26 @@ 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:
         if repo_url not in known_repo_urls:
             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)
@@ -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):



More information about the Bf-blender-cvs mailing list