Skip to content

Commit 04fbec5

Browse files
committed
Releasing 1.1.0 with safer filenames
1 parent 4bb6cb3 commit 04fbec5

3 files changed

Lines changed: 20 additions & 9 deletions

File tree

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [1.1.0] - 2024-01-30
9+
10+
### Changed
11+
12+
- `fs_name` now includes image reference and is filesystem safe for all OS.
13+
- Default export filename now includes platform as well.
14+
815
## [1.0.1] - 2023-08-11
916

1017
### Changed

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ classifiers = [
2222
]
2323
dependencies = [
2424
"requests>=2,<3",
25+
"pathvalidate==3.2.0",
2526
]
2627
dynamic = ["version"]
2728

@@ -47,7 +48,7 @@ dev = [
4748
"docker-export[lint]",
4849
"docker-export[test]",
4950
"docker-export[check]",
50-
"docker-export[all]",
51+
"docker-export[visual]",
5152
]
5253
visual = [
5354
"humanfriendly>=8.0",

src/docker_export/__init__.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from typing import Any
2121

2222
import requests
23+
from pathvalidate import sanitize_filename
2324

2425
try:
2526
import progressbar # pyright: ignore [reportMissingTypeStubs]
@@ -32,7 +33,7 @@
3233

3334
REQUEST_TIMEOUT = 60
3435

35-
__version__ = "1.0.1"
36+
__version__ = "1.1.0"
3637
logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
3738
logger = logging.getLogger("docker-export")
3839
logging.getLogger("urllib3").setLevel(logging.WARNING)
@@ -230,30 +231,32 @@ class Image:
230231
tag: str
231232
digest: str
232233

233-
def __str__(self):
234+
def __str__(self) -> str:
234235
value = f"{self.registry}/{self.repository}/{self.name}:{self.tag}"
235236
if self.digest:
236237
value += f"@{self.digest}"
237238
return value
238239

239240
@property
240-
def fullname(self):
241+
def fullname(self) -> str:
241242
return f"{self.repository}/{self.name}"
242243

243244
@property
244-
def reg_fullname(self):
245+
def reg_fullname(self) -> str:
245246
return f"{self.registry}/{self.fullname}"
246247

247248
@property
248-
def fs_name(self):
249-
return "_".join(pathlib.Path(self.reg_fullname).parts)
249+
def fs_name(self) -> str:
250+
return sanitize_filename(
251+
"_".join(pathlib.Path(self.reg_fullname).parts) + f"_{self.reference}"
252+
)
250253

251254
@property
252255
def reference(self):
253256
return self.digest or self.tag
254257

255258
@property
256-
def url(self):
259+
def url(self) -> str:
257260
domain = (
258261
"hub.docker.com" if self.registry == "index.docker.io" else self.registry
259262
)
@@ -903,7 +906,7 @@ def main():
903906
image = Image.parse(**args)
904907
dest = pathlib.Path(output).expanduser().resolve()
905908
if not dest.suffix == ".tar":
906-
dest = dest.joinpath(f"{image.fs_name}.tar")
909+
dest = dest.joinpath(sanitize_filename(f"{image.fs_name}_{platform}.tar"))
907910
build_dir = (
908911
pathlib.Path(build_dir).expanduser().resolve() if build_dir else None
909912
)

0 commit comments

Comments
 (0)