Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgandalf3 <gandalf3@blendermonkey.com>2017-08-29 11:44:09 +0300
committergandalf3 <gandalf3@blendermonkey.com>2017-08-29 11:50:58 +0300
commit2cccd9341b7fc74ea395c042913e57cc914f4da7 (patch)
tree802af03b2a942c4f32421df12d5e7d540c3b420f /release
parentc2ed14532265a85cf46c45b03e4b90a2a1ee6046 (diff)
Actually display progress
Diffstat (limited to 'release')
-rw-r--r--release/scripts/modules/bpkg/actions.py36
-rw-r--r--release/scripts/modules/bpkg/subproc.py21
-rw-r--r--release/scripts/modules/bpkg/types.py1
-rw-r--r--release/scripts/modules/bpkg/utils.py1
-rw-r--r--release/scripts/startup/bl_operators/package.py26
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):