mirror of
https://github.com/platformio/platformio-core.git
synced 2025-07-31 10:37:13 +02:00
Fixed an issue with package publishing on Windows when Unix permissions are not preserved // Resolve // #3776
This commit is contained in:
2
.github/workflows/examples.yml
vendored
2
.github/workflows/examples.yml
vendored
@ -42,7 +42,7 @@ jobs:
|
|||||||
if: startsWith(matrix.os, 'macos')
|
if: startsWith(matrix.os, 'macos')
|
||||||
env:
|
env:
|
||||||
PIO_INSTALL_DEVPLATFORMS_OWNERNAMES: "platformio"
|
PIO_INSTALL_DEVPLATFORMS_OWNERNAMES: "platformio"
|
||||||
PIO_INSTALL_DEVPLATFORMS_IGNORE: "ststm8,infineonxmc,microchippic32,lattice_ice40"
|
PIO_INSTALL_DEVPLATFORMS_IGNORE: "ststm8,infineonxmc,microchippic32,lattice_ice40,gd32v"
|
||||||
run: |
|
run: |
|
||||||
df -h
|
df -h
|
||||||
tox -e testexamples
|
tox -e testexamples
|
||||||
|
@ -19,6 +19,7 @@ PlatformIO Core 5
|
|||||||
- Show a warning message about deprecated support for Python 2 and Python 3.5
|
- Show a warning message about deprecated support for Python 2 and Python 3.5
|
||||||
- Do not provide "intelliSenseMode" option when generating configuration for VSCode C/C++ extension
|
- Do not provide "intelliSenseMode" option when generating configuration for VSCode C/C++ extension
|
||||||
- Fixed a "git-sh-setup: file not found" error when installing project dependencies from Git VCS (`issue #3740 <https://github.com/platformio/platformio-core/issues/3740>`_)
|
- Fixed a "git-sh-setup: file not found" error when installing project dependencies from Git VCS (`issue #3740 <https://github.com/platformio/platformio-core/issues/3740>`_)
|
||||||
|
- Fixed an issue with package publishing on Windows when Unix permissions are not preserved (`issue #3776 <https://github.com/platformio/platformio-core/issues/3776>`_)
|
||||||
|
|
||||||
5.0.3 (2020-11-12)
|
5.0.3 (2020-11-12)
|
||||||
~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
@ -23,6 +23,7 @@ from platformio.clients.registry import RegistryClient
|
|||||||
from platformio.compat import ensure_python3
|
from platformio.compat import ensure_python3
|
||||||
from platformio.package.meta import PackageSpec, PackageType
|
from platformio.package.meta import PackageSpec, PackageType
|
||||||
from platformio.package.pack import PackagePacker
|
from platformio.package.pack import PackagePacker
|
||||||
|
from platformio.package.unpack import FileUnpacker, TARArchiver
|
||||||
|
|
||||||
|
|
||||||
def validate_datetime(ctx, param, value): # pylint: disable=unused-argument
|
def validate_datetime(ctx, param, value): # pylint: disable=unused-argument
|
||||||
@ -81,6 +82,17 @@ def package_pack(package, output):
|
|||||||
)
|
)
|
||||||
def package_publish(package, owner, released_at, private, notify):
|
def package_publish(package, owner, released_at, private, notify):
|
||||||
assert ensure_python3()
|
assert ensure_python3()
|
||||||
|
|
||||||
|
# publish .tar.gz instantly without repacking
|
||||||
|
if not os.path.isdir(package) and isinstance(
|
||||||
|
FileUnpacker.new_archiver(package), TARArchiver
|
||||||
|
):
|
||||||
|
response = RegistryClient().publish_package(
|
||||||
|
package, owner, released_at, private, notify
|
||||||
|
)
|
||||||
|
click.secho(response.get("message"), fg="green")
|
||||||
|
return
|
||||||
|
|
||||||
with tempfile.TemporaryDirectory() as tmp_dir: # pylint: disable=no-member
|
with tempfile.TemporaryDirectory() as tmp_dir: # pylint: disable=no-member
|
||||||
with fs.cd(tmp_dir):
|
with fs.cd(tmp_dir):
|
||||||
p = PackagePacker(package)
|
p = PackagePacker(package)
|
||||||
|
@ -134,27 +134,28 @@ class FileUnpacker(object):
|
|||||||
self.path = path
|
self.path = path
|
||||||
self._archiver = None
|
self._archiver = None
|
||||||
|
|
||||||
def _init_archiver(self):
|
def __enter__(self):
|
||||||
|
self._archiver = self.new_archiver(self.path)
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(self, *args):
|
||||||
|
if self._archiver:
|
||||||
|
self._archiver.close()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def new_archiver(path):
|
||||||
magic_map = {
|
magic_map = {
|
||||||
b"\x1f\x8b\x08": TARArchiver,
|
b"\x1f\x8b\x08": TARArchiver,
|
||||||
b"\x42\x5a\x68": TARArchiver,
|
b"\x42\x5a\x68": TARArchiver,
|
||||||
b"\x50\x4b\x03\x04": ZIPArchiver,
|
b"\x50\x4b\x03\x04": ZIPArchiver,
|
||||||
}
|
}
|
||||||
magic_len = max(len(k) for k in magic_map)
|
magic_len = max(len(k) for k in magic_map)
|
||||||
with open(self.path, "rb") as fp:
|
with open(path, "rb") as fp:
|
||||||
data = fp.read(magic_len)
|
data = fp.read(magic_len)
|
||||||
for magic, archiver in magic_map.items():
|
for magic, archiver in magic_map.items():
|
||||||
if data.startswith(magic):
|
if data.startswith(magic):
|
||||||
return archiver(self.path)
|
return archiver(path)
|
||||||
raise PackageException("Unknown archive type '%s'" % self.path)
|
raise PackageException("Unknown archive type '%s'" % path)
|
||||||
|
|
||||||
def __enter__(self):
|
|
||||||
self._archiver = self._init_archiver()
|
|
||||||
return self
|
|
||||||
|
|
||||||
def __exit__(self, *args):
|
|
||||||
if self._archiver:
|
|
||||||
self._archiver.close()
|
|
||||||
|
|
||||||
def unpack(
|
def unpack(
|
||||||
self, dest_dir=None, with_progress=True, check_unpacked=True, silent=False
|
self, dest_dir=None, with_progress=True, check_unpacked=True, silent=False
|
||||||
|
Reference in New Issue
Block a user