Skip to content

v3.0.0

Compare
Choose a tag to compare
@emmercm emmercm released this 31 Aug 20:48
2c53493

See the project website for complete documentation, installation & usage instructions, and examples!

Release Highlights

This release has been a long time in the making, with more than 9,200 lines of code and documentation changed, and has taken significant testing—but it's finally ready!

Igir just passed the second birthday of its first release on August 24th. By the numbers, it has reached 7 community contributors, 344 stars on GitHub, and 18.2k downloads across all channels. I'm very proud of the project, and I'm humbled by the traction it's gotten with admittedly little advertisement. I will likely scale back the time I put into the project through the end of the year as this release has taken so much time & effort to get ready. Thank you all for your continued support!

The documentation website has had a significant refresh, but should still feel familiar. Thank you @netwaretcs for the new logo!

🚀 New major features

Support for reading & extracting CHD, CSO/ZSO/DAX, and NKit ISO files

Support for these common disk/disc compression formats is what prompted a major version change of Igir. And best yet—all of the required tools are bundled, so you don't have to source any of them! Thank you @maxexcloo, @unexpectedpanda, and @Djabal for all of your effort in development and general discussion!

Moved files are moved immediately

Previously, Igir would copy files from input to output during igir move, and then delete those "moved" files from the input directory as a cleanup action at the end. This was for the case when a single input file was used for different output files. Igir will now actually move files in real time, and it will then copy the first moved file in the output directory as needed for duplicates.

Copying zip files that don't need to be recreated

When not extracting (igir extract), Igir can now detect zip files that contain exactly the correct files for a game and copy that zip file as-is without recreating a new zip file. This helps preserve information such as zip comments and file timestamps.

🪛 New minor features

Breaking: --allow-excess-sets option

When not extracting or zipping, Igir would previously match archives that contained all of a game's files, even if the archive contained excess files. This is no longer the default behavior as it was likely unexpected, and instead, you must enable the behavior with the new --allow-excess-sets option. Thank you @PhasecoreX for the suggestion!

--input-checksum-quick option

The addition of new archive formats (above) that require bundled third-party tools to decompress may require a lot of temp file reading & writing. To bypass this, a new "quick" checksum option has been added that will only read checksums from archive headers and never extract contents to temp files. This comes with a lot of caveats, so please read the new documentation for more information.

--input-checksum-max <algorithm> option

The --input-checksum-min <algorithm> option which allows you to raise the minimum allowed checksum above CRC32 has existed since v2.6.0. It now has a sibling option --input-checksum-max <algorithm> which will let you constrain the maximum allowed checksum. This is useful because Igir will automatically enable the use of non-CRC32 algorithms in the case that DATs don't provide CRC32 checksums for all files.

🐛 Bug fixes, performance improvements

Support for DAT URLs to archives

@PhasecoreX found a bug/oversight where DAT URLs pointed to archive files wouldn't parse the archive's contents. This has been fixed!

More efficient rendering of progress bars

A change to render progress bars asynchronously should make all processing a little faster.

Cache file is tested after writing

When Igir writes the cache back to disk, it first writes it to a temp file and then overwrites the real location. That temp file will now be tested to make sure it was written correctly, which should reduce the chance of a corrupted file.

--dir-mirror with input subdirectories

The --dir-mirror option wasn't working as intended with input paths with path separators (i.e. / or \) in them. This should be fixed, and there is now an example highlighting the option's value.

Erroneous ROM header removal

No-Intro started including Clrmamepro-style header information in their headerless DATs, which was causing headers to be automatically removed when they shouldn't have been. This has been fixed.

⛓️‍💥 Breaking changes

Breaking: cache structure has significantly changed

Both the serialization format and the key structure of the cache file have been significantly changed, which will make your existing cache file invalid, so Igir will overwrite it with a fresh cache file. This is not the type of change that should need to happen often.

Breaking: all previously deprecated options and tokens have been removed

Several options that aren't visible in the help message have been deprecated for a long time, and all of them have been removed to keep the code tidy.

Breaking: --exclude-disks option

Now that Igir can parse CHDs, MAME games that specify "disks" will require their CHDs to be present to be considered a full match. This is because these games likely require their disks to function at all. To revert to the old behavior where disks aren't required, you can provide the --exclude-disks option.

Breaking: --prefer-ntsc and --prefer-pal have been removed

These options relied on naming schemes specific to certain DAT groups, and the tagging convention they relied on isn't present in the gross majority of games. These two options have been removed to avoid an expectation that they should work in most cases. You can use the --prefer-game-regex <pattern> option to recreate this behavior.

Breaking: --prefer-revision-newer and --prefer-revision-older combined into --prefer-revision <mode>

This brings the option in line with other options that have been added recently.

🫶 Sponsors

Thank you @dcramer who has been a long-time project sponsor, @lauripaulo for your recent sponsorship, and to everyone who has chosen to sponsor privately!

Every donation to the project is a blessing, and I'm thankful to everyone who spends their time making it a little better.

All changes

31 August 2024 - 2c53493 - v3.0.0 (#1334)
31 August 2024 - 21c7490 - Chore: update typescript-eslint monorepo to v8 (major) (#1323)
31 August 2024 - ea55b6a - CI: add .git-blame-ignore-revs (#1333)
31 August 2024 - 6746d8a - Refactor: sort modules into groups (#1332)
30 August 2024 - f7865f7 - Refactor: replace 'eslint-config-airbnb-typescript' with Prettier (#1331)
30 August 2024 - 79093af - Feature: v3.0.0 (#1233)
30 August 2024 - 9ea6039 - Fix: caching headers & signatures for archived files (#1330)
30 August 2024 - 3ed0202 - Docs: update (#1328)
30 August 2024 - cea8734 - Fix: dir mirror option when input path contains multiple path slugs (#1329)
30 August 2024 - 7b127e8 - Refactor: use the V8 serializer for the cache file (#1326)
29 August 2024 - b403669 - Refactor: rename progress bar icon names (#1327)
28 August 2024 - fcf0793 - Chore: update lockfile (#1325)
28 August 2024 - 27502fd - Docs: update asciinema (#1324)
28 August 2024 - 20dae09 - Fix: don't delay deleting input files during writing when moving (#1320)
28 August 2024 - be15b05 - CI: Renovate: don't group major upgrades together (#1321)
28 August 2024 - 02b0f61 - Refactor: ignore temp cache file move failures (#1319)
28 August 2024 - 6126d77 - Fix: log warnings with input-checksum-quick (#1318)
28 August 2024 - ecfca00 - Chore: update Node.js to v20.17.0 (#1317)
27 August 2024 - 29c0d85 - Chore: update dependency eslint-plugin-jsdoc to v50 (#1316)
27 August 2024 - 0e9fd97 - Chore: update dev dependencies (#1313)
27 August 2024 - 57aaa4a - Chore: update docs dependencies (#1311)
27 August 2024 - 70e98dc - Chore: update ESLint (#1312)
27 August 2024 - 08d35ed - Chore: update dependency ts-jest to v29.2.5 (#1310)
27 August 2024 - 6c93b60 - Chore: update dependencies (#1309)
26 August 2024 - 2811035 - Refactor: breaking: combine prefer revision older & newer options (#1308)
26 August 2024 - 6f80e28 - Refactor: breaking: remove prefer NTSC & PAL options (#1307)
26 August 2024 - 7aa70d6 - Refactor: use TimePoly in more places (#1306)
25 August 2024 - 487fe82 - Refactor: don't use promises to render progress bars (#1305)
25 August 2024 - b8a8623 - Feature: add .gcz and .wdf header detection (#1304)
25 August 2024 - e0c44e3 - Fix: mutex & test written cache files (#1303)
25 August 2024 - ac28363 - Feature: don't delay deleting input files during writing when moving (#1302)
24 August 2024 - 3ee18bd - Refactor: progress bar symbols update (#1294)
24 August 2024 - dcafd6c - Refactor: delete moved files in chunks (#1301)
24 August 2024 - a17c0a1 - Feature: log warnings with input-checksum-quick (#1300)
23 August 2024 - 127dd0b - Fix: stop the progress multi-bar on exit (#1299)
22 August 2024 - 16fcc6f - Fix: remove move-hardlink option (#1298)
22 August 2024 - 148d51e - Feature: test if the output directory supports hard linking (#1297)
21 August 2024 - 21074ff - Fix: can't raw-copy zips when patch files provided (#1296)
21 August 2024 - 45bafa8 - Refactor: handle empty-ish CRC32 correctly (#1295)
21 August 2024 - 4a3f81a - Fix: archive entries can't be executable (#1293)
21 August 2024 - 1a6e4b6 - Fix: don't get headered/headerless status from DAT headers (#1292)
21 August 2024 - f52b702 - Fix: remove the temp directory on every exit (#1291)
20 August 2024 - a1b6e47 - Fix: don't call walk callback with negative increment (#1290)
19 August 2024 - dc48b8b - Refactor: ArrayPoly efficiencies (#1288)
19 August 2024 - 8702b80 - Fix: only calculate CSO/ZSO CRC32 when necessary (#1289)
19 August 2024 - 6b9f60c - Fix: allow raw-copying zip files that don't need recreation (#1287)
19 August 2024 - 394fbc0 - Refactor: bypass modules that don't need running (#1285)
19 August 2024 - f838ad2 - Refactor: limit waiting message length (#1286)
19 August 2024 - 9dedbe4 - CI: auto-rebase PRs merging into feature branches (#1284)
19 August 2024 - 455afad - CI: auto-rebase PRs merging into feature branches (#1283)
15 August 2024 - 0eca0c1 - Feature: allow raw-copying zip files that don't need recreation (#1282)
15 August 2024 - 562736b - CI: auto-rebase PRs merging into feature branches (#1281)
15 August 2024 - 18507d4 - Fix: still use an in-memory cache even when loading/saving disabled (#1280)
15 August 2024 - 3188811 - Fix: don't CRC32 checksum files by default (#1279)
13 August 2024 - 246369f - Feature: input-checksum-max option (#1277)
13 August 2024 - afd30f6 - Fix: downloading & extracting temp files (#1278)
12 August 2024 - fecdffd - Refactor: immutable setters (#1274)
12 August 2024 - f437dc8 - Refactor: better efficiency with maps of arrays (#1276)
8 August 2024 - dd7f268 - Docs: update (#1271)
8 August 2024 - 6fc2551 - Chore: merge main into v3.0.0 (#1269)
8 August 2024 - 7dab1bb - Refactor: stability changes for unit tests (#1273)
7 August 2024 - 667173d - Refactor: progress bar size & fixes (#1270)
6 August 2024 - e786f65 - CI: increase test coverage (#1272)
3 August 2024 - d31389c - Refactor: update progress bar symbols (#1268)
2 August 2024 - d43398a - Refactor: breaking: drop the game* prefixed tokens (#1267)
2 August 2024 - 7b13f5c - Refactor: don't semaphore on files that won't have headers processed (#1266)
2 August 2024 - 751e287 - Feature: input-checksum-quick option (#1265)
2 August 2024 - 89265ff - Feature: option to move files via hardlinks (#1264)
31 July 2024 - f58fa21 - Chore: update Node.js to v20.16.0 (#1263)
30 July 2024 - 302a601 - Feature: better Dreamcast parent/clone inference (#1262)
30 July 2024 - f86f5d4 - Feature: CSO/ZSO/DAX support (#1253)
30 July 2024 - e16494d - Feature: breaking: exclude disks option (#1260)
30 July 2024 - 89a3c5c - Refactor: replace term-size with terminal-size (#1261)
30 July 2024 - 61d006f - Chore: Bump fast-xml-parser from 4.4.0 to 4.4.1 (#1259)
29 July 2024 - e63c5e8 - Refactor: consolidate filesize semaphore logic in DriveSemaphore (#1258)
28 July 2024 - 65f2525 - Chore: update lockfile (#1257)
28 July 2024 - c5aadad - Chore: update lockfile (#1256)
28 July 2024 - 849198b - Chore: update lockfile (#1255)
27 July 2024 - 2e72ef9 - Chore: update dependency typescript to v5.5.4 (#1251)
27 July 2024 - b28d756 - Chore: update dependency eslint-plugin-unicorn to v55 (#1254)
27 July 2024 - b27b201 - Refactor: group 7z classes together (#1252)
27 July 2024 - 4bbbc65 - Docs: rebrand (#1035)
27 July 2024 - 5be6bfb - Chore: update dependency ts-jest to v29.2.3 (#1249)
27 July 2024 - c15fa6e - Chore: update dev dependencies (#1247)
27 July 2024 - 06598d4 - Chore: update docs dependencies (#1250)
27 July 2024 - d010ae9 - Chore: update ESLint (#1248)
27 July 2024 - 7222656 - Chore: update dependencies (#1246)
27 July 2024 - 592f575 - Docs: remove grave markers around "Igir" (#1245)
27 July 2024 - 946e0a4 - Refactor: breaking: remove deprecated options (#1036)
27 July 2024 - e6a79d1 - Feature: group gdi/bin/raw files together when inferring games (#1244)
27 July 2024 - 6535f5b - Feature: group bin/cue files together when inferring games (#1239)
26 July 2024 - e4e3c47 - Refactor: return a dummy CUE file when scanning CHDs (#1243)
26 July 2024 - 4a86701 - Feature: breaking: allow excess sets option (#1034)
26 July 2024 - a740ef1 - Feature: CHD support (#1006)
22 July 2024 - 6d65525 - Feature: scanning support for NKit ISOs (#1226)
22 July 2024 - a50a78c - Update datGameInferrer.test.ts (a50a78c)
22 July 2024 - dbcc70b - Empty commit (dbcc70b)

igir, and other open-source projects like it, are a labor of love. They wouldn't be nearly as meaningful without the community supporting them. Constructive feedback and general positivity will always be welcome. Be kind to others, and be kind to yourselves.
❤️ Christian