[Scummvm-git-logs] scummvm master -> cc8f2d69ef8693699b86571fef8a5df0f97f30c8
sev-
noreply at scummvm.org
Sat Nov 11 21:57:04 UTC 2023
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
cc8f2d69ef DEVTOOLS: dumper-companion: Support images with multiple partitions; don't warn about missing deps when not running mac
Commit: cc8f2d69ef8693699b86571fef8a5df0f97f30c8
https://github.com/scummvm/scummvm/commit/cc8f2d69ef8693699b86571fef8a5df0f97f30c8
Author: eientei (einstein95 at users.noreply.github.com)
Date: 2023-11-11T22:57:01+01:00
Commit Message:
DEVTOOLS: dumper-companion: Support images with multiple partitions; don't warn about missing deps when not running mac mode
Additionally fix a copy/paste error and remove an unused variable.
Changed paths:
devtools/dumper-companion.py
diff --git a/devtools/dumper-companion.py b/devtools/dumper-companion.py
index 29451547dea..c85db87cd48 100755
--- a/devtools/dumper-companion.py
+++ b/devtools/dumper-companion.py
@@ -32,12 +32,6 @@ from typing import Any
import machfs
-if sys.platform == "darwin":
- try:
- import xattr
- except ImportError:
- logging.error("xattr is required for the 'mac' mode to work\n")
-
# fmt: off
decode_map = {
@@ -298,13 +292,7 @@ def encode_string(args: argparse.Namespace) -> int:
def extract_volume(args: argparse.Namespace) -> int:
"""Extract an HFS volume"""
source_volume: Path = args.src
- destination_dir: Path = args.dir
- japanese: bool = args.japanese
- dryrun: bool = args.dryrun
- dopunycode: bool = not args.nopunycode
loglevel: str = args.log
- force_macbinary: bool = args.forcemacbinary
- add_macbinary_ext: bool = args.addmacbinaryext
numeric_level = getattr(logging, loglevel.upper(), None)
if not isinstance(numeric_level, int):
@@ -313,29 +301,52 @@ def extract_volume(args: argparse.Namespace) -> int:
logging.info(f"Loading {source_volume} ...")
vol = machfs.Volume()
+ partitions = []
with source_volume.open(mode="rb") as f:
f.seek(0x200)
- if f.read(4) == b"PM\x00\x00":
- partition_num = 1
- partition_type = ""
- while partition_type != "Apple_HFS":
+ partition_num = 1
+
+ while True:
+ data = f.read(4)
+ if data == b"PM\x00\x00":
num_partitions, partition_start, partition_size = unpack(
">III", f.read(12)
)
- f.seek(32, 1)
- partition_type = f.read(32).decode("ascii").split("\x00")[0]
- if partition_num <= num_partitions and partition_type != "Apple_HFS":
+ f.seek(0x20, 1)
+ partition_type = f.read(0x20).decode("ascii").split("\x00")[0]
+ if partition_type == "Apple_HFS" and partition_size > 0:
+ # Found an HFS partition, log it
+ partitions.append((partition_start * 0x200, partition_size * 0x200))
+ if partition_num <= num_partitions:
# Move onto the next partition
partition_num += 1
- f.seek(partition_num * 0x200 + 4)
+ f.seek(partition_num * 0x200)
else:
- # We found the one we want or there's none
+ # Finished parsing the partition map
break
- f.seek(partition_start * 0x200)
- vol.read(f.read(partition_size * 0x200))
+ else:
+ # Didn't find the Apple Partition Map, break so we can just
+ # load the entire image
+ break
+
+ if partitions:
+ for partition_start, partition_size in partitions:
+ f.seek(partition_start)
+ vol.read(f.read(partition_size))
+ extract_partition(args, vol)
else:
f.seek(0)
vol.read(f.read())
+ extract_partition(args, vol)
+
+
+def extract_partition(args: argparse.Namespace, vol) -> int:
+ destination_dir: Path = args.dir
+ japanese: bool = args.japanese
+ dryrun: bool = args.dryrun
+ dopunycode: bool = not args.nopunycode
+ force_macbinary: bool = args.forcemacbinary
+ add_macbinary_ext: bool = args.addmacbinaryext
if not dryrun:
destination_dir.mkdir(parents=True, exist_ok=True)
@@ -508,6 +519,12 @@ def collect_forks(args: argparse.Namespace) -> int:
- combine them with the data fork when it's available
- punyencode the filename when requested
"""
+ try:
+ import xattr
+ except ImportError:
+ logging.error("xattr is required for the 'mac' mode to work\n")
+ exit(1)
+
directory: bytes = bytes(args.dir)
punify: bool = args.punycode
force_macbinary: bool = args.forcemacbinary
@@ -525,7 +542,7 @@ def collect_forks(args: argparse.Namespace) -> int:
filepath = os.path.join(dirpath, filename)
if add_macbinary_ext:
- filepath = upath.with_name(filepath.name + ".bin")
+ filepath = filepath.with_name(filepath.name + ".bin")
resourcepath = os.path.join(dirpath, resource_filename)
file = machfs.File()
@@ -662,7 +679,7 @@ def create_macfonts(args: argparse.Namespace) -> int:
datafork.seek(-0x200, 2)
alt_mdb_loc = datafork.tell()
datafork.seek(-(0x200 - 0x12), 2)
- num_allocation_blocks, allocation_block_size, first_allocation_block = unpack(
+ _, allocation_block_size, first_allocation_block = unpack(
">HI4xH", datafork.read(12)
)
compressed_data_start = first_allocation_block * allocation_block_size
More information about the Scummvm-git-logs
mailing list