Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
57ab6d8
refactor: refine console fingerprinting to reduce PS1 false positives
lloydsmart Feb 7, 2026
158d8b1
Merge pull request #21 from lloydsmart/bugfix/playstation-header
lloydsmart Feb 7, 2026
602825b
fix: resolve race condition and refine PS2 CD/DVD handling
lloydsmart Feb 11, 2026
ba08c87
fix: implement strict extraction validation to handle corrupt archives
lloydsmart Feb 11, 2026
59beb51
refactor: consolidate disc size detection and add surgical debugging
lloydsmart Feb 11, 2026
50f89e8
feat: implement CUE-to-BIN sniffing for accurate console detection
lloydsmart Feb 11, 2026
472ee1a
debug: trace CUE-to-BIN resolution path in detect_disc_type
lloydsmart Feb 11, 2026
911ea0c
debugging
lloydsmart Feb 11, 2026
65b7195
Merge pull request #22 from lloydsmart/bugfix/detection-logic
lloydsmart Mar 4, 2026
daed06b
fix: remove unsupported PCRE non-capturing group from parse_disc_info…
lloydsmart Mar 4, 2026
0d5e415
fix: prevent double counting of failures across helper functions
lloydsmart Mar 4, 2026
889bf24
fix: centralise failure accounting in process_input()
lloydsmart Mar 4, 2026
7c94590
refactor(process_input): centralise input removal with _remove_input_…
lloydsmart Mar 4, 2026
771e95b
fix(process_input): only generate M3U when input processing succeeds
lloydsmart Mar 4, 2026
b4d97a6
fix(archives): parse 7z technical listing instead of table output
lloydsmart Mar 4, 2026
8564979
fix(archives): protect unzip/unrar calls with `--` to stop option par…
lloydsmart Mar 4, 2026
e382729
fix(cue): normalize Windows-style paths when validating FILE references
lloydsmart Mar 4, 2026
a27b234
chore(logging): stop dumping full chdman -help output during createdv…
lloydsmart Mar 4, 2026
227e6ed
fix(chdman): detect createdvd support via explicit help probe
lloydsmart Mar 4, 2026
d55113f
fix(detection): guard header sniff in detect_disc_type against pipefail
lloydsmart Mar 4, 2026
c24b6b5
refactor(temp): avoid double bookkeeping of per-input temp directories
lloydsmart Mar 4, 2026
f60ed0c
refactor(disc-detection): remove duplicate label definitions in parse…
lloydsmart Mar 4, 2026
d776310
fix(archives): preserve subdir context in CHD output names and avoid …
lloydsmart Mar 4, 2026
12cd36a
fix(progress): avoid subshell in chdman progress filter
lloydsmart Mar 4, 2026
f7c9e9f
fix(cue): make BIN path detection more robust
lloydsmart Mar 4, 2026
f962314
fix(cue): prefer data track when choosing sniff target
lloydsmart Mar 4, 2026
66c2504
feat(tempdir): allow TMPDIR override for temporary workspace
lloydsmart Mar 4, 2026
107f8a5
improve(tempdir): isolate temporary workspace per run
lloydsmart Mar 4, 2026
fd17434
refactor(process_input): reduce nesting in conversion flow
lloydsmart Mar 4, 2026
bc7b930
fix(cleanup): correctly untrack temp dirs after early deletion
lloydsmart Mar 4, 2026
2a6574e
Merge pull request #23 from lloydsmart/bugfix/correctness-fixes
lloydsmart Mar 4, 2026
a94384f
fix(workflow): update permissions for workflow files
lloydsmart Mar 4, 2026
e2022d4
Merge pull request #24 from lloydsmart/bugfix/workflow-permissions
lloydsmart Mar 4, 2026
fcc20bf
fix: count failed inputs consistently in process_input
lloydsmart Mar 6, 2026
51dd23a
fix: count failed inputs once and stop on hard extraction errors
lloydsmart Mar 6, 2026
1d7b6b6
Merge pull request #25 from lloydsmart/bugfix/failure-accounting
lloydsmart Mar 6, 2026
050e337
fix: prioritise descriptor files when selecting disc inputs from arch…
lloydsmart Mar 7, 2026
b58cd37
fix: apply descriptor priority when discovering extracted disc files
lloydsmart Mar 7, 2026
f6f189b
fix: allow wav audio tracks in cue validation
lloydsmart Mar 7, 2026
ccc8f5f
fix: fail cue validation on lossy or unverified audio tracks
lloydsmart Mar 7, 2026
12e32a1
feat: add override for unverified cue audio tracks
lloydsmart Mar 7, 2026
5a70e8d
chore: add debug logging for expected chd names and cue validation su…
lloydsmart Mar 7, 2026
da974ae
chore: Change error message to be more informative
lloydsmart Mar 7, 2026
719beaa
Merge pull request #26 from lloydsmart/bugfix/cue-handling-fixes
lloydsmart Mar 7, 2026
1a2eff2
docs: overhaul README with clickable badges and comprehensive documen…
lloydsmart Mar 24, 2026
1ef5cca
docs: tweaks to README
lloydsmart Mar 24, 2026
ce74492
ci: update actions/checkout to v5 and opt into Node 24
lloydsmart Mar 24, 2026
875c072
ci: upgrade upload-artifact to v6 for Node 24 compatibility
lloydsmart Mar 24, 2026
08f5b84
fix: make source deletion transactional
lloydsmart Aug 4, 2026
7dc509c
Merge pull request #35 from lloydsmart/fix/27-transactional-source-de…
lloydsmart Aug 4, 2026
9aab095
ci: strengthen repository quality checks
lloydsmart Aug 4, 2026
c793f0b
docs: fix markdown lint violations
lloydsmart Aug 4, 2026
b94f2ac
ci: document markdownlint exclusions
lloydsmart Aug 4, 2026
2a056f2
Merge pull request #37 from lloydsmart/chore/36-ci-quality-checks
lloydsmart Aug 4, 2026
3ab3bf1
chore(deps): bump the github-actions group with 4 updates
dependabot[bot] Aug 4, 2026
a268885
Merge pull request #38 from lloydsmart/dependabot/github_actions/gith…
lloydsmart Aug 4, 2026
42d7de7
fix: use unique tracked temporary CHD outputs
lloydsmart Aug 5, 2026
30e6529
Merge pull request #39 from lloydsmart/fix/29-unique-temporary-chd-ou…
lloydsmart Aug 5, 2026
67caf42
fix: support reliable partial resume states
lloydsmart Aug 5, 2026
9c9c774
test: clarify partial resume assertion
lloydsmart Aug 5, 2026
2ebe934
Merge pull request #40 from lloydsmart/bugfix/28-reliable-partial-resume
lloydsmart Aug 5, 2026
29bbea3
fix: return non-zero status for input failures
lloydsmart Aug 5, 2026
066d801
chore: annotate trap callbacks for shellcheck
lloydsmart Aug 5, 2026
9d66679
Merge pull request #41 from lloydsmart/bugfix/meaningful-non-zero-exi…
lloydsmart Aug 5, 2026
02c0fe6
fix: harden descriptor and archive validation (#32)
lloydsmart Aug 5, 2026
4f8f0d6
perf: improve chdman resource handling (#31)
lloydsmart Aug 5, 2026
069bab0
docs: document validation and resource controls (#31, #32)
lloydsmart Aug 5, 2026
b3dfc09
ci: resolve shellcheck warnings (#31, #32)
lloydsmart Aug 5, 2026
77896cf
Merge pull request #42 from lloydsmart/bugfix/descriptor-archive-vali…
lloydsmart Aug 5, 2026
a59b89f
test: expand conversion regression coverage (#33)
lloydsmart Aug 5, 2026
144e764
Merge pull request #43 from lloydsmart/feature/expand-regression-cove…
lloydsmart Aug 5, 2026
258340c
chore: harden release packaging and CLI (#34)
lloydsmart Aug 5, 2026
4fdcd2e
Merge pull request #44 from lloydsmart/feature/release-packaging-and-…
lloydsmart Aug 5, 2026
8a7d716
docs: document release procedure
lloydsmart Aug 5, 2026
2d991b5
Merge pull request #45 from lloydsmart/docs/release-procedure
lloydsmart Aug 5, 2026
3374be8
chore: backport v0.2.5 release state
lloydsmart Aug 5, 2026
ad364a3
Merge pull request #47 from lloydsmart/chore/backport-v0.2.5-release
lloydsmart Aug 5, 2026
ace06cb
chore: prepare v0.3.0
lloydsmart Aug 5, 2026
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
11 changes: 11 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
version: 2

updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: weekly
groups:
github-actions:
patterns:
- "*"
46 changes: 46 additions & 0 deletions .github/workflows/lint-actions.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: Lint Actions

on:
workflow_dispatch:
push:
paths:
- ".github/workflows/**"
pull_request:
paths:
- ".github/workflows/**"

concurrency:
group: lint-actions-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"

jobs:
actionlint:
name: Lint GitHub Actions workflows
runs-on: ubuntu-latest
env:
ACTIONLINT_VERSION: "1.7.8"

steps:
- name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Install actionlint
shell: bash
run: |
set -euo pipefail
archive="actionlint_${ACTIONLINT_VERSION}_linux_amd64.tar.gz"
base_url="https://github.com/rhysd/actionlint/releases/download/v${ACTIONLINT_VERSION}"
curl -fsSLO "${base_url}/${archive}"
curl -fsSLO "${base_url}/actionlint_${ACTIONLINT_VERSION}_checksums.txt"
grep " ${archive}$" "actionlint_${ACTIONLINT_VERSION}_checksums.txt" | sha256sum --check
tar -xzf "${archive}" actionlint
sudo install actionlint /usr/local/bin/actionlint

- name: Lint workflows
run: actionlint
43 changes: 43 additions & 0 deletions .github/workflows/lint-docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Lint Docs

on:
workflow_dispatch:
push:
paths:
- "**/*.md"
- ".markdownlint.json"
- ".github/workflows/lint-docs.yml"
pull_request:
paths:
- "**/*.md"
- ".markdownlint.json"
- ".github/workflows/lint-docs.yml"

concurrency:
group: lint-docs-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"

jobs:
markdownlint:
name: Lint Markdown
runs-on: ubuntu-latest

steps:
- name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Lint Markdown
uses: DavidAnson/markdownlint-cli2-action@6bf21b07787794f89a243495939cd651942aeabe # v24.1.0
with:
# Changelogs are generated by git-cliff; LICENSE.md preserves canonical licence text.
globs: |
**/*.md
#CHANGELOG.md
#CHANGELOG_RELEASE.md
#LICENSE.md
47 changes: 28 additions & 19 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,29 @@ permissions:
jobs:
release:
runs-on: ubuntu-latest

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
steps:
- name: Check out repo
uses: actions/checkout@v4
- name: Check out repo
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
fetch-tags: true
fetch-tags: true

- name: Install test and packaging dependencies
run: |
sudo apt-get update
sudo apt-get install -y make shellcheck unzip zip

- name: Run tests and ShellCheck
run: |
make test
shellcheck chdtool.sh scripts/*.sh tests/*.sh tests/bin/*

# Generate release notes for this tag (used as Release body)
- name: Generate release notes with git-cliff
id: cliff_notes
uses: orhun/git-cliff-action@v4
uses: orhun/git-cliff-action@f50e11560dce63f7c33227798f90b924471a88b5 # v4
with:
config: cliff.toml
# notes only for the pushed tag, without the big header
Expand All @@ -32,23 +43,21 @@ jobs:
OUTPUT: CHANGELOG_RELEASE.md
GITHUB_REPO: ${{ github.repository }}

- name: Prepare artifacts
run: |
set -euo pipefail
chmod +x chdtool.sh || true
cp chdtool.sh chdtool
mkdir -p dist
tar -czf "dist/chdtool-${GITHUB_REF_NAME}.tar.gz" chdtool README.md LICENSE CHANGELOG.md || true
zip -j "dist/chdtool-${GITHUB_REF_NAME}.zip" chdtool README.md LICENSE CHANGELOG.md || true
- name: Prepare artifacts
run: |
set -euo pipefail
release_version="${GITHUB_REF_NAME#v}"
DIST_DIR="${RUNNER_TEMP}/chdtool-dist" \
SOURCE_DATE_EPOCH="$(git log -1 --format=%ct)" \
bash scripts/package-release.sh "$release_version"

- name: Create GitHub Release and upload assets
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2
with:
tag_name: ${{ github.ref_name }}
body_path: ${{ steps.cliff_notes.outputs.changelog }} # file generated above
files: |
dist/*
chdtool.sh
files: |
${{ runner.temp }}/chdtool-dist/*
draft: false
prerelease: ${{ contains(github.ref_name, '-') }}
env:
Expand All @@ -57,7 +66,7 @@ jobs:
# Regenerate the full CHANGELOG.md for main and open a PR
- name: Regenerate full CHANGELOG.md
id: cliff_full
uses: orhun/git-cliff-action@v4
uses: orhun/git-cliff-action@f50e11560dce63f7c33227798f90b924471a88b5 # v4
with:
config: cliff.toml
args: -vv
Expand All @@ -66,7 +75,7 @@ jobs:
GITHUB_REPO: ${{ github.repository }}

- name: Open PR to update CHANGELOG.md on main
uses: peter-evans/create-pull-request@v6
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
with:
commit-message: "chore(changelog): update for ${{ github.ref_name }}"
branch: chore/update-changelog-${{ github.ref_name }}
Expand Down
48 changes: 37 additions & 11 deletions .github/workflows/shellcheck.yml
Original file line number Diff line number Diff line change
@@ -1,11 +1,37 @@
name: ShellCheck
on: [push, pull_request]
jobs:
shellcheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install ShellCheck
run: sudo apt-get update && sudo apt-get install -y shellcheck
- name: Run ShellCheck
run: shellcheck chdtool.sh
name: ShellCheck

on:
workflow_dispatch:
push:
paths:
- "chdtool.sh"
- "tests/**/*.sh"
- "tests/bin/*"
- "scripts/**/*.sh"
- ".github/workflows/shellcheck.yml"
pull_request:
paths:
- "chdtool.sh"
- "tests/**/*.sh"
- "tests/bin/*"
- "scripts/**/*.sh"
- ".github/workflows/shellcheck.yml"

concurrency:
group: shellcheck-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
shellcheck:
runs-on: ubuntu-latest
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Install ShellCheck
run: sudo apt-get update && sudo apt-get install -y shellcheck
- name: Run ShellCheck
run: shellcheck chdtool.sh scripts/*.sh tests/*.sh tests/bin/*
35 changes: 26 additions & 9 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -1,31 +1,48 @@
name: tests
name: Tests

on:
workflow_dispatch:
push:
paths:
- "chdtool.sh"
- "Makefile"
- "tests/**"
- "scripts/**"
- ".github/workflows/tests.yml"
pull_request:
paths:
- "chdtool.sh"
- "Makefile"
- "tests/**"
- "scripts/**"
- ".github/workflows/tests.yml"

concurrency:
group: tests-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
tests:
runs-on: ubuntu-latest
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Install test deps
run: |
sudo apt-get update
sudo apt-get install -y unzip zip make

- name: Debug workspace
run: |
pwd
ls -la
sed -n '1,120p' Makefile

- name: Run tests
run: make test

- name: Upload logs from tests (always)
if: ${{ always() }}
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: logs-from-tests
path: logs/
Expand Down
12 changes: 7 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,13 @@ Thumbs.db
logs/
*.log

# Archives or temp outputs (just in case)
*.zip
*.7z
*.rar
*.tmp
# Archives or temp outputs (just in case)
*.zip
*.7z
*.rar
*.tmp
/chdtool
/dist/

# Python virtual envs (if any tooling is added later)
.venv/
Expand Down
4 changes: 4 additions & 0 deletions .markdownlint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"default": true,
"MD013": false
}
46 changes: 27 additions & 19 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,25 +1,28 @@
# Contributing

Thanks for your interest in contributing to **chdscript**! 🎉
Thanks for your interest in contributing to **chdtool**! 🎉

## How to Contribute

1. **Fork the repo** and create your feature branch:
```bash
git checkout -b feature/my-new-feature
1. **Fork the repo** and create your feature branch:

```bash
git checkout -b feature/my-new-feature
```

2. **Commit your changes** with clear messages:

```bash
git commit -m "Add support for XYZ"
```

3. **Push to the branch**:

```bash
git push origin feature/my-new-feature
```

2. **Commit your changes** with clear messages:
```bash
git commit -m "Add support for XYZ"
```

3. **Push to the branch**:
```bash
git push origin feature/my-new-feature
```

4. **Open a Pull Request** against `main`.
4. **Open a Pull Request** against `develop`.

## Coding Guidelines

Expand All @@ -37,11 +40,16 @@ Thanks for your interest in contributing to **chdscript**! 🎉

## Versioning

We use [Semantic Versioning](https://semver.org/) (semver).
Bump version numbers when you:
- `MAJOR`: Break backward compatibility
We use [Semantic Versioning](https://semver.org/) (semver).

Bump version numbers when you:

- `MAJOR`: Break backward compatibility
- `MINOR`: Add new functionality in a backward-compatible manner
- `PATCH`: Fix bugs or make small improvements
- `PATCH`: Fix bugs or make small improvements

Maintainers should follow the complete [release procedure](RELEASING.md) when
preparing, tagging, publishing, and verifying a release.

---

Expand Down
Loading