Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions examples/client/client
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,6 @@ def init_tofu(base_url: str) -> bool:

metadata_dir = build_metadata_dir(base_url)

if not os.path.isdir(metadata_dir):
os.makedirs(metadata_dir)

response = urllib3.request("GET", f"{base_url}/metadata/1.root.json")
if response.status != 200:
print(f"Failed to download initial root {base_url}/metadata/1.root.json")
Expand Down Expand Up @@ -81,9 +78,6 @@ def download(base_url: str, target: str) -> bool:

print(f"Using trusted root in {metadata_dir}")

if not os.path.isdir(DOWNLOAD_DIR):
os.mkdir(DOWNLOAD_DIR)

try:
# NOTE: initial root should be provided with ``bootstrap`` argument:
# This examples uses unsafe Trust-On-First-Use initialization so it is
Expand Down
7 changes: 4 additions & 3 deletions tests/test_updater_top_level_update.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import tempfile
import unittest
from datetime import timezone
from pathlib import Path
from typing import TYPE_CHECKING
from unittest.mock import MagicMock, call, patch

Expand Down Expand Up @@ -57,8 +58,6 @@ def setUp(self) -> None:
self.temp_dir = tempfile.TemporaryDirectory()
self.metadata_dir = os.path.join(self.temp_dir.name, "metadata")
self.targets_dir = os.path.join(self.temp_dir.name, "targets")
os.mkdir(self.metadata_dir)
os.mkdir(self.targets_dir)

self.sim = RepositorySimulator()

Expand Down Expand Up @@ -134,7 +133,8 @@ def test_cached_root_missing_without_bootstrap(self) -> None:
self._run_refresh(skip_bootstrap=True)

# Metadata dir is empty
self.assertFalse(os.listdir(self.metadata_dir))
with self.assertRaises(FileNotFoundError):
os.listdir(self.metadata_dir)

def test_trusted_root_expired(self) -> None:
# Create an expired root version
Expand Down Expand Up @@ -166,6 +166,7 @@ def test_trusted_root_expired(self) -> None:

def test_trusted_root_unsigned_without_bootstrap(self) -> None:
# Cached root is not signed, bootstrap root is not used
Path(self.metadata_dir).mkdir(parents=True)
root_path = os.path.join(self.metadata_dir, "root.json")
md_root = Metadata.from_bytes(self.sim.signed_roots[0])
md_root.signatures.clear()
Expand Down
9 changes: 5 additions & 4 deletions tuf/ngclient/updater.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
import os
import shutil
import tempfile
from pathlib import Path
from typing import TYPE_CHECKING, cast
from urllib import parse

Expand Down Expand Up @@ -267,6 +268,7 @@ def download_target(

if filepath is None:
filepath = self._generate_target_file_path(targetinfo)
Path(filepath).parent.mkdir(exist_ok=True, parents=True)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a case where Pathlib is much more ergonomic so I'm using it even though we don't use Paths generally


if target_base_url is None:
if self._target_base_url is None:
Expand Down Expand Up @@ -332,10 +334,9 @@ def _persist_root(self, version: int, data: bytes) -> None:
The metadata is stored with version prefix (e.g.
"root_history/1.root.json").
"""
rootdir = os.path.join(self._dir, "root_history")
with contextlib.suppress(FileExistsError):
os.mkdir(rootdir)
self._persist_file(os.path.join(rootdir, f"{version}.root.json"), data)
rootdir = Path(self._dir, "root_history")
rootdir.mkdir(exist_ok=True, parents=True)
self._persist_file(str(rootdir / f"{version}.root.json"), data)

def _persist_file(self, filename: str, data: bytes) -> None:
"""Write a file to disk atomically to avoid data loss."""
Expand Down