Skip to content

chore: release v0.3.0 - #48

Merged
lloydsmart merged 78 commits into
mainfrom
release/v0.3.0
Aug 5, 2026
Merged

lloydsmart merged 78 commits into
mainfrom
release/v0.3.0

Conversation

@lloydsmart

Copy link
Copy Markdown
Owner

Summary

  • promote the current tested develop line to main
  • set the embedded CHD Tool version to 0.3.0
  • include the conversion safety, validation, resource handling, regression coverage, CLI, logging, release packaging, and documentation improvements completed since v0.2.5
  • include the corrected gitflow history and release-workflow artifact isolation from chore: backport v0.2.5 release state #47

Release process

This PR is the gitflow release promotion from release/v0.3.0 directly into main. After it merges, create annotated tag v0.3.0 on the resulting main merge commit and push that tag. The existing Release workflow will run tests and ShellCheck, generate release notes, build and validate reproducible artifacts, publish checksums, create the GitHub release, and open the automated changelog PR.

After the release and changelog PR are complete, backport main into develop.

Preflight validation

  • make test
  • ShellCheck across production, packaging, tests, and stubs
  • isolated make package VERSION=0.3.0
  • sha256sum --check SHA256SUMS
  • exact .tar.gz and .zip manifest validation
  • embedded version reports 0.3.0
  • clean working tree after removing WSL-only line-ending changes

- Tighten 'PLAYSTATION' pattern matching to distinguish between PS1 and PS2
- Reduce log noise by improving header-sniffing accuracy
- Maintain size-based safety fallback for non-standard hybrid discs
refactor: refine console fingerprinting to reduce PS1 false positives
- Add 1s sleep before chdman to prevent I/O collisions on fast runs
- Decouple subcommand (createcd/dvd) from hunk size (2048) for PS2
- Ensure PS2 CDs use createcd with 2048-byte sector alignment
- Improve stability on virtualized storage with high I/O latency
- Capture exit codes for unzip, unrar, and 7z operations
- Abort processing if extraction fails or detects CRC/header errors
- Prevent chdman from attempting to convert malformed disc images
- Ensure failures are logged and temporary directories are cleaned up
- Fetch file size once at function start to ensure logical consistency
- Use 'is_large_disc' flag for all size-based branching
- Remove redundant 'stat' calls in fallback logic
- Add DEBUG logs to trace raw byte counts and boolean evaluations
- Update detect_disc_type to resolve referenced files in CUE sheets
- Enable console fingerprinting on the primary data track (BIN) of CD sets
- Prioritize header sniffing over extension-based short-circuits
- Ensure PS2 CD-ROMs receive 2048-byte hunk alignment via 'ps2' identity
- Log extracted BIN filenames from CUE headers
- Verify existence of referenced data tracks before sniffing
- Add header-match confirmation for PS2 signatures
Fix disc detection & PS2 handling (CUE→BIN sniffing, safer extraction, fewer false positives)
… regex

Bash uses POSIX ERE for [[ =~ ]] matching and does not support the
PCRE non-capturing group syntax (?:...). This caused the "1 of 2" and
"1/2" disc patterns in parse_disc_info() to never match.

Replace the non-capturing group with a standard capturing group so the
regex works correctly under Bash.
Failure counts were incremented in multiple layers including
verify_chds() and convert_disc_file(), while callers also incremented
the counter when helpers returned non-zero.

Remove failure increments from helper functions so they only return
status. Failure counting is now centralized in process_input(),
ensuring the summary reflects actual input-level failures.
Introduce an `input_failed` flag within process_input() and move the
increment of the global `failures` counter to a single location at the
end of the function.

Previously, helper functions such as convert_disc_file() and some
verification paths modified the global failure counter directly, which
could lead to multiple increments for a single input.

Failures are now signalled via return codes or by setting `input_failed`,
and process_input() increments the counter once before returning a
non-zero status. This ensures failure reporting is consistent and avoids
double-counting in the summary.
…if_allowed()

- dedupe KEEP_ORIGINALS/DRY_RUN guarded removal logic
- call helper in verified-fastpath and post-conversion finalisation
Prevent M3U generation when an input fails during extraction,
conversion, or CHD verification. Previously the M3U update logic
could still run with input_failed=true, potentially producing
playlists based on incomplete or partially converted sets.

Move the failure check before the M3U generation block so
maybe_generate_m3u_for() is only called on successful runs.
Replace `7z l -ba | grep` with parsing of `7z l -slt` output.
Table output is formatting-dependent and not reliable for scripting.
Using `-slt` provides stable `Path = ...` entries for extraction.
…sing

Add `--` before the archive filename when calling unzip and unrar.
This prevents filenames beginning with `-` from being interpreted
as command options.
Convert backslashes to forward slashes before basename matching so CUEs
with Windows separators don’t falsely report missing referenced files.
…d detection

Keep createdvd probing but remove the verbose debug log to avoid noisy logs.
Replace detection based on `chdman -help` output with an explicit
capability probe using `chdman help createdvd`.

This avoids parsing large help output and provides a more reliable
feature check across chdman versions and builds.
Add `|| true` when reading the first 64KB of the image so failures in
`head` do not terminate the script under `set -euo pipefail`.

Also add `--` to protect against filenames beginning with `-`.
Remove temp directories from the global TEMP_DIRS list when they are
already cleaned up by the per-input `_cleanup` trap in process_input().

This avoids duplicate cleanup attempts and simplifies temp directory
lifecycle management.
…_disc_info

Define disc label patterns once and reuse them when constructing the
union regex. This reduces duplication and makes the detection patterns
easier to maintain without changing behaviour.
…collisions

- Add optional base override to convert_disc_file()
- Drive archive conversions from archive_entries and name outputs via archive_entry_to_chd_name()
- Ensure tmp CHD paths align with expected CHD manifests for verify/finalize
- Normalize CR→LF without piping the while-loop (keeps state in current shell)
- Ensure progress_active/newline handling works reliably at EOF
- Improve terminal wrap restore consistency via traps
Improve CUE FILE parsing when resolving the BIN path used for
header sniffing. The parser now:

- accepts leading whitespace before FILE
- handles case-insensitive FILE directives
- normalizes Windows-style backslashes in paths

This prevents false negatives when locating BIN files referenced
by valid CUE sheets.
When detecting disc type from a .cue, select the first referenced
data-like file (bin/iso/img/mdf) instead of blindly taking the
first FILE entry, which is often an audio track. Normalize
Windows-style path separators and keep detailed debug logging.
Allow the temporary working directory used for extraction and
verification to be overridden via the TMPDIR environment variable.

Defaults to /var/tmp/chdtool to avoid filling tmpfs, but users can
now supply a custom location (e.g. faster SSD or larger volume)
without modifying the script.
Create a unique per-run temporary workspace under TMPDIR using
RUN_ID. This prevents collisions between concurrent script runs
and keeps extraction and verification scratch files isolated.

Example layout:
/var/tmp/chdtool/<RUN_ID>/chdconv_*
/var/tmp/chdtool/<RUN_ID>/chdverify_*
- early-return in dry-run mode after logging intended conversions
- split archive vs non-archive conversion into a single clear branch
- keep temp dir cleanup in archive path after conversions complete
- fix array element unset in cleanup_temp_dir_now
- prevents duplicate cleanup attempts/log lines on EXIT after per-input cleanup
lloydsmart and others added 27 commits August 5, 2026 00:47
ci: align quality checks with retromount
Bumps the github-actions group with 4 updates: [actions/checkout](https://github.com/actions/checkout), [softprops/action-gh-release](https://github.com/softprops/action-gh-release), [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) and [actions/upload-artifact](https://github.com/actions/upload-artifact).


Updates `actions/checkout` from 5.1.0 to 7.0.1
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@fbc6f39...3d3c42e)

Updates `softprops/action-gh-release` from 2.6.2 to 3.0.2
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](softprops/action-gh-release@3bb1273...3d0d988)

Updates `peter-evans/create-pull-request` from 6.1.0 to 8.1.1
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](peter-evans/create-pull-request@c5a7806...5f6978f)

Updates `actions/upload-artifact` from 6.0.0 to 7.0.1
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@b7c566a...043fb46)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: softprops/action-gh-release
  dependency-version: 3.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: peter-evans/create-pull-request
  dependency-version: 8.1.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
…ub-actions-11669ccbcf

chore(deps): bump the github-actions group with 4 updates
…tputs

fix: use unique tracked temporary CHD outputs
fix: support reliable partial resume with explicit output states
…t-status

fix: return meaningful status when inputs fail
Registers the focused regression suites and documents the behavior added for #31 and #32.
Removes obsolete state and unused compatibility variables introduced while addressing #31 and #32.
…dation-and-resources

Harden descriptor validation and improve resource handling
…rage

test: expand conversion regression coverage
…documentation

chore: harden release packaging and CLI
@lloydsmart
lloydsmart marked this pull request as ready for review August 5, 2026 11:35
@lloydsmart
lloydsmart merged commit 8424c43 into main Aug 5, 2026
6 checks passed
@lloydsmart
lloydsmart deleted the release/v0.3.0 branch August 5, 2026 11:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant