Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Some PCs are having problems updating addon #90

Open
Lynchon83 opened this issue Jan 9, 2024 · 7 comments
Open

Some PCs are having problems updating addon #90

Lynchon83 opened this issue Jan 9, 2024 · 7 comments

Comments

@Lynchon83
Copy link

Hi,
We are getting an error which we can't reproduce as it only occurs in some pcs. When updating after detecting a new version of our asson some pcs throw the following error:

FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\FerranMMC\\AppData\\Roaming\\Blender Foundation\\Blender\\4.0\\scripts\\addons\\blender_venue_editor\\blender_venue_editor_updater\\source\\addon_updater_dir/blender_venue_editor.addon_updater_dir_updater/blender_venue_editor.addon_updater_dir_updater_status.json'

Is there any condition inside the updater which changes where the status.jason is stored???

@TheDuckCow
Copy link
Collaborator

Sorry for the late reply here. It's hard to debug path based issues, as it depends a lot on the structure of the source addon and the repo itself. Can you gather any insights over why it was happening with some pc's? When those updates were attempted, do you know what version of your own addon they were updating to and from? Was there any restructure (folder pivot) at some time with the plugin?

I'll admit I haven't run into any pathing issues with plugins I manage using this framework, but that doesn't mean there isn't some edge case out there.

Is there any condition inside the updater which changes where the status.jason is stored???

There shouldn't be realistically, but I will say I notice some double pathing in the folder structure (e.g. seeing source in the path makes me wonder if some of the github repo structure is making its way in where it shouldn't). Would be curious if this ever happens again, if it persists after a restart for that user.

@agajdosi
Copy link

Hi @TheDuckCow, I've just recently upgraded my build scripts and I've seen this bug for BlenderKit add-on (there are few prints added for debug purposes):

blenderkit addon: Starting download update zip
blenderkit addon: Successfully downloaded update zip
blenderkit addon: Source folder cleared
blenderkit addon: Begin extracting source from zip:/Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/blenderkit_updater/update_staging/source.zip
Extracting:  blenderkit/__init__.py
name blenderkit/__init__.py does not end with sep: /
blenderkit addon: Extract - create: /Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/blenderkit_updater/source/__init__.py
Extracting:  blenderkit/addon_updater.py
name blenderkit/addon_updater.py does not end with sep: /
blenderkit addon: Extract - create: /Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/blenderkit_updater/source/addon_updater.py
Extracting:  blenderkit/addon_updater_ops.py
name blenderkit/addon_updater_ops.py does not end with sep: /
blenderkit addon: Extract - create: /Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/blenderkit_updater/source/addon_updater_ops.py
Extracting:  blenderkit/append_link.py
name blenderkit/append_link.py does not end with sep: /
blenderkit addon: Extract - create: /Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/blenderkit_updater/source/append_link.py
Extracting:  blenderkit/asset_bar_op.py
name blenderkit/asset_bar_op.py does not end with sep: /
blenderkit addon: Extract - create: /Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/blenderkit_updater/source/asset_bar_op.py
Extracting:  blenderkit/asset_drag_op.py
name blenderkit/asset_drag_op.py does not end with sep: /
blenderkit addon: Extract - create: /Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/blenderkit_updater/source/asset_drag_op.py
Extracting:  blenderkit/asset_inspector.py
name blenderkit/asset_inspector.py does not end with sep: /
blenderkit addon: Extract - create: /Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/blenderkit_updater/source/asset_inspector.py
Extracting:  blenderkit/autothumb.py
name blenderkit/autothumb.py does not end with sep: /
blenderkit addon: Extract - create: /Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/blenderkit_updater/source/autothumb.py
Extracting:  blenderkit/autothumb_material_bg.py
name blenderkit/autothumb_material_bg.py does not end with sep: /
blenderkit addon: Extract - create: /Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/blenderkit_updater/source/autothumb_material_bg.py
Extracting:  blenderkit/autothumb_model_bg.py
name blenderkit/autothumb_model_bg.py does not end with sep: /
blenderkit addon: Extract - create: /Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/blenderkit_updater/source/autothumb_model_bg.py
Extracting:  blenderkit/bg_blender.py
name blenderkit/bg_blender.py does not end with sep: /
blenderkit addon: Extract - create: /Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/blenderkit_updater/source/bg_blender.py
Extracting:  blenderkit/bg_utils.py
name blenderkit/bg_utils.py does not end with sep: /
blenderkit addon: Extract - create: /Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/blenderkit_updater/source/bg_utils.py
Extracting:  blenderkit/bkit_oauth.py
name blenderkit/bkit_oauth.py does not end with sep: /
blenderkit addon: Extract - create: /Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/blenderkit_updater/source/bkit_oauth.py
Extracting:  blenderkit/bl_ui_widgets/__init__.py
name blenderkit/bl_ui_widgets/__init__.py does not end with sep: /
Traceback (most recent call last):
  File "/Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/addon_updater_ops.py", line 311, in execute
    res = updater.run_update(
          ^^^^^^^^^^^^^^^^^^^
  File "/Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/addon_updater.py", line 1459, in run_update
    res = self.unpack_staged_zip(clean)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/addon_updater.py", line 965, in unpack_staged_zip
    with open(os.path.join(outdir, sub_path), "wb") as outfile:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '/Users/ag/Library/Application Support/Blender/4.1/scripts/addons/blenderkit/blenderkit_updater/source/bl_ui_widgets/__init__.py'

So I have investigated the zip files and found that I've somehow managed to create it without explicit directory entries:

v3.10.1.240123
blenderkit/
blenderkit/bl_ui_widgets/
blenderkit/blendfiles/
blenderkit/daemon/
blenderkit/data/
blenderkit/dependencies/
blenderkit/thumbnails/
blenderkit/addon_updater.py
blenderkit/ui_panels.py
blenderkit/log.py
blenderkit/comments_utils.py
blenderkit/disclaimer_op.py
blenderkit/autothumb_model_bg.py
blenderkit/colors.py
blenderkit/ui.py
blenderkit/search.py
blenderkit/paths.py
blenderkit/daemon_lib.py
blenderkit/asset_inspector.py
blenderkit/resolutions.py
blenderkit/overrides.py
blenderkit/reports.py
blenderkit/utils.py
blenderkit/autothumb.py
blenderkit/tasks_queue.py
blenderkit/version_checker.py
blenderkit/categories.py
blenderkit/bg_blender.py
blenderkit/__init__.py
blenderkit/asset_bar_op.py
blenderkit/ratings_utils.py
blenderkit/addon_updater_ops.py
blenderkit/ui_bgl.py
blenderkit/download.py
blenderkit/global_vars.py
blenderkit/upload_bg.py
blenderkit/icons.py
blenderkit/autothumb_material_bg.py
blenderkit/upload.py
blenderkit/pyproject.toml
blenderkit/bkit_oauth.py
blenderkit/image_utils.py
blenderkit/asset_drag_op.py
blenderkit/unpack_asset_bg.py
blenderkit/dependencies.py
blenderkit/timer.py
blenderkit/persistent_preferences.py
blenderkit/bg_utils.py
blenderkit/ratings.py
blenderkit/requirements.txt
blenderkit/append_link.py
blenderkit/blendfiles/cleaned.blend
blenderkit/blendfiles/material_thumbnailer_cycles.blend
blenderkit/blendfiles/thumbnailer.blend
blenderkit/thumbnails/flp.png
blenderkit/thumbnails/cc0.png
blenderkit/thumbnails/0008.png
blenderkit/thumbnails/0030.png
blenderkit/thumbnails/post_comment.png
blenderkit/thumbnails/logo_facebook.png
blenderkit/thumbnails/logo_artstation.png
blenderkit/thumbnails/dumbbell.png
blenderkit/thumbnails/0010.png
blenderkit/thumbnails/0003.png
blenderkit/thumbnails/0009.png
blenderkit/thumbnails/0150.png
blenderkit/thumbnails/thumbnail_not_available.jpg
blenderkit/thumbnails/logo_instagram.png
blenderkit/thumbnails/0005.png
blenderkit/thumbnails/bar_slider.png
blenderkit/thumbnails/0002.png
blenderkit/thumbnails/0.2.png
blenderkit/thumbnails/logo_youtube.png
blenderkit/thumbnails/vs_uploading.png
blenderkit/thumbnails/vs_deleted.png
blenderkit/thumbnails/private.png
blenderkit/thumbnails/logo_x.png
blenderkit/thumbnails/bookmark_full.png
blenderkit/thumbnails/blenderkit_logo_offline.png
blenderkit/thumbnails/bar_slider_up.png
blenderkit/thumbnails/bell.png
blenderkit/thumbnails/vs_rejected.png
blenderkit/thumbnails/categories_active.png
blenderkit/thumbnails/0001.png
blenderkit/thumbnails/filter_active.png
blenderkit/thumbnails/0004.png
blenderkit/thumbnails/bookmark_empty.png
blenderkit/thumbnails/trophy.png
blenderkit/thumbnails/0200.png
blenderkit/thumbnails/locked.png
blenderkit/thumbnails/0020.png
blenderkit/thumbnails/0100.png
blenderkit/thumbnails/0006.png
blenderkit/thumbnails/star_grey.png
blenderkit/thumbnails/vs_uploaded.png
blenderkit/thumbnails/vs_on_hold.png
blenderkit/thumbnails/logo_tiktok.png
blenderkit/thumbnails/royalty_free.png
blenderkit/thumbnails/fp.png
blenderkit/thumbnails/star_white.png
blenderkit/thumbnails/0007.png
blenderkit/thumbnails/filter.png
blenderkit/thumbnails/0015.png
blenderkit/thumbnails/arrow_left.png
blenderkit/thumbnails/0250.png
blenderkit/thumbnails/thumbnail_notready.jpg
blenderkit/thumbnails/blenderkit_logo.png
blenderkit/thumbnails/0050.png
blenderkit/thumbnails/vs_validated.png
blenderkit/thumbnails/intro.jpg
blenderkit/thumbnails/arrow_right.png
blenderkit/thumbnails/categories.png
blenderkit/thumbnails/logo_vimeo.png
blenderkit/thumbnails/0.5.png
blenderkit/thumbnails/vs_ready.png
blenderkit/data/categories.json
blenderkit/bl_ui_widgets/bl_ui_label.py
blenderkit/bl_ui_widgets/bl_ui_button.py
blenderkit/bl_ui_widgets/bl_ui_image.py
blenderkit/bl_ui_widgets/bl_ui_widget.py
blenderkit/bl_ui_widgets/__init__.py
blenderkit/bl_ui_widgets/bl_ui_drag_panel.py
blenderkit/bl_ui_widgets/bl_ui_draw_op.py
blenderkit/daemon/certs/
blenderkit/daemon/daemon_uploads.py
blenderkit/daemon/daemon_configurator.py
blenderkit/daemon/daemon.py
blenderkit/daemon/daemon_search.py
blenderkit/daemon/daemon_ratings.py
blenderkit/daemon/daemon_profiles.py
blenderkit/daemon/daemon_utils.py
blenderkit/daemon/__init__.py
blenderkit/daemon/daemon_globals.py
blenderkit/daemon/daemon_assets.py
blenderkit/daemon/daemon_oauth.py
blenderkit/daemon/daemon_comments.py
blenderkit/daemon/daemon_disclaimer.py
blenderkit/daemon/daemon_tasks.py
blenderkit/daemon/certs/blenderkit-com-chain.pem



v3.12.0.240319-alpha
blenderkit/__init__.py
blenderkit/addon_updater.py
blenderkit/addon_updater_ops.py
blenderkit/append_link.py
blenderkit/asset_bar_op.py
blenderkit/asset_drag_op.py
blenderkit/asset_inspector.py
blenderkit/autothumb.py
blenderkit/autothumb_material_bg.py
blenderkit/autothumb_model_bg.py
blenderkit/bg_blender.py
blenderkit/bg_utils.py
blenderkit/bkit_oauth.py
blenderkit/bl_ui_widgets/__init__.py
blenderkit/bl_ui_widgets/bl_ui_button.py
blenderkit/bl_ui_widgets/bl_ui_drag_panel.py
blenderkit/bl_ui_widgets/bl_ui_draw_op.py
blenderkit/bl_ui_widgets/bl_ui_image.py
blenderkit/bl_ui_widgets/bl_ui_label.py
blenderkit/bl_ui_widgets/bl_ui_widget.py
blenderkit/blendfiles/cleaned.blend
blenderkit/blendfiles/material_thumbnailer_cycles.blend
blenderkit/blendfiles/thumbnailer.blend
blenderkit/categories.py
blenderkit/client/v0.0.4/blenderkit-client-linux-arm64
blenderkit/client/v0.0.4/blenderkit-client-linux-x86_64
blenderkit/client/v0.0.4/blenderkit-client-macos-arm64
blenderkit/client/v0.0.4/blenderkit-client-macos-x86_64
blenderkit/client/v0.0.4/blenderkit-client-windows-arm64.exe
blenderkit/client/v0.0.4/blenderkit-client-windows-x86_64.exe
blenderkit/colors.py
blenderkit/comments_utils.py
blenderkit/daemon_lib.py
blenderkit/daemon_tasks.py
blenderkit/data/categories.json
blenderkit/disclaimer_op.py
blenderkit/download.py
blenderkit/global_vars.py
blenderkit/icons.py
blenderkit/image_utils.py
blenderkit/log.py
blenderkit/overrides.py
blenderkit/paths.py
blenderkit/persistent_preferences.py
blenderkit/pyproject.toml
blenderkit/ratings.py
blenderkit/ratings_utils.py
blenderkit/reports.py
blenderkit/resolutions.py
blenderkit/search.py
blenderkit/tasks_queue.py
blenderkit/thumbnails/0.2.png
blenderkit/thumbnails/0.5.png
blenderkit/thumbnails/0001.png
blenderkit/thumbnails/0002.png
blenderkit/thumbnails/0003.png
blenderkit/thumbnails/0004.png
blenderkit/thumbnails/0005.png
blenderkit/thumbnails/0006.png
blenderkit/thumbnails/0007.png
blenderkit/thumbnails/0008.png
blenderkit/thumbnails/0009.png
blenderkit/thumbnails/0010.png
blenderkit/thumbnails/0015.png
blenderkit/thumbnails/0020.png
blenderkit/thumbnails/0030.png
blenderkit/thumbnails/0050.png
blenderkit/thumbnails/0100.png
blenderkit/thumbnails/0150.png
blenderkit/thumbnails/0200.png
blenderkit/thumbnails/0250.png
blenderkit/thumbnails/arrow_left.png
blenderkit/thumbnails/arrow_right.png
blenderkit/thumbnails/bar_slider.png
blenderkit/thumbnails/bar_slider_up.png
blenderkit/thumbnails/bell.png
blenderkit/thumbnails/blenderkit_logo.png
blenderkit/thumbnails/blenderkit_logo_offline.png
blenderkit/thumbnails/bookmark_empty.png
blenderkit/thumbnails/bookmark_full.png
blenderkit/thumbnails/categories.png
blenderkit/thumbnails/categories_active.png
blenderkit/thumbnails/cc0.png
blenderkit/thumbnails/dumbbell.png
blenderkit/thumbnails/filter.png
blenderkit/thumbnails/filter_active.png
blenderkit/thumbnails/flp.png
blenderkit/thumbnails/fp.png
blenderkit/thumbnails/intro.jpg
blenderkit/thumbnails/locked.png
blenderkit/thumbnails/logo_artstation.png
blenderkit/thumbnails/logo_facebook.png
blenderkit/thumbnails/logo_instagram.png
blenderkit/thumbnails/logo_tiktok.png
blenderkit/thumbnails/logo_vimeo.png
blenderkit/thumbnails/logo_x.png
blenderkit/thumbnails/logo_youtube.png
blenderkit/thumbnails/post_comment.png
blenderkit/thumbnails/private.png
blenderkit/thumbnails/royalty_free.png
blenderkit/thumbnails/star_grey.png
blenderkit/thumbnails/star_white.png
blenderkit/thumbnails/thumbnail_not_available.jpg
blenderkit/thumbnails/thumbnail_notready.jpg
blenderkit/thumbnails/trophy.png
blenderkit/thumbnails/vs_deleted.png
blenderkit/thumbnails/vs_on_hold.png
blenderkit/thumbnails/vs_ready.png
blenderkit/thumbnails/vs_rejected.png
blenderkit/thumbnails/vs_uploaded.png
blenderkit/thumbnails/vs_uploading.png
blenderkit/thumbnails/vs_validated.png
blenderkit/timer.py
blenderkit/ui.py
blenderkit/ui_bgl.py
blenderkit/ui_panels.py
blenderkit/unpack_asset_bg.py
blenderkit/upload.py
blenderkit/upload_bg.py
blenderkit/utils.py
blenderkit/version_checker.py

This then leads to situation when update fails, because it tries to write the file into a directory which does not exist. Maybe updater could just check if the parent directory exists before opening the file for write instead of relying on existence of directory entry and the pathsep?

        with zipfile.ZipFile(self._source_zip, "r") as zfile:
            if not zfile:
                self._error = "Install failed"
                self._error_msg = "Resulting file is not a zip, cannot extract"
                self.print_verbose(self._error_msg)
                return -1

            # Now extract directly from the first subfolder (not root)
            # this avoids adding the first subfolder to the path length,
            # which can be too long if the download has the SHA in the name.
            zsep = "/"  # Not using os.sep, always the / value even on windows.            
            for name in zfile.namelist():
                if zsep not in name:
                    continue
                top_folder = name[: name.index(zsep) + 1]
                if name == top_folder + zsep:
                    continue  # skip top level folder
                sub_path = name[name.index(zsep) + 1 :]
                if name.endswith(zsep):
                    try:
                        os.mkdir(os.path.join(outdir, sub_path))
                        self.print_verbose(
                            "Extract - mkdir: " + os.path.join(outdir, sub_path)
                        )
                    except OSError as exc:
                        if exc.errno != errno.EEXIST:
                            self._error = "Install failed"
                            self._error_msg = "Could not create folder from zip"
                            self.print_trace()
                            return -1
                else:
                    with open(os.path.join(outdir, sub_path), "wb") as outfile:
                        data = zfile.read(name)
                        outfile.write(data)
                        self.print_verbose(
                            "Extract - create: " + os.path.join(outdir, sub_path)
                        )

@agajdosi
Copy link

We have updated to github action https://github.com/actions/upload-artifact v3 -> v4. That could be the reason. Not sure, but maybe it could help somebody, until this issue is fixed. For now I am gonna stick to manual zip creation as the v4 does not offer possibility to insert explicit directory entries.

@TheDuckCow
Copy link
Collaborator

A question for you @agajdosi - if you download that zip being downloaded by the updater manually, does it work as-is to install into blender manually? Blender addons pretty strictly require that, otherwise you end up creating a mess in the addons folder (presuming these addon builds are also made available for download elsewhere).

I find it odd that upload-artifact would make a difference, unless is that action itself doing the work on constructing a zip file?

@TheDuckCow
Copy link
Collaborator

Oh and I should clarify, is the snippet you provided a workaround that makes it functional as-is for you? If so, I can analyze it a bit further and see if I'm happy enough to take that as a contribution (you could also create a PR and tag me as a reviewer, the important thing is to verify it is at least working for you, I can then cross verify if working in other addon repo setups)

@agajdosi
Copy link

agajdosi commented Mar 22, 2024

Hi @TheDuckCow, I would be totally happy to make the PR.

I find it odd that upload-artifact would make a difference, unless is that action itself doing the work on constructing a zip file?

I am relying on the artifact-upload action to create the .zip file (as I am not aware of a way how this action could upload zip created by me and not encapsulate it into another zip). So the problem starts there. But...

if you download that zip being downloaded by the updater manually, does it work as-is to install into blender manually?

... I am able to install that .zip into Blender manually just fine. Actually I have sent these zips to many users and they all reported it fixed their issue. I only found the problem recently when I have released the zip and people started auto-updating.

For now the fix was to release the zip created manually. But I believe auto-updater should handle this form of zip. Because the directory entry in the zip is redundant, information about the directory is present in the files which specify it: blenderkit/thumbnails/flp.png - here we know there should be directory thumbnails. No need to specify entry for this directory. (Only exception would be if you would need to have an empty dir after unzip.)

@TheDuckCow
Copy link
Collaborator

Ok great, I'd be happy to swiftly review any PR you put together to make sure there's no unintended regressions. I agree that it shouldn't be a requirement to create a manual build, so this is a fix worth making indeed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants