-
Notifications
You must be signed in to change notification settings - Fork 1k
Compression plugin #18314
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
base: develop2
Are you sure you want to change the base?
Compression plugin #18314
Conversation
…xisting function (#18320) Changelog: omit Docs: omit As suggested in #18314 (comment) This PR will simplify #18314 by modifying the compression functionality on cache save command. Intead of creating a tar object and adding files one by one (very coupled interface with tarfile module), create a list of files which will be passed to a already existing method in conan `compress_files`. This method may be moved to another module in a future PR.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looking much better, easier to assess that the risk is low.
Just some small concern about the pkglist.json of the conan cache restore
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is looking good.
Before proceeding, I'd like to see a poc of using zstd and how the possible fallbacks and error handling is done, when mixing packages conan_package.tgz
compressed with gz and with zstd.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A comment about not re-checking the file, otherwise this looks good :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
Introduces a plugin hook for compression/decompression by loading a user-supplied compression.py
and delegating to it when present, with fallback to the builtin behavior.
- Loaded
compression.py
via a newconfig.compression_plugin
property and propagated it through all compress/uncompress calls. - Updated
compress_files
anduncompress_file
to invoke the plugin if available. - Added integration tests for plugin loading, fallback behavior, and default output.
Reviewed Changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.
Show a summary per file
File | Description |
---|---|
test/integration/extensions/test_compression_plugin.py | added tests for plugin validity and end-to-end usage |
test/integration/command/cache/test_cache_save_restore.py | asserted default compress/decompress outputs when no plugin |
conan/internal/rest/rest_client_local_recipe_index.py | passed config_api into LocalRecipesIndexApp |
conan/internal/rest/remote_manager.py | propagated compression_plugin into uncompress_file |
conan/internal/cache/home_paths.py | added compression_plugin_path property |
conan/internal/api/uploader.py | forwarded compression_plugin to compress_files |
conan/internal/conan_app.py | injected config_api into RemoteManager and LocalRecipesIndexApp |
conan/api/subapi/config.py | implemented compression_plugin loader property |
conan/api/subapi/cache.py | integrated plugin hook into cache save/restore |
Comments suppressed due to low confidence (1)
conan/api/subapi/config.py:248
- The code references
os.path
but there’s noimport os
at the top of this module. Addimport os
to avoid a NameError.
if not os.path.exists(compression_plugin_path):
@@ -90,3 +90,7 @@ def settings_path_user(self): | |||
@property | |||
def config_version_path(self): | |||
return os.path.join(self._home, "config_version.json") | |||
|
|||
@property | |||
def compression_plugin_path(self): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[nitpick] Add a docstring explaining that this property returns the path to the compression.py
plugin under the extensions directory.
def compression_plugin_path(self): | |
def compression_plugin_path(self): | |
"""Returns the path to the `compression.py` plugin under the extensions directory.""" |
Copilot uses AI. Check for mistakes.
@@ -158,9 +158,13 @@ def test_cache_save_excluded_folders(): | |||
|
|||
# exclude source | |||
c.run("cache save * --no-source") | |||
# Check default compression function is being used and not compression.py plugin one | |||
assert "Compressing conan_cache_save.tgz\n" in c.out |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[nitpick] Instead of matching the newline, assert on "Compressing conan_cache_save.tgz" in c.out
to make the test more robust across platforms and output formats.
assert "Compressing conan_cache_save.tgz\n" in c.out | |
assert "Compressing conan_cache_save.tgz" in c.out |
Copilot uses AI. Check for mistakes.
Changelog: Feature: Allow externalization of compression/decompression tasks to a user defined plugin
Docs: conan-io/docs#4107
Close #18259
Related issues:
Related PRs:
With the aim of simplicity this PR keeps the current behaviour in some compression/decompression tasks such as:
Adding an extra layer which will be in charge of determining if the
compression.py
plugin is defined falling back to existing behaviour if it doesn't.The
compression.py
plugin interface may follow the following structure:Pluging example with zstd: