Skip to content

v6.6.0 - #126

Merged
ajslater merged 830 commits into
mainfrom
develop
Jul 5, 2026
Merged

v6.6.0#126
ajslater merged 830 commits into
mainfrom
develop

Conversation

@ajslater

@ajslater ajslater commented Jul 5, 2026

Copy link
Copy Markdown
Owner

Fixes

  • Files are now replaced atomically: a crash, kill, or full disk mid-write can
    no longer destroy the original image.
  • Archive members whose optimization fails are kept in the repacked archive;
    previously they were silently dropped.
  • Nested archives (e.g. a CBZ inside a ZIP) now optimize; previously they always
    errored.
  • Archives keep their comments and member order through repack; tar symlinks and
    hardlinks survive; 7z member times are preserved; pre-1980 member times no
    longer crash conversion; legacy non-UTF8 zip member names are repaired.
  • Archive conversions compress each member by content; converting a rar, tar, or
    7z no longer leaves every member stored uncompressed.
  • Files that fail to optimize are retried on the next timestamped run;
    previously directory timestamps covered them and they were skipped forever.
  • One corrupt file inside an archive (e.g. a decompression bomb) no longer
    aborts the entire run.
  • Boolean options set in config files or environment variables are no longer
    ignored.
  • Requested archive conversions (e.g. CBR to CBZ) now happen even when the
    contents are already optimized.
  • Lossless WebPs with large metadata inside archives are no longer misdetected
    as lossy.
  • Owner-password-restricted PDFs keep their encryption; optimized PDF images
    keep their color transform; more signed PDFs are detected and refused.
  • svgo no longer strips viewBox, and keeps title/desc metadata unless
    --strip-metadata is given.
  • Conversions discarded for being bigger (and dry runs) are reported as skips,
    not errors.
  • --preserve no longer fails as a non-root user when it cannot change
    ownership; it still restores permissions and modification time.
  • Temporary files and animated-WebP frame directories are cleaned up when a tool
    fails or a run is cancelled, instead of leaking to disk.
  • picopt doctor no longer reports missing tools and exits nonzero on healthy
    installs.
  • Symlink loops, unreadable directories, and FIFOs no longer hang or crash the
    walk.
  • Bad --memory-limit and --after values abort with clean error messages;
    timezone-aware --after values are honored; lowercase format lists are
    accepted for -x and -c.
  • -I/--no-default-ignores without -i no longer aborts at startup.
  • Existing timestamps are invalidated once after upgrading because the timestamp
    config check gained new keys; the first -t run re-examines already-optimized
    trees.

Features

  • Per-directory .picopt.yaml config files: pin any setting to a directory
    tree. Deeper directories win; environment variables and the command line still
    override. Editing one re-processes its tree on timestamped runs.
  • Write your invoked options to config files: -w to the user config, -W to a
    .picopt.yaml in each target directory, --write-config-file PATH to an
    explicit path.
  • Memory-aware scheduling: picopt now estimates the peak memory of large
    archives and limits how many run at once so big libraries (e.g. multi-GB comic
    archives) no longer exhaust RAM and get the process OOM-killed. Tune the
    budget with the new --memory-limit option (e.g. --memory-limit 8G), which
    reads as an approximate peak-memory target; the default is two-thirds of
    detected RAM.
  • Incremental archive re-optimization: when a timestamped archive changes,
    members older than its timestamp are skipped instead of re-optimized; -E
    disables the member check. Timestamp files found inside archives are consumed
    and removed on repack.

Performance

  • Archive member format detection runs in parallel workers instead of
    serializing the scheduler.
  • Solid 7z archives extract in one pass instead of decompressing from the start
    for every member.
  • The progress pre-scan is skipped in quiet mode, less image data is shipped
    between processes, and scheduling under a memory limit no longer rescans the
    whole queue on every completion.

ajslater added 30 commits April 29, 2025 00:05
* change --destroy-metadata to --strip-metadata. change running script name. bump version to 3.4.0

* move report totals from walk into Totals

* Squashed commit of the following:

commit f7c2bd6647380b65a0d74ba7fb533724c6c6c455
Author: AJ Slater <aj@slater.net>
Date:   Fri Jan 19 14:28:04 2024 -0800

    remove converge option

commit 3401da410565fdba7be7b6a8dee89dc43f061fbc
Author: AJ Slater <aj@slater.net>
Date:   Fri Jan 19 14:26:48 2024 -0800

    update docs for oxipng and more formats

commit d01d7128d9040b60d87086e4b35065c4c1714601
Author: AJ Slater <aj@slater.net>
Date:   Fri Jan 19 14:26:22 2024 -0800

    update deps

commit ceb7ece72b3861010f2c1e4a24e932d999274d7c
Author: AJ Slater <aj@slater.net>
Date:   Fri Jan 19 13:32:23 2024 -0800

    refactor config for lint and complexity

commit 7c8a9154a02c37e50c2ac0b417d8b18c17c85692
Author: AJ Slater <aj@slater.net>
Date:   Fri Jan 19 13:32:09 2024 -0800

    lint

commit c2248b95444aeb9b5f8913543f493dbc5f3f8afa
Author: AJ Slater <aj@slater.net>
Date:   Fri Jan 19 13:11:16 2024 -0800

    working many formats and oxipng

* lint

* python 3.10

* Squashed commit of the following:

commit ed0dc98a1d32beb8db47d4dc9570b6666f3f1541
Author: AJ Slater <aj@slater.net>
Date:   Fri Jan 19 16:52:01 2024 -0800

    support optmizing SVG with svgo

* add svgo install instructions. allow sh markdown highlighting

* use svgo if it's installed by npm

* fix timestamp test

* todos for variable name

* Fix convert from formats not activating.
Do not let npx auto-install
Quiet npx output.
Consolidate pil2png and pil2native
Use positive if in webp_animated
Even more aggressive webp presets.

* lint

* install svgo and oxipng for linux

* bump version to 4.0.0

* remove cruft

* add converge option for cwebp. replace gif2webp with pillow and cwebp. no converge/exhaustive tests yet.

* update deps

* test exaustive

* Big stages and config refactor. Allows mutliple programs in priority lists for stages. Simplifies on pil2native. removes external containerized webp_animated optimimzation for pil method (worse). Removes gif2webp for generic webp animated convertion.

* Squashed commit of the following:

commit 484c93d223dd2e7ffbb2b850876aba3ee05f8fc2
Merge: cb56ee3 0a2104e
Author: AJ Slater <aj@slater.net>
Date:   Wed Jan 24 21:21:34 2024 -0800

    Merge branch 'main' into develop

commit 0a2104ea299939c40f66d789b71963b4f6a6e4b3
Author: AJ Slater <aj@slater.net>
Date:   Wed Jan 24 21:21:23 2024 -0800

    picopt 3.3.8 (#72)

    * fix settings tests add coverage

    * fix settings coverage

    * expand stats coverage

    * timetstamp tests and individual file timestamp checking

    * better coverage for walk module

    * bump NEWS

    * types

    * remove relative imports

    * default recursion

    * default recursion

    * bump news

    * fix compacting timestamps

    * adjust verbosity and remove debug cruft

    * fix tests for defualt recursion and clean up skip code

    * move parse_date to Timestamp

    * comment for picopt specific code

    * move _should_record_timestamp to walk because it depends on settings.

    * abstract out base settings method

    * fix tests for new settings

    * fully seperate timestamp_base, make abc methods lint friendly. rename _FN constants to _NAME

    * move rc bases into a module for possible use elsewhere

    * bump news

    * update dat REAMDE

    * remove manual disable cli args

    * Squashed commit of the following:

    commit ae129a38bb246d885212b81a924609d88727be6c
    Author: AJ Slater <aj@slater.net>
    Date:   Sat Feb 12 17:41:04 2022 -0800

        remove formats.programs file, move formats back into classes

    commit 5e9c728ad63d0411a9a7bb6945e8fdcc38dcaa0b
    Author: AJ Slater <aj@slater.net>
    Date:   Sat Feb 12 17:40:01 2022 -0800

        lint

    commit 31672265f574542d7db1b218b266f651631bb542
    Author: AJ Slater <aj@slater.net>
    Date:   Sat Feb 12 17:39:41 2022 -0800

        fix syntax for calling linters

    commit e7798f6e4a9a865972aa8dd0db8cc3a46dd90668
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 19:46:22 2022 -0800

        reorg formats dir part 1"

    commit e2403c98ea9507fae53b1ff7546e750616f9a26a
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 17:41:55 2022 -0800

        remove lie from argparse docs

    commit 9f70ad224598b60bc2a9fcac36ce431a0271a618
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 17:40:36 2022 -0800

        remove nag behavior. make recursive default false again

    commit 3df145d135f9911b54a5dd6780c44b55d1706e8f
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 16:21:22 2022 -0800

        test webp and webp_is_lossless

    commit 8845d808224e9a0df3a748c7973d2b9c07840247
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 16:21:07 2022 -0800

        use is_lossless to choose cwebp params. fix webp LOSSLESS_FORMATS and CONVERTABLE_FORMATS

    commit a286e548613cae76f1d3e0e377cc1b47d045719f
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 16:18:00 2022 -0800

        sort items in documentation

    commit 061f745e79e4247636ebbaf337a8d9bcb255a05e
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 16:17:27 2022 -0800

        typing hints

    commit 5b84a249ad1cd9c1ef69e9a8abc20106d05f83e1
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 16:17:08 2022 -0800

        lint

    commit c88371ea09ef8407ee106cb3011db0132764ba79
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 16:16:34 2022 -0800

        move pillow enhancements to own module

    commit 0a8ddb7392f7b12b6e3d7a366b36275e399e9b86
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 13:41:57 2022 -0800

        remove cruft

    commit 90ac317d566602efa3325fe967d226192e5d121e
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 13:41:06 2022 -0800

        mark function private

    commit 66b9d7e72817dbb917c56a2e35ef126ec72b4421
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 13:07:17 2022 -0800

        consolidate webp test functions, add png2webp

    commit 9882fbb5d89d4f0cb75eaa24ecca1bdb628d9e14
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 01:12:51 2022 -0800

        remove cruft

    commit 4d705feae0fc21e20f0ea6e65890da8a3f04a6bd
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 01:05:27 2022 -0800

        remove object inheritance

    commit 884a0d311ef0c3531270c6ae9532b015d3d357e7
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 00:31:22 2022 -0800

        lint

    commit f90445dd2a2d22b5871ff58733475041e5614cec
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 00:22:55 2022 -0800

        lint NEWS

    commit 9312bf504948bd5e7b3d501487dcd5b97f10feb0
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 00:17:25 2022 -0800

        ignore TODO

    commit d4f4342a26fdfb0e44a9970a76d36f082a00a66d
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 00:16:30 2022 -0800

        remove dev scripts

    commit a44cf027a985fc0d46fb2311d24ea2fd12ee8dec
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 11 00:16:03 2022 -0800

        remove eslintcache from git

    commit 8e8b7c8ebd260df4189b8d51dbd6ea6ea9f24dce
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Feb 10 16:53:44 2022 -0800

        working webp tests. not all cases probably. lots of new linting

    commit c92c42406f52b83572f7868ee6545d8b2a76d8fc
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Oct 5 14:58:14 2021 -0700

        fix conversion to webp

    commit a143f6e77f86566761aa99b7d6c345b8421c3b1a
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Oct 5 14:40:12 2021 -0700

        fix -w option help

    commit 276a56e1059593fb2ef61e4b9c09bdd86c6e5b7c
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Oct 5 14:33:10 2021 -0700

        poetry update and lint

    commit 5748643bae0d9738eaf59a6b36fae96766d7b199
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Sep 21 20:52:14 2021 -0700

        animated webp sort of working.

    commit 39687e3c5d22b64d39c1817d05a26b5ae0e21961
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Sep 21 20:46:31 2021 -0700

        fix mypy config

    commit 8efa91f867310ebbae774459c115245c83784774
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Sep 21 15:22:21 2021 -0700

        webp support. no animated webp support yet.

    commit f17a0ceac6e6883a7399d41cff713641e1834dcc
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Sep 21 15:13:47 2021 -0700

        update deps

    commit 18f1b312f42224501324e388ef5563e29f8f9428
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Sep 21 15:08:38 2021 -0700

        add ini lint for setup.cfg

    commit ef7d878419c6740b4d50ed63f7a6c9d2bf0d2ddb
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Sep 21 15:07:56 2021 -0700

        modern ubuntu. hadolint

    commit 37e23a11a9dd25c98628019a04dfc4984cdefe59
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Sep 21 14:58:41 2021 -0700

        lint script updates

    commit bc95342eba6258886fa03543ca9439e977d01366
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Sep 21 14:58:14 2021 -0700

        sortignore script

    * Squashed commit of the following:

    commit fd1474e30f5a57b0cacbf61649c3fdef2ac7808a
    Author: AJ Slater <aj@slater.net>
    Date:   Mon Feb 28 22:15:33 2022 -0800

        add command line args file

    commit e329c309ca5f514c9a65151aec4c8794fc1f49be
    Author: AJ Slater <aj@slater.net>
    Date:   Mon Feb 28 22:01:06 2022 -0800

        rename -N to -T

    commit cc2d9dbf6bd504cb09aec34205a39c9e09a302fa
    Author: AJ Slater <aj@slater.net>
    Date:   Mon Feb 28 21:33:18 2022 -0800

        optimize_after to after

    commit 9533993f8b1bb410525065e98379bf31d9dad33a
    Author: AJ Slater <aj@slater.net>
    Date:   Sat Feb 26 22:37:44 2022 -0800

        enable handlers with pil2 programs

    commit c8afd8a0a3c87210580fa5e13138b461541a61e3
    Author: AJ Slater <aj@slater.net>
    Date:   Sat Feb 26 22:35:12 2022 -0800

        use PIL to optimize if no programs available

    commit bf6b3428737ab3a7d3f075ac76fd1aa8e4d8c194
    Author: AJ Slater <aj@slater.net>
    Date:   Sat Feb 26 16:32:51 2022 -0800

        working containers, webp and conversions with integration tests

    commit f64d0058cde23a1482c810140e78156616a7c811
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 25 21:59:39 2022 -0800

        fix bit depth offset

    commit ac8dc54de35308b6243ac68c455227afa49e792a
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 25 14:15:42 2022 -0800

        fix png bit depth offset

    commit 7eb3e4e168739e1806f95f4bb26d34e4273ade2f
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Feb 25 14:08:24 2022 -0800

        re-optimize preo-optimzed jpg

    commit cc5474faf4190f9096073d7a2c79bde7f207995d
    Author: AJ Slater <aj@slater.net>
    Date:   Sun Feb 20 20:00:31 2022 -0800

        move more things into unpack common lib

    commit 6d789aa5dc79a429e0666792b3e830fca98d4c00
    Author: AJ Slater <aj@slater.net>
    Date:   Sun Feb 20 02:21:48 2022 -0800

        new test files

    commit afca8965c15894bb8f68f195db93cbd9c5420589
    Author: AJ Slater <aj@slater.net>
    Date:   Mon Feb 14 18:02:31 2022 -0800

        extra commit

    commit a10f9c35f89bd31bbde5d656818d528a4e9b9e5a
    Author: AJ Slater <aj@slater.net>
    Date:   Mon Feb 14 18:02:20 2022 -0800

        container structure fine

    * move import to top

    * webanimated, reform container error handling and available method

    * update news

    * extract is_lossless into a function

    * remove cruft

    * consolidate error handling for handlers

    * refactor stats

    * reuse FORMAT_STR

    * simpler container dir name

    * Squashed commit of the following:

    commit e37d88a7834a65b729024110d0dea29eb88c2fd3
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Mar 3 12:30:02 2022 -0800

        rename can_handle to identify_format

    commit 825fb0e865667e602b58ef5e868a534b460828f1
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Mar 3 12:22:16 2022 -0800

        simpler to use two handlers for gif

    commit e73d19c3863f6e23e041903aec190f4c524d04ca
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Mar 3 12:09:58 2022 -0800

        rename FORMAT & FORMAT_OBJ

    commit f02ebd7db5f4ea3f1f062fa5ebb2bdb675321347
    Author: AJ Slater <aj@slater.net>
    Date:   Wed Mar 2 22:28:07 2022 -0800

        treat internal programs differently

    commit 28a3b680430a507d54c370103f7e47a5cb2028f7
    Author: AJ Slater <aj@slater.net>
    Date:   Wed Mar 2 22:18:00 2022 -0800

        remove IMPLIES_RECURSE

    commit 0d088430b4669a389def42e2ba193e51421bbfee
    Author: AJ Slater <aj@slater.net>
    Date:   Wed Mar 2 22:08:46 2022 -0800

        reorder class methods

    commit d1e615c1a94f4b1baad73514f47e1cbd2f20b2e5
    Author: AJ Slater <aj@slater.net>
    Date:   Wed Mar 2 22:06:24 2022 -0800

        remove cruft

    commit ac86a44d7a8240b5ca64fa6f920fb16d030652dc
    Author: AJ Slater <aj@slater.net>
    Date:   Wed Mar 2 22:05:01 2022 -0800

        remove cruft

    commit ee726238d4d5f364f4d357aa42ac7626d264ad26
    Author: AJ Slater <aj@slater.net>
    Date:   Wed Mar 2 22:04:14 2022 -0800

        dynamic native formats

    commit af4bf19721b8356dcd729a9b80634dbffe4c36c6
    Author: AJ Slater <aj@slater.net>
    Date:   Wed Mar 2 21:21:48 2022 -0800

        rename self.format to self.input_format

    commit c7c0f44603b1b85b52aea8dc554ee823f056c8da
    Author: AJ Slater <aj@slater.net>
    Date:   Wed Mar 2 21:01:58 2022 -0800

        more dynamic suffix generation

    * name factory factory

    * remove cruft

    * verify independantly of metadata read. store exif data

    * exif support for handlers

    * exif support for png, also use o5 for optimizing

    * metadata preserve for webp. consolidate pil2webp function

    * bump NEWS

    * icc preservation

    * pillow optimization for jpeg

    * epub support

    * Squashed commit of the following:

    commit 547ec01fe5c1b0fc90f84964bdc0fe4a92bd166b
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Mar 4 14:44:50 2022 -0800

        bump news

    commit 0a1b689f3bab481c85bb48357190efe4bbd4dd32
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Mar 4 14:44:31 2022 -0800

        tif support

    commit ecb294fa37fa3c2de6e03de72d2dbb410e574447
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Mar 4 12:07:16 2022 -0800

        fix container dir suffix dot

    commit 361e1310b98f5db8441eb478158d38022922638e
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Mar 4 12:06:51 2022 -0800

        remove debug print statement

    * pil2jpeg is not lossless

    * add to comment

    * combine pil2 methods into a superclass method

    * tweak comment

    * reform some variable names

    * more consistent method naming for containers

    * Squashed commit of the following:

    commit 5e0fb4776af2bbe59890a270bb13c27efb2fdd64
    Author: AJ Slater <aj@slater.net>
    Date:   Mon Mar 7 16:32:48 2022 -0800

        compact timestamps get routine

    commit ed15c4506b994adc895a2718a5c62c9cb666b725
    Author: AJ Slater <aj@slater.net>
    Date:   Mon Mar 7 16:20:28 2022 -0800

        refactor timestamps

    commit c6664e09a12b943b65587b4282c51f7ce4da3d6d
    Author: AJ Slater <aj@slater.net>
    Date:   Sat Mar 5 14:57:08 2022 -0800

        move comments

    * Squashed commit of the following:

    commit 3dd8e76ed71a13f0790b51cec8b9234f75694a2a
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Mar 10 12:41:56 2022 -0800

        one queue per timestamps file. move walk-all_files into run

    commit 8ba764d5bd95a10ec9510675c3d1c3d32284a310
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Mar 10 12:21:34 2022 -0800

        move exception handling into walk_file. dump timestamp file after completing every directory

    commit f8462df14cb51993e0f171514bc75356b983721a
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Mar 10 12:03:32 2022 -0800

        handle item method

    commit c9520ee1fcd79515191ada48b4e7ad85b2f6c991
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Mar 10 11:33:26 2022 -0800

        restore passing timestamps down

    commit 4ef23e005451e5582bd98c042cd1390dbca3f050
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Mar 10 10:06:22 2022 -0800

        remove passing top_path around. change return types to asyncresult, dirresult, none

    commit cc3f87463ecba21618ae1b5772f98db2a8933fa7
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Mar 10 09:03:05 2022 -0800

        remove walk_after and move call unpack directly in handler

    commit 1fb0caa7f76b7aac3f31d1449302d79ba9773bd7
    Author: AJ Slater <aj@slater.net>
    Date:   Wed Mar 9 15:32:16 2022 -0800

        queue system works for unblocking containers. timestamp refactor for non-dir submissions. needs some refactoring

    * bump news

    * change destroy_metadata config variable to keep_metadata

    * Squashed commit of the following:

    commit b772d0770c2772129106f6de66928c300d816cd6
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Mar 10 21:45:47 2022 -0800

        convert-to is now a list. no more global implied recurse, but containers recurse

    * Squashed commit of the following:

    commit ee7db97aef3a1003c848ef0e883ea60bf86355be
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Mar 11 16:52:34 2022 -0800

        config in timestamps

    * Squashed commit of the following:

    commit d8577ed56ad31d3d803e30379c3ca6877f56aa25
    Author: AJ Slater <aj@slater.net>
    Date:   Fri Mar 11 22:09:47 2022 -0800

        ignore globs

    * Squashed commit of the following:

    commit 15694ae4a52b695c321fac7e7ad732446589c407
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Mar 22 22:34:39 2022 -0700

        remove dependency on timestamps. make timestamps off the default again

    commit 95f7ab272e589fd0351ae2e3d620640f7909b614
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Mar 22 20:34:07 2022 -0700

        all tests work

    commit cb0be7d9ffc39a57cd07ff3498fa6ddb48f7eeb3
    Author: AJ Slater <aj@slater.net>
    Date:   Mon Mar 21 18:59:41 2022 -0700

        fix non-relative imports into timestamps. fix old timestamps import

    commit ec1eb4562dc0279e979614a627ba7fe9a65ef8c6
    Author: AJ Slater <aj@slater.net>
    Date:   Mon Mar 21 16:55:30 2022 -0700

        pytest_config rename test

    commit 1fbe451e821857c51a9b81f14f44eba5a3fd4460
    Author: AJ Slater <aj@slater.net>
    Date:   Mon Mar 21 16:54:41 2022 -0700

        dump a fake journal test reading

    commit 12c0e0b49cae8c810445db4a8505b3743cd1a0e8
    Author: AJ Slater <aj@slater.net>
    Date:   Mon Mar 21 16:29:25 2022 -0700

        clean up journal on dump properly

    commit e87844fa03c5f00f427ba8cbdd7c902e1fbac38c
    Author: AJ Slater <aj@slater.net>
    Date:   Mon Mar 21 15:20:28 2022 -0700

        more timestamps tests

    commit 28e00ae88af93630c8c85c5edb437de06df9669d
    Author: AJ Slater <aj@slater.net>
    Date:   Mon Mar 21 13:36:17 2022 -0700

        passes simple timestamp tests

    commit 9f18ebbe06d9c8f66826ffeeb4a2f9edff5d21a0
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Mar 17 14:02:31 2022 -0700

        correctly typed wal stuff

    * fix after param

    * remove cruft

    * fix directory task order, seperaate queue tasks into a file

    * reorg walk initialization

    * output showing conversions

    * use python 3.9 typing

    * fix quiet setting

    * better after parsing

    * list only to caps

    * trap unlink exception

    * handle directory results from bottom up. remove mypy

    * poetry update

    * poetry update

    * don't store timestamps for things inside containers

    * rename tasks

    * Squashed commit of the following:

    commit 74a4a17e6c870924fc97ce65e2dbab48881c7152
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Mar 24 14:33:08 2022 -0700

        don't deflate images in archives. remove resort. move output to containerhandler.

    commit 9a1f166eb1cb78a9ba17538a5a5b426494453066
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Mar 24 14:13:15 2022 -0700

        lint

    commit babe920eefe2bc896090d62f079e83816049e898
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Mar 24 14:13:12 2022 -0700

        rename tasks

    commit 36239c8399995a0ea4e9e2919a4bb7bdfc3c8688
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Mar 24 14:08:29 2022 -0700

        inline unpack and repack

    * remove old unit tests.

    * lint

    * fix up NEWS

    * clean up old working directories as well as files

    * make working filename even more unique

    * fix TIFF not a default format getting turned on by convert_to

    * package updates

    * make queues private and close pools before writing timestamps

    * use eslint_d in scripts, update pakcaegs

    * version bump to 3.0, update packages

    * bump docker python image in cirlcleci

    * fix permissions on builder. use python3.10

    * don't use sudo. fix speling

    * copy necessary files for install

    * add pyright

    * test before lint

    * add webp dependency

    * update scripts packages and README

    * tests pass on linux

    * combine linux & darwin common tests

    * move dirpath back into Timestamps"

    * fix commands"
    in compose

    * change license

    * use subprocess run

    * cleaner cli calling

    * lint

    * change symlink option name

    * use shutil.which() and check for executable bits, don't run programs

    * colored output

    * factory method for timestamps

    * fix mozjpeg

    * fix config keys for timestamps keys

    * use timestamps factory. do timestamps ignore simpler

    * namespace picopt config

    * Squashed commit of the following:

    commit 62cc6d4ce3016f545d74200da0a85aa397764200
    Author: AJ Slater <aj@slater.net>
    Date:   Mon May 2 21:15:15 2022 -0700

        cleaner format classes doesn't make duplicate trees

    commit 1306e1321ac1d7de15359cd2d3987ea1271bd8a9
    Author: AJ Slater <aj@slater.net>
    Date:   Mon May 2 20:33:45 2022 -0700

        bump news

    commit 73960e382b98e940084914d7683937604bb4f62a
    Author: AJ Slater <aj@slater.net>
    Date:   Mon May 2 20:32:34 2022 -0700

        hacky but working epub fix

    * extra close for animated images

    * cleanup setting formats. add TIFF format don't subtract it

    * linux mozjpeg size

    * newer mozjpeg

    * document newer mozjpeg. update readme.

    * use frozenset

    * Squashed commit of the following:

    commit dedcb80180b978b11c3c3e80b910ca094faead6c
    Author: AJ Slater <aj@slater.net>
    Date:   Wed May 4 14:27:12 2022 -0700

        pypi treestamps

    commit 1f98040faa23e4ce9ddb89bd5b7871675dababdc
    Author: AJ Slater <aj@slater.net>
    Date:   Wed May 4 14:17:24 2022 -0700

        fix mounts for circleci

    commit 783248363c0e320febe96cf061f48736bc75d470
    Author: AJ Slater <aj@slater.net>
    Date:   Wed May 4 14:17:15 2022 -0700

        use current images for circleci

    commit 2486bf4a0bb11928d0bc64da85e3a6d21aa2743c
    Author: AJ Slater <aj@slater.net>
    Date:   Wed May 4 13:17:54 2022 -0700

        treestamps conversion

    * bump news

    * v3.0.1

    * update treestamps

    * trap repack exceptions

    * v3.0.2

    * v3.0.3

    * v3.0.4

    * better usage examples

    * sorted dirs

    * bump news and version

    * test for existence of timestamp in timestamp tests

    * don't record timestamps for items in containers

    * repack message uses final path not working path

    * don't look for old timestamps in ignore globs

    * alphebetize config

    * v3.0.5

    * fix not skipping files. add skip logging

    * maybe fix webp_animated detection

    * update packages

    * v3.1.2

    * Squashed commit of the following:

    commit 28e5f4a7d1215ae641c26f2b2b0b8d999d32df0c
    Author: AJ Slater <aj@slater.net>
    Date:   Wed May 18 13:00:19 2022 -0700

        fix deleting working file. add progress dots.

    * lint typing

    * bump version update packages

    * remove print statement

    * Fixed showing total at end. supress program output. change colors by operation

    * better error reporting

    * update packages and fix verbosity count

    * Squashed commit of the following:

    commit 212f653dd6b399e4db878a5a2ed6053452fde6df
    Author: AJ Slater <aj@slater.net>
    Date:   Wed May 25 14:05:59 2022 -0700

        3.2 apng

    * remove print statements

    * remove debug statements

    * lint

    * v3.2.2 & package updates

    * color help. change bigger color to blue

    * package updates

    * install webp in Dockerfile

    * move isort config to pyproject.toml

    * update confuse. add eradicate

    * ignore pypirc

    * update packages

    * update packages modernize linting

    * clearer headers code for pillow extension

    * refactor pillow extensions

    * switch to shellharden

    * fix identation in readme

    * Squashed commit of the following:

    commit 92daaf1e7ac0c8b0b537637929118cce8d47a82e
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Nov 1 18:04:39 2022 -0700

        change linux test values

    commit f96bde1a2640a9c89117ea2dd37be12dd88bf946
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Nov 1 17:04:26 2022 -0700

        fix webp lossless detection

    commit a08ba3af4ffa87a374ab527d38125b18e94bfe9a
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Nov 1 16:20:33 2022 -0700

        lint

    commit b31e8cd81ad9f2c3b591de02b402e0b32e99696d
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Nov 1 16:20:26 2022 -0700

        lint

    commit a48d1a24b5927e03777d27c6dc4592d7f517e32f
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Nov 1 15:02:25 2022 -0700

        fix image header compare

    commit 781d1e4ab93965e7cff138b749b533f12d7ca859
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Nov 1 14:53:29 2022 -0700

        fix error reporting

    * remove debug print

    * change order of test and lint in ci. use python 3.11

    * update packages

    * fix toml replication

    * detect case insensitive filessystems and be careful about replacing files on them

    * bump version and news

    * speling

    * use ruff for linting

    * update deps

    * remove setup.cfg update deps

    * update deps

    * lint

    * add typing info

    * switch to makefile

    * fix cleanup of temp dir when container fails

    * fix version script for no frontend

    * bump version

    * fix stack trace on config error

    * update deps

    * update deps

    * Squashed commit of the following:

    commit 253cfbca14a5922d87cb21a3f85bec44294f22ee
    Author: AJ Slater <aj@slater.net>
    Date:   Tue May 9 18:54:56 2023 -0700

        fix build

    commit 6c4f44c6478624a53ba4b3385f4e9a89c402d483
    Author: AJ Slater <aj@slater.net>
    Date:   Tue May 9 18:35:31 2023 -0700

        update deps

    commit d18c0e69291fcc42d94feb4846399b2198d5fe6b
    Author: AJ Slater <aj@slater.net>
    Date:   Tue May 9 18:35:27 2023 -0700

        new treestamps new option to not check config on treestamps

    commit 8c357ebd27ade334edc633ea839572bffaa4f8dd
    Author: AJ Slater <aj@slater.net>
    Date:   Mon May 8 16:29:23 2023 -0700

        use some dataclasses for walk and report

    commit f9136d4176a2a57f967a2497c415a537afbc52a1
    Author: AJ Slater <aj@slater.net>
    Date:   Mon May 8 15:39:55 2023 -0700

        remove stray print

    commit cb2561314b5a9e1717757679326e31adb58d9cdb
    Author: AJ Slater <aj@slater.net>
    Date:   Mon May 8 15:39:08 2023 -0700

        move computed config items into a computed namespace instead of prefixing with underscore

    commit 106e06542a7b9238adb9a00c9a8f5453978617de
    Author: AJ Slater <aj@slater.net>
    Date:   Mon May 8 14:36:35 2023 -0700

        ignore some linting for tests

    commit be5c645f304605c9dd441c57a4394360b0bf5524
    Author: AJ Slater <aj@slater.net>
    Date:   Mon May 8 14:34:02 2023 -0700

        lint timezeones with now

    commit 2f6f7bd1d8c5004f6e2b84f39bd23739b4ffe2c0
    Author: AJ Slater <aj@slater.net>
    Date:   Mon May 8 14:25:12 2023 -0700

        cprint in walk.py. optimize report on bytes saved.

    commit 5708e43ef07edd5843c583c733227c633f942121
    Author: AJ Slater <aj@slater.net>
    Date:   Mon May 8 14:15:22 2023 -0700

        use cprint for normal output so lint flags debug prints

    commit 0e1efbb233e65e0ba7d312ec2e86241c10bb7e97
    Author: AJ Slater <aj@slater.net>
    Date:   Mon May 8 14:03:01 2023 -0700

        comment

    commit cbc94d6a38eedcfdbe573dd37c4efb4976d61d74
    Author: AJ Slater <aj@slater.net>
    Date:   Mon May 8 14:02:38 2023 -0700

        refactor where skips happen, move dir skip into walk dir, file skips happend after handle dir

    commit e545efc72fb3d376cbff7539e7e63164d6a2a252
    Author: AJ Slater <aj@slater.net>
    Date:   Mon May 8 13:51:29 2023 -0700

        fix variable name

    commit 147dd25439c7bd5a0fc8177b93e2b38b7e5289d8
    Author: AJ Slater <aj@slater.net>
    Date:   Mon May 8 13:51:12 2023 -0700

        use consts for repeat values in test

    commit 0bdc63629254beb6927627444ebde96fbad7bb9a
    Author: AJ Slater <aj@slater.net>
    Date:   Sun May 7 20:06:55 2023 -0700

        fix webp input_file_format name

    commit 480b082e357b9c75f9cd2f14cebcad2214e55c52
    Author: AJ Slater <aj@slater.net>
    Date:   Sun May 7 20:06:15 2023 -0700

        trap unidentified image error. fix warning message

    commit dae37e40784e307ae4a6c7a5b0609ce5b81ecf13
    Author: AJ Slater <aj@slater.net>
    Date:   Sun May 7 20:03:48 2023 -0700

        fix variable name

    commit 49f7546d689134d51156c267758185792a433173
    Author: AJ Slater <aj@slater.net>
    Date:   Sun May 7 20:03:08 2023 -0700

        fix lingering format name for variables

    commit 99e2b34c66954e7c689997dadcec4701effc62f3
    Author: AJ Slater <aj@slater.net>
    Date:   Sun May 7 20:02:29 2023 -0700

        allow make to do one test

    commit cfc58f1a0eda5361e74ad5099792165c1eb2ea98
    Author: AJ Slater <aj@slater.net>
    Date:   Sat May 6 20:22:22 2023 -0700

        add missing init files

    commit 3e82ba617536f874b5bcbee2004f93ad4142ffcc
    Author: AJ Slater <aj@slater.net>
    Date:   Sat May 6 18:31:38 2023 -0700

        first pass of lint

    * fix build with bin path

    * fix build

    * fix pngout install script package location

    * fix pngout install script again

    * update dockerfile bases

    * remove python 3.11ism

    * use lunar for ubuntu

    * update treestamps

    * fix test for reading wal

    * normalize wal writing to use ts_config as well

    * update treestamps

    * v3.3.3 uses new treestamps

    * bump version

    * Squashed commit of the following:

    commit d3ba8df31fa61604450500e1f4ae0948dd1c779f
    Author: AJ Slater <aj@slater.net>
    Date:   Thu May 11 15:48:08 2023 -0700

        3.3.4 keep original path extension

    * fix directory skipping

    * update deps

    * deflate64 and rarfile. cffi

    * Squashed commit of the following:

    commit 7af058987c6a36e1b523944af61d872c0b8a3b88
    Author: AJ Slater <aj@slater.net>
    Date:   Sun May 14 15:34:06 2023 -0700

        don't rar if no unrar

    * remove unrar.cffi support

    * update deps and lint

    * improve cwebp params

    * lint

    * update deps

    * Squashed commit of the following:

    commit 70ec98237334b5ead1ac2bcb1df8d44acb27837a
    Author: AJ Slater <aj@slater.net>
    Date:   Mon Jan 15 20:59:45 2024 -0800

        webp: -m 6, -q 100 for both lossy and lossless

    commit b31880a5c25d4792d4da45670e07b7d3d98f4842
    Author: AJ Slater <aj@slater.net>
    Date:   Mon Jan 15 19:57:58 2024 -0800

        update deps and lint

    commit bcb77803b8875636093937f015fae8b4a7755370
    Author: AJ Slater <aj@slater.net>
    Date:   Wed Aug 16 18:33:28 2023 -0700

        update deps and lint

    commit d0062cbee30504aeb83c8e4cfedf7fc053e7cb8c
    Author: AJ Slater <aj@slater.net>
    Date:   Mon Jul 10 13:40:10 2023 -0700

        use prettier plugins

    commit b3aa384a5618a2b27d6e912efcb2c2cacceacc01
    Author: AJ Slater <aj@slater.net>
    Date:   Mon Jul 10 11:33:23 2023 -0700

        update deps and add more eslint plugins. add first step of converge option

    * alphabetize macOS deps

    * fix non zero exit code on success

    * remove webp lossy optimizing. it wasn't

    * mac tests pass. remove unfinished converge stuff. add near_lossless to webp

    * update to mozjpeg 4.1.1 for testing

    * use mantic manticore for testing

    * fix linux test sizes

    * fix more linux tests

    * fix png to webp linux size

    * fix webp size for linux

    * penultimate linux webp size fix

    * possibly final linux test fix

    * version is actually 3.3.7

    * remove cruft

    * remove converge vestiges from config

    * lint

commit cb56ee32665a1555d7075c70c15da95633802cc9
Author: AJ Slater <aj@slater.net>
Date:   Wed Jan 24 21:19:18 2024 -0800

    lint

commit e5751bebd2ddbfdfd7228595392d2ec219555870
Author: AJ Slater <aj@slater.net>
Date:   Wed Jan 24 21:18:50 2024 -0800

    remove converge vestiges from config

commit 23befb50dc6ec294368ecf901617cf1e9253b42b
Author: AJ Slater <aj@slater.net>
Date:   Wed Jan 24 21:18:42 2024 -0800

    remove cruft

commit 42eb827001a81e6c52b5272ed670bd44e8bade5b
Author: AJ Slater <aj@slater.net>
Date:   Wed Jan 24 21:18:28 2024 -0800

    version is actually 3.3.7

commit 13607e0e49ecbf5eaffae698403edc8bc5837587
Author: AJ Slater <aj@slater.net>
Date:   Wed Jan 24 21:10:31 2024 -0800

    possibly final linux test fix

commit f7c357be73a4fdf3fb0f65de179666903e7aa6cc
Author: AJ Slater <aj@slater.net>
Date:   Wed Jan 24 20:49:40 2024 -0800

    penultimate linux webp size fix

commit ea06037de39ab4cb8443b173d6688acd91a75ab6
Author: AJ Slater <aj@slater.net>
Date:   Wed Jan 24 20:13:20 2024 -0800

    fix webp size for linux

commit 9c9dc0281f655ccad3726ac81cc027d801321f3a
Author: AJ Slater <aj@slater.net>
Date:   Wed Jan 24 19:47:26 2024 -0800

    fix png to webp linux size

commit b208220a9d057e62b33c4a1389e5c96e5d35a680
Author: AJ Slater <aj@slater.net>
Date:   Wed Jan 24 19:42:35 2024 -0800

    fix more linux tests

commit 651d205f7e56cff8fe424a4619dfb20f58ae2823
Author: AJ Slater <aj@slater.net>
Date:   Wed Jan 24 19:35:14 2024 -0800

    fix linux test sizes

commit d2c4490a877e90b91360ea6971e27dd900eb2bfe
Author: AJ Slater <aj@slater.net>
Date:   Wed Jan 24 19:26:49 2024 -0800

    use mantic manticore for testing

commit 57c217b722b18e8fa67447adeecfd2a1cf21ca11
Author: AJ Slater <aj@slater.net>
Date:   Wed Jan 24 19:26:39 2024 -0800

    update to mozjpeg 4.1.1 for testing

commit 83bd34d3f6883cd5a42114ee5ac289fe41ba0bb9
Author: AJ Slater <aj@slater.net>
Date:   Wed Jan 24 19:21:37 2024 -0800

    mac tests pass. remove unfinished converge stuff. add near_lossless to webp

* make webp_animated a container again, but use PIL for demux and remux, remove BEST_ONLY cruft

* add animated png handler and generic animated image handler

* bump news

* update deps

* pngout docs

* fix phrasing in readme

* add warning to readme

* remove pngout from default homebrew instructions

* move near_lossless into WebPLossess handler

* more info in README about pngout

* reorder strings

* activate apng conversion for animated gif

* no traceback for ConfigError

* move pil2png up to image handler

* rename PIL2_ARGS to PIL2_KWARGS

* Rename all caps handlers to Capitalized for regularity

* update deps

* Squashed commit of the following:

commit 2de7b0947f8cfcb95d34f5687acd9dbef016dbcf
Author: AJ Slater <aj@slater.net>
Date:   Fri Jan 26 00:10:14 2024 -0800

    remove optional multihread_flags

commit 0f0b04ac0f834de26d2dd52ed2942c47c58b5da3
Author: AJ Slater <aj@slater.net>
Date:   Thu Jan 25 23:45:34 2024 -0800

    optional multithreding for large and small loads

* replace converible FORMAT_STR constants with ones from PIL

* speling CONVERTABLE to CONVERTIBLE

* remove cruft

* remove configurable superclass

* move ReportInfo into stats. move PathInfo and is_path_ignored into path.py

* fix import

* label sections and private consts in config module

* move handlers/configurible to formats

* make webp_animated depend on png a bit

* refactor formats module

* reorder functions

* refactor builing a set

* label code sections

* remove cruft

* use subviews in config for brevity

* more expressive verbose timestamp config logging

* big fixes for README and proper listing of formats

* optional near_lossless for webp

* update deps

* simplify import

* MPO support

* --preserve option

* lint

* don't run pil2png if already png

* update deps

* fix tests

* fix tests for png

* Squashed commit of the following:

commit d829ef62264b63d882b63ca6263f0ba2247cbc6d
Author: AJ Slater <aj@slater.net>
Date:   Tue Jan 30 20:24:56 2024 -0800

    replace external oxipng, opting & pil png optimizer with pyoxipng

commit 61d4285d1a76c53f96ef8270afaecb7d319252b9
Merge: 7bb21c7 77ff587
Author: AJ Slater <aj@slater.net>
Date:   Tue Jan 30 18:18:41 2024 -0800

    Merge branch 'picopt4' into picopt4-oxipng

commit 7bb21c70ccffb41f4dabbbda70e09da3b56fc769
Author: AJ Slater <aj@slater.net>
Date:   Tue Jan 30 18:13:46 2024 -0800

    oxipng

* Squashed commit of the following:

commit 56c395dcb2465d51f7ddd665dc34d77295c5909d
Author: AJ Slater <aj@slater.net>
Date:   Mon Feb 12 16:41:43 2024 -0800

    update deps

commit fc3746746536818196606d5d9a3e66246f7f12b5
Author: AJ Slater <aj@slater.net>
Date:   Mon Feb 12 16:37:20 2024 -0800

    simplify _is_older_than walk method'

commit 2259cacd905a3ebbd5936952fbc05cb4c2e2bcda
Author: AJ Slater <aj@slater.net>
Date:   Mon Feb 12 16:37:03 2024 -0800

    clear path_info original data asap for containers

commit 4337bddd273800059f9d4a7bb9fabbe4a1de5bcb
Author: AJ Slater <aj@slater.net>
Date:   Mon Feb 12 16:35:55 2024 -0800

    use is_contianer_child method

commit e4bb8fb3888fbb766f960d54b12a2629bc62f369
Author: AJ Slater <aj@slater.net>
Date:   Mon Feb 12 16:35:30 2024 -0800

    clear data method for path. is_container_child method for path

commit e4f908a8e2dba9da2f1a399f7f3e457cc01f50cf
Author: AJ Slater <aj@slater.net>
Date:   Mon Feb 12 15:19:40 2024 -0800

    make buffer method private in path

commit 5b7ab1091988214b0d880e83ac9fb4e4e64477cf
Author: AJ Slater <aj@slater.net>
Date:   Mon Feb 12 14:44:02 2024 -0800

    close input_buffer asap

commit cd3ab541601fbfffe5da3bda17226524a751b299
Author: AJ Slater <aj@slater.net>
Date:   Mon Feb 12 14:43:52 2024 -0800

    minort optimization

commit 4b2c289e6dc5d326d524519f16e813caf87fb678
Author: AJ Slater <aj@slater.net>
Date:   Mon Feb 12 13:45:13 2024 -0800

    colocate tmp files with container

commit 7093e89fada545ae74e27a8f6b69a8a64837c108
Author: AJ Slater <aj@slater.net>
Date:   Mon Feb 12 12:52:24 2024 -0800

    update deps

commit 7a2d25c4b23245a3e90cd8c5f836580343198c2f
Author: AJ Slater <aj@slater.net>
Date:   Sun Feb 11 23:51:17 2024 -0800

    don't copy files more than we have to for non-streaming external programs like cwebp

commit 4e2101947bc2ce19f540aae46492a202e0318a3d
Author: AJ Slater <aj@slater.net>
Date:   Sun Feb 11 14:41:27 2024 -0800

    don't use a tmp file for cwebp input when we don't need to

commit 4fa37bec390a0980584d5c93b94c6cab4cf38386
Author: AJ Slater <aj@slater.net>
Date:   Sat Feb 10 17:18:44 2024 -0800

    Pass filename or file buffer to detection and initial optimize program to store less in memory. Buffers get passed around handlers instead of bytes. Pillow agument utilities take buffers as input.

commit 48dbe755872dcdb0e501dff73dd88d9e5579de10
Author: AJ Slater <aj@slater.net>
Date:   Sat Feb 10 02:57:41 2024 -0800

    better ignore cli help

commit ddaa2179ba7d74231008dd15a7de36a62e02563e
Author: AJ Slater <aj@slater.net>
Date:   Fri Feb 9 12:27:58 2024 -0800

    expidite frame checking even more

commit 08e24a77a695323b1aee4ece1cca0d1fdbde55c7
Author: AJ Slater <aj@slater.net>
Date:   Fri Feb 9 12:26:05 2024 -0800

    make animated frame detection a little smoother

commit 7725d520fbf871c8366ed6b5345bd2c44a3c94f2
Author: AJ Slater <aj@slater.net>
Date:   Thu Feb 8 17:14:43 2024 -0800

    lint

commit 4f713eddb84e0e00cc9169bd3a8c0d441ccf7d28
Author: AJ Slater <aj@slater.net>
Date:   Thu Feb 8 17:14:38 2024 -0800

    comments

commit cd86affcc274f8ccead84f70760c6ffc4577e2ad
Author: AJ Slater <aj@slater.net>
Date:   Thu Feb 8 17:10:51 2024 -0800

    simplify pillow methods

commit 6da8505213c290a14d6e472ea6d263cb6d227552
Author: AJ Slater <aj@slater.net>
Date:   Thu Feb 8 16:29:34 2024 -0800

    working in memory picopt. unoptimized. big revisions to PathInfo.

commit 0ad1bee4f690ac210e20cbe93a4e4b70b9fe3601
Author: AJ Slater <aj@slater.net>
Date:   Thu Feb 8 16:29:18 2024 -0800

    working in memory picopt. unoptimized. big revisions to PathInfo.

commit 86031556bd3b0414e11109829e2c0b80c55fbd1c
Author: AJ Slater <aj@slater.net>
Date:   Thu Feb 8 15:27:55 2024 -0800

    update deps

* clearer logging for bigger than files. change the ReportStats constructor a bit.

* SVG no longer optimized by default

* remove comment cruft

* better xmp support

* some comments in the readme about the utility of external programs

* remove comment from README

* remove cruft

* move container check

* remove cruft

* consolidate error handling and reporting for image and container

* longer fuller names for ouput

* remove todo, uneccissary

* refine comment

* reduce complexity of config method

* simplify complexity of cleanup_after optimize and consolidate container path printing delimeter

* move jpeg get xmp to pillow module

* remove overzealous exhaustive near lossless feature

* cleaner error messages for bad input

* upgrade to eslint flat config. disable eslint-plugin-import until it works again"

* update eslint.confg.js, lint markdown more

* fix clean up working files method in walk

* test internal mpo converter

* clean up native xmp extraction code

* add comment

* move jpeg bit crunching all into pillow directory

* set version to alpha0

* pre-release circleci

* update test numbers for linux

* fix testts for linux

* old cwebp doesn't accept some tiffs?

* fix tests for linux

* consolidate test for images that are identitcal on all platforms, also fix some for 22.04 ubuntu

* switch for minimum cwebp version

* use an environ hack to make the mpo internal test work

* disable-programs option fixes mpo test hack

* remove obsolete platform specific test references

* update cli help

* fix finish totals math

* better size related noop logging

* update deps

* fix container timestamp crash

* bump version

* remove redundant log phrase

* don't throw out unoptimized data, use it for containers. destructive bug fixed

* simplify stats constructor. indent container paths

* update deps

* fix report path for non replaced files

* fix crash on zip or rar directory

* bump version

* fix epub test

* clean up working path if noop

* lint

* rename zip filenames if file converts

* bump version

* update deps

* sort files again

* NEWS note about timestamp options change

* update ubunut image for circelci

* update treestamps dep

* update treestamps. bump version to rc0

* bump news for treestamps fix'

* Squashed commit of the following:

commit 34aca281569e9f0b0152b4f5383c2f5a31fc6150
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 29 00:05:52 2025 -0700

    keep the color tester

commit 47caf32349b6472459bbe7f51ac25124638c1531
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 28 23:58:06 2025 -0700

    change colors, bump version to alpha

commit fb2923f98b118acde0cc2b42006bf26480d48ef2
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 28 21:33:57 2025 -0700

    reduce complexity

commit ecd36b6f7a578603dce18084991631a34e30e840
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 28 21:07:18 2025 -0700

    update deps

commit 35e29668478ebe6740d19094c4f4fc7586d41508
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 28 21:07:13 2025 -0700

    flush prints immediately for progress

commit db4ba40e8da2ac55bfd2a25449484688d5ab0287
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 28 17:04:45 2025 -0700

    printer takes pathinfo instead of string

commit 92bb0bb2aa6337ace4b23901741f305628dff8ef
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 28 16:56:47 2025 -0700

    delete original name from archive not changed

commit 901456937e1b66329de1360889d8b3203017f7ca
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 28 16:56:16 2025 -0700

    save original name of path_info

commit 7d6d61ce1ee41536825f31f07a59859f9967a81b
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 28 14:50:57 2025 -0700

    consolidate more prints into printer

commit ac18fad4b13ff1e146ff06cc9051c3e4ce10f4f9
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 28 14:39:52 2025 -0700

    rename Messenger to Printer. Use Printer in Reports

commit 8329e3b64ba5924b72294042a12fc00a6fd18c31
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 28 14:30:48 2025 -0700

    rename stats to report

commit dcb9c604a8d491b72e348f46fd3642f307376682
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 28 14:28:22 2025 -0700

    move handler_factory & detect_format back into walk. move _messenger into handler and use it exclusively

commit 1ce5b3e4f98663758322e94eaee5eca9abf6a2bd
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 28 00:25:21 2025 -0700

    Fix container Repacking...done printing. Make non-packing container raise if it calls optimize.

commit 2417ab1a4e8e134e971226e2cc630c930b2b76aa
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 28 00:14:42 2025 -0700

    break up handler base class

commit d62875c82147f14f039296a764a471dd36de7778
Author: AJ Slater <aj@slater.net>
Date:   Sun Apr 27 23:59:23 2025 -0700

    forgot to commit uml script

commit ab9ffe3e060ce6f69b5957989d95e7eb1b7b29c1
Author: AJ Slater <aj@slater.net>
Date:   Sun Apr 27 23:58:43 2025 -0700

    rename variable

commit 84b0f7804b2acbe3dc9bd6deae439361ed24e7b4
Author: AJ Slater <aj@slater.net>
Date:   Sun Apr 27 23:57:41 2025 -0700

    move _optimize_in_place_on_disk and _bytes_in to zip

commit 883fe8cbcdcca01077dd2828e998d012e28f2940
Author: AJ Slater <aj@slater.net>
Date:   Sun Apr 27 23:39:42 2025 -0700

    move delete_files into zip. rename _convert to _convert_children

commit fd8be5c74cf886bbd0f68d13f91f15f6745f9db3
Author: AJ Slater <aj@slater.net>
Date:   Sun Apr 27 23:33:46 2025 -0700

    fix zipfile patching atomicity

commit f858eafff9a670b34d229fa070e0dc4819973838
Author: AJ Slater <aj@slater.net>
Date:   Sun Apr 27 13:01:21 2025 -0700

    add uml & cycle make tasks

commit 3638a7fbc6ac5d8e6bed4c08559138c8d633d3a8
Author: AJ Slater <aj@slater.net>
Date:   Sat Apr 26 02:14:24 2025 -0700

    forgot to add printer.py

commit d8750187f213de746bf5f491dca8fc0616a34d1c
Author: AJ Slater <aj@slater.net>
Date:   Sat Apr 26 02:12:26 2025 -0700

    captilize news items

commit a039c8cca12c9263c1d971785ef068ed0086b534
Author: AJ Slater <aj@slater.net>
Date:   Sat Apr 26 00:34:34 2025 -0700

    fix missing container_path_history in containers. add newlines before messages

commit 7e1577fd900c7f7601e9978a507c9dd37dec2574
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 23:59:44 2025 -0700

    turn off optimize in place on disk for archives within archives

commit 03a2cf8ec79fe19be885434c58d1b9be621cdb29
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 23:49:32 2025 -0700

    move messeger to own file

commit de3584a9cc5e4b62ee0efa4c76eaef76864fc509
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 23:41:06 2025 -0700

    messenger class for printing dots

commit 995cce2564f93739de25b64d28f4d2a8928f9066
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 23:10:32 2025 -0700

    more fuzziness for container test sizes

commit 42d79dc8990b73236b894f2def10ecfac73a4c1e
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 23:09:00 2025 -0700

    simplify walk_container

commit 920eafc2fdc13d18d4f4bda1c82396aabff16161
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 23:05:53 2025 -0700

    moving skipper and _do_repack into container from archive simplifies walk code

commit 0aead82c1ce92124a39da9155ef3a5781c533faf
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 21:02:33 2025 -0700

    compression is not idempotent :o

commit a99741b4ebd361c20d1e18f09888b1fe218eff10
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 21:01:04 2025 -0700

    pathinfo copy constructor

commit 491dd518744df280be7bc94a7a5ddb446bad2c9e
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 20:06:55 2025 -0700

    add delete_stored test

commit 3a7662dad1c64251e7ac5a586e51d37e0ffa7905
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 20:06:39 2025 -0700

    adjust container test numbers

commit 8296f6d47c3d97fbe001d062e46f9e1046f0dee8
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 20:06:27 2025 -0700

    change method name to not be confusing

commit 51ff4828efe7493c8ea67e9f82f6e4b433bb56ca
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 18:37:29 2025 -0700

    fix FBT linting. Make factory handle info param

commit 63a0e3ded2933bf82517648f9c93ccde89e1ccb4
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 18:18:25 2025 -0700

    fix FBT lints

commit cdf1d1af7829def51dc46024bf9fb26fceae2ec8
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 18:07:24 2025 -0700

    Skip code moves from walk into archive
    archive gets an _optimize_in_place_on_disk flag
    container copy_skipped_files turns into a hydrate_optimized paths
    zip deletes files it would replace on disk and closes the file before
    appending the new files.

commit 47daa2f7a32c65504926bb4328ee4c4db3945696
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 18:03:41 2025 -0700

    spacing and comments to make handle init less difficult to read

commit 3955f6087f4667d8cb14046bff545803b01bd506
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 16:01:58 2025 -0700

    skipper consolidates printing to one method. gains archive awareness

commit c2139a41d6e91586ff8cfa7b1d3a6a7658601d62
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 16:00:47 2025 -0700

    remove useless test

commit 1d42bf78f542336b143b6980cde32b2a78937d19
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 16:00:14 2025 -0700

    pathinfo gains a rename method

commit 3a777e34348e30d917b67ca141aeafd36ea421c6
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 15:59:56 2025 -0700

    ArchiveInfo gains a rename method

commit d81d4d15021e6097e5285e1d418b8e761869f31f
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 25 13:14:04 2025 -0700

    update deps

commit 0be3159425044a60cde006d2ae49f3d71f8e0445
Author: AJ Slater <aj@slater.net>
Date:   Thu Apr 24 21:38:27 2025 -0700

    update deps

commit 0073323571a2723f138810b6a2d6597978b4d89b
Author: AJ Slater <aj@slater.net>
Date:   Thu Apr 24 20:37:06 2025 -0700

    reduce complexity if parse ignore config

commit 73d07bec2d15d426982d339e7cf5a3ae8945c1ea
Author: AJ Slater <aj@slater.net>
Date:   Thu Apr 24 20:28:12 2025 -0700

    zip rewrite in place

commit 5001a01b7ced6b18b32a3ea750fa88a05cbf1e29
Author: AJ Slater <aj@slater.net>
Date:   Thu Apr 24 20:24:40 2025 -0700

    add webp animated handler

commit 6762a9702d955e160a76c46499f4124336299940
Author: AJ Slater <aj@slater.net>
Date:   Thu Apr 24 18:16:43 2025 -0700

    simplify container optimize_contents structure. should save memory. save memory repacking animated

commit d5846dad268ae916609f4f91eec6987a5fd68213
Author: AJ Slater <aj@slater.net>
Date:   Thu Apr 24 17:22:38 2025 -0700

    reorganize handlers hierarchically

commit 23aa9aa2c96c457f5b63dc2c76629f12d0f4ad1d
Author: AJ Slater <aj@slater.net>
Date:   Thu Apr 24 16:54:47 2025 -0700

    make sure case_insensitive is a requiured param for PathInfo. reorganize Walk() a bit

commit 38b6baa8b6af73628e418ed94718ea90558c58fd
Author: AJ Slater <aj@slater.net>
Date:   Thu Apr 24 16:48:36 2025 -0700

    Squashed commit of the following:

    commit 8f869a7edfcce5026f442ba0cb4b3ad5483848c9
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Apr 24 16:24:33 2025 -0700

        ignore obeys filesystem case sensitiviy

    commit 749a4a9e59505c2e71970bc00e531548d614a946
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Apr 24 16:24:06 2025 -0700

        fix adding timestamps from inside archives

    commit f40ac06f23061d77945f1aede85719e496b5c4a4
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Apr 24 15:55:28 2025 -0700

        move WalkSkipper back into walk dir

    commit bfcf32ae57c669f236e31c2b08c542b2059f1447
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Apr 24 15:54:11 2025 -0700

        move walk out of __init__.py

    commit b2dcea5f22e4d6fd2442b8fabd04351ea79563c1
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Apr 24 15:51:03 2025 -0700

        simplify using timestamps inwalk and archive. remove cruft

    commit e4afb1692f34d6d30b74cd5f2aea56bf4e2a340e
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Apr 24 15:37:26 2025 -0700

        organize news

    commit aea9ba29dbd14f0ea37211ed75585ed1b0fbfd4b
    Author: AJ Slater <aj@slater.net>
    Date:   Thu Apr 24 15:35:20 2025 -0700

        treestamps can skip archive without opening them

commit 70d0d4a6ae6bac8f11a8b5146d9e96675bac55a8
Author: AJ Slater <aj@slater.net>
Date:   Thu Apr 24 02:43:41 2025 -0700

    bump news for ignore options

commit c3713094713b6476f59c77890af6fe09b6e6e91f
Author: AJ Slater <aj@slater.net>
Date:   Thu Apr 24 02:43:30 2025 -0700

    add new ignore options to config default

commit 9f395dbaafee7820670423adf81686c869389138
Author: AJ Slater <aj@slater.net>
Date:   Thu Apr 24 02:42:45 2025 -0700

    fix ignore to construct a regex. fixes wildcards and is faster.

commit ea053a9921e2e4bacd8aaa3f4f675a2560141a8b
Author: AJ Slater <aj@slater.net>
Date:   Thu Apr 24 02:42:43 2025 -0700

    use set not assign for config

commit 51842d5465e9058e1250d1f303237de21874755a
Author: AJ Slater <aj@slater.net>
Date:   Thu Apr 24 02:38:22 2025 -0700

    fix os.walk scanning too many directories. write my own version with ignore filters

commit e990d83546d7e4dba4049dd2a9c1223f6a5d9eba
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 15:51:09 2025 -0700

    update news

commit 2f5318d652f9ada3b04296d5bf30487a1a5b5e80
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 15:32:35 2025 -0700

    really fix format str set types

commit 50daa2419da9bd91518c46f74b39ca882dac1216
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 15:14:08 2025 -0700

    fix format strings set types

commit 0bafe7f010942f140eec73012a04fbc35cd35f92
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 15:05:19 2025 -0700

    override docker parser for prettier until bug is fixed

commit 33b07f24b14737576c672a9e4d0f53320620c0fd
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 15:01:46 2025 -0700

    fix and clean up cli help for formats and convert_to

commit ebca916967d6a8bbd2606ae8ec172dd214c4d211
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 14:16:37 2025 -0700

    move get_repack_handler_class into get_handler and skip a little earlier

commit 60444cd0945b6f0c8bca16d7e13c25464c3534bc
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 13:14:54 2025 -0700

    re-add epub convert protection

commit ffe3d5f19437fc86d89e0499c8cf587e3d34def6
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 13:10:03 2025 -0700

    break up walk into files

commit 607f35ee64c8d82321d223df0835d9b8a2f53623
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 12:49:47 2025 -0700

    use ABC instead of ABCMeta

commit 60469a3f3b5d9df568474d007626d342457bfd0a
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 12:47:27 2025 -0700

    format

commit 6316043bb438658f5bde2a03079b6d70e656fe7a
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 12:41:48 2025 -0700

    remove temporary const

commit abcc449a28cc44e899300212fa9b609c12268f7f
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 12:39:44 2025 -0700

    privatize some image handler class consts

commit 1780d5a6823ff795ebaeee6acbe96a1abecad5cc
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 12:35:58 2025 -0700

    remove archive const cruft

commit be5ccfa8baf53e2e7ef13d4c16c9e7d4d01fd84f
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 12:25:05 2025 -0700

    privatise handler consts. move INTERNAL const outside of class

commit df380c9213dadb93c9466642a001fbaf4368c961
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 12:11:17 2025 -0700

    pillow patches const privacy

commit 0438302d98a32a3593bfce48a4eefcf512f5da86
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 12:08:29 2025 -0700

    make path is_case_sensitive bool|None instead for test_case_sensitive

commit 77003f3040959b794661ffde95b801fd9eda157b
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 12:03:49 2025 -0700

    shuffle config internal const privacy

commit 4f2d5121227008a8241930466ef117e9a375a06d
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 11:56:04 2025 -0700

    privatize class variable

commit 22bdd0aff81b04606e2083f700ead34fc2c0bc62
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 11:55:10 2025 -0700

    move case sensitivity test into path

commit e7f50bca5467a15c727d8307b7d786c3ac1e32c2
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 11:43:09 2025 -0700

    remove const cruft

commit 100c49bd4b9bcb49f1d26177dda4e5051983a94a
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 11:14:36 2025 -0700

    consolidate full name generation

commit 325ac7e12a6e77802a40252f16668d5c0d49402d
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 22 11:08:29 2025 -0700

    refactor in_containter calculation to be a little simpler for PathInfo

commit 6652c459b6fb02f78137e1d1e2c4346a6070ce44
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 21:35:05 2025 -0700

    replace PathInfo.container_mtime with in_container

commit f8dd81d7c86b39f6ba6df5dd1a8f00fa152f5bca
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 20:40:01 2025 -0700

    comment about why i won't remember compression for 7z

commit b6bd35fa9d5a02cf60b574ab11ad48f44cdbfa85
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 20:23:27 2025 -0700

    parameterize most tests

commit 87b85e267179e8dc7e999034c024fb30ccc394c7
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 19:32:06 2025 -0700

    move image metadata preservation into mixin

commit 277b01a774e1ef065452776ec648d0e6400134d7
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 19:29:46 2025 -0700

    clean up webp passing args & kwargs to super init

commit 275a8620f21b45bc7f0e710ce887abc60badef43
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 16:27:48 2025 -0700

    move no repack handler skip print to walk. FileFormat represents itself as a string.

commit 255f2ec87c31341490b8a0181ca7aa695d42d062
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 16:14:18 2025 -0700

    remove todo replace with comment

commit 3ee70f34c2e7803de0e0fbb823cd9420aa552370
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 16:10:51 2025 -0700

    remove pathinfo.container_filename cruft"

commit d798fba648cab18f10c9ae57ae5aa6d63a64b3ef
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 16:08:52 2025 -0700

    rename test to match what it does

commit 99ecc7fc89a10e8782b58582a72eb940ea4eba2a
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 16:08:31 2025 -0700

    add mpo suffix for jpegs

commit b9ce570a0631d9c56a002cc1e43f4b3ad69e1f97
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 16:08:15 2025 -0700

    clean up and fix get handler stages

commit 70cf5985c80b9f421b3b3710c6954b0bcc0aa4c3
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 15:39:32 2025 -0700

    move archiveinfo into archve dir

commit 7aac7a5545cc965de253e3db970f36f37f7530d4
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 15:37:01 2025 -0700

    separate ArchiveHandler and PackingArchiveHandler to handle archive conversions less hackily. gain 7zr and tar support. introduce ArchiveInfo translator class.

commit 966c7f51bfae988c305f805062ef67778405d710
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 15:36:34 2025 -0700

    update deps

commit c478bd7e7b56b34f3e9a4dc6c0713ded798919ba
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 15:33:21 2025 -0700

    add todos for simplifying handler

commit 69279914410858a3ad4a81f2254d580e66dd17dc
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 15:32:35 2025 -0700

    add newline for stats errors

commit c590e67ea3b22a16a1e9361d7a8fdbb69f21c290
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 15:32:05 2025 -0700

    disable FIX checking for ruff

commit 1ef89b5a5d32a366ba1cbc994beb7ca3ea2c231d
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 15:31:36 2025 -0700

    introduce archive flag for formats

commit e4a817a4d02bcf0eefdc39eca2218c99dbdd4527
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 21 14:47:25 2025 -0700

    fix kill eslintd script

commit f5d2cbfef3411559ceedf6a59d0c0dc10c634629
Author: AJ Slater <aj@slater.net>
Date:   Sat Apr 19 12:21:12 2025 -0700

    comments

commit 886ebcc593dc81bdece8087a44913fef6d68ee44
Author: AJ Slater <aj@slater.net>
Date:   Sat Apr 19 12:19:08 2025 -0700

    put image handlers in their own directory

commit c51c7a78d7de8a90a2dc8ac145b3306c4fc1b4e4
Author: AJ Slater <aj@slater.net>
Date:   Sat Apr 19 12:12:56 2025 -0700

    split off detect_format into it's own file

commit 69102990590938f12ef22f779b4171efbf034791
Author: AJ Slater <aj@slater.net>
Date:   Sat Apr 19 12:03:54 2025 -0700

    update deps

commit 64bb51f9ead9407b423a1a42dc7b95da2bfde146
Author: AJ Slater <aj@slater.net>
Date:   Sat Apr 19 12:03:08 2025 -0700

    zip archive info map

commit 8b0596c3292470a205b1757b63b84af8f645b996
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 18 21:20:38 2025 -0700

    add suffixes to rar

commit 3758b21ba0a923fd4a5f7f367aba92d13985aa7b
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 18 20:44:05 2025 -0700

    make config more modular

commit 6553800af350f46916310ca9fc2e2b23b1b3af96
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 18 19:50:23 2025 -0700

    make config more modular

commit d3472be7ee7e86c987c934e49bff405a8cb2b09e
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 18 18:39:34 2025 -0700

    fix tests for keeping directories

commit c5be3792ec7fcd04cc64132752d8cdc14ad2c578
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 18 18:36:31 2025 -0700

    use pathinfo.name() for archive names

commit 9cac1a607c4aeccb88a1e91f5b855b622fcf5fec
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 18 18:32:59 2025 -0700

    fix PathInfo to consider archiveinfo names first

commit 8f2a0d3b581d3c4838c18a08607936a71ef104e6
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 18 18:30:12 2025 -0700

    return empty bytes for 7z dir data. use archiveinfo for filename

commit e1192382511fea0342d5d754e0995c14b89f3bf4
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 18 18:29:41 2025 -0700

    don't skip directories

commit 9cea5a3ef99d2a3b266dbe10456fed67898f4324
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 18 18:09:09 2025 -0700

    fix tests for 7z variablity

commit f3d9565c94c93d60a918a4712a9bfc8f31d811c7
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 18 18:06:21 2025 -0700

    more generic archivinfo handling. working sevenzip writing, but the size varies by a bytegit diff picopt/handlers/archive/!

commit 4e782164886aa7886ade3dbdd00587a99d48ac1c
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 18 12:49:39 2025 -0700

    fix containers test

commit 52e729a716c41da0c7001dad42415dc6203f91bb
Author: AJ Slater <aj@slater.net>
Date:   Fri Apr 18 12:23:26 2025 -0700

    no_convert tests for tar & 7z

commit f01e70e3c538005b855e7be677d304d810b7c54c
Author: AJ Slater <aj@slater.net>
Date:   Thu Apr 17 15:34:15 2025 -0700

    refactor archive code into dir. add sevenzip and tar archives

commit 46c24163262f1411335b072e74d0eb758efa9758
Author: AJ Slater <aj@slater.net>
Date:   Tue Apr 15 17:44:07 2025 -0700

    fix tests for sets and mpts in treestamps

commit 129122fdd7d0a630d0740e01d018afd5fc857130
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 14 19:11:39 2025 -0700

    remove erroneous final publish command

commit 61e6ce9f5a605baab4287bf1048acf9d95ba8eaa
Merge: 1a45b27 c3d0c0b
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 14 19:09:00 2025 -0700

    Merge branch 'main' into develop

commit c3d0c0b238174fb30e599e054e24797c08946979
Author: AJ Slater <aj@slater.net>
Date:   Mon Apr 14 19:08:46 2025 -0700

    v4.1.0 (#86)

    * fix after param

    * remove cruft

    * fix directory task order, seperaate queue tasks into a file

    * reorg walk initialization

    * output showing conversions

    * use python 3.9 typing

    * fix quiet setting

    * better after parsing

    * list only to caps

    * trap unlink exception

    * handle directory results from bottom up. remove mypy

    * poetry update

    * poetry update

    * don't store timestamps for things …
commit c00fb80e1d5df4c0a90608ef0f1e66ffa98bd7fa
Author: AJ Slater <aj@slater.net>
Date:   Wed Jun 11 14:43:49 2025 -0700

    document experimental options. bump newsS

commit d11c41ee5b69295e2f63060ec911da3acbe7614a
Author: AJ Slater <aj@slater.net>
Date:   Wed Jun 11 14:37:38 2025 -0700

    consolidate cwebp & gif2webp code

commit 11c26e5781a248095cd7086cb87355e4cf3a66fa
Author: AJ Slater <aj@slater.net>
Date:   Wed Jun 11 14:07:10 2025 -0700

    change working filenames for gif2webp

commit 93300c5e7927912771318ce32d5f817cdf0f4892
Author: AJ Slater <aj@slater.net>
Date:   Wed Jun 11 14:05:37 2025 -0700

    add img2webp. hide gif2webp and img2webp behind environment variables

commit c8bf48d6c892f11f1ac2c807e451d889c04ad357
Author: AJ Slater <aj@slater.net>
Date:   Wed Jun 11 12:58:10 2025 -0700

    make pack_into return BinaryIO. Make unpack_frame more modular

commit 4acbb667b1d65778cf105eefe53dee02e9e64795
Author: AJ Slater <aj@slater.net>
Date:   Wed Jun 11 12:57:02 2025 -0700

    fix variable name

commit 260f13ea57e71b2795e999af6ae41d0edb1edbf8
Author: AJ Slater <aj@slater.net>
Date:   Tue Jun 10 19:11:59 2025 -0700

    use gif2webp
commit 9cedfda46c9dc91262a2ee6d52995cef3b22e37a
Author: AJ Slater <aj@slater.net>
Date:   Wed Jun 11 18:24:00 2025 -0700

    permanently activate gif2webp

commit f9948e8ad6af3a2a39e1fad797234b25d120d160
Author: AJ Slater <aj@slater.net>
Date:   Wed Jun 11 15:18:38 2025 -0700

    update version to alpha

commit decf63487304040ef0df287c95077b2fda3f299c
Author: AJ Slater <aj@slater.net>
Date:   Wed Jun 11 15:17:57 2025 -0700

    fix merge error

commit 641b46b6e1a46ac292982ef96e47c4e7421e2304
Author: AJ Slater <aj@slater.net>
Date:   Wed Jun 11 15:17:31 2025 -0700

    Squashed commit of the following:

    commit 6008984226164f19346791f69195aae3e73d79a4
    Author: AJ Slater <aj@slater.net>
    Date:   Wed Jun 11 15:15:41 2025 -0700

        update deps

    commit 4df737d5252ff3bc6fd839cc2aea5ef6a25f7846
    Author: AJ Slater <aj@slater.net>
    Date:   Wed Jun 11 14:44:41 2025 -0700

        Squashed commit of the following:

        commit c00fb80e1d5df4c0a90608ef0f1e66ffa98bd7fa
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jun 11 14:43:49 2025 -0700

            document experimental options. bump newsS

        commit d11c41ee5b69295e2f63060ec911da3acbe7614a
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jun 11 14:37:38 2025 -0700

            consolidate cwebp & gif2webp code

        commit 11c26e5781a248095cd7086cb87355e4cf3a66fa
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jun 11 14:07:10 2025 -0700

            change working filenames for gif2webp

        commit 93300c5e7927912771318ce32d5f817cdf0f4892
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jun 11 14:05:37 2025 -0700

            add img2webp. hide gif2webp and img2webp behind environment variables

        commit c8bf48d6c892f11f1ac2c807e451d889c04ad357
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jun 11 12:58:10 2025 -0700

            make pack_into return BinaryIO. Make unpack_frame more modular

        commit 4acbb667b1d65778cf105eefe53dee02e9e64795
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jun 11 12:57:02 2025 -0700

            fix variable name

        commit 260f13ea57e71b2795e999af6ae41d0edb1edbf8
        Author: AJ Slater <aj@slater.net>
        Date:   Tue Jun 10 19:11:59 2025 -0700

            use gif2webp

    commit 07d7f6677b5c2dadc1ac151d91dc5bc064bf2a99
    Merge: c05b2cd 5b8f9cd
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Jun 10 01:33:48 2025 -0700

        Merge branch 'main' into develop

    commit 5b8f9cde5281cfffcc81582bd12322c717fb17ee
    Author: AJ Slater <aj@slater.net>
    Date:   Tue Jun 10 01:33:05 2025 -0700

        v5.0.1 (#89)

        * remove setup.cfg update deps

        * update deps

        * lint

        * add typing info

        * switch to makefile

        * fix cleanup of temp dir when container fails

        * fix version script for no frontend

        * bump version

        * fix stack trace on config error

        * update deps

        * update deps

        * Squashed commit of the following:

        commit 253cfbca14a5922d87cb21a3f85bec44294f22ee
        Author: AJ Slater <aj@slater.net>
        Date:   Tue May 9 18:54:56 2023 -0700

            fix build

        commit 6c4f44c6478624a53ba4b3385f4e9a89c402d483
        Author: AJ Slater <aj@slater.net>
        Date:   Tue May 9 18:35:31 2023 -0700

            update deps

        commit d18c0e69291fcc42d94feb4846399b2198d5fe6b
        Author: AJ Slater <aj@slater.net>
        Date:   Tue May 9 18:35:27 2023 -0700

            new treestamps new option to not check config on treestamps

        commit 8c357ebd27ade334edc633ea839572bffaa4f8dd
        Author: AJ Slater <aj@slater.net>
        Date:   Mon May 8 16:29:23 2023 -0700

            use some dataclasses for walk and report

        commit f9136d4176a2a57f967a2497c415a537afbc52a1
        Author: AJ Slater <aj@slater.net>
        Date:   Mon May 8 15:39:55 2023 -0700

            remove stray print

        commit cb2561314b5a9e1717757679326e31adb58d9cdb
        Author: AJ Slater <aj@slater.net>
        Date:   Mon May 8 15:39:08 2023 -0700

            move computed config items into a computed namespace instead of prefixing with underscore

        commit 106e06542a7b9238adb9a00c9a8f5453978617de
        Author: AJ Slater <aj@slater.net>
        Date:   Mon May 8 14:36:35 2023 -0700

            ignore some linting for tests

        commit be5c645f304605c9dd441c57a4394360b0bf5524
        Author: AJ Slater <aj@slater.net>
        Date:   Mon May 8 14:34:02 2023 -0700

            lint timezeones with now

        commit 2f6f7bd1d8c5004f6e2b84f39bd23739b4ffe2c0
        Author: AJ Slater <aj@slater.net>
        Date:   Mon May 8 14:25:12 2023 -0700

            cprint in walk.py. optimize report on bytes saved.

        commit 5708e43ef07edd5843c583c733227c633f942121
        Author: AJ Slater <aj@slater.net>
        Date:   Mon May 8 14:15:22 2023 -0700

            use cprint for normal output so lint flags debug prints

        commit 0e1efbb233e65e0ba7d312ec2e86241c10bb7e97
        Author: AJ Slater <aj@slater.net>
        Date:   Mon May 8 14:03:01 2023 -0700

            comment

        commit cbc94d6a38eedcfdbe573dd37c4efb4976d61d74
        Author: AJ Slater <aj@slater.net>
        Date:   Mon May 8 14:02:38 2023 -0700

            refactor where skips happen, move dir skip into walk dir, file skips happend after handle dir

        commit e545efc72fb3d376cbff7539e7e63164d6a2a252
        Author: AJ Slater <aj@slater.net>
        Date:   Mon May 8 13:51:29 2023 -0700

            fix variable name

        commit 147dd25439c7bd5a0fc8177b93e2b38b7e5289d8
        Author: AJ Slater <aj@slater.net>
        Date:   Mon May 8 13:51:12 2023 -0700

            use consts for repeat values in test

        commit 0bdc63629254beb6927627444ebde96fbad7bb9a
        Author: AJ Slater <aj@slater.net>
        Date:   Sun May 7 20:06:55 2023 -0700

            fix webp input_file_format name

        commit 480b082e357b9c75f9cd2f14cebcad2214e55c52
        Author: AJ Slater <aj@slater.net>
        Date:   Sun May 7 20:06:15 2023 -0700

            trap unidentified image error. fix warning message

        commit dae37e40784e307ae4a6c7a5b0609ce5b81ecf13
        Author: AJ Slater <aj@slater.net>
        Date:   Sun May 7 20:03:48 2023 -0700

            fix variable name

        commit 49f7546d689134d51156c267758185792a433173
        Author: AJ Slater <aj@slater.net>
        Date:   Sun May 7 20:03:08 2023 -0700

            fix lingering format name for variables

        commit 99e2b34c66954e7c689997dadcec4701effc62f3
        Author: AJ Slater <aj@slater.net>
        Date:   Sun May 7 20:02:29 2023 -0700

            allow make to do one test

        commit cfc58f1a0eda5361e74ad5099792165c1eb2ea98
        Author: AJ Slater <aj@slater.net>
        Date:   Sat May 6 20:22:22 2023 -0700

            add missing init files

        commit 3e82ba617536f874b5bcbee2004f93ad4142ffcc
        Author: AJ Slater <aj@slater.net>
        Date:   Sat May 6 18:31:38 2023 -0700

            first pass of lint

        * fix build with bin path

        * fix build

        * fix pngout install script package location

        * fix pngout install script again

        * update dockerfile bases

        * remove python 3.11ism

        * use lunar for ubuntu

        * update treestamps

        * fix test for reading wal

        * normalize wal writing to use ts_config as well

        * update treestamps

        * v3.3.3 uses new treestamps

        * bump version

        * Squashed commit of the following:

        commit d3ba8df31fa61604450500e1f4ae0948dd1c779f
        Author: AJ Slater <aj@slater.net>
        Date:   Thu May 11 15:48:08 2023 -0700

            3.3.4 keep original path extension

        * fix directory skipping

        * update deps

        * deflate64 and rarfile. cffi

        * Squashed commit of the following:

        commit 7af058987c6a36e1b523944af61d872c0b8a3b88
        Author: AJ Slater <aj@slater.net>
        Date:   Sun May 14 15:34:06 2023 -0700

            don't rar if no unrar

        * remove unrar.cffi support

        * update deps and lint

        * improve cwebp params

        * lint

        * update deps

        * Squashed commit of the following:

        commit 70ec98237334b5ead1ac2bcb1df8d44acb27837a
        Author: AJ Slater <aj@slater.net>
        Date:   Mon Jan 15 20:59:45 2024 -0800

            webp: -m 6, -q 100 for both lossy and lossless

        commit b31880a5c25d4792d4da45670e07b7d3d98f4842
        Author: AJ Slater <aj@slater.net>
        Date:   Mon Jan 15 19:57:58 2024 -0800

            update deps and lint

        commit bcb77803b8875636093937f015fae8b4a7755370
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Aug 16 18:33:28 2023 -0700

            update deps and lint

        commit d0062cbee30504aeb83c8e4cfedf7fc053e7cb8c
        Author: AJ Slater <aj@slater.net>
        Date:   Mon Jul 10 13:40:10 2023 -0700

            use prettier plugins

        commit b3aa384a5618a2b27d6e912efcb2c2cacceacc01
        Author: AJ Slater <aj@slater.net>
        Date:   Mon Jul 10 11:33:23 2023 -0700

            update deps and add more eslint plugins. add first step of converge option

        * alphabetize macOS deps

        * fix non zero exit code on success

        * remove webp lossy optimizing. it wasn't

        * mac tests pass. remove unfinished converge stuff. add near_lossless to webp

        * update to mozjpeg 4.1.1 for testing

        * use mantic manticore for testing

        * fix linux test sizes

        * fix more linux tests

        * fix png to webp linux size

        * fix webp size for linux

        * penultimate linux webp size fix

        * possibly final linux test fix

        * version is actually 3.3.7

        * remove cruft

        * remove converge vestiges from config

        * lint

        * v4.0.0rc0 (#76)

        * change --destroy-metadata to --strip-metadata. change running script name. bump version to 3.4.0

        * move report totals from walk into Totals

        * Squashed commit of the following:

        commit f7c2bd6647380b65a0d74ba7fb533724c6c6c455
        Author: AJ Slater <aj@slater.net>
        Date:   Fri Jan 19 14:28:04 2024 -0800

            remove converge option

        commit 3401da410565fdba7be7b6a8dee89dc43f061fbc
        Author: AJ Slater <aj@slater.net>
        Date:   Fri Jan 19 14:26:48 2024 -0800

            update docs for oxipng and more formats

        commit d01d7128d9040b60d87086e4b35065c4c1714601
        Author: AJ Slater <aj@slater.net>
        Date:   Fri Jan 19 14:26:22 2024 -0800

            update deps

        commit ceb7ece72b3861010f2c1e4a24e932d999274d7c
        Author: AJ Slater <aj@slater.net>
        Date:   Fri Jan 19 13:32:23 2024 -0800

            refactor config for lint and complexity

        commit 7c8a9154a02c37e50c2ac0b417d8b18c17c85692
        Author: AJ Slater <aj@slater.net>
        Date:   Fri Jan 19 13:32:09 2024 -0800

            lint

        commit c2248b95444aeb9b5f8913543f493dbc5f3f8afa
        Author: AJ Slater <aj@slater.net>
        Date:   Fri Jan 19 13:11:16 2024 -0800

            working many formats and oxipng

        * lint

        * python 3.10

        * Squashed commit of the following:

        commit ed0dc98a1d32beb8db47d4dc9570b6666f3f1541
        Author: AJ Slater <aj@slater.net>
        Date:   Fri Jan 19 16:52:01 2024 -0800

            support optmizing SVG with svgo

        * add svgo install instructions. allow sh markdown highlighting

        * use svgo if it's installed by npm

        * fix timestamp test

        * todos for variable name

        * Fix convert from formats not activating.
        Do not let npx auto-install
        Quiet npx output.
        Consolidate pil2png and pil2native
        Use positive if in webp_animated
        Even more aggressive webp presets.

        * lint

        * install svgo and oxipng for linux

        * bump version to 4.0.0

        * remove cruft

        * add converge option for cwebp. replace gif2webp with pillow and cwebp. no converge/exhaustive tests yet.

        * update deps

        * test exaustive

        * Big stages and config refactor. Allows mutliple programs in priority lists for stages. Simplifies on pil2native. removes external containerized webp_animated optimimzation for pil method (worse). Removes gif2webp for generic webp animated convertion.

        * Squashed commit of the following:

        commit 484c93d223dd2e7ffbb2b850876aba3ee05f8fc2
        Merge: cb56ee3 0a2104e
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jan 24 21:21:34 2024 -0800

            Merge branch 'main' into develop

        commit 0a2104ea299939c40f66d789b71963b4f6a6e4b3
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jan 24 21:21:23 2024 -0800

            picopt 3.3.8 (#72)

            * fix settings tests add coverage

            * fix settings coverage

            * expand stats coverage

            * timetstamp tests and individual file timestamp checking

            * better coverage for walk module

            * bump NEWS

            * types

            * remove relative imports

            * default recursion

            * default recursion

            * bump news

            * fix compacting timestamps

            * adjust verbosity and remove debug cruft

            * fix tests for defualt recursion and clean up skip code

            * move parse_date to Timestamp

            * comment for picopt specific code

            * move _should_record_timestamp to walk because it depends on settings.

            * abstract out base settings method

            * fix tests for new settings

            * fully seperate timestamp_base, make abc methods lint friendly. rename _FN constants to _NAME

            * move rc bases into a module for possible use elsewhere

            * bump news

            * update dat REAMDE

            * remove manual disable cli args

            * Squashed commit of the following:

            commit ae129a38bb246d885212b81a924609d88727be6c
            Author: AJ Slater <aj@slater.net>
            Date:   Sat Feb 12 17:41:04 2022 -0800

                remove formats.programs file, move formats back into classes

            commit 5e9c728ad63d0411a9a7bb6945e8fdcc38dcaa0b
            Author: AJ Slater <aj@slater.net>
            Date:   Sat Feb 12 17:40:01 2022 -0800

                lint

            commit 31672265f574542d7db1b218b266f651631bb542
            Author: AJ Slater <aj@slater.net>
            Date:   Sat Feb 12 17:39:41 2022 -0800

                fix syntax for calling linters

            commit e7798f6e4a9a865972aa8dd0db8cc3a46dd90668
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 19:46:22 2022 -0800

                reorg formats dir part 1"

            commit e2403c98ea9507fae53b1ff7546e750616f9a26a
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 17:41:55 2022 -0800

                remove lie from argparse docs

            commit 9f70ad224598b60bc2a9fcac36ce431a0271a618
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 17:40:36 2022 -0800

                remove nag behavior. make recursive default false again

            commit 3df145d135f9911b54a5dd6780c44b55d1706e8f
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 16:21:22 2022 -0800

                test webp and webp_is_lossless

            commit 8845d808224e9a0df3a748c7973d2b9c07840247
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 16:21:07 2022 -0800

                use is_lossless to choose cwebp params. fix webp LOSSLESS_FORMATS and CONVERTABLE_FORMATS

            commit a286e548613cae76f1d3e0e377cc1b47d045719f
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 16:18:00 2022 -0800

                sort items in documentation

            commit 061f745e79e4247636ebbaf337a8d9bcb255a05e
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 16:17:27 2022 -0800

                typing hints

            commit 5b84a249ad1cd9c1ef69e9a8abc20106d05f83e1
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 16:17:08 2022 -0800

                lint

            commit c88371ea09ef8407ee106cb3011db0132764ba79
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 16:16:34 2022 -0800

                move pillow enhancements to own module

            commit 0a8ddb7392f7b12b6e3d7a366b36275e399e9b86
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 13:41:57 2022 -0800

                remove cruft

            commit 90ac317d566602efa3325fe967d226192e5d121e
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 13:41:06 2022 -0800

                mark function private

            commit 66b9d7e72817dbb917c56a2e35ef126ec72b4421
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 13:07:17 2022 -0800

                consolidate webp test functions, add png2webp

            commit 9882fbb5d89d4f0cb75eaa24ecca1bdb628d9e14
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 01:12:51 2022 -0800

                remove cruft

            commit 4d705feae0fc21e20f0ea6e65890da8a3f04a6bd
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 01:05:27 2022 -0800

                remove object inheritance

            commit 884a0d311ef0c3531270c6ae9532b015d3d357e7
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 00:31:22 2022 -0800

                lint

            commit f90445dd2a2d22b5871ff58733475041e5614cec
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 00:22:55 2022 -0800

                lint NEWS

            commit 9312bf504948bd5e7b3d501487dcd5b97f10feb0
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 00:17:25 2022 -0800

                ignore TODO

            commit d4f4342a26fdfb0e44a9970a76d36f082a00a66d
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 00:16:30 2022 -0800

                remove dev scripts

            commit a44cf027a985fc0d46fb2311d24ea2fd12ee8dec
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 11 00:16:03 2022 -0800

                remove eslintcache from git

            commit 8e8b7c8ebd260df4189b8d51dbd6ea6ea9f24dce
            Author: AJ Slater <aj@slater.net>
            Date:   Thu Feb 10 16:53:44 2022 -0800

                working webp tests. not all cases probably. lots of new linting

            commit c92c42406f52b83572f7868ee6545d8b2a76d8fc
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Oct 5 14:58:14 2021 -0700

                fix conversion to webp

            commit a143f6e77f86566761aa99b7d6c345b8421c3b1a
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Oct 5 14:40:12 2021 -0700

                fix -w option help

            commit 276a56e1059593fb2ef61e4b9c09bdd86c6e5b7c
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Oct 5 14:33:10 2021 -0700

                poetry update and lint

            commit 5748643bae0d9738eaf59a6b36fae96766d7b199
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Sep 21 20:52:14 2021 -0700

                animated webp sort of working.

            commit 39687e3c5d22b64d39c1817d05a26b5ae0e21961
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Sep 21 20:46:31 2021 -0700

                fix mypy config

            commit 8efa91f867310ebbae774459c115245c83784774
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Sep 21 15:22:21 2021 -0700

                webp support. no animated webp support yet.

            commit f17a0ceac6e6883a7399d41cff713641e1834dcc
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Sep 21 15:13:47 2021 -0700

                update deps

            commit 18f1b312f42224501324e388ef5563e29f8f9428
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Sep 21 15:08:38 2021 -0700

                add ini lint for setup.cfg

            commit ef7d878419c6740b4d50ed63f7a6c9d2bf0d2ddb
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Sep 21 15:07:56 2021 -0700

                modern ubuntu. hadolint

            commit 37e23a11a9dd25c98628019a04dfc4984cdefe59
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Sep 21 14:58:41 2021 -0700

                lint script updates

            commit bc95342eba6258886fa03543ca9439e977d01366
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Sep 21 14:58:14 2021 -0700

                sortignore script

            * Squashed commit of the following:

            commit fd1474e30f5a57b0cacbf61649c3fdef2ac7808a
            Author: AJ Slater <aj@slater.net>
            Date:   Mon Feb 28 22:15:33 2022 -0800

                add command line args file

            commit e329c309ca5f514c9a65151aec4c8794fc1f49be
            Author: AJ Slater <aj@slater.net>
            Date:   Mon Feb 28 22:01:06 2022 -0800

                rename -N to -T

            commit cc2d9dbf6bd504cb09aec34205a39c9e09a302fa
            Author: AJ Slater <aj@slater.net>
            Date:   Mon Feb 28 21:33:18 2022 -0800

                optimize_after to after

            commit 9533993f8b1bb410525065e98379bf31d9dad33a
            Author: AJ Slater <aj@slater.net>
            Date:   Sat Feb 26 22:37:44 2022 -0800

                enable handlers with pil2 programs

            commit c8afd8a0a3c87210580fa5e13138b461541a61e3
            Author: AJ Slater <aj@slater.net>
            Date:   Sat Feb 26 22:35:12 2022 -0800

                use PIL to optimize if no programs available

            commit bf6b3428737ab3a7d3f075ac76fd1aa8e4d8c194
            Author: AJ Slater <aj@slater.net>
            Date:   Sat Feb 26 16:32:51 2022 -0800

                working containers, webp and conversions with integration tests

            commit f64d0058cde23a1482c810140e78156616a7c811
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 25 21:59:39 2022 -0800

                fix bit depth offset

            commit ac8dc54de35308b6243ac68c455227afa49e792a
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 25 14:15:42 2022 -0800

                fix png bit depth offset

            commit 7eb3e4e168739e1806f95f4bb26d34e4273ade2f
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Feb 25 14:08:24 2022 -0800

                re-optimize preo-optimzed jpg

            commit cc5474faf4190f9096073d7a2c79bde7f207995d
            Author: AJ Slater <aj@slater.net>
            Date:   Sun Feb 20 20:00:31 2022 -0800

                move more things into unpack common lib

            commit 6d789aa5dc79a429e0666792b3e830fca98d4c00
            Author: AJ Slater <aj@slater.net>
            Date:   Sun Feb 20 02:21:48 2022 -0800

                new test files

            commit afca8965c15894bb8f68f195db93cbd9c5420589
            Author: AJ Slater <aj@slater.net>
            Date:   Mon Feb 14 18:02:31 2022 -0800

                extra commit

            commit a10f9c35f89bd31bbde5d656818d528a4e9b9e5a
            Author: AJ Slater <aj@slater.net>
            Date:   Mon Feb 14 18:02:20 2022 -0800

                container structure fine

            * move import to top

            * webanimated, reform container error handling and available method

            * update news

            * extract is_lossless into a function

            * remove cruft

            * consolidate error handling for handlers

            * refactor stats

            * reuse FORMAT_STR

            * simpler container dir name

            * Squashed commit of the following:

            commit e37d88a7834a65b729024110d0dea29eb88c2fd3
            Author: AJ Slater <aj@slater.net>
            Date:   Thu Mar 3 12:30:02 2022 -0800

                rename can_handle to identify_format

            commit 825fb0e865667e602b58ef5e868a534b460828f1
            Author: AJ Slater <aj@slater.net>
            Date:   Thu Mar 3 12:22:16 2022 -0800

                simpler to use two handlers for gif

            commit e73d19c3863f6e23e041903aec190f4c524d04ca
            Author: AJ Slater <aj@slater.net>
            Date:   Thu Mar 3 12:09:58 2022 -0800

                rename FORMAT & FORMAT_OBJ

            commit f02ebd7db5f4ea3f1f062fa5ebb2bdb675321347
            Author: AJ Slater <aj@slater.net>
            Date:   Wed Mar 2 22:28:07 2022 -0800

                treat internal programs differently

            commit 28a3b680430a507d54c370103f7e47a5cb2028f7
            Author: AJ Slater <aj@slater.net>
            Date:   Wed Mar 2 22:18:00 2022 -0800

                remove IMPLIES_RECURSE

            commit 0d088430b4669a389def42e2ba193e51421bbfee
            Author: AJ Slater <aj@slater.net>
            Date:   Wed Mar 2 22:08:46 2022 -0800

                reorder class methods

            commit d1e615c1a94f4b1baad73514f47e1cbd2f20b2e5
            Author: AJ Slater <aj@slater.net>
            Date:   Wed Mar 2 22:06:24 2022 -0800

                remove cruft

            commit ac86a44d7a8240b5ca64fa6f920fb16d030652dc
            Author: AJ Slater <aj@slater.net>
            Date:   Wed Mar 2 22:05:01 2022 -0800

                remove cruft

            commit ee726238d4d5f364f4d357aa42ac7626d264ad26
            Author: AJ Slater <aj@slater.net>
            Date:   Wed Mar 2 22:04:14 2022 -0800

                dynamic native formats

            commit af4bf19721b8356dcd729a9b80634dbffe4c36c6
            Author: AJ Slater <aj@slater.net>
            Date:   Wed Mar 2 21:21:48 2022 -0800

                rename self.format to self.input_format

            commit c7c0f44603b1b85b52aea8dc554ee823f056c8da
            Author: AJ Slater <aj@slater.net>
            Date:   Wed Mar 2 21:01:58 2022 -0800

                more dynamic suffix generation

            * name factory factory

            * remove cruft

            * verify independantly of metadata read. store exif data

            * exif support for handlers

            * exif support for png, also use o5 for optimizing

            * metadata preserve for webp. consolidate pil2webp function

            * bump NEWS

            * icc preservation

            * pillow optimization for jpeg

            * epub support

            * Squashed commit of the following:

            commit 547ec01fe5c1b0fc90f84964bdc0fe4a92bd166b
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Mar 4 14:44:50 2022 -0800

                bump news

            commit 0a1b689f3bab481c85bb48357190efe4bbd4dd32
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Mar 4 14:44:31 2022 -0800

                tif support

            commit ecb294fa37fa3c2de6e03de72d2dbb410e574447
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Mar 4 12:07:16 2022 -0800

                fix container dir suffix dot

            commit 361e1310b98f5db8441eb478158d38022922638e
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Mar 4 12:06:51 2022 -0800

                remove debug print statement

            * pil2jpeg is not lossless

            * add to comment

            * combine pil2 methods into a superclass method

            * tweak comment

            * reform some variable names

            * more consistent method naming for containers

            * Squashed commit of the following:

            commit 5e0fb4776af2bbe59890a270bb13c27efb2fdd64
            Author: AJ Slater <aj@slater.net>
            Date:   Mon Mar 7 16:32:48 2022 -0800

                compact timestamps get routine

            commit ed15c4506b994adc895a2718a5c62c9cb666b725
            Author: AJ Slater <aj@slater.net>
            Date:   Mon Mar 7 16:20:28 2022 -0800

                refactor timestamps

            commit c6664e09a12b943b65587b4282c51f7ce4da3d6d
            Author: AJ Slater <aj@slater.net>
            Date:   Sat Mar 5 14:57:08 2022 -0800

                move comments

            * Squashed commit of the following:

            commit 3dd8e76ed71a13f0790b51cec8b9234f75694a2a
            Author: AJ Slater <aj@slater.net>
            Date:   Thu Mar 10 12:41:56 2022 -0800

                one queue per timestamps file. move walk-all_files into run

            commit 8ba764d5bd95a10ec9510675c3d1c3d32284a310
            Author: AJ Slater <aj@slater.net>
            Date:   Thu Mar 10 12:21:34 2022 -0800

                move exception handling into walk_file. dump timestamp file after completing every directory

            commit f8462df14cb51993e0f171514bc75356b983721a
            Author: AJ Slater <aj@slater.net>
            Date:   Thu Mar 10 12:03:32 2022 -0800

                handle item method

            commit c9520ee1fcd79515191ada48b4e7ad85b2f6c991
            Author: AJ Slater <aj@slater.net>
            Date:   Thu Mar 10 11:33:26 2022 -0800

                restore passing timestamps down

            commit 4ef23e005451e5582bd98c042cd1390dbca3f050
            Author: AJ Slater <aj@slater.net>
            Date:   Thu Mar 10 10:06:22 2022 -0800

                remove passing top_path around. change return types to asyncresult, dirresult, none

            commit cc3f87463ecba21618ae1b5772f98db2a8933fa7
            Author: AJ Slater <aj@slater.net>
            Date:   Thu Mar 10 09:03:05 2022 -0800

                remove walk_after and move call unpack directly in handler

            commit 1fb0caa7f76b7aac3f31d1449302d79ba9773bd7
            Author: AJ Slater <aj@slater.net>
            Date:   Wed Mar 9 15:32:16 2022 -0800

                queue system works for unblocking containers. timestamp refactor for non-dir submissions. needs some refactoring

            * bump news

            * change destroy_metadata config variable to keep_metadata

            * Squashed commit of the following:

            commit b772d0770c2772129106f6de66928c300d816cd6
            Author: AJ Slater <aj@slater.net>
            Date:   Thu Mar 10 21:45:47 2022 -0800

                convert-to is now a list. no more global implied recurse, but containers recurse

            * Squashed commit of the following:

            commit ee7db97aef3a1003c848ef0e883ea60bf86355be
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Mar 11 16:52:34 2022 -0800

                config in timestamps

            * Squashed commit of the following:

            commit d8577ed56ad31d3d803e30379c3ca6877f56aa25
            Author: AJ Slater <aj@slater.net>
            Date:   Fri Mar 11 22:09:47 2022 -0800

                ignore globs

            * Squashed commit of the following:

            commit 15694ae4a52b695c321fac7e7ad732446589c407
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Mar 22 22:34:39 2022 -0700

                remove dependency on timestamps. make timestamps off the default again

            commit 95f7ab272e589fd0351ae2e3d620640f7909b614
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Mar 22 20:34:07 2022 -0700

                all tests work

            commit cb0be7d9ffc39a57cd07ff3498fa6ddb48f7eeb3
            Author: AJ Slater <aj@slater.net>
            Date:   Mon Mar 21 18:59:41 2022 -0700

                fix non-relative imports into timestamps. fix old timestamps import

            commit ec1eb4562dc0279e979614a627ba7fe9a65ef8c6
            Author: AJ Slater <aj@slater.net>
            Date:   Mon Mar 21 16:55:30 2022 -0700

                pytest_config rename test

            commit 1fbe451e821857c51a9b81f14f44eba5a3fd4460
            Author: AJ Slater <aj@slater.net>
            Date:   Mon Mar 21 16:54:41 2022 -0700

                dump a fake journal test reading

            commit 12c0e0b49cae8c810445db4a8505b3743cd1a0e8
            Author: AJ Slater <aj@slater.net>
            Date:   Mon Mar 21 16:29:25 2022 -0700

                clean up journal on dump properly

            commit e87844fa03c5f00f427ba8cbdd7c902e1fbac38c
            Author: AJ Slater <aj@slater.net>
            Date:   Mon Mar 21 15:20:28 2022 -0700

                more timestamps tests

            commit 28e00ae88af93630c8c85c5edb437de06df9669d
            Author: AJ Slater <aj@slater.net>
            Date:   Mon Mar 21 13:36:17 2022 -0700

                passes simple timestamp tests

            commit 9f18ebbe06d9c8f66826ffeeb4a2f9edff5d21a0
            Author: AJ Slater <aj@slater.net>
            Date:   Thu Mar 17 14:02:31 2022 -0700

                correctly typed wal stuff

            * fix after param

            * remove cruft

            * fix directory task order, seperaate queue tasks into a file

            * reorg walk initialization

            * output showing conversions

            * use python 3.9 typing

            * fix quiet setting

            * better after parsing

            * list only to caps

            * trap unlink exception

            * handle directory results from bottom up. remove mypy

            * poetry update

            * poetry update

            * don't store timestamps for things inside containers

            * rename tasks

            * Squashed commit of the following:

            commit 74a4a17e6c870924fc97ce65e2dbab48881c7152
            Author: AJ Slater <aj@slater.net>
            Date:   Thu Mar 24 14:33:08 2022 -0700

                don't deflate images in archives. remove resort. move output to containerhandler.

            commit 9a1f166eb1cb78a9ba17538a5a5b426494453066
            Author: AJ Slater <aj@slater.net>
            Date:   Thu Mar 24 14:13:15 2022 -0700

                lint

            commit babe920eefe2bc896090d62f079e83816049e898
            Author: AJ Slater <aj@slater.net>
            Date:   Thu Mar 24 14:13:12 2022 -0700

                rename tasks

            commit 36239c8399995a0ea4e9e2919a4bb7bdfc3c8688
            Author: AJ Slater <aj@slater.net>
            Date:   Thu Mar 24 14:08:29 2022 -0700

                inline unpack and repack

            * remove old unit tests.

            * lint

            * fix up NEWS

            * clean up old working directories as well as files

            * make working filename even more unique

            * fix TIFF not a default format getting turned on by convert_to

            * package updates

            * make queues private and close pools before writing timestamps

            * use eslint_d in scripts, update pakcaegs

            * version bump to 3.0, update packages

            * bump docker python image in cirlcleci

            * fix permissions on builder. use python3.10

            * don't use sudo. fix speling

            * copy necessary files for install

            * add pyright

            * test before lint

            * add webp dependency

            * update scripts packages and README

            * tests pass on linux

            * combine linux & darwin common tests

            * move dirpath back into Timestamps"

            * fix commands"
            in compose

            * change license

            * use subprocess run

            * cleaner cli calling

            * lint

            * change symlink option name

            * use shutil.which() and check for executable bits, don't run programs

            * colored output

            * factory method for timestamps

            * fix mozjpeg

            * fix config keys for timestamps keys

            * use timestamps factory. do timestamps ignore simpler

            * namespace picopt config

            * Squashed commit of the following:

            commit 62cc6d4ce3016f545d74200da0a85aa397764200
            Author: AJ Slater <aj@slater.net>
            Date:   Mon May 2 21:15:15 2022 -0700

                cleaner format classes doesn't make duplicate trees

            commit 1306e1321ac1d7de15359cd2d3987ea1271bd8a9
            Author: AJ Slater <aj@slater.net>
            Date:   Mon May 2 20:33:45 2022 -0700

                bump news

            commit 73960e382b98e940084914d7683937604bb4f62a
            Author: AJ Slater <aj@slater.net>
            Date:   Mon May 2 20:32:34 2022 -0700

                hacky but working epub fix

            * extra close for animated images

            * cleanup setting formats. add TIFF format don't subtract it

            * linux mozjpeg size

            * newer mozjpeg

            * document newer mozjpeg. update readme.

            * use frozenset

            * Squashed commit of the following:

            commit dedcb80180b978b11c3c3e80b910ca094faead6c
            Author: AJ Slater <aj@slater.net>
            Date:   Wed May 4 14:27:12 2022 -0700

                pypi treestamps

            commit 1f98040faa23e4ce9ddb89bd5b7871675dababdc
            Author: AJ Slater <aj@slater.net>
            Date:   Wed May 4 14:17:24 2022 -0700

                fix mounts for circleci

            commit 783248363c0e320febe96cf061f48736bc75d470
            Author: AJ Slater <aj@slater.net>
            Date:   Wed May 4 14:17:15 2022 -0700

                use current images for circleci

            commit 2486bf4a0bb11928d0bc64da85e3a6d21aa2743c
            Author: AJ Slater <aj@slater.net>
            Date:   Wed May 4 13:17:54 2022 -0700

                treestamps conversion

            * bump news

            * v3.0.1

            * update treestamps

            * trap repack exceptions

            * v3.0.2

            * v3.0.3

            * v3.0.4

            * better usage examples

            * sorted dirs

            * bump news and version

            * test for existence of timestamp in timestamp tests

            * don't record timestamps for items in containers

            * repack message uses final path not working path

            * don't look for old timestamps in ignore globs

            * alphebetize config

            * v3.0.5

            * fix not skipping files. add skip logging

            * maybe fix webp_animated detection

            * update packages

            * v3.1.2

            * Squashed commit of the following:

            commit 28e5f4a7d1215ae641c26f2b2b0b8d999d32df0c
            Author: AJ Slater <aj@slater.net>
            Date:   Wed May 18 13:00:19 2022 -0700

                fix deleting working file. add progress dots.

            * lint typing

            * bump version update packages

            * remove print statement

            * Fixed showing total at end. supress program output. change colors by operation

            * better error reporting

            * update packages and fix verbosity count

            * Squashed commit of the following:

            commit 212f653dd6b399e4db878a5a2ed6053452fde6df
            Author: AJ Slater <aj@slater.net>
            Date:   Wed May 25 14:05:59 2022 -0700

                3.2 apng

            * remove print statements

            * remove debug statements

            * lint

            * v3.2.2 & package updates

            * color help. change bigger color to blue

            * package updates

            * install webp in Dockerfile

            * move isort config to pyproject.toml

            * update confuse. add eradicate

            * ignore pypirc

            * update packages

            * update packages modernize linting

            * clearer headers code for pillow extension

            * refactor pillow extensions

            * switch to shellharden

            * fix identation in readme

            * Squashed commit of the following:

            commit 92daaf1e7ac0c8b0b537637929118cce8d47a82e
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Nov 1 18:04:39 2022 -0700

                change linux test values

            commit f96bde1a2640a9c89117ea2dd37be12dd88bf946
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Nov 1 17:04:26 2022 -0700

                fix webp lossless detection

            commit a08ba3af4ffa87a374ab527d38125b18e94bfe9a
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Nov 1 16:20:33 2022 -0700

                lint

            commit b31e8cd81ad9f2c3b591de02b402e0b32e99696d
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Nov 1 16:20:26 2022 -0700

                lint

            commit a48d1a24b5927e03777d27c6dc4592d7f517e32f
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Nov 1 15:02:25 2022 -0700

                fix image header compare

            commit 781d1e4ab93965e7cff138b749b533f12d7ca859
            Author: AJ Slater <aj@slater.net>
            Date:   Tue Nov 1 14:53:29 2022 -0700

                fix error reporting

            * remove debug print

            * change order of test and lint in ci. use python 3.11

            * update packages

            * fix toml replication

            * detect case insensitive filessystems and be careful about replacing files on them

            * bump version and news

            * speling

            * use ruff for linting

            * update deps

            * remove setup.cfg update deps

            * update deps

            * lint

            * add typing info

            * switch to makefile

            * fix cleanup of temp dir when container fails

            * fix version script for no frontend

            * bump version

            * fix stack trace on config error

            * update deps

            * update deps

            * Squashed commit of the following:

            commit 253cfbca14a5922d87cb21a3f85bec44294f22ee
            Author: AJ Slater <aj@slater.net>
            Date:   Tue May 9 18:54:56 2023 -0700

                fix build

            commit 6c4f44c6478624a53ba4b3385f4e9a89c402d483
            Author: AJ Slater <aj@slater.net>
            Date:   Tue May 9 18:35:31 2023 -0700

                update deps

            commit d18c0e69291fcc42d94feb4846399b2198d5fe6b
            Author: AJ Slater <aj@slater.net>
            Date:   Tue May 9 18:35:27 2023 -0700

                new treestamps new option to not check config on treestamps

            commit 8c357ebd27ade334edc633ea839572bffaa4f8dd
            Author: AJ Slater <aj@slater.net>
            Date:   Mon May 8 16:29:23 2023 -0700

                use some dataclasses for walk and report

            commit f9136d4176a2a57f967a2497c415a537afbc52a1
            Author: AJ Slater <aj@slater.net>
            Date:   Mon May 8 15:39:55 2023 -0700

                remove stray print

            commit cb2561314b5a9e1717757679326e31adb58d9cdb
            Author: AJ Slater <aj@slater.net>
            Date:   Mon May 8 15:39:08 2023 -0700

                move computed config items into a computed namespace instead of prefixing with underscore

            commit 106e06542a7b9238adb9a00c9a8f5453978617de
            Author: AJ Slater <aj@slater.net>
            Date:   Mon May 8 14:36:35 2023 -0700

                ignore some linting for tests

            commit be5c645f304605c9dd441c57a4394360b0bf5524
            Author: AJ Slater <aj@slater.net>
            Date:   Mon May 8 14:34:02 2023 -0700

                lint timezeones with now

            commit 2f6f7bd1d8c5004f6e2b84f39bd23739b4ffe2c0
            Author: AJ Slater <aj@slater.net>
            Date:   Mon May 8 14:25:12 2023 -0700

                cprint in walk.py. optimize report on bytes saved.

            commit 5708e43ef07edd5843c583c733227c633f942121
            Author: AJ Slater <aj@slater.net>
            Date:   Mon May 8 14:15:22 2023 -0700

                use cprint for normal output so lint flags debug prints

            commit 0e1efbb233e65e0ba7d312ec2e86241c10bb7e97
            Author: AJ Slater <aj@slater.net>
            Date:   Mon May 8 14:03:01 2023 -0700

                comment

            commit cbc94d6a38eedcfdbe573dd37c4efb4976d61d74
            Author: AJ Slater <aj@slater.net>
            Date:   Mon May 8 14:02:38 2023 -0700

                refactor where skips happen, move dir skip into walk dir, file skips happend after handle dir

            commit e545efc72fb3d376cbff7539e7e63164d6a2a252
            Author: AJ Slater <aj@slater.net>
            Date:   Mon May 8 13:51:29 2023 -0700

                fix variable name

            commit 147dd25439c7bd5a0fc8177b93e2b38b7e5289d8
            Author: AJ Slater <aj@slater.net>
            Date:   Mon May 8 13:51:12 2023 -0700

                use consts for repeat values in test

            commit 0bdc63629254beb6927627444ebde96fbad7bb9a
            Author: AJ Slater <aj@slater.net>
            Date:   Sun May 7 20:06:55 2023 -0700

                fix webp input_file_format name

            commit 480b082e357b9c75f9cd2f14cebcad2214e55c52
            Author: AJ Slater <aj@slater.net>
            Date:   Sun May 7 20:06:15 2023 -0700

                trap unidentified image error. fix warning message

            commit dae37e40784e307ae4a6c7a5b0609ce5b81ecf13
            Author: AJ Slater <aj@slater.net>
            Date:   Sun May 7 20:03:48 2023 -0700

                fix variable name

            commit 49f7546d689134d51156c267758185792a433173
            Author: AJ Slater <aj@slater.net>
            Date:   Sun May 7 20:03:08 2023 -0700

                fix lingering format name for variables

            commit 99e2b34c66954e7c689997dadcec4701effc62f3
            Author: AJ Slater <aj@slater.net>
            Date:   Sun May 7 20:02:29 2023 -0700

                allow make to do one test

            commit cfc58f1a0eda5361e74ad5099792165c1eb2ea98
            Author: AJ Slater <aj@slater.net>
            Date:   Sat May 6 20:22:22 2023 -0700

                add missing init files

            commit 3e82ba617536f874b5bcbee2004f93ad4142ffcc
            Author: AJ Slater <aj@slater.net>
            Date:   Sat May 6 18:31:38 2023 -0700

                first pass of lint

            * fix build with bin path

            * fix build

            * fix pngout install script package location

            * fix pngout install script again

            * update dockerfile bases

            * remove python 3.11ism

            * use lunar for ubuntu

            * update treestamps

            * fix test for reading wal

            * normalize wal writing to use ts_config as well

            * update treestamps

            * v3.3.3 uses new treestamps

            * bump version

            * Squashed commit of the following:

            commit d3ba8df31fa61604450500e1f4ae0948dd1c779f
            Author: AJ Slater <aj@slater.net>
            Date:   Thu May 11 15:48:08 2023 -0700

                3.3.4 keep original path extension

            * fix directory skipping

            * update deps

            * deflate64 and rarfile. cffi

            * Squashed commit of the following:

            commit 7af058987c6a36e1b523944af61d872c0b8a3b88
            Author: AJ Slater <aj@slater.net>
            Date:   Sun May 14 15:34:06 2023 -0700

                don't rar if no unrar

            * remove unrar.cffi support

            * update deps and lint

            * improve cwebp params

            * lint

            * update deps

            * Squashed commit of the following:

            commit 70ec98237334b5ead1ac2bcb1df8d44acb27837a
            Author: AJ Slater <aj@slater.net>
            Date:   Mon Jan 15 20:59:45 2024 -0800

                webp: -m 6, -q 100 for both lossy and lossless

            commit b31880a5c25d4792d4da45670e07b7d3d98f4842
            Author: AJ Slater <aj@slater.net>
            Date:   Mon Jan 15 19:57:58 2024 -0800

                update deps and lint

            commit bcb77803b8875636093937f015fae8b4a7755370
            Author: AJ Slater <aj@slater.net>
            Date:   Wed Aug 16 18:33:28 2023 -0700

                update deps and lint

            commit d0062cbee30504aeb83c8e4cfedf7fc053e7cb8c
            Author: AJ Slater <aj@slater.net>
            Date:   Mon Jul 10 13:40:10 2023 -0700

                use prettier plugins

            commit b3aa384a5618a2b27d6e912efcb2c2cacceacc01
            Author: AJ Slater <aj@slater.net>
            Date:   Mon Jul 10 11:33:23 2023 -0700

                update deps and add more eslint plugins. add first step of converge option

            * alphabetize macOS deps

            * fix non zero exit code on success

            * remove webp lossy optimizing. it wasn't

            * mac tests pass. remove unfinished converge stuff. add near_lossless to webp

            * update to mozjpeg 4.1.1 for testing

            * use mantic manticore for testing

            * fix linux test sizes

            * fix more linux tests

            * fix png to webp linux size

            * fix webp size for linux

            * penultimate linux webp size fix

            * possibly final linux test fix

            * version is actually 3.3.7

            * remove cruft

            * remove converge vestiges from config

            * lint

        commit cb56ee32665a1555d7075c70c15da95633802cc9
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jan 24 21:19:18 2024 -0800

            lint

        commit e5751bebd2ddbfdfd7228595392d2ec219555870
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jan 24 21:18:50 2024 -0800

            remove converge vestiges from config

        commit 23befb50dc6ec294368ecf901617cf1e9253b42b
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jan 24 21:18:42 2024 -0800

            remove cruft

        commit 42eb827001a81e6c52b5272ed670bd44e8bade5b
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jan 24 21:18:28 2024 -0800

            version is actually 3.3.7

        commit 13607e0e49ecbf5eaffae698403edc8bc5837587
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jan 24 21:10:31 2024 -0800

            possibly final linux test fix

        commit f7c357be73a4fdf3fb0f65de179666903e7aa6cc
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jan 24 20:49:40 2024 -0800

            penultimate linux webp size fix

        commit ea06037de39ab4cb8443b173d6688acd91a75ab6
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jan 24 20:13:20 2024 -0800

            fix webp size for linux

        commit 9c9dc0281f655ccad3726ac81cc027d801321f3a
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jan 24 19:47:26 2024 -0800

            fix png to webp linux size

        commit b208220a9d057e62b33c4a1389e5c96e5d35a680
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jan 24 19:42:35 2024 -0800

            fix more linux tests

        commit 651d205f7e56cff8fe424a4619dfb20f58ae2823
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jan 24 19:35:14 2024 -0800

            fix linux test sizes

        commit d2c4490a877e90b91360ea6971e27dd900eb2bfe
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jan 24 19:26:49 2024 -0800

            use mantic manticore for testing

        commit 57c217b722b18e8fa67447adeecfd2a1cf21ca11
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jan 24 19:26:39 2024 -0800

            update to mozjpeg 4.1.1 for testing

        commit 83bd34d3f6883cd5a42114ee5ac289fe41ba0bb9
        Author: AJ Slater <aj@slater.net>
        Date:   Wed Jan 24 19:21:37 2024 -0800

            mac tests pass. remove unfinished converge stuff. add near_lossless to webp

        * make webp_animated a container again, but use PIL for demux and remux, remove BEST_ONLY cruft

        * add animated png handler and generic animated image handler

        * bump news

        * update deps

        * pngout docs

        * fix phrasing in readme

        * add warning to readme

        * remove pngout from default homebrew instructions

        * move near_lossless into WebPLossess handler

        * more info in README about pngout

        * reorder strings

        * activate apng conversion for animated gif

        * no traceback for ConfigError

        * move pil2png up to image handler

        * rename PIL2_ARGS to PIL2_KWARGS

        * Rename all caps handlers to Capitalized for regularity

        * update deps

        * Squashed commit of the following:

        commit 2de7b0947f8cfcb95d34f5687acd9dbef016dbcf
        Author: AJ Slater <aj@slater.net>
        Date:   Fri Jan 26 00:10:14 2024 -0800

            remove optional multihread_flags

        commit 0f0b04ac0f834de26d2dd52ed2942c47c58b5da3
        Author: AJ Slater <aj@slater.net>
        Date:   Thu Jan 25 23:45:34 2024 -0800

            optional multithreding for large and small loads

        * replace converible FORMAT_STR constants with ones from PIL

        * speling CONVERTABLE to CONVERTIBLE

        * remove cruft

        * remove configurable superclass

        * move ReportInfo into stats. move PathInfo and is_path_ignored into path.py

        * fix import

        * label sections and private consts in config module

        * move handlers/configurible to formats

        * make webp_animated depend on png a bit

        * refactor formats module

        * reorder functions

        * refactor builing a set

        * label code sections

        * remove cruft

        * use subviews in config for brevity

        * more expressive verbose timestamp config logging

        * big fixes for README and proper listing of formats

        * optional near_lossless for webp

        * update deps

        * simplify import

        * MPO support

        * --preserve option

        * lint

        * don't run pil2png if already png

        * update deps

        * fix tests

        * fix tests for png

        * Squashed commit of the following:

        commit d829ef62264b63d882b63ca6263f0ba2247cbc6d
        Author: AJ Slater <aj@slater.net>
        Date:   Tue Jan 30 20:24:56 2024 -0800

            replace external oxipng, opting & pil png optimizer with pyoxipng

        commit 61d4285d1a76c53f96ef8270afaecb7d319252b9
        Merge: 7bb21c7 77ff587
        Author: AJ Slater <aj@slater.net>
        Date:   Tue Jan 30 18:18:41 2024 -0800

            Merge branch 'picopt4' into picopt4-oxipng

        commit 7bb21c70ccffb41f4dabbbda70e09da3b56fc769
        Author: AJ Slater <aj@slater.net>
        Date:   Tue Jan 30 18:13:46 2024 -0800

            oxipng

        * Squashed commit of the following:

        commit 56c395dcb2465d51f7ddd665dc34d77295c5909d
        Author: AJ Slater <aj@slater.net>
        Date:   Mon Feb 12 16:41:43 2024 -0800

            update deps

        commit fc3746746536818196606d5d9a3e66246f7f12b5
        Author: AJ Slater <aj@slater.net>
        Date:   Mon Feb 12 16:37:20 2024 -0800

            simplify _is_older_than walk method'

        commit 2259cacd905a3ebbd5936952fbc05cb4c2e2bcda
        Author: AJ Slater <aj@slater.net>
        Date:   Mon Feb 12 16:37:03 2024 -0800

            clear path_info original data asap for containers

        commit 4337bddd273800059f9d4a7bb9fabbe4a1de5bcb
        Author: AJ Slater <aj@slater.net>
        Date:   Mon Feb 12 16:35:55 2024 -0800

            use is_contianer_child method

        commit e4bb8fb3888fbb766f960d54b12a2629bc62f369
        Author: AJ Slater <aj@slater.net>
        Date:   Mon Feb 12 16:35:30 2024 -0800

            clear data method for path. is_container_child method for path

        commit e4f908a8e2dba9da2f1a399f7f3e457cc01f50cf
        Author: AJ Slater <aj@slater.net>
        Date:   Mon Feb 12 15:19:40 2024 -0800

            make buffer method private in path

        commit 5b7ab1091988214b0d880e83ac9fb4e4e64477cf
        Author: AJ Slater <aj@slater.net>
        Date:   Mon Feb 12 14:44:02 2024 -0800

            close input_buffer asap

        commit cd3ab541601fbfffe5da3bda17226524a751b299
        Author: AJ Slater <aj@slater.net>
        Date:   Mon Feb 12 14:43:52 2024 -0800

            minort optimization

        commit 4b2c289e6dc5d326d524519f16e813caf87fb678
        Author: AJ Slater <aj@slater.net>
        Date:   Mon Feb 12 13:45:13 2024 -0800

            colocate tmp files with container

        commit 7093e89fada545ae74e27a8f6b69a8a64837c108
        Author: AJ Slater <aj@slater.net>
        Date:   Mon Feb 12 12:52:24 2024 -0800

            update deps

        commit 7a2d25c4b23245a3e90cd8c5f836580343198c2f
        Author: AJ Slater <aj@slater.net>
        Date:   Sun Feb 11 23:51:17 2024 -0800

            don't copy files more than we have to for non-streaming external programs like cwebp

        commit 4e2101947bc2ce19f540aae46492a202e0318a3d
        Author: AJ Slater <aj@slater.net>
        Date:   Sun Feb 11 14:41:27 2024 -0800

            don't use a tmp file for cwebp input when we don't need to

        commit 4fa37bec390a0980584d5c93b94c6cab4cf38386
        Author: AJ Slater <aj@slater.net>
        Date:   Sat Feb 10 17:18:44 2024 -0800

            Pass filename or file buffer to detection and initial optimize program to store less in memory. Buffers get passed around handlers instead of bytes. Pillow agument utilities take buffers as input.

        commit 48dbe755872dcdb0e501dff73dd88d9e5579de10
        Author: AJ Slater <aj@slater.net>
        Date:   Sat Feb 10 02:57:41 2024 -0800

            better ignore cli help

        commit ddaa2179ba7d74231008dd15a7de36a62e02563e
        Author: AJ Slater <aj@slater.net>
        Date:   Fri Feb 9 12:27:58 2024 -0800

            expidite frame checking even more

        commit 08e24a77a695323b1aee4ece1cca0d1fdbde55c7
        Author: AJ Slater <aj@slater.net>
        Date:   Fri Feb 9 12:26:05 2024 -0800

            make animated frame detection a little smoother

        commit 7725d520fbf871c8366ed6b5345bd2c44a3c94f2
        Author: AJ Slater <aj@slater.net>
        Date:   Thu Feb 8 17:14:43 2024 -0800

            lint

        commit 4f713eddb84e0e00cc9169bd3a8c0d441ccf7d28
        Author: AJ Slater <aj@slater.net>
        Date:   Thu Feb 8 17:14:38 2024 -0800

            comments

        commit cd86affcc274f8ccead84f70760c6ffc4577e2ad
        Author: AJ Slater <aj@slater.net>
        Date:   Thu Feb 8 17:10:51 2024 -0800

            simplify pillow methods

        commit 6da8505213c290a14d6e472ea6d263cb6d227552
        Author: AJ Slater <aj@slater.net>
        Date:   Thu Feb 8 16:29:34 2024 -0800

            working in memory picopt. unoptimized. big revisions to PathInfo.

        commit 0ad1bee4f690ac210e20cbe93a4e4b70b9fe3601
        Author: AJ Slater <aj@slater.net>
        Date:   Thu Feb 8 16:29:18 2024 -0800

            working in memory picopt. unoptimized. big revisions to PathInfo.

        commit 86031556bd3b0414e11109829e2c0b80c55fbd1c
        Author: AJ Slater <aj@slater.net>
        Date:   Thu Feb 8 15:27:55 2024 -0800

            update deps

        * clearer logging for bigger than files. change the ReportStats constructor a bit.

        * SVG no longer optimized by default

        * remove comment cruft

        * better xmp support

        * some comments in the readme about the utility of external programs

        * remove comment from README

        * remove cruft

        * move container check

        * remove cruft

        * consolidate error handling and reporting for image and container

        * longer fuller names for ouput

        * remove todo, uneccissary

        * refine comment

        * reduce complexity of config method

        * simplify complexity of cleanup_after optimize and consolidate container path printing delimeter

        * move jpeg get xmp to pillow module

        * remove overzealous exhaustive near lossless feature

        * cleaner error messages for bad input

        * upgrade to eslint flat config. disable eslint-plugin-import until it works again"

        * update eslint.confg.js, lint markdown more

        * fix clean up working files method in walk

        * test internal mpo converter

        * clean up native xmp extraction code

        * add comment

        * move jpeg bit crunching all into pillow directory

        * set version to alpha0

        * pre-release circleci

        * update test numbers for linux

        * fix testts for linux

        * old cwebp doesn't accept some tiffs?

        * fix tests for linux

        * consolidate test for images that are identitcal on all platforms, also fix some for 22.04 ubuntu

        * switch for minimum cwebp version

        * use an environ hack to make the mpo internal test work

        * disable-programs option fixes mpo test hack

        * remove obsolete platform specific test references

        * update cli help

        * fix finish totals math

        * better size related noop logging

        * update deps

        * fix container timestamp crash

        * bump version

        * remove redundant log phrase

        * don't throw out unoptimized data, use it for containers. destructive bug fixed

        * simplify stats constructor. indent container paths

        * update deps

        * fix report path for non replaced files

        * fix crash on zip or rar directory

        * bump version

        * fix epub test

        * clean up working path if noop

        * lint

        * rename zip filenames if file converts

        * bump version

        * update deps

        * sort files again

        * NEWS note about timestamp options change

        * update ubunut image for circelci

        * update treestamps dep

        * update treestamps. bump version to rc0

        * bump news for treestamps fix'

        * v4, update deps

        * reduce png zealousness add --png-max mode

        * a bit more clarity to the readme about MPO images and a spelling mistake.

        * update deps, eslintconfig. lint and typefix

        * lint

        * fix windows crash with mmap

        * bump version

        * update circleci machine image

        * Squashed commit of the following:

            remove a great deal of custom xmp & exif extraction and writing code, because Pillow 11 is better about this.
            fix error results stats

        * add fix to NEWS'

        * update deps

        * ignore lockfiles in prettier

        * remove bad jxl plugin addition. bump version

        * import README fixes from https://github.com/ajslater/picopt/pull/83

        * Squashed commit of the following:

        commit e967284ad75157c015eb917fc504ec0299c642bf
        Author: AJ Slater <aj@slater.net>
        Date:   Thu Oct 24 01:26:41 2024 -0700

            update deps, update ruff rules, lint and format

        * ignore PERF203

        * env upgrade script

        * update deps. re-add old eslint plugins, add eslint plugin comment.

        * update eslint

        * update ubuntu in docker

        * update deps and eslint config

        * update deploy image

        * fix copy in dockerfile

        * comment out useless test condition

        * update deps

        * update deps

        * update image

        * update deps. lint changes. darwin test size changes

        * poetry to uv

        * make warnings yellow

        * update deps including treestamps and termcolor"

        * fix type hinting for new termcolor

        * finish changing test option to dry_run

        * finish changing test option to dry_run

        * remove extraneous prints from test

        * update to working treestamps

        * update dry_run option for treestamps

        * minor clarity refactor

        * move png_animated into png file

        * adjus file sizes for animated gifs getting optimized with optipng. and accept bigger files in one test

        * bump version and adjust news

        * fix build dockerfile

        * fix uv sync in dockerfile

        * lint

        * fix docker compose command

        * fix debian sources uri

        * fix file size for linux

        * update animated png size for linux

        * change bmp to webp size for test

        * update pnm to webp size for bookworm

        * gif size test bookworm

        * pre optimized webp size

        * tif webp size

        * remove erroneous final publish command

        * fix tests for sets and mpts in treestamps

        * refactor archive code into dir. add sevenzip and tar archives

        * no_convert tests for tar & 7z

        * fix containers test

        * more generic archivinfo handling. working sevenzip writing, but the size varies by a bytegit diff picopt/handlers/archive/!

        * fix tests for 7z variablity

        * don't skip directories

        * return empty bytes for 7z dir data. use archiveinfo for filename

        * fix PathInfo to consider archiveinfo names first

        *…
commit 0c2b3790c9611f35381d7159c6dea2295e8eb51e
Author: AJ Slater <aj@slater.net>
Date:   Thu Jun 26 15:01:52 2025 -0700

    internal mozjpeg works, remove external jpeg methods

commit 2a79892c44daf358901c5b1afdac7297e73cbe0e
Merge: 3a01d55 a793e0b
Author: AJ Slater <aj@slater.net>
Date:   Thu Jun 26 14:22:38 2025 -0700

    Merge branch 'develop' into mozjpeg-lossless-optimization

commit 3a01d55856896d2e4fe94d56cdb60dfd00ffe640
Author: AJ Slater <aj@slater.net>
Date:   Wed Jun 11 15:14:40 2025 -0700

    use internal mozjpeg. currently broken on mac
ajslater and others added 29 commits May 28, 2026 11:11
Optimizing large archives (e.g. multi-GB comic books) could exhaust RAM
and get the process OOM-killed. Each container holds its whole archive,
all decompressed members, the optimized copies, and the output buffer in
memory at once, replicated into each parallel worker, and nothing bounded
the in-flight total beyond a future-count cap.

Give the scheduler a memory budget: estimate each top-level archive's peak
resident memory (~3x its on-disk size) and only admit a new one while it
fits the budget, with a forward-progress guarantee so a single archive
larger than the whole budget still runs (alone). The gate scans past
budget-blocked items so in-flight work still frees the budget, avoiding
both deadlock and head-of-line blocking.

Add a --memory-limit option (e.g. 8G, 512M) that sets the budget as an
approximate peak-memory target; the default is two-thirds of detected RAM.
It is excluded from the timestamps config so it never invalidates stamps.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Convert mypy-style `# type: ignore[arg-type]` comments in the scheduler
memory test to the project's paired `# pyright: ignore  # ty: ignore`
convention (neither checker honors mypy-style comments), and make the
`_charge_info` match exhaustive with an explicit `case _` for the
intentionally-exempt RepackJob path.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Write optimized results to a sibling temp file and atomically replace
  the original; a crash, OOM-kill, or full disk mid-write can no longer
  destroy the user's file.
- Keep members whose optimization errored (and nested containers whose
  repack failed) in the repacked archive instead of silently dropping them.
- Open nested archives from their in-memory buffer; archives inside
  archives previously always failed to unpack with FileNotFoundError.
- Discarded conversion results (bigger output, dry-run) no longer stat a
  never-written path and are reported as skipped instead of errors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgZ7kxNgvEWuSEKeTJMJcH
Extract per-tier tool picking into _pick_tier_tool and drop the
redundant empty-pipeline guard; behavior is unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgZ7kxNgvEWuSEKeTJMJcH
- A member that fails format detection (e.g. a decompression bomb) is
  recorded as one error and passed through to the repacked archive
  instead of aborting the entire run and losing all timestamps.
- Directories and containers with errored children no longer get
  timestamps; previously the compacted dir stamp covered failed files
  so they were silently skipped on every subsequent run.
- Failed top-level containers now notify their directory tracker, which
  previously leaked and blocked ancestor timestamp finalization.
- Nested container repacks hydrate through the parent handler so
  conversion renames (e.g. inner CBR -> CBZ) are no longer lost.
- Requested container conversions repack even when every member was
  already optimized; CBR -> CBZ previously did nothing in that case.
- Ignore patterns now respect filesystem case sensitivity (the flag
  was inverted), timestamps files are matched by basename, and FIFOs/
  sockets are skipped instead of blocking the walk forever.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgZ7kxNgvEWuSEKeTJMJcH
- Archive comments (zip, rar) are read during walk and written back on
  repack; _set_comment previously had no call site so comments were
  always destroyed (CBZ comments commonly hold ComicBookInfo tags).
- Repack preserves original member order via a walk-time archive_index
  on PathInfo; the optimized-contents set previously scrambled order,
  which broke EPUB's mimetype-first requirement and reproducibility.
- Member times before 1980 (or missing) are clamped to the zip epoch
  instead of crashing zipfile on conversion.
- Converted members choose compression by content: text deflates,
  already-compressed image formats are stored. Previously rar/tar/7z
  conversions wrote every member uncompressed, and --strip-metadata
  wastefully deflated incompressible images.
- Legacy zip member names that are really UTF-8 misread as CP437 are
  repaired at repack instead of being re-encoded as mojibake forever.
- Tar links survive repack: symlinks/hardlinks keep their type, target,
  and zero size; link targets are no longer duplicated into link
  entries (or crashes on external targets).
- 7z member mtimes are restored after repack; py7zr's writef API stamps
  members with now() and offers no public override.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgZ7kxNgvEWuSEKeTJMJcH
- Config-file and env values for boolean options and verbose are no
  longer silently shadowed: un-passed CLI flags now default to None,
  which confuse drops, so lower layers stay visible. CLI flags that ARE
  passed still override everything.
- -I/--no-default-ignores without -i no longer aborts at startup (the
  computed ignore patterns are validly None).
- Unparseable --memory-limit values abort with a clean config error
  instead of silently falling back to auto, and unparseable --after
  values no longer dump a raw dateutil traceback. Timezone-aware
  --after values are interpreted correctly instead of as local time.
- picopt doctor counts requirements per pipeline tier instead of per
  tool; tools within a tier are alternatives, so healthy installs no
  longer report missing-required tools and exit 1.
- Lowercase format lists are accepted for -x and -c exactly as for -f.
- README no longer documents the removed PICOPT_ENABLE_IMG2WEBP
  environment variable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgZ7kxNgvEWuSEKeTJMJcH
- is_lossless() parses the RIFF chunk structure instead of searching
  for byte strings. The old code searched the whole file via mmap for
  filesystem input (metadata bytes could fake losslessness) but only
  128 bytes for in-memory input (a large ICC/EXIF chunk before VP8L
  misdetected lossless in-archive WebPs as lossy). It also closed the
  caller's buffer and crashed mmap on empty files.
- png_bit_depth() returns None for truncated PNGs instead of a fake
  0 depth.
- run_ext_fs() cleans up spilled temp files when the external tool
  fails instead of leaking them.
- --preserve survives chown permission failures (non-root users) and
  still restores mode and mtime instead of reporting the whole
  optimization as an error.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgZ7kxNgvEWuSEKeTJMJcH
- Repacking preserves PDF encryption: owner-password-restricted PDFs
  open without a password and were silently saved decrypted. qpdf
  cannot decode streams while preserving encryption, so encrypted PDFs
  get the weaker (but protected) rewrite.
- Optimized JPEGs are written back with their original /DecodeParms
  (e.g. /ColorTransform), which pikepdf's write() otherwise drops.
- Signature detection also looks for /Type /Sig objects, catching
  signed PDFs from producers that never set the AcroForm SigFlags bit.
- svgo runs with an explicit config instead of the default preset:
  removeViewBox is disabled (it breaks responsive scaling), and title/
  desc/metadata elements follow the --strip-metadata flag instead of
  the preset's whims.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgZ7kxNgvEWuSEKeTJMJcH
- walk_dir, the progress pre-count, and the legacy timestamp import
  track visited directories by (st_dev, st_ino); symlink cycles and
  duplicate links are walked once instead of recursing until the
  filesystem errors (or, in the pre-count, forever).
- The legacy timestamp import skips unreadable paths with a warning
  instead of crashing the whole run at startup, and matches ignore
  patterns with the same case-sensitivity fix as the walk skipper.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgZ7kxNgvEWuSEKeTJMJcH
ContainerHandler.walk() always executes in a worker process, but
__getstate__ dropped the Grovestamps (unpicklable ruamel state) it
needs, so member entry-mtime skipping, in-archive .picopt_treestamps
consumption, and the timestamps_ignore_archive_entry_mtimes option
were all dead code.

Archive handlers now carry an ArchiveStamps slice instead: the tree's
picklable config plus its dump_dict() serialization (the same
config-headed mapping treestamps round-trips through disk). A real,
detached Treestamps is rebuilt lazily in the worker — never set() or
dumped, so it never touches the WAL — preserving full treestamps
semantics: ancestor-max lookups and config-checked loading of stamp
files found inside archives.

Members whose entry mtimes predate the archive's stamp are now
noop-copied instead of re-optimized when a stamped archive is
modified, stamp files inside archives are consumed and dropped on
repack, and -E disables entry-mtime skipping as documented.
timestamps_ignore_archive_entry_mtimes joins TIMESTAMPS_CONFIG_KEYS
since flipping it changes which members get optimized.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgZ7kxNgvEWuSEKeTJMJcH
- Archive member format detection (PIL open + verify per member) moves
  into the unpack workers via predetect_format(), which caches onto
  PathInfo; the scheduler thread previously decoded every member of
  every archive serially.
- The progress pre-count no longer re-walks the whole tree when the
  progress bar is disabled (-q).
- Top-level results no longer pickle their optimized bytes back to the
  main process just to be discarded; only in-container entries return
  data for their parent's repack.
- Items deferred by the memory gate wait in a FIFO gated queue retried
  head-first per tick instead of rescanning the entire ready queue on
  every completion (O(queue) per event under memory pressure).
- 7z archives extract all members in one pass; solid archives
  previously decompressed from the start for every single-target
  extract, O(n^2) over members. The extraction cache is dropped before
  the handler pickles back to the main process.
- Add bin/benchmark.py: wall-clock + per-run peak RSS harness over
  synthetic fixture corpora, for measuring future changes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgZ7kxNgvEWuSEKeTJMJcH
…patch

- The per-directory completion tracking and compacted timestamp writes
  move from the scheduler into walk/dir_timestamps.DirTimestamper; the
  scheduler delegates its begin/seal/cancel API.
- All five container pending-counter decrements route through one
  _child_done() method; _maybe_start_repack's state guards make it safe
  on every completion path.
- The staging-dir cleanup design is finally wired: handlers expose
  get_staging_dir(), the scheduler stores it on the node after unpack,
  and rollback/fail-fast/final cleanup actually remove worker tmp dirs.
  Animated-WebP frame directories previously leaked on cancellation.
- Reporter outcome dispatch is an explicit match instead of
  getattr(f"record_{kind}") string dispatch that failed silently on
  renames.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgZ7kxNgvEWuSEKeTJMJcH
plugins/webp.py (759 lines, five handlers, four pack strategies) becomes
plugins/webp/: const, tools, static, and animated modules with the
PLUGIN descriptor in __init__. Plugin discovery now accepts subpackages.

The CWebPTool.probe() -> IS_MODERN_CWEBP class-attribute side effect is
replaced by an is_modern flag on the shared, probed-once CWEBP_TOOL
singleton that WebPLossless's PIPELINE holds and both consuming handlers
read at construction time. The tools no longer import handler classes at
all — they duck-type on the args-provider methods — removing the
tool/handler import cycle the isinstance checks required.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgZ7kxNgvEWuSEKeTJMJcH
- plugins.pick_route_handler is the one routing decision: the factory
  uses it at runtime and config/handlers uses it to build the startup
  formats summary, replacing an 8-parameter re-derivation whose logic
  had already drifted from the factory's (it ignored empty-pipeline
  availability). The log can no longer disagree with the walk.
- PathInfo's class docstring documents the mutable-identity contract:
  instances cross the process boundary and are mutated by the scheduler
  after hydration, with cache invalidation owned by rename()/set_data().
- computed.handler_stages is structurally typed dict[type, tuple];
  the concrete Handler/Tool annotation is impossible because
  plugins.base imports settings and basedpyright's reportImportCycles
  counts even TYPE_CHECKING edges.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgZ7kxNgvEWuSEKeTJMJcH
probe() caches its ToolStatus per instance and concrete probes move to
_probe(). Tools are module singletons, so each external tool spawns its
--version subprocess once per process — a prerequisite for per-directory
config files, whose confuse rebuilds rerun the pipeline probe loop.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgZ7kxNgvEWuSEKeTJMJcH
Ported from nudebomb's implementation (same confuse + treestamps stack).

A .picopt.yaml placed in a target directory applies to that directory
and everything beneath it. Files are discovered from each processed
file's directory up to the CLI target root (never above it); deeper
directories win over shallower ones, and env vars and CLI options still
win over every directory file — implemented by rebuilding a fresh
confuse Configuration per unique directory chain through the extracted
_build_config layering core. DirConfig caches resolutions per directory
with an identity fast path when no config applies, and isolates
malformed files (logged once, recorded in stats, fall back to run-wide
settings). Run-mode keys (dry_run, list_only, timestamps) are pinned to
run-level values: a per-directory dry run with run-level timestamps
would stamp files that were never optimized.

Per-directory settings reach everything: guards (ignore/symlinks/
recurse) via per-directory skippers and the pre-count mirror, handlers
via the factory's settings parameter (formats/convert_to/bigger/
keep_metadata/... travel into workers), archive members by inheriting
their container's config (nesting inherits automatically), and repacks
run under the handler's own config. .picopt.yaml files are skipped as
optimization targets by basename.

With -t, a sha256 fingerprint of every .picopt.yaml under the targets
joins the treestamps program-config check, so editing, adding, or
removing a directory config re-processes its tree (over-invalidation,
never a wrong-skip).

New write flags, all validate-before-persist with round-trip YAML
merges that preserve comments and unrelated keys, written owner-only:
-w/--write-config (user config), -W/--write-dir-config (a .picopt.yaml
in each target directory), and --write-config-file PATH. Run-mode
flags and target paths are never persisted.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgZ7kxNgvEWuSEKeTJMJcH
- --fail-fast cancels every live top-level container and clears both
  scheduler queues on the first repack error; --fail-fast-container
  escalates an inner failure to its subtree root while leaving sibling
  top-level containers untouched; a leaf result arriving after its
  parent's cancellation is dropped without touching the parent's
  contents.
- Optimization converges: a second pass may only shrink files (the
  multi-tool png pipeline legitimately shaves another byte when one
  tool's output enables another) and every file reaches its fixed
  point by the third pass.
- Lossless paths are pixel-exact: png optimization, png-to-webp, and
  gif-to-png conversions decode to identical RGBA pixels.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgZ7kxNgvEWuSEKeTJMJcH
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgZ7kxNgvEWuSEKeTJMJcH
Fill in five user-facing fixes that landed since v6.5.2 but were absent
from the v6.6.0 entry: archive conversions recompress members by content,
--preserve survives non-root chown failures, temp files and animated-WebP
frame dirs are cleaned up on failure/cancellation, timezone-aware --after
is honored, and -I without -i no longer aborts at startup.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@ajslater
ajslater merged commit a7cd47f into main Jul 5, 2026
3 checks passed
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