From c7a3a67441644b41cb53718b670c1315d096e56a Mon Sep 17 00:00:00 2001 From: clover caruso Date: Thu, 10 Sep 2026 23:05:38 -0700 Subject: [PATCH] test: create native pages after Rust page removal and reopen cold Take the parent, all, features and leading-parent outputs of delete_pages_permanently, let OneNote 2010 create a titled page with a bold body in each section through COM, and reopen each natively saved section through a fresh cache. Every surviving page keeps its exact active revision through both native phases; the native page carries its title and body; the cold reopen changes only the section root's navigation metadata copies or nothing at all. tools/test_page_removal.py compares all eight captures with the Rust model and finds the native title once per hierarchy. Eight owned clones removed. Acceptance: evidence/m10/PAGE-MODEL.md. Assisted-by: claude-fable-5.1 --- .gitignore | 1 - corpus/page-lifecycle/removal/README.md | 12 ++ .../all/candidate/notebook/Lifecycle.one | Bin 0 -> 64904 bytes .../candidate/notebook/Open Notebook.onetoc2 | Bin 0 -> 4800 bytes .../all/followup-cold/commands.jsonl | 3 + .../all/followup-cold/format-differences.json | 1 + .../followup-cold/geometry-differences.json | 1 + .../all/followup-cold/machine.json | 1 + .../all/followup-cold/notebook/Lifecycle.one | Bin 0 -> 71048 bytes .../notebook/Open Notebook.onetoc2 | Bin 0 -> 4800 bytes .../all/followup-cold/pdf-format-checks.json | 1 + .../all/followup-cold/read/environment.json | 7 + .../all/followup-cold/read/hierarchy.xml | 2 + .../all/followup-cold/read/page-000.xml | 3 + .../all/followup-cold/read/payloads.json | 3 + .../rust-followup/all/followup-cold/run.json | 18 +++ .../all/followup-cold/scripts/cold.ps1 | 27 ++++ .../all/followup-cold/scripts/read.ps1 | 142 ++++++++++++++++++ .../all/followup-cold/source.json | 14 ++ .../all/followup-cold/table-autofit.json | 1 + .../all/followup-cold/teardown.json | 1 + .../rust-followup/all/followup/commands.jsonl | 4 + .../all/followup/format-differences.json | 1 + .../all/followup/geometry-differences.json | 1 + .../rust-followup/all/followup/machine.json | 1 + .../all/followup/native-title.txt | 1 + .../all/followup/notebook/Lifecycle.one | Bin 0 -> 71048 bytes .../followup/notebook/Open Notebook.onetoc2 | Bin 0 -> 4800 bytes .../all/followup/pdf-format-checks.json | 1 + .../all/followup/read/environment.json | 7 + .../all/followup/read/hierarchy.xml | 2 + .../all/followup/read/page-000.xml | 3 + .../all/followup/read/payloads.json | 3 + .../rust-followup/all/followup/run.json | 19 +++ .../all/followup/scripts/author.ps1 | 27 ++++ .../all/followup/scripts/cold.ps1 | 27 ++++ .../all/followup/scripts/read.ps1 | 142 ++++++++++++++++++ .../rust-followup/all/followup/source.json | 14 ++ .../all/followup/table-autofit.json | 1 + .../rust-followup/all/followup/teardown.json | 1 + .../features/candidate/notebook/Lifecycle.one | Bin 0 -> 132280 bytes .../candidate/notebook/Open Notebook.onetoc2 | Bin 0 -> 4800 bytes .../features/followup-cold/commands.jsonl | 3 + .../followup-cold/format-differences.json | 1 + .../followup-cold/geometry-differences.json | 1 + .../features/followup-cold/machine.json | 1 + .../followup-cold/notebook/Lifecycle.one | Bin 0 -> 140024 bytes .../notebook/Open Notebook.onetoc2 | Bin 0 -> 4800 bytes .../followup-cold/pdf-format-checks.json | 1 + .../followup-cold/read/environment.json | 7 + .../features/followup-cold/read/hierarchy.xml | 2 + .../features/followup-cold/read/page-000.xml | 21 +++ .../features/followup-cold/read/page-001.xml | 6 + .../features/followup-cold/read/page-002.xml | 3 + .../features/followup-cold/read/page-003.xml | 6 + .../features/followup-cold/read/page-004.xml | 46 ++++++ .../features/followup-cold/read/page-005.xml | 6 + .../features/followup-cold/read/page-006.xml | 9 ++ .../features/followup-cold/read/payloads.json | 3 + .../features/followup-cold/run.json | 18 +++ .../features/followup-cold/scripts/cold.ps1 | 27 ++++ .../features/followup-cold/scripts/read.ps1 | 142 ++++++++++++++++++ .../features/followup-cold/source.json | 14 ++ .../features/followup-cold/table-autofit.json | 1 + .../features/followup-cold/teardown.json | 1 + .../features/followup/commands.jsonl | 4 + .../features/followup/format-differences.json | 1 + .../followup/geometry-differences.json | 1 + .../features/followup/machine.json | 1 + .../features/followup/native-title.txt | 1 + .../features/followup/notebook/Lifecycle.one | Bin 0 -> 139520 bytes .../followup/notebook/Open Notebook.onetoc2 | Bin 0 -> 4800 bytes .../features/followup/pdf-format-checks.json | 1 + .../features/followup/read/environment.json | 7 + .../features/followup/read/hierarchy.xml | 2 + .../features/followup/read/page-000.xml | 3 + .../features/followup/read/page-001.xml | 6 + .../features/followup/read/page-002.xml | 21 +++ .../features/followup/read/page-003.xml | 46 ++++++ .../features/followup/read/page-004.xml | 6 + .../features/followup/read/page-005.xml | 9 ++ .../features/followup/read/page-006.xml | 6 + .../features/followup/read/payloads.json | 3 + .../rust-followup/features/followup/run.json | 19 +++ .../features/followup/scripts/author.ps1 | 27 ++++ .../features/followup/scripts/cold.ps1 | 27 ++++ .../features/followup/scripts/read.ps1 | 142 ++++++++++++++++++ .../features/followup/source.json | 14 ++ .../features/followup/table-autofit.json | 1 + .../features/followup/teardown.json | 1 + .../candidate/notebook/Lifecycle.one | Bin 0 -> 76440 bytes .../candidate/notebook/Open Notebook.onetoc2 | Bin 0 -> 4800 bytes .../followup-cold/commands.jsonl | 3 + .../followup-cold/format-differences.json | 1 + .../followup-cold/geometry-differences.json | 1 + .../leading-parent/followup-cold/machine.json | 1 + .../followup-cold/notebook/Lifecycle.one | Bin 0 -> 83640 bytes .../notebook/Open Notebook.onetoc2 | Bin 0 -> 4800 bytes .../followup-cold/pdf-format-checks.json | 1 + .../followup-cold/read/environment.json | 7 + .../followup-cold/read/hierarchy.xml | 2 + .../followup-cold/read/page-000.xml | 2 + .../followup-cold/read/page-001.xml | 4 + .../followup-cold/read/page-002.xml | 4 + .../followup-cold/read/page-003.xml | 2 + .../followup-cold/read/page-004.xml | 2 + .../followup-cold/read/page-005.xml | 3 + .../followup-cold/read/page-006.xml | 4 + .../followup-cold/read/page-007.xml | 4 + .../followup-cold/read/page-008.xml | 4 + .../followup-cold/read/payloads.json | 3 + .../leading-parent/followup-cold/run.json | 18 +++ .../followup-cold/scripts/cold.ps1 | 27 ++++ .../followup-cold/scripts/read.ps1 | 142 ++++++++++++++++++ .../leading-parent/followup-cold/source.json | 14 ++ .../followup-cold/table-autofit.json | 1 + .../followup-cold/teardown.json | 1 + .../leading-parent/followup/commands.jsonl | 4 + .../followup/format-differences.json | 1 + .../followup/geometry-differences.json | 1 + .../leading-parent/followup/machine.json | 1 + .../leading-parent/followup/native-title.txt | 1 + .../followup/notebook/Lifecycle.one | Bin 0 -> 83640 bytes .../followup/notebook/Open Notebook.onetoc2 | Bin 0 -> 4800 bytes .../followup/pdf-format-checks.json | 1 + .../followup/read/environment.json | 7 + .../followup/read/hierarchy.xml | 2 + .../leading-parent/followup/read/page-000.xml | 4 + .../leading-parent/followup/read/page-001.xml | 4 + .../leading-parent/followup/read/page-002.xml | 4 + .../leading-parent/followup/read/page-003.xml | 2 + .../leading-parent/followup/read/page-004.xml | 3 + .../leading-parent/followup/read/page-005.xml | 2 + .../leading-parent/followup/read/page-006.xml | 4 + .../leading-parent/followup/read/page-007.xml | 4 + .../leading-parent/followup/read/page-008.xml | 2 + .../followup/read/payloads.json | 3 + .../leading-parent/followup/run.json | 19 +++ .../followup/scripts/author.ps1 | 27 ++++ .../leading-parent/followup/scripts/cold.ps1 | 27 ++++ .../leading-parent/followup/scripts/read.ps1 | 142 ++++++++++++++++++ .../leading-parent/followup/source.json | 14 ++ .../followup/table-autofit.json | 1 + .../leading-parent/followup/teardown.json | 1 + .../parent/candidate/notebook/Lifecycle.one | Bin 0 -> 56688 bytes .../candidate/notebook/Open Notebook.onetoc2 | Bin 0 -> 4800 bytes .../parent/followup-cold/commands.jsonl | 3 + .../followup-cold/format-differences.json | 1 + .../followup-cold/geometry-differences.json | 1 + .../parent/followup-cold/machine.json | 1 + .../followup-cold/notebook/Lifecycle.one | Bin 0 -> 63360 bytes .../notebook/Open Notebook.onetoc2 | Bin 0 -> 4800 bytes .../followup-cold/pdf-format-checks.json | 1 + .../followup-cold/read/environment.json | 7 + .../parent/followup-cold/read/hierarchy.xml | 2 + .../parent/followup-cold/read/page-000.xml | 4 + .../parent/followup-cold/read/page-001.xml | 4 + .../parent/followup-cold/read/page-002.xml | 4 + .../parent/followup-cold/read/page-003.xml | 2 + .../parent/followup-cold/read/page-004.xml | 4 + .../parent/followup-cold/read/page-005.xml | 2 + .../parent/followup-cold/read/page-006.xml | 3 + .../parent/followup-cold/read/page-007.xml | 4 + .../parent/followup-cold/read/page-008.xml | 2 + .../parent/followup-cold/read/payloads.json | 3 + .../parent/followup-cold/run.json | 18 +++ .../parent/followup-cold/scripts/cold.ps1 | 27 ++++ .../parent/followup-cold/scripts/read.ps1 | 142 ++++++++++++++++++ .../parent/followup-cold/source.json | 14 ++ .../parent/followup-cold/table-autofit.json | 1 + .../parent/followup-cold/teardown.json | 1 + .../parent/followup/commands.jsonl | 4 + .../parent/followup/format-differences.json | 1 + .../parent/followup/geometry-differences.json | 1 + .../parent/followup/machine.json | 1 + .../parent/followup/native-title.txt | 1 + .../parent/followup/notebook/Lifecycle.one | Bin 0 -> 62856 bytes .../followup/notebook/Open Notebook.onetoc2 | Bin 0 -> 4800 bytes .../parent/followup/pdf-format-checks.json | 1 + .../parent/followup/read/environment.json | 7 + .../parent/followup/read/hierarchy.xml | 2 + .../parent/followup/read/page-000.xml | 4 + .../parent/followup/read/page-001.xml | 2 + .../parent/followup/read/page-002.xml | 2 + .../parent/followup/read/page-003.xml | 4 + .../parent/followup/read/page-004.xml | 2 + .../parent/followup/read/page-005.xml | 3 + .../parent/followup/read/page-006.xml | 4 + .../parent/followup/read/page-007.xml | 4 + .../parent/followup/read/page-008.xml | 4 + .../parent/followup/read/payloads.json | 3 + .../rust-followup/parent/followup/run.json | 19 +++ .../parent/followup/scripts/author.ps1 | 27 ++++ .../parent/followup/scripts/cold.ps1 | 27 ++++ .../parent/followup/scripts/read.ps1 | 142 ++++++++++++++++++ .../rust-followup/parent/followup/source.json | 14 ++ .../parent/followup/table-autofit.json | 1 + .../parent/followup/teardown.json | 1 + .../removal/rust-followup/provenance.json | 77 ++++++++++ crates/onestore/tests/page_deletion.rs | 78 +++++++++- tools/codex_usage_report.example.json | 18 --- tools/codex_usage_report.mjs | 129 ---------------- tools/native/page-removal-followup.ps1 | 27 ++++ tools/test_page_removal.py | 19 +++ tools/zenith-locks | 132 ---------------- 205 files changed, 2424 insertions(+), 281 deletions(-) create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/candidate/notebook/Lifecycle.one create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/candidate/notebook/Open Notebook.onetoc2 create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup-cold/commands.jsonl create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup-cold/format-differences.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup-cold/geometry-differences.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup-cold/machine.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup-cold/notebook/Lifecycle.one create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup-cold/notebook/Open Notebook.onetoc2 create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup-cold/pdf-format-checks.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup-cold/read/environment.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup-cold/read/hierarchy.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup-cold/read/page-000.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup-cold/read/payloads.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup-cold/run.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup-cold/scripts/cold.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup-cold/scripts/read.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup-cold/source.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup-cold/table-autofit.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup-cold/teardown.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/commands.jsonl create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/format-differences.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/geometry-differences.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/machine.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/native-title.txt create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/notebook/Lifecycle.one create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/notebook/Open Notebook.onetoc2 create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/pdf-format-checks.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/read/environment.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/read/hierarchy.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/read/page-000.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/read/payloads.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/run.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/scripts/author.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/scripts/cold.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/scripts/read.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/source.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/table-autofit.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/all/followup/teardown.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/candidate/notebook/Lifecycle.one create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/candidate/notebook/Open Notebook.onetoc2 create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/commands.jsonl create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/format-differences.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/geometry-differences.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/machine.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/notebook/Lifecycle.one create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/notebook/Open Notebook.onetoc2 create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/pdf-format-checks.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/environment.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/hierarchy.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-000.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-001.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-002.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-003.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-004.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-005.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-006.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/payloads.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/run.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/scripts/cold.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/scripts/read.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/source.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/table-autofit.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup-cold/teardown.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/commands.jsonl create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/format-differences.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/geometry-differences.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/machine.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/native-title.txt create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/notebook/Lifecycle.one create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/notebook/Open Notebook.onetoc2 create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/pdf-format-checks.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/read/environment.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/read/hierarchy.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-000.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-001.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-002.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-003.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-004.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-005.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-006.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/read/payloads.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/run.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/scripts/author.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/scripts/cold.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/scripts/read.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/source.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/table-autofit.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/features/followup/teardown.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/candidate/notebook/Lifecycle.one create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/candidate/notebook/Open Notebook.onetoc2 create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/commands.jsonl create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/format-differences.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/geometry-differences.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/machine.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/notebook/Lifecycle.one create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/notebook/Open Notebook.onetoc2 create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/pdf-format-checks.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/environment.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/hierarchy.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-000.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-001.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-002.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-003.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-004.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-005.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-006.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-007.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-008.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/payloads.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/run.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/scripts/cold.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/scripts/read.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/source.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/table-autofit.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/teardown.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/commands.jsonl create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/format-differences.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/geometry-differences.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/machine.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/native-title.txt create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/notebook/Lifecycle.one create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/notebook/Open Notebook.onetoc2 create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/pdf-format-checks.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/environment.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/hierarchy.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-000.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-001.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-002.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-003.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-004.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-005.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-006.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-007.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-008.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/payloads.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/run.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/scripts/author.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/scripts/cold.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/scripts/read.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/source.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/table-autofit.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/teardown.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/candidate/notebook/Lifecycle.one create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/candidate/notebook/Open Notebook.onetoc2 create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/commands.jsonl create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/format-differences.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/geometry-differences.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/machine.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/notebook/Lifecycle.one create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/notebook/Open Notebook.onetoc2 create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/pdf-format-checks.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/environment.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/hierarchy.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-000.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-001.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-002.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-003.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-004.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-005.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-006.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-007.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-008.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/payloads.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/run.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/scripts/cold.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/scripts/read.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/source.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/table-autofit.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/teardown.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/commands.jsonl create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/format-differences.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/geometry-differences.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/machine.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/native-title.txt create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/notebook/Lifecycle.one create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/notebook/Open Notebook.onetoc2 create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/pdf-format-checks.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/read/environment.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/read/hierarchy.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-000.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-001.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-002.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-003.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-004.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-005.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-006.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-007.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-008.xml create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/read/payloads.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/run.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/scripts/author.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/scripts/cold.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/scripts/read.ps1 create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/source.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/table-autofit.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/parent/followup/teardown.json create mode 100644 corpus/page-lifecycle/removal/rust-followup/provenance.json delete mode 100644 tools/codex_usage_report.example.json delete mode 100644 tools/codex_usage_report.mjs create mode 100644 tools/native/page-removal-followup.ps1 delete mode 100755 tools/zenith-locks diff --git a/.gitignore b/.gitignore index b10b426374d528986f027a4f06c106c8df415b02..a394d270c02acc5b4765500f48d5bac581bdab39 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ /corpus/private/ /corpus/recovered/ /evidence/ -/.DS_Store __pycache__/ /fuzz/target/ /fuzz/corpus/ diff --git a/corpus/page-lifecycle/removal/README.md b/corpus/page-lifecycle/removal/README.md index 2d227802946bcfc09ffb98f479ff08fe9fd28edf..05edb05202ecc5222108986c5e689f8eda4eef92 100644 --- a/corpus/page-lifecycle/removal/README.md +++ b/corpus/page-lifecycle/removal/README.md @@ -50,3 +50,15 @@ failure. Decode the input hex into a new writable corpus and set the platform path separator, then use `cargo +nightly fuzz run document CORPUS -- -seed=1993 -max_total_time=120 -timeout=30 -runs=20000`. The target also retains its built-in synthetic sources. This is bounded reader testing of these inputs. + +`rust-followup` takes four Rust `delete_pages_permanently` outputs (`parent`, `all`, +`features`, `leading-parent`) and lets OneNote 2010 create a titled page with a bold +body in each section through COM (`tools/native/page-removal-followup.ps1`), then +reopens the natively saved section through a fresh cache. The Rust test +`native_pages_created_after_rust_removal_reopen_cold` requires every surviving page +to keep its exact active revision through both native phases, the new page to carry +the native title and body, and the cold reopen to change no object space. +`tools/test_page_removal.py` compares both captures' native XML with the Rust model +and finds the native title exactly once in each hierarchy. Regenerate the candidates +with `ONESTORE_PAGE_REMOVAL_OUTPUT` on the removal reference test, then run the +runner with `--author` into `followup` and cold into `followup-cold`. diff --git a/corpus/page-lifecycle/removal/rust-followup/all/candidate/notebook/Lifecycle.one b/corpus/page-lifecycle/removal/rust-followup/all/candidate/notebook/Lifecycle.one new file mode 100644 index 0000000000000000000000000000000000000000..c62907c99edfd451551a13ca4a9765a6863b4ecb GIT binary patch literal 64904 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 literal 0 HcmV?d00001 diff --git a/corpus/page-lifecycle/removal/rust-followup/all/candidate/notebook/Open Notebook.onetoc2 b/corpus/page-lifecycle/removal/rust-followup/all/candidate/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..dd1d819eba785a38d9e40b7e5756d54aabd53423 GIT binary patch literal 4800 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 + diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/read/page-000.xml b/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..136e228354ab47498675e05b15e035c6839cae71 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/read/page-000.xml @@ -0,0 +1,3 @@ + +Native body after Rust removal.]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/read/payloads.json b/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/run.json b/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/run.json new file mode 100644 index 0000000000000000000000000000000000000000..471b5efd98a69d8a966cc1c208ed2283f0f0bf1e --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/private/tmp/page-removal/run/all/followup/notebook", + "expected_pages": 1, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41" + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/scripts/cold.ps1 b/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/scripts/read.ps1 b/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..476094ab1e0c47077988a6461db2080cf208642b --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/scripts/read.ps1 @@ -0,0 +1,142 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $lastChange = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $lastChange = $previous + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/source.json b/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/source.json new file mode 100644 index 0000000000000000000000000000000000000000..ff4ba59576491f27c378f85c1eb592fdbf70ff3f --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Lifecycle.one", + "bytes": 71048, + "sha256": "36a33c1d7f8a13d93f6bcb0ea9431d5524a1f43aa8a8e121dc2c735e076cc029", + "mtime_ns": 1789112222791725210 + }, + { + "path": "Open Notebook.onetoc2", + "bytes": 4800, + "sha256": "0f15237414704e35cc85965841e1388fb91d2150e1eb2f41981256649e72cd40", + "mtime_ns": 1789112222791871294 + } +] diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/table-autofit.json b/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/table-autofit.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/table-autofit.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/teardown.json b/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup-cold/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup/commands.jsonl b/corpus/page-lifecycle/removal/rust-followup/all/followup/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..b57045b0e11b4803fa86e12ba75d117d4eddbc2e --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup/commands.jsonl @@ -0,0 +1,4 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\author.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-4C5FF100", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-4C5FF100 -ExpectedPages 1 -UseCurrentCache", "exit": 0, "stdout": "Read 1 sections and 1 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup/format-differences.json b/corpus/page-lifecycle/removal/rust-followup/all/followup/format-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup/format-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup/geometry-differences.json b/corpus/page-lifecycle/removal/rust-followup/all/followup/geometry-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup/geometry-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup/machine.json b/corpus/page-lifecycle/removal/rust-followup/all/followup/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..03ed100faa8e91a2d71f82f8d82209e0045873c2 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup/machine.json @@ -0,0 +1 @@ +{"name": "m6-4c5ff100", "hostname": "ONE-M6-4C5FF100"} diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup/native-title.txt b/corpus/page-lifecycle/removal/rust-followup/all/followup/native-title.txt new file mode 100644 index 0000000000000000000000000000000000000000..1d6cb6d0262b9c45259962e524e8b806eb94dbac --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup/native-title.txt @@ -0,0 +1 @@ +Native after Rust removal 🦋 é \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup/notebook/Lifecycle.one b/corpus/page-lifecycle/removal/rust-followup/all/followup/notebook/Lifecycle.one new file mode 100644 index 0000000000000000000000000000000000000000..109ebb490bd6bfa8b8c8355a1d156ccb7af0c005 GIT binary patch literal 71048 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 + diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup/read/page-000.xml b/corpus/page-lifecycle/removal/rust-followup/all/followup/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..e665510f38610111b74fa8aa21c92d5a18366c3d --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup/read/page-000.xml @@ -0,0 +1,3 @@ + +Native body after Rust removal.]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup/read/payloads.json b/corpus/page-lifecycle/removal/rust-followup/all/followup/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup/run.json b/corpus/page-lifecycle/removal/rust-followup/all/followup/run.json new file mode 100644 index 0000000000000000000000000000000000000000..f789eb2ef4cee0c78af9a9e0eb2a69b68d3fb20f --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup/run.json @@ -0,0 +1,19 @@ +{ + "notebook": "/private/tmp/page-removal/run/all/candidate/notebook", + "expected_pages": 1, + "author": "tools/native/page-removal-followup.ps1", + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "6e6bd74f0460457118d436345350c38594c52bd9199fb4a1e31efec3b3e954fd", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41" + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup/scripts/author.ps1 b/corpus/page-lifecycle/removal/rust-followup/all/followup/scripts/author.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..1393a1ff21e7ae5c383cf8babf1f4f21d5f0c14b --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup/scripts/author.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$app = New-Object -ComObject OneNote.Application +$notebook = '' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebook, 0) + $section = '' + $app.OpenHierarchy('Lifecycle.one', $notebook, [ref]$section, 0) + $page = '' + $app.CreateNewPage($section, [ref]$page, 2) + $title = 'Native after Rust removal ' + [char]::ConvertFromUtf32(0x1F98B) + ' e' + [char]0x0301 + $xml = 'Native body after Rust removal.]]>' + $app.UpdatePageContent($xml, [DateTime]::MinValue, 1, $false) + $app.SyncHierarchy($notebook) + [IO.File]::WriteAllText("$Root\native-title.txt", $title, [Text.Encoding]::UTF8) +} finally { + try { if ($notebook) { $app.CloseNotebook($notebook, $false) } } + finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 120 -ErrorAction SilentlyContinue + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup/scripts/cold.ps1 b/corpus/page-lifecycle/removal/rust-followup/all/followup/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup/scripts/read.ps1 b/corpus/page-lifecycle/removal/rust-followup/all/followup/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..476094ab1e0c47077988a6461db2080cf208642b --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup/scripts/read.ps1 @@ -0,0 +1,142 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $lastChange = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $lastChange = $previous + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup/source.json b/corpus/page-lifecycle/removal/rust-followup/all/followup/source.json new file mode 100644 index 0000000000000000000000000000000000000000..0ed7dfc21854677822642582c2c64f8d014cc0b0 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Lifecycle.one", + "bytes": 64904, + "sha256": "645169c4f76dedd0deb0c928a08339479763ae607c21b7f604c21d823eee53eb", + "mtime_ns": 1789112028773633383 + }, + { + "path": "Open Notebook.onetoc2", + "bytes": 4800, + "sha256": "0f15237414704e35cc85965841e1388fb91d2150e1eb2f41981256649e72cd40", + "mtime_ns": 1789112028775905222 + } +] diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup/table-autofit.json b/corpus/page-lifecycle/removal/rust-followup/all/followup/table-autofit.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup/table-autofit.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/all/followup/teardown.json b/corpus/page-lifecycle/removal/rust-followup/all/followup/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/all/followup/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/page-lifecycle/removal/rust-followup/features/candidate/notebook/Lifecycle.one b/corpus/page-lifecycle/removal/rust-followup/features/candidate/notebook/Lifecycle.one new file mode 100644 index 0000000000000000000000000000000000000000..d6167b04713bf4ddbe1f66b0889f651b8ad9d633 GIT binary patch literal 132280 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 zΠ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 + diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-000.xml b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..8b11ce85b2864cff5b5a794ce2172eac2d244105 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-000.xml @@ -0,0 +1,21 @@ + +/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a +HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy +MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABAAGADASIA +AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA +AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 +ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm +p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA +AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx +BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK +U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 +uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDwhYfa +plh9qsrD7VMsPtUqRFOqVVh9qmWH2qysPtUyw+1UpHbTqlZYfaplh9qsrD7VMsPtVqR206pVWGpl +h9qsrDUyw+1UpHbTqlZYalWH2q0sNSrD7VSkdtOqVlh9qmWH2qysPtUyw+1UpHdTqnHrD7VMsPtV +lYfaplh9q81SPyqnVKqw+1TLD7VZWH2qZYfaqUjtp1SssPtUyw+1WVh9qmWH2qlI7adUqrDUyw+1 +WVhqZYfarUjtp1SssNSrD7VaWGpVh9qpSO2nVKyw+1TLD7VZWH2qZYfaqUjup1Tj1h9qmWH2qysP +tUyw+1eapH5VTqlVYfaplh9qsrD7VMsPtVKR206pWWH2qZYfarKw+1TLD7VSkdtOqVVhqZYfarKw +1MsPtVqR206pWWGpVh9qtLDUqw+1UpHbTqlZYfaplh9qsrD7VMsPtVKR206px6w+1TLD7VZWH2qZ +YfavNUj8rp1SqsPtUyw+1WVh9qmWH2qlI7adUrLD7VMsPtVlYfaplh9qpSO2nVKqw1MsPtVlYamW +H2q1I7adUrLDUqw+1WlhqVYfaqUjtp1SssPtUyw+1WVh9qmWH2qlI7adU//Z + diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-001.xml b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..fd0654815ec2be17f896932b46ad35321185ebd3 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-001.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-002.xml b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..20ef6c4713ec013609fa2fefad6c2a04c0bb7b7e --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-002.xml @@ -0,0 +1,3 @@ + +Native body after Rust removal.]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-003.xml b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..e701da2ba007b444287e936f43fb9a1768622fc3 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-003.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-004.xml b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-004.xml new file mode 100644 index 0000000000000000000000000000000000000000..12e1b328e3a710166b1e7580cad6c44bddca1e4d --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-004.xml @@ -0,0 +1,46 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAMAAADS6oI8AAADAFBMVEW4t5mrt5O4qpWrqo6euo2S +uoeZs4ieqoiSqoK4nJCrnIq4kIyrkIaen4SSn36ZmH+ekH+SkHmGuoGGs395t3pounJos3CGqnx5 +qnVtqm9iqmqGnHd5nHGGkHN5kG1on2lomGdokGS4hIirhIK4d4Srd32eh3ySh3aZgHeed3eSd3G4 +a4Cra3m4YHyrYHaea3OSa22eYG+SYGmGh3CGgG55hGloh2FogF+Gd2t5d2Rtd15id1mGa2d5a2CG +YGN5YF1ta1pia1VoYFRWumlWs2dJt2I4ulo4s1hWqmRJql09qlcyqlImulEaukshs0wKukMKs0Em +qkwaqkYPqkAEqjtWnF9JnFlWkFtJkFU4n1E4mE84kEwmn0gan0IhmEMmkEMakD0KnzoKmDgKkDVW +h1hWgFZJhFE4h0k4gEdWd1NJd0w9d0Yyd0FWa09Ja0hWYEtJYEU9a0Iyaz04YDwmh0AahzohgDsK +hzIKgDAmdzsadzUPdy8EdyomazcaazEmYDMaYC0PaysEayYKYCW4VHirVHK4R3SrR22eV2ySV2aZ +UGeeR2eSR2G4O3CrO2m4MGyrMGaeO2OSO12eMF+SMFmGV2CGUF55VFloV1FoUE+GR1t5R1RtR05i +R0mGO1d5O1CGMFN5ME1tO0piO0VoMES4JGirJGK4GGSrGF6eJ1ySJ1aZIFeeGFeSGFG4DmGrDlq4 +A12rA1eeDlSSDk6eA1CSA0qGJE95JEmGGEt5GEVoJ0FoID9oGDyGDkh5DkGGA0R5Az5tDjtiDjZo +AzVWVEdJVEE4Vzk4UDdWR0NJRzw9RzYyRzFWOz9JOzhWMDtJMDU9OzIyOy04MCwmVzAaVyohUCsK +VyIKUCAmRysaRyUPRx8ERxomOycaOyEmMCMaMB0POxsEOxYKMBVWJDdJJDFWGDNJGC04Jyk4ICc4 +GCRWDjBJDilWAyxJAyY9DiMyDh44Ax0mJyAaJxohIBsmGBsaGBUKJxIKIBAKGA0mDhgaDhImAxQa +Aw4PDgwEDgcKAwZYdbPqAAAAAWJLR0QAiAUdSAAAAAxjbVBQSkNtcDA3MTIAAAADSABzvAAABjJJ +REFUWEedkImbTgUcha9ChZl2RUKR0TKTtGiRsZUSEpI0tKm0GoW0WSOjMmNpL82oFG1apJJltNDC +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 +AElFTkSuQmCC + diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-005.xml b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-005.xml new file mode 100644 index 0000000000000000000000000000000000000000..e9d9556d56d5adceb3610718267d535cf5b6f34d --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-005.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-006.xml b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-006.xml new file mode 100644 index 0000000000000000000000000000000000000000..06085d84fb78cce2f2ca1b9794139e3714ee687f --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/page-006.xml @@ -0,0 +1,9 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAO +xAAADsQBlSsOGwAAARlJREFUeF7t2VFHQ2EcBvD3PWetVqvVam1ERESMiIiIiL7/J5p9gD1dvF51 +8eNcn4uf53n2P1ZLKUOpnkMCtYx0kkAt00F8gkAtsxFQBJpPAEWgxRGgCLScAopAq2NAEWhzAigC +3c0ARaD7U0AR6OEMUAR6nAOKQE/ngCLQ8wWgCLRdAIpAL5eAItDrFaAI9LYEFIHerwFFoI8bQBHo +cwUoAn3dAopA32tAEehnAygKjPu/xjyHBAY0WQDQL+0BBKhtYSVIgiSo6w+xiqmYiqnYX34J2SAb +ZINskA1qa4EESZAEdW1B15e7g9xBbf2VIAmSICPtDmprgQRJkAR1bUHXl7uD3EFt/ZUgCZIgI+0O +amuBBEnQP07QDo1OW207QPoWAAAAAElFTkSuQmCC + diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/payloads.json b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/run.json b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/run.json new file mode 100644 index 0000000000000000000000000000000000000000..444c0b4fcd2140ff113f36c4ac5cf6ebfd49c19f --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/private/tmp/page-removal/run/features/followup/notebook", + "expected_pages": 7, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41" + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/scripts/cold.ps1 b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/scripts/read.ps1 b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..476094ab1e0c47077988a6461db2080cf208642b --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/scripts/read.ps1 @@ -0,0 +1,142 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $lastChange = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $lastChange = $previous + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/source.json b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/source.json new file mode 100644 index 0000000000000000000000000000000000000000..5c7d34c2abdbf0c8d7eee89aaa6659484b11fd6e --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Lifecycle.one", + "bytes": 139520, + "sha256": "4c51e1d89b121d74fc15945b3d4e83698956d274bfa092f21a12a817f3acd95a", + "mtime_ns": 1789112618636859068 + }, + { + "path": "Open Notebook.onetoc2", + "bytes": 4800, + "sha256": "f9e4761726171bdc72e946e6742603dd225f2e154298987f36f628b6d8741e78", + "mtime_ns": 1789112618637055068 + } +] diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/table-autofit.json b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/table-autofit.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/table-autofit.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/teardown.json b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup-cold/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/commands.jsonl b/corpus/page-lifecycle/removal/rust-followup/features/followup/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..8890440e62c8df2f58d706068cca42d10f800418 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/commands.jsonl @@ -0,0 +1,4 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\author.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-49B2CF78", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-49B2CF78 -ExpectedPages 7 -UseCurrentCache", "exit": 0, "stdout": "Read 1 sections and 7 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/format-differences.json b/corpus/page-lifecycle/removal/rust-followup/features/followup/format-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/format-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/geometry-differences.json b/corpus/page-lifecycle/removal/rust-followup/features/followup/geometry-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/geometry-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/machine.json b/corpus/page-lifecycle/removal/rust-followup/features/followup/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..a418249529b52569a1b8b65cbbf1ad53f97ba9c1 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/machine.json @@ -0,0 +1 @@ +{"name": "m6-49b2cf78", "hostname": "ONE-M6-49B2CF78"} diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/native-title.txt b/corpus/page-lifecycle/removal/rust-followup/features/followup/native-title.txt new file mode 100644 index 0000000000000000000000000000000000000000..1d6cb6d0262b9c45259962e524e8b806eb94dbac --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/native-title.txt @@ -0,0 +1 @@ +Native after Rust removal 🦋 é \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/notebook/Lifecycle.one b/corpus/page-lifecycle/removal/rust-followup/features/followup/notebook/Lifecycle.one new file mode 100644 index 0000000000000000000000000000000000000000..466222a5eec81265694fb371a7f3971a7c738814 GIT binary patch literal 139520 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 literal 0 HcmV?d00001 diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/notebook/Open Notebook.onetoc2 b/corpus/page-lifecycle/removal/rust-followup/features/followup/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..18f015f65a9419ea2a74835decb84d7b76760183 GIT binary patch literal 4800 zcmZ3e|KIuM`!b(-j|5(YE0x9P?%=jt%UI|?xqWh&N26>y0~)ZuJ4--%;#be57sMyN zJ+bbFG*BKH!<7FA0uY-OCIF>j;%LGsT#yF2T;|mMERXeWTxwTB#Alwe79vi(yb0I%6#-?UeY%~Oh zdI%i(^8M?^s<0&jP>*orFidS=R1uU@;!M6e(__9%=&~ovf15A@rCAah8nB5E^&l8^ z|7Zw|h!8-oGre~iHysu|)D6q`pbUO_DpLT6&jiGRKnxNC;q=Z~z92qG98}f9#BGxA zEe7$qpkk)kBFP}W2$Y|q>f}~$GH1MBMXG@!8=(I{R>D|E^Gj>o}i50M2iM4XL%LtKI6lrK+ zPyq%#Na-`{SDas>g}qykJnuj4n($gfprN4$D7QPHQ}MGKum6?;!<~7)EEyoJx*iO@ zCm0!FB`~mTZb@P2LG}p9L=adXY0%IBQzrv7^1lE>16YP=;s761DGLJwto{IsG=M~b zjscs_#PCgqL1mu|g9ylZTjt#ZNkTva3&Rvy2AQ2exojW}QUj`O9wzN?*`6rry>prx zm)t+g{~&!bK + diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-000.xml b/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..992e8b870ffa1581d640dcc8baf4b3b9491c0d71 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-000.xml @@ -0,0 +1,3 @@ + +Native body after Rust removal.]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-001.xml b/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..e589833ec0f679592a096846ed427e76e1b9dc89 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-001.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-002.xml b/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..94285d475fff149e2215da58eb159e42f50edae4 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-002.xml @@ -0,0 +1,21 @@ + +/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a +HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy +MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABAAGADASIA +AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA +AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 +ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm +p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA +AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx +BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK +U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 +uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDwhYfa +plh9qsrD7VMsPtUqRFOqVVh9qmWH2qysPtUyw+1UpHbTqlZYfaplh9qsrD7VMsPtVqR206pVWGpl +h9qsrDUyw+1UpHbTqlZYalWH2q0sNSrD7VSkdtOqVlh9qmWH2qysPtUyw+1UpHdTqnHrD7VMsPtV +lYfaplh9q81SPyqnVKqw+1TLD7VZWH2qZYfaqUjtp1SssPtUyw+1WVh9qmWH2qlI7adUqrDUyw+1 +WVhqZYfarUjtp1SssNSrD7VaWGpVh9qpSO2nVKyw+1TLD7VZWH2qZYfaqUjup1Tj1h9qmWH2qysP +tUyw+1eapH5VTqlVYfaplh9qsrD7VMsPtVKR206pWWH2qZYfarKw+1TLD7VSkdtOqVVhqZYfarKw +1MsPtVqR206pWWGpVh9qtLDUqw+1UpHbTqlZYfaplh9qsrD7VMsPtVKR206px6w+1TLD7VZWH2qZ +YfavNUj8rp1SqsPtUyw+1WVh9qmWH2qlI7adUrLD7VMsPtVlYfaplh9qpSO2nVKqw1MsPtVlYamW +H2q1I7adUrLDUqw+1WlhqVYfaqUjtp1SssPtUyw+1WVh9qmWH2qlI7adU//Z + diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-003.xml b/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..54c0fb93aa867e9698a344396dbd4309290b46af --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-003.xml @@ -0,0 +1,46 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAMAAADS6oI8AAADAFBMVEW4t5mrt5O4qpWrqo6euo2S +uoeZs4ieqoiSqoK4nJCrnIq4kIyrkIaen4SSn36ZmH+ekH+SkHmGuoGGs395t3pounJos3CGqnx5 +qnVtqm9iqmqGnHd5nHGGkHN5kG1on2lomGdokGS4hIirhIK4d4Srd32eh3ySh3aZgHeed3eSd3G4 +a4Cra3m4YHyrYHaea3OSa22eYG+SYGmGh3CGgG55hGloh2FogF+Gd2t5d2Rtd15id1mGa2d5a2CG +YGN5YF1ta1pia1VoYFRWumlWs2dJt2I4ulo4s1hWqmRJql09qlcyqlImulEaukshs0wKukMKs0Em +qkwaqkYPqkAEqjtWnF9JnFlWkFtJkFU4n1E4mE84kEwmn0gan0IhmEMmkEMakD0KnzoKmDgKkDVW +h1hWgFZJhFE4h0k4gEdWd1NJd0w9d0Yyd0FWa09Ja0hWYEtJYEU9a0Iyaz04YDwmh0AahzohgDsK +hzIKgDAmdzsadzUPdy8EdyomazcaazEmYDMaYC0PaysEayYKYCW4VHirVHK4R3SrR22eV2ySV2aZ +UGeeR2eSR2G4O3CrO2m4MGyrMGaeO2OSO12eMF+SMFmGV2CGUF55VFloV1FoUE+GR1t5R1RtR05i +R0mGO1d5O1CGMFN5ME1tO0piO0VoMES4JGirJGK4GGSrGF6eJ1ySJ1aZIFeeGFeSGFG4DmGrDlq4 +A12rA1eeDlSSDk6eA1CSA0qGJE95JEmGGEt5GEVoJ0FoID9oGDyGDkh5DkGGA0R5Az5tDjtiDjZo +AzVWVEdJVEE4Vzk4UDdWR0NJRzw9RzYyRzFWOz9JOzhWMDtJMDU9OzIyOy04MCwmVzAaVyohUCsK +VyIKUCAmRysaRyUPRx8ERxomOycaOyEmMCMaMB0POxsEOxYKMBVWJDdJJDFWGDNJGC04Jyk4ICc4 +GCRWDjBJDilWAyxJAyY9DiMyDh44Ax0mJyAaJxohIBsmGBsaGBUKJxIKIBAKGA0mDhgaDhImAxQa +Aw4PDgwEDgcKAwZYdbPqAAAAAWJLR0QAiAUdSAAAAAxjbVBQSkNtcDA3MTIAAAADSABzvAAABjJJ +REFUWEedkImbTgUcha9ChZl2RUKR0TKTtGiRsZUSEpI0tKm0GoW0WSOjMmNpL82oFG1apJJltNDC +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 +AElFTkSuQmCC + diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-004.xml b/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-004.xml new file mode 100644 index 0000000000000000000000000000000000000000..dea54bb07c51e60e69758160afd7553f31677024 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-004.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-005.xml b/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-005.xml new file mode 100644 index 0000000000000000000000000000000000000000..0b86a1b45fe6fcb3f02072ca13dd5fab56963444 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-005.xml @@ -0,0 +1,9 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAO +xAAADsQBlSsOGwAAARlJREFUeF7t2VFHQ2EcBvD3PWetVqvVam1ERESMiIiIiL7/J5p9gD1dvF51 +8eNcn4uf53n2P1ZLKUOpnkMCtYx0kkAt00F8gkAtsxFQBJpPAEWgxRGgCLScAopAq2NAEWhzAigC +3c0ARaD7U0AR6OEMUAR6nAOKQE/ngCLQ8wWgCLRdAIpAL5eAItDrFaAI9LYEFIHerwFFoI8bQBHo +cwUoAn3dAopA32tAEehnAygKjPu/xjyHBAY0WQDQL+0BBKhtYSVIgiSo6w+xiqmYiqnYX34J2SAb +ZINskA1qa4EESZAEdW1B15e7g9xBbf2VIAmSICPtDmprgQRJkAR1bUHXl7uD3EFt/ZUgCZIgI+0O +amuBBEnQP07QDo1OW207QPoWAAAAAElFTkSuQmCC + diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-006.xml b/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-006.xml new file mode 100644 index 0000000000000000000000000000000000000000..5d49dbcfd78d74202ce870dc239f35f73a3b3ead --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/read/page-006.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/read/payloads.json b/corpus/page-lifecycle/removal/rust-followup/features/followup/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/run.json b/corpus/page-lifecycle/removal/rust-followup/features/followup/run.json new file mode 100644 index 0000000000000000000000000000000000000000..6edbf0a12183a6055fa32fa6ebb441519fbf8730 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/run.json @@ -0,0 +1,19 @@ +{ + "notebook": "/private/tmp/page-removal/run/features/candidate/notebook", + "expected_pages": 7, + "author": "tools/native/page-removal-followup.ps1", + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "6e6bd74f0460457118d436345350c38594c52bd9199fb4a1e31efec3b3e954fd", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41" + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/scripts/author.ps1 b/corpus/page-lifecycle/removal/rust-followup/features/followup/scripts/author.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..1393a1ff21e7ae5c383cf8babf1f4f21d5f0c14b --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/scripts/author.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$app = New-Object -ComObject OneNote.Application +$notebook = '' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebook, 0) + $section = '' + $app.OpenHierarchy('Lifecycle.one', $notebook, [ref]$section, 0) + $page = '' + $app.CreateNewPage($section, [ref]$page, 2) + $title = 'Native after Rust removal ' + [char]::ConvertFromUtf32(0x1F98B) + ' e' + [char]0x0301 + $xml = 'Native body after Rust removal.]]>' + $app.UpdatePageContent($xml, [DateTime]::MinValue, 1, $false) + $app.SyncHierarchy($notebook) + [IO.File]::WriteAllText("$Root\native-title.txt", $title, [Text.Encoding]::UTF8) +} finally { + try { if ($notebook) { $app.CloseNotebook($notebook, $false) } } + finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 120 -ErrorAction SilentlyContinue + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/scripts/cold.ps1 b/corpus/page-lifecycle/removal/rust-followup/features/followup/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/scripts/read.ps1 b/corpus/page-lifecycle/removal/rust-followup/features/followup/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..476094ab1e0c47077988a6461db2080cf208642b --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/scripts/read.ps1 @@ -0,0 +1,142 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $lastChange = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $lastChange = $previous + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/source.json b/corpus/page-lifecycle/removal/rust-followup/features/followup/source.json new file mode 100644 index 0000000000000000000000000000000000000000..89f2898869d302da880f24f0500622da42562f67 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Lifecycle.one", + "bytes": 132280, + "sha256": "266aaf86a29b942255349dc84ec8a8d9691c965aeafd16122326a97b3acb10ee", + "mtime_ns": 1789112426557088257 + }, + { + "path": "Open Notebook.onetoc2", + "bytes": 4800, + "sha256": "f9e4761726171bdc72e946e6742603dd225f2e154298987f36f628b6d8741e78", + "mtime_ns": 1789112426559091346 + } +] diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/table-autofit.json b/corpus/page-lifecycle/removal/rust-followup/features/followup/table-autofit.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/table-autofit.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/features/followup/teardown.json b/corpus/page-lifecycle/removal/rust-followup/features/followup/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/features/followup/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/candidate/notebook/Lifecycle.one b/corpus/page-lifecycle/removal/rust-followup/leading-parent/candidate/notebook/Lifecycle.one new file mode 100644 index 0000000000000000000000000000000000000000..7fe07784b693ae51a17260afb50bafe4fb3cd360 GIT binary patch literal 76440 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 Y3d79!mYTquji%BsZMymQ!s-A20q@HjQ2+n{ literal 0 HcmV?d00001 diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/candidate/notebook/Open Notebook.onetoc2 b/corpus/page-lifecycle/removal/rust-followup/leading-parent/candidate/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..1dae1b4365a16cf77afdc426b8d194a6094c4959 GIT binary patch literal 4800 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 M&JaK@)?noi097 + diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-000.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..f8d107f1f3e620f09f5233ce36544bf3ac0cd5f5 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-001.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..0950640f2a72186a7cba084de16c4612a2f2e9d7 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-001.xml @@ -0,0 +1,4 @@ + +Body grandchild 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-002.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..4d3714d0012ec9fac7c078bf3db94d3fb639b8e8 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-002.xml @@ -0,0 +1,4 @@ + +Body parent 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-003.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..403bd15be0b0f58a4a0872191af6d4ccaea2a32d --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-003.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-004.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-004.xml new file mode 100644 index 0000000000000000000000000000000000000000..f44adc13639a3e0949b32574a8efe968d37bd0a1 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-004.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-005.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-005.xml new file mode 100644 index 0000000000000000000000000000000000000000..53ce86660fa9b562bbbf7daffd38c9f636e70e4a --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-005.xml @@ -0,0 +1,3 @@ + +Native body after Rust removal.]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-006.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-006.xml new file mode 100644 index 0000000000000000000000000000000000000000..a0542bdf4b035130ff2a99225b955b406646aa14 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-006.xml @@ -0,0 +1,4 @@ + +Body trailing 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-007.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-007.xml new file mode 100644 index 0000000000000000000000000000000000000000..998c43fbf34ac4edb0070c408a5fd2bd6a1c4854 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-007.xml @@ -0,0 +1,4 @@ + +Body automatic 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-008.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-008.xml new file mode 100644 index 0000000000000000000000000000000000000000..abcef66e0197b993a57ffc1724b5635520b07a6e --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/page-008.xml @@ -0,0 +1,4 @@ + +Body duplicate 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/payloads.json b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/run.json b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/run.json new file mode 100644 index 0000000000000000000000000000000000000000..60af9620b50621dc4b9b5b726ce9de6a5726ab87 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/private/tmp/page-removal/run/leading-parent/followup/notebook", + "expected_pages": 9, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41" + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/scripts/cold.ps1 b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/scripts/read.ps1 b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..476094ab1e0c47077988a6461db2080cf208642b --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/scripts/read.ps1 @@ -0,0 +1,142 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $lastChange = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $lastChange = $previous + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/source.json b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/source.json new file mode 100644 index 0000000000000000000000000000000000000000..5bd43afecbfca65159103620a696807254fefebb --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Lifecycle.one", + "bytes": 83640, + "sha256": "07d44900cbb3e03c7ccb27fb256afee1601fb2473cfa927b1c3e20aa662c3dd4", + "mtime_ns": 1789113084012096660 + }, + { + "path": "Open Notebook.onetoc2", + "bytes": 4800, + "sha256": "99b99375297e299d0dabe97e4c156a1a2249fd0521edebae64ac3221a5955f2c", + "mtime_ns": 1789113084012236119 + } +] diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/table-autofit.json b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/table-autofit.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/table-autofit.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/teardown.json b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup-cold/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/commands.jsonl b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..ff4e17a7646b5df9c9be14fa7db35d795876606d --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/commands.jsonl @@ -0,0 +1,4 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\author.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-9A847CAB", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-9A847CAB -ExpectedPages 9 -UseCurrentCache", "exit": 0, "stdout": "Read 1 sections and 9 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/format-differences.json b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/format-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/format-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/geometry-differences.json b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/geometry-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/geometry-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/machine.json b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..322696b28ec0103274fb9099155a6771a0411448 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/machine.json @@ -0,0 +1 @@ +{"name": "m6-9a847cab", "hostname": "ONE-M6-9A847CAB"} diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/native-title.txt b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/native-title.txt new file mode 100644 index 0000000000000000000000000000000000000000..1d6cb6d0262b9c45259962e524e8b806eb94dbac --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/native-title.txt @@ -0,0 +1 @@ +Native after Rust removal 🦋 é \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/notebook/Lifecycle.one b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/notebook/Lifecycle.one new file mode 100644 index 0000000000000000000000000000000000000000..3383072968b32d792c5b00be44ef5b8ccf23ad20 GIT binary patch literal 83640 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 M&JaK@)?noi097 + diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-000.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..9298dcbbbe758bda0abc748b4e7d56792817039b --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-000.xml @@ -0,0 +1,4 @@ + +Body automatic 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-001.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..e81fb3389e0c5c07d2f6df7a31842b4e69c08635 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-001.xml @@ -0,0 +1,4 @@ + +Body duplicate 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-002.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..caba52d63cf1396da7822afe5c2c48a67315504f --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-002.xml @@ -0,0 +1,4 @@ + +Body trailing 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-003.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..1633d9ae816a1833019e3b2c0374d309d3a6513e --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-003.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-004.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-004.xml new file mode 100644 index 0000000000000000000000000000000000000000..8ed396aba33ba7970da318b21644c30d6e7d46b5 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-004.xml @@ -0,0 +1,3 @@ + +Native body after Rust removal.]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-005.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-005.xml new file mode 100644 index 0000000000000000000000000000000000000000..91f894c8b52afa812c523e188f9860f9706fda70 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-005.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-006.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-006.xml new file mode 100644 index 0000000000000000000000000000000000000000..42c2d85c414b62f40014dd72e418ec1d8011f783 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-006.xml @@ -0,0 +1,4 @@ + +Body grandchild 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-007.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-007.xml new file mode 100644 index 0000000000000000000000000000000000000000..03a4e117fdea11277906ed5c1f3f42f53da98d69 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-007.xml @@ -0,0 +1,4 @@ + +Body parent 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-008.xml b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-008.xml new file mode 100644 index 0000000000000000000000000000000000000000..1657d126f1c92d6106cb941aced314c954b53396 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/page-008.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/payloads.json b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/run.json b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/run.json new file mode 100644 index 0000000000000000000000000000000000000000..a1fc8f5f18ca882d551ca0ca57f1ce4734ce47bb --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/run.json @@ -0,0 +1,19 @@ +{ + "notebook": "/private/tmp/page-removal/run/leading-parent/candidate/notebook", + "expected_pages": 9, + "author": "tools/native/page-removal-followup.ps1", + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "6e6bd74f0460457118d436345350c38594c52bd9199fb4a1e31efec3b3e954fd", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41" + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/scripts/author.ps1 b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/scripts/author.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..1393a1ff21e7ae5c383cf8babf1f4f21d5f0c14b --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/scripts/author.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$app = New-Object -ComObject OneNote.Application +$notebook = '' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebook, 0) + $section = '' + $app.OpenHierarchy('Lifecycle.one', $notebook, [ref]$section, 0) + $page = '' + $app.CreateNewPage($section, [ref]$page, 2) + $title = 'Native after Rust removal ' + [char]::ConvertFromUtf32(0x1F98B) + ' e' + [char]0x0301 + $xml = 'Native body after Rust removal.]]>' + $app.UpdatePageContent($xml, [DateTime]::MinValue, 1, $false) + $app.SyncHierarchy($notebook) + [IO.File]::WriteAllText("$Root\native-title.txt", $title, [Text.Encoding]::UTF8) +} finally { + try { if ($notebook) { $app.CloseNotebook($notebook, $false) } } + finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 120 -ErrorAction SilentlyContinue + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/scripts/cold.ps1 b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/scripts/read.ps1 b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..476094ab1e0c47077988a6461db2080cf208642b --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/scripts/read.ps1 @@ -0,0 +1,142 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $lastChange = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $lastChange = $previous + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/source.json b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/source.json new file mode 100644 index 0000000000000000000000000000000000000000..a0b4ba0e793cce014c04a95e8ce91e8f014cc727 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Lifecycle.one", + "bytes": 76440, + "sha256": "4aabf26fa4960cf6d99d76c1f76906ef1023f04bf01b65ea07464ac87449ca3e", + "mtime_ns": 1789112626756437119 + }, + { + "path": "Open Notebook.onetoc2", + "bytes": 4800, + "sha256": "99b99375297e299d0dabe97e4c156a1a2249fd0521edebae64ac3221a5955f2c", + "mtime_ns": 1789112626758941541 + } +] diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/table-autofit.json b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/table-autofit.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/table-autofit.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/teardown.json b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/leading-parent/followup/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/candidate/notebook/Lifecycle.one b/corpus/page-lifecycle/removal/rust-followup/parent/candidate/notebook/Lifecycle.one new file mode 100644 index 0000000000000000000000000000000000000000..c24e3d33dbe8b0e1520ab626de0b76d9eb50c593 GIT binary patch literal 56688 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 C@h30< literal 0 HcmV?d00001 diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/candidate/notebook/Open Notebook.onetoc2 b/corpus/page-lifecycle/removal/rust-followup/parent/candidate/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..4b21b2a4655ba5798579711f620169ba8703d230 GIT binary patch literal 4800 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 T+)Y6m_F}>QFB}?_>iz!#x_A;l literal 0 HcmV?d00001 diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/notebook/Open Notebook.onetoc2 b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..4b21b2a4655ba5798579711f620169ba8703d230 GIT binary patch literal 4800 zcmZ3e|KIuM`!b(-j|5(YE0x8+`TRWc>C+9)9hKiV{|(JeWcV`JmPyFh+^n&=r zw;)KmcO1!UUi+OdL%Zg$q&x0$@Q7s1ys324N5Y(hwC8H3x(s!Z5NR zyvECW`xo!tBiy&=ue$V-8!9ocsB!7fP1X+UXG;lP589jrQ;&__qPdVC8Dmp3DmEGd zLp=nJeEI%$V^!D^0jNhfau}vIFsjt=`ZI0!)Jv{i-cK}5bt29&0;O3J8XB;P5A`4z zb^mAxjEE3Gt~0%N88;mkJ=6`$_n-`Zc`8!?h|dJXfV*H-e;JG&FczoUrf(cZ19NuSTkj(~pUO%1UhD!<$fdONYCR5P3zB zh6V-|V9R9s{&(=f#LLce7&C?KQXy^gTHE8?KHEQ1Fwfw2-<@(0%K9E*j z4~E_ojEt}n7+5y9q%ia#djw=62&|7ZXlQ_`lK~p}Ux1+jEJHMLfDfvag@FN9e*i@q zK%zj$fK6v&_$I@kvQLHq?DH-2?tvsBpn-*9iY$Z7PM};ikOrv%)ixb(^d6Onb$Bo7 z(`?Uop0FR}Eg2y8VaQ}iV@PF4W~c<>93V@NA)g@+NJDymKne(u;|HV@6bBJ;ce{0c z6 + diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-000.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..182a7c665bbc1f9cbb52306bc7a5606e1a99d9d4 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-000.xml @@ -0,0 +1,4 @@ + +Body trailing 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-001.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..33caceac601c6ef1edcf48ede908fd804fd7ea24 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-001.xml @@ -0,0 +1,4 @@ + +Body duplicate 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-002.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..153373a906d9ed1d550cf7634aaebc6c1a6755aa --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-002.xml @@ -0,0 +1,4 @@ + +Body automatic 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-003.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..68b3002e8923753a7c3deb251aedec8f4eb2efd2 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-003.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-004.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-004.xml new file mode 100644 index 0000000000000000000000000000000000000000..4b1bbbb5232fb2226e633ad50d3005f9e7160b93 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-004.xml @@ -0,0 +1,4 @@ + +Body grandchild 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-005.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-005.xml new file mode 100644 index 0000000000000000000000000000000000000000..17d7e6acffb6e3b7679021840d2f448d1ab30f36 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-005.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-006.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-006.xml new file mode 100644 index 0000000000000000000000000000000000000000..0c942bdf032eef7ec552066297a4470d0aa2641d --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-006.xml @@ -0,0 +1,3 @@ + +Native body after Rust removal.]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-007.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-007.xml new file mode 100644 index 0000000000000000000000000000000000000000..416598cb23bbe1a18ac8d6a3e40d0f8d808af126 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-007.xml @@ -0,0 +1,4 @@ + +Body child 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-008.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-008.xml new file mode 100644 index 0000000000000000000000000000000000000000..c8d7cd9b92cf1a8e409ae6471fd120d35072ea49 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/page-008.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/payloads.json b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/run.json b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/run.json new file mode 100644 index 0000000000000000000000000000000000000000..9c0f9a413a9bada6bc6e413cb34951453ae421df --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/private/tmp/page-removal/run/parent/followup/notebook", + "expected_pages": 9, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41" + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/scripts/cold.ps1 b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/scripts/read.ps1 b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..476094ab1e0c47077988a6461db2080cf208642b --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/scripts/read.ps1 @@ -0,0 +1,142 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $lastChange = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $lastChange = $previous + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/source.json b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/source.json new file mode 100644 index 0000000000000000000000000000000000000000..8c4bcdeee919f316a3182ceaec6f30c23a4aaca3 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Lifecycle.one", + "bytes": 62856, + "sha256": "e1c9e25eb5bb28c90ecd2f9bd627497489382e485c47efbc38e719880e7c0f3d", + "mtime_ns": 1789111825549418917 + }, + { + "path": "Open Notebook.onetoc2", + "bytes": 4800, + "sha256": "a0530a11d189eaf6c64273f6997ca3a2e953ab911798993420b872794d1d3cbc", + "mtime_ns": 1789111825549583834 + } +] diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/table-autofit.json b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/table-autofit.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/table-autofit.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/teardown.json b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup-cold/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/commands.jsonl b/corpus/page-lifecycle/removal/rust-followup/parent/followup/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..9a38c1d06cd642b4bb6812561346d086e909ce23 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/commands.jsonl @@ -0,0 +1,4 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\author.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-E0700600", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-E0700600 -ExpectedPages 9 -UseCurrentCache", "exit": 0, "stdout": "Read 1 sections and 9 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/format-differences.json b/corpus/page-lifecycle/removal/rust-followup/parent/followup/format-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/format-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/geometry-differences.json b/corpus/page-lifecycle/removal/rust-followup/parent/followup/geometry-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/geometry-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/machine.json b/corpus/page-lifecycle/removal/rust-followup/parent/followup/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..58ddf44e426c7ff6d659dc2e09f098b4ea62e98f --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/machine.json @@ -0,0 +1 @@ +{"name": "m6-e0700600", "hostname": "ONE-M6-E0700600"} diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/native-title.txt b/corpus/page-lifecycle/removal/rust-followup/parent/followup/native-title.txt new file mode 100644 index 0000000000000000000000000000000000000000..1d6cb6d0262b9c45259962e524e8b806eb94dbac --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/native-title.txt @@ -0,0 +1 @@ +Native after Rust removal 🦋 é \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/notebook/Lifecycle.one b/corpus/page-lifecycle/removal/rust-followup/parent/followup/notebook/Lifecycle.one new file mode 100644 index 0000000000000000000000000000000000000000..49437dba925e8a3e684cfcccacaf6a6c279bf373 GIT binary patch literal 62856 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 H{r~>~V9IaX literal 0 HcmV?d00001 diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/notebook/Open Notebook.onetoc2 b/corpus/page-lifecycle/removal/rust-followup/parent/followup/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..4b21b2a4655ba5798579711f620169ba8703d230 GIT binary patch literal 4800 zcmZ3e|KIuM`!b(-j|5(YE0x8+`TRWc>C+9)9hKiV{|(JeWcV`JmPyFh+^n&=r zw;)KmcO1!UUi+OdL%Zg$q&x0$@Q7s1ys324N5Y(hwC8H3x(s!Z5NR zyvECW`xo!tBiy&=ue$V-8!9ocsB!7fP1X+UXG;lP589jrQ;&__qPdVC8Dmp3DmEGd zLp=nJeEI%$V^!D^0jNhfau}vIFsjt=`ZI0!)Jv{i-cK}5bt29&0;O3J8XB;P5A`4z zb^mAxjEE3Gt~0%N88;mkJ=6`$_n-`Zc`8!?h|dJXfV*H-e;JG&FczoUrf(cZ19NuSTkj(~pUO%1UhD!<$fdONYCR5P3zB zh6V-|V9R9s{&(=f#LLce7&C?KQXy^gTHE8?KHEQ1Fwfw2-<@(0%K9E*j z4~E_ojEt}n7+5y9q%ia#djw=62&|7ZXlQ_`lK~p}Ux1+jEJHMLfDfvag@FN9e*i@q zK%zj$fK6v&_$I@kvQLHq?DH-2?tvsBpn-*9iY$Z7PM};ikOrv%)ixb(^d6Onb$Bo7 z(`?Uop0FR}Eg2y8VaQ}iV@PF4W~c<>93V@NA)g@+NJDymKne(u;|HV@6bBJ;ce{0c z6 + diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-000.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..c70617f7dc55405d0d76d844475dcd38aed4291e --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-000.xml @@ -0,0 +1,4 @@ + +Body child 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-001.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..5ca7645eb6045823acb2ce8b818ac9b4202572d6 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-001.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-002.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..dd99c619f8ebe470b08df5eb0e0b06f6f8fba370 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-002.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-003.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..42dc5a8822f99a3854c4c0fd1d06912dde0d857e --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-003.xml @@ -0,0 +1,4 @@ + +Body grandchild 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-004.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-004.xml new file mode 100644 index 0000000000000000000000000000000000000000..617f8cadd8c53f8b51f2ee687c5e995ecc2a6582 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-004.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-005.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-005.xml new file mode 100644 index 0000000000000000000000000000000000000000..21034b0c616812c48c64dc059595ab966257011b --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-005.xml @@ -0,0 +1,3 @@ + +Native body after Rust removal.]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-006.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-006.xml new file mode 100644 index 0000000000000000000000000000000000000000..3dc9610328c1dac6527ec48cc49b2e092f7167b9 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-006.xml @@ -0,0 +1,4 @@ + +Body duplicate 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-007.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-007.xml new file mode 100644 index 0000000000000000000000000000000000000000..aaac10673bbd220fb5104ad677b951e826e61500 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-007.xml @@ -0,0 +1,4 @@ + +Body automatic 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-008.xml b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-008.xml new file mode 100644 index 0000000000000000000000000000000000000000..3c3477ba64cc94398c54e05697781bcabef59590 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/page-008.xml @@ -0,0 +1,4 @@ + +Body trailing 🦀 é preserved]]> diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/payloads.json b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/run.json b/corpus/page-lifecycle/removal/rust-followup/parent/followup/run.json new file mode 100644 index 0000000000000000000000000000000000000000..2db66012badd1d3a40daa0a7c952fd271cb98569 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/run.json @@ -0,0 +1,19 @@ +{ + "notebook": "/private/tmp/page-removal/run/parent/candidate/notebook", + "expected_pages": 9, + "author": "tools/native/page-removal-followup.ps1", + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "6e6bd74f0460457118d436345350c38594c52bd9199fb4a1e31efec3b3e954fd", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41" + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/scripts/author.ps1 b/corpus/page-lifecycle/removal/rust-followup/parent/followup/scripts/author.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..1393a1ff21e7ae5c383cf8babf1f4f21d5f0c14b --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/scripts/author.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$app = New-Object -ComObject OneNote.Application +$notebook = '' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebook, 0) + $section = '' + $app.OpenHierarchy('Lifecycle.one', $notebook, [ref]$section, 0) + $page = '' + $app.CreateNewPage($section, [ref]$page, 2) + $title = 'Native after Rust removal ' + [char]::ConvertFromUtf32(0x1F98B) + ' e' + [char]0x0301 + $xml = 'Native body after Rust removal.]]>' + $app.UpdatePageContent($xml, [DateTime]::MinValue, 1, $false) + $app.SyncHierarchy($notebook) + [IO.File]::WriteAllText("$Root\native-title.txt", $title, [Text.Encoding]::UTF8) +} finally { + try { if ($notebook) { $app.CloseNotebook($notebook, $false) } } + finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 120 -ErrorAction SilentlyContinue + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/scripts/cold.ps1 b/corpus/page-lifecycle/removal/rust-followup/parent/followup/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/scripts/read.ps1 b/corpus/page-lifecycle/removal/rust-followup/parent/followup/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..476094ab1e0c47077988a6461db2080cf208642b --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/scripts/read.ps1 @@ -0,0 +1,142 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $lastChange = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $lastChange = $previous + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/source.json b/corpus/page-lifecycle/removal/rust-followup/parent/followup/source.json new file mode 100644 index 0000000000000000000000000000000000000000..f73e5732ca13c896dfeda82225eed03d39252e21 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Lifecycle.one", + "bytes": 56688, + "sha256": "f7b163e466afb5c13530beefd2bb7b3303f08ed42f5a6f817a805abf7005d65b", + "mtime_ns": 1789111621160316671 + }, + { + "path": "Open Notebook.onetoc2", + "bytes": 4800, + "sha256": "a0530a11d189eaf6c64273f6997ca3a2e953ab911798993420b872794d1d3cbc", + "mtime_ns": 1789111621162916678 + } +] diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/table-autofit.json b/corpus/page-lifecycle/removal/rust-followup/parent/followup/table-autofit.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/table-autofit.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/page-lifecycle/removal/rust-followup/parent/followup/teardown.json b/corpus/page-lifecycle/removal/rust-followup/parent/followup/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/parent/followup/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/page-lifecycle/removal/rust-followup/provenance.json b/corpus/page-lifecycle/removal/rust-followup/provenance.json new file mode 100644 index 0000000000000000000000000000000000000000..c85c2973f1176eaa1643ad5017ae1210ac335ea4 --- /dev/null +++ b/corpus/page-lifecycle/removal/rust-followup/provenance.json @@ -0,0 +1,77 @@ +{ + "generator": "ONESTORE_PAGE_REMOVAL_OUTPUT on removal_matches_all_native_cases_and_retains_every_old_revision", + "author_script": "tools/native/page-removal-followup.ps1", + "cases": { + "parent": { + "candidate_sha256": "f7b163e466afb5c13530beefd2bb7b3303f08ed42f5a6f817a805abf7005d65b", + "captures": { + "followup": { + "clone": "m6-e0700600", + "teardown_absent": true, + "notebook_sha256": "e1c9e25eb5bb28c90ecd2f9bd627497489382e485c47efbc38e719880e7c0f3d", + "pages": 9 + }, + "followup-cold": { + "clone": "m6-e51ea1b2", + "teardown_absent": true, + "notebook_sha256": "253fde4f872bb302632de20eb977180114ab1776d6032cc4e9e46905ff3e6366", + "pages": 9 + } + } + }, + "all": { + "candidate_sha256": "645169c4f76dedd0deb0c928a08339479763ae607c21b7f604c21d823eee53eb", + "captures": { + "followup": { + "clone": "m6-4c5ff100", + "teardown_absent": true, + "notebook_sha256": "36a33c1d7f8a13d93f6bcb0ea9431d5524a1f43aa8a8e121dc2c735e076cc029", + "pages": 1 + }, + "followup-cold": { + "clone": "m6-9d41f146", + "teardown_absent": true, + "notebook_sha256": "36a33c1d7f8a13d93f6bcb0ea9431d5524a1f43aa8a8e121dc2c735e076cc029", + "pages": 1 + } + } + }, + "features": { + "candidate_sha256": "266aaf86a29b942255349dc84ec8a8d9691c965aeafd16122326a97b3acb10ee", + "captures": { + "followup": { + "clone": "m6-49b2cf78", + "teardown_absent": true, + "notebook_sha256": "4c51e1d89b121d74fc15945b3d4e83698956d274bfa092f21a12a817f3acd95a", + "pages": 7 + }, + "followup-cold": { + "clone": "m6-53651ab4", + "teardown_absent": true, + "notebook_sha256": "5d7d209a9320bcd932879da30bd0b6d54e87b7ee85766037bf69954d3f2d66b0", + "pages": 7 + } + } + }, + "leading-parent": { + "candidate_sha256": "4aabf26fa4960cf6d99d76c1f76906ef1023f04bf01b65ea07464ac87449ca3e", + "captures": { + "followup": { + "clone": "m6-9a847cab", + "teardown_absent": true, + "notebook_sha256": "07d44900cbb3e03c7ccb27fb256afee1601fb2473cfa927b1c3e20aa662c3dd4", + "pages": 9 + }, + "followup-cold": { + "clone": "m6-063c5792", + "teardown_absent": true, + "notebook_sha256": "07d44900cbb3e03c7ccb27fb256afee1601fb2473cfa927b1c3e20aa662c3dd4", + "pages": 9 + } + } + } + }, + "rejected_attempts": [ + "features followup-cold and leading-parent followup first ran while the lab configuration was moving to .env and failed before booting a clone; both were rerun" + ] +} diff --git a/crates/onestore/tests/page_deletion.rs b/crates/onestore/tests/page_deletion.rs index 1dd8deab5e63a8f5396de11c9d8e79ffc432b44c..c3ceaa3706ce9617c7fcd4a6edfee76340991093 100644 --- a/crates/onestore/tests/page_deletion.rs +++ b/crates/onestore/tests/page_deletion.rs @@ -1,6 +1,6 @@ use onestore::{ ExGuid, FileDataReference, ObjectData, PreparedEdit, PropertySets, RevisionIndex, Store, - document::Document, + document::{Document, Kind}, }; use std::collections::BTreeSet; @@ -177,6 +177,82 @@ fn removal_rejects_duplicate_missing_and_non_page_spaces_without_publication() { use page_schedule::{current, disk}; +/// OneNote created a page in each section after Rust permanently removed pages from it; +/// the surviving pages keep their revisions through the native save and a cold reopen. +#[test] +fn native_pages_created_after_rust_removal_reopen_cold() { + let root = std::path::Path::new(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../corpus/page-lifecycle/removal/rust-followup" + )); + for case in ["parent", "all", "features", "leading-parent"] { + let read = |phase: &str| { + std::fs::read(root.join(case).join(phase).join("notebook/Lifecycle.one")).unwrap() + }; + let (candidate, followup, cold) = + (read("candidate"), read("followup"), read("followup-cold")); + let title = + std::fs::read_to_string(root.join(case).join("followup/native-title.txt")).unwrap(); + let title = title.trim_start_matches('\u{feff}').trim_end(); + let stores = [&candidate, &followup, &cold].map(|bytes| Store::parse(bytes).unwrap()); + let indexes = stores.each_ref().map(|store| { + assert!(store.checksum_mismatches.is_empty()); + let index = RevisionIndex::parse(store).unwrap(); + index.validate_current().unwrap(); + index + }); + let documents = indexes + .each_ref() + .map(|index| Document::parse(index).unwrap()); + let before = documents[0].pages().unwrap(); + for (document, index) in documents[1..].iter().zip(&indexes[1..]) { + let pages = document.pages().unwrap(); + assert_eq!(pages.len(), before.len() + 1, "{case}"); + assert_eq!( + &pages[..before.len()], + before.as_slice(), + "{case}: surviving page order" + ); + for (sid, _) in &before { + assert_eq!( + index.active(*sid).unwrap(), + indexes[0].active(*sid).unwrap(), + "{case}: {sid}" + ); + } + let (native, page) = pages[before.len()]; + let revision = document.active(native).unwrap(); + let metadata = revision + .roots + .get(&2) + .and_then(|id| revision.nodes.get(id)) + .unwrap(); + assert!( + matches!(&metadata.kind, Kind::Metadata { title: Some(name), .. } if name == title), + "{case}" + ); + let body = revision + .parents(&[page]) + .unwrap() + .into_keys() + .any(|id| matches!(&revision.nodes[&id].kind, Kind::RichText { text, .. } if text == "Native body after Rust removal.")); + assert!(body, "{case}: native body"); + } + // The section root may gain OneNote's per-series navigation metadata copies on open. + for sid in indexes[1] + .spaces + .keys() + .filter(|sid| **sid != indexes[1].root) + { + assert_eq!( + indexes[1].active(*sid).unwrap(), + indexes[2].active(*sid).unwrap(), + "{case}: cold reopen changed {sid}" + ); + } + } +} + #[test] fn tombstones_and_first_page_promotion_survive_each_storage_interruption() { let leading = include_bytes!( diff --git a/tools/codex_usage_report.example.json b/tools/codex_usage_report.example.json deleted file mode 100644 index ce4d61158f7a0178d789b7024e83fde0b696b363..0000000000000000000000000000000000000000 --- a/tools/codex_usage_report.example.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "threadIds": ["01a078fb-d5d2-7ad0-97f0-d14db4e4c94e"], - "sources": [ - "/Users/clo/.codex/sessions/2026/09/06/rollout-2026-09-06T16-09-25-01a078fb-d5d2-7ad0-97f0-d14db4e4c94e.jsonl" - ], - "boundaries": [ - { - "name": "Planning discussion", - "kind": "discussion", - "end": "2026-09-07T01:28:56Z" - }, - { - "name": "Canvas goal", - "kind": "goal", - "start": "2026-09-07T01:28:56Z" - } - ] -} diff --git a/tools/codex_usage_report.mjs b/tools/codex_usage_report.mjs deleted file mode 100644 index 45cd27ff308511f6c86df1d755459e533085ea16..0000000000000000000000000000000000000000 --- a/tools/codex_usage_report.mjs +++ /dev/null @@ -1,129 +0,0 @@ -#!/usr/bin/env node - -import { mkdir, readFile, readdir, writeFile } from "node:fs/promises"; -import { homedir } from "node:os"; -import { dirname, join, resolve } from "node:path"; - -const rates = { input: 10, cached: 1, output: 50 }; - -function usageCost(usage) { - return ((usage.input_tokens - usage.cached_input_tokens) * rates.input - + usage.cached_input_tokens * rates.cached - + usage.output_tokens * rates.output) / 1_000_000; -} - -function duration(ms) { - const seconds = Math.round(ms / 1000); - const hours = Math.floor(seconds / 3600); - const minutes = Math.floor((seconds % 3600) / 60); - const remainder = seconds % 60; - return hours ? `${hours}h ${minutes}m` : minutes ? `${minutes}m ${remainder}s` : `${remainder}s`; -} - -function unionDuration(intervals) { - const merged = []; - for (const interval of intervals.sort((a, b) => a[0] - b[0])) { - const previous = merged.at(-1); - if (previous && interval[0] <= previous[1]) previous[1] = Math.max(previous[1], interval[1]); - else merged.push([...interval]); - } - return merged.reduce((total, [start, end]) => total + end - start, 0); -} - -async function filesBelow(root) { - const entries = await readdir(root, { withFileTypes: true }); - const nested = await Promise.all(entries.map((entry) => { - const path = join(root, entry.name); - return entry.isDirectory() ? filesBelow(path) : entry.name.endsWith(".jsonl") ? [path] : []; - })); - return nested.flat(); -} - -async function loadEvents(paths) { - const events = []; - for (const path of paths) { - for (const line of (await readFile(path, "utf8")).trim().split("\n")) { - if (!line) continue; - try { events.push(JSON.parse(line)); } catch { /* Ignore a partially-written final line. */ } - } - } - return events; -} - -function snapshotBefore(records, time) { - return records.filter((record) => Date.parse(record.timestamp) <= time).at(-1)?.payload.thread_token_usage; -} - -function taskRows(events, start, end) { - const tasks = new Map(); - for (const event of events) { - if (event.type !== "event_msg" || !["task_started", "task_complete"].includes(event.payload.type)) continue; - const prior = tasks.get(event.payload.turn_id) ?? {}; - tasks.set(event.payload.turn_id, { ...prior, ...event.payload }); - } - return [...tasks.values()].filter((task) => task.started_at >= start && task.started_at < end && task.duration_ms); -} - -function toolIntervals(events, start, end) { - return events.flatMap((event) => { - const item = event.type === "event_msg" && event.payload.type === "item_completed" ? event.payload.item : undefined; - if (!item || !["CommandExecution", "McpToolCall"].includes(item.type)) return []; - const milliseconds = (item.duration?.secs ?? 0) * 1000 + (item.duration?.nanos ?? 0) / 1_000_000; - const finished = Date.parse(event.timestamp); - return milliseconds && finished >= start && finished < end ? [[finished - milliseconds, finished]] : []; - }); -} - -function segment(events, records, boundary, previous, finalTime) { - const start = boundary.start ? Date.parse(boundary.start) : -Infinity; - const end = boundary.end ? Date.parse(boundary.end) : finalTime; - const tasks = taskRows(events, start, end); - const tools = toolIntervals(events, start, end); - const finish = snapshotBefore(records, end); - const begin = previous ?? snapshotBefore(records, start); - return { - name: boundary.name, - kind: boundary.kind ?? "segment", - cost: finish ? usageCost(finish) - (begin ? usageCost(begin) : 0) : null, - durationMs: tasks.reduce((total, task) => total + task.duration_ms, 0), - apiTtftMs: tasks.reduce((total, task) => total + (task.time_to_first_token_ms ?? 0), 0), - toolWallMs: unionDuration(tools), - toolCoreMs: tools.reduce((total, [startTime, endTime]) => total + endTime - startTime, 0), - }; -} - -function chart(segments) { - const maximum = Math.max(...segments.map((segment) => segment.cost ?? 0), 1); - return segments.map((segment) => `

${escapeHtml(segment.name)}
${segment.cost === null ? "—" : `$${segment.cost.toFixed(2)}`}
`).join("\n"); -} - -function escapeHtml(value) { - return value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">"); -} - -function html(report) { - const rows = report.segments.map((segment) => `${escapeHtml(segment.name)}${segment.kind}${segment.cost === null ? "—" : `$${segment.cost.toFixed(2)}`}${duration(segment.durationMs)}${duration(segment.toolWallMs)}${duration(segment.toolCoreMs)}≥${duration(segment.apiTtftMs)}`).join("\n"); - return `Codex usage report

Codex usage report

API-equivalent rate: Astra standard ($10/M uncached input, $1/M cached input, $50/M output). Tool core time counts parallel calls separately; API TTFT is a lower bound.

Cost

${chart(report.segments)}

Segments

${rows}
SegmentTypeCostDurationTool wallTool coreRecorded API
`; -} - -function usage() { - console.error("Usage: node tools/codex_usage_report.mjs report.json [output.html]"); - process.exit(1); -} - -const [configPath, outputPath] = process.argv.slice(2); -if (!configPath) usage(); -const config = JSON.parse(await readFile(resolve(configPath), "utf8")); -const codexHome = config.codexHome ?? join(homedir(), ".codex"); -const paths = config.sources ?? (await Promise.all(["sessions", "archived_sessions"].map((name) => filesBelow(join(codexHome, name))))).flat(); -const events = await loadEvents(paths); -const selected = events.filter((event) => event.type !== "token_usage_record" || config.threadIds.includes(event.payload.thread_id)); -const records = selected.filter((event) => event.type === "token_usage_record").sort((a, b) => Date.parse(a.timestamp) - Date.parse(b.timestamp)); -if (!records.length) throw new Error("No token records matched config.threadIds."); -const finalTime = Date.parse(records.at(-1).timestamp); -const segments = config.boundaries.map((boundary, index) => segment(selected, records, boundary, index ? snapshotBefore(records, Date.parse(config.boundaries[index - 1].end ?? new Date(finalTime).toISOString())) : undefined, finalTime)); -const report = { threadIds: config.threadIds, total: usageCost(records.at(-1).payload.thread_token_usage), segments }; -if (outputPath) { - await mkdir(dirname(resolve(outputPath)), { recursive: true }); - await writeFile(resolve(outputPath), html(report)); -} else console.log(JSON.stringify(report, null, 2)); diff --git a/tools/native/page-removal-followup.ps1 b/tools/native/page-removal-followup.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..1393a1ff21e7ae5c383cf8babf1f4f21d5f0c14b --- /dev/null +++ b/tools/native/page-removal-followup.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$app = New-Object -ComObject OneNote.Application +$notebook = '' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebook, 0) + $section = '' + $app.OpenHierarchy('Lifecycle.one', $notebook, [ref]$section, 0) + $page = '' + $app.CreateNewPage($section, [ref]$page, 2) + $title = 'Native after Rust removal ' + [char]::ConvertFromUtf32(0x1F98B) + ' e' + [char]0x0301 + $xml = 'Native body after Rust removal.]]>' + $app.UpdatePageContent($xml, [DateTime]::MinValue, 1, $false) + $app.SyncHierarchy($notebook) + [IO.File]::WriteAllText("$Root\native-title.txt", $title, [Text.Encoding]::UTF8) +} finally { + try { if ($notebook) { $app.CloseNotebook($notebook, $false) } } + finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 120 -ErrorAction SilentlyContinue + } +} diff --git a/tools/test_page_removal.py b/tools/test_page_removal.py index e3ae6bbb25f427b19682063c8a26178d2eada497..a974d31aef6ad7f7c343db91a75bc0f8c26cd972 100644 --- a/tools/test_page_removal.py +++ b/tools/test_page_removal.py @@ -59,3 +59,22 @@ class PageRemovalTest(unittest.TestCase): if __name__ == '__main__': unittest.main() + + +class RustRemovalFollowupTest(unittest.TestCase): + """OneNote creates a page in a section after Rust removed pages from it, then reopens cold.""" + + CASES = ('parent', 'all', 'features', 'leading-parent') + + def test_native_page_after_rust_removal_matches_its_captures(self): + for case in self.CASES: + with self.subTest(case=case): + root = FIXTURE / 'rust-followup' / case + title = (root / 'followup/native-title.txt').read_text(encoding='utf-8-sig') + self.assertTrue(title.startswith('Native after Rust removal')) + for phase in ('followup', 'followup-cold'): + compare(root / phase / 'notebook', root / phase / 'read') + hierarchy = ET.parse(root / phase / 'read/hierarchy.xml').getroot() + names = [page.get('name') for page in hierarchy.findall('.//one:Page', ns)] + self.assertEqual(names.count(title), 1, names) + self.assertTrue(json.loads((root / phase / 'teardown.json').read_text())['absent']) diff --git a/tools/zenith-locks b/tools/zenith-locks deleted file mode 100755 index 095817d79bc5bb93f0b901b9db7720ccc1ce2136..0000000000000000000000000000000000000000 --- a/tools/zenith-locks +++ /dev/null @@ -1,132 +0,0 @@ -#!/usr/bin/env python3 -"""Watch SMB byte-range locks on zenith (TrueNAS) as OneNote takes and drops them.""" -import json -import os -import subprocess -import sys -import time - -HOST = "10.0.0.1" -SSH = ["ssh", "-o", "BatchMode=yes", "-o", "ControlMaster=auto", - "-o", "ControlPath=/tmp/zenith-locks-%r@%h:%p", "-o", "ControlPersist=30s", HOST] -SEP = "--%%--" - - -def agent_socket(): - """SSH_AUTH_SOCK is usually absent here; find a live agent that holds an identity.""" - pids = subprocess.run(["pgrep", "ssh-agent"], capture_output=True, text=True).stdout.split() - for pid in pids: - out = subprocess.run(["lsof", "-a", "-U", "-p", pid], capture_output=True, text=True).stdout - for word in out.split(): - if "/agent." not in word: - continue - env = dict(os.environ, SSH_AUTH_SOCK=word) - if subprocess.run(["ssh-add", "-l"], env=env, capture_output=True).returncode == 0: - return word - return None - - -def connect(): - if subprocess.run(SSH + ["true"], capture_output=True).returncode == 0: - return - sock = agent_socket() - if sock is None: - sys.exit("no ssh-agent with a loaded identity; cannot reach %s" % HOST) - os.environ["SSH_AUTH_SOCK"] = sock - if subprocess.run(SSH + ["true"], capture_output=True).returncode != 0: - sys.exit("ssh %s failed even with agent %s" % (HOST, sock)) - - -def status(*views): - cmd = (" ; echo %s ; " % SEP).join("midclt call smb.status " + v for v in views) - out = subprocess.run(SSH + [cmd], capture_output=True, text=True) - if out.returncode != 0: - sys.exit(out.stderr.strip() or "ssh failed") - return [json.loads(chunk) for chunk in out.stdout.split(SEP + "\n")] - - -def locks(byterange): - """(share_path, file, pid, type, start, size) per held range.""" - for entry in byterange: - for lk in entry["locks"]: - yield (entry["share_path"], entry["file_name"], lk["server_id"]["pid"], - lk["type"], lk["start"], lk["size"]) - - -def table(rows, headers): - rows = [[str(c) for c in r] for r in rows] - width = [max(len(h), *(len(r[i]) for r in rows)) for i, h in enumerate(headers)] - for r in [headers] + rows: - print(" ".join(c.ljust(w) for c, w in zip(r, width)).rstrip()) - - -def show_locks(): - byterange, openfiles, shares = status("BYTERANGE", "LOCKS", "SHARES") - held = sorted(locks(byterange)) - if not held: - print("no byte-range locks held") - return - machine = {s["server_id"]["pid"]: s["machine"] for s in shares} - user = {} - for f in openfiles: - for o in f["opens"].values(): - user[(f["service_path"], f["filename"], o["server_id"]["pid"])] = o["username"] - rows = [] - for share, name, pid, typ, start, size in held: - who = user.get((share, name, pid), "?") - rows.append(["%s/%s" % (os.path.basename(share), os.path.basename(name)), pid, who, - machine.get(pid, "?"), start, size, - {"W": "write", "R": "read"}.get(typ, typ)]) - table(rows, ["FILE", "PID", "USER", "CLIENT", "OFFSET", "LENGTH", "TYPE"]) - - -def show_opens(): - openfiles, shares = status("LOCKS", "SHARES") - machine = {s["server_id"]["pid"]: s["machine"] for s in shares} - rows = [] - for f in openfiles: - share = os.path.basename(f["service_path"]) - for o in f["opens"].values(): - pid = o["server_id"]["pid"] - rows.append(["%s/%s" % (share, f["filename"]), pid, o["username"], - machine.get(pid, "?"), o["access_mask"]["text"] or "-", - o["sharemode"]["text"] or "-", o["opened_at"][11:23]]) - if not rows: - print("no open files") - return - table(sorted(rows), ["FILE", "PID", "USER", "CLIENT", "ACCESS", "SHAREMODE", "OPENED"]) - - -def watch(interval): - prev = set() - while True: - now = set(locks(status("BYTERANGE")[0])) - t = time.time() - stamp = time.strftime("%H:%M:%S", time.localtime(t)) + ".%03d" % (t % 1 * 1000) - for sign, changed in (("-", prev - now), ("+", now - prev)): - for share, name, pid, typ, start, size in sorted(changed): - print("%s %s %s/%s pid=%s %s %d+%d" % - (stamp, sign, os.path.basename(share), os.path.basename(name), pid, - {"W": "write", "R": "read"}.get(typ, typ), start, size), flush=True) - prev = now - time.sleep(interval) - - -def main(): - args = sys.argv[1:] - connect() - if args and args[0] == "--watch": - watch(float(args[1]) if len(args) > 1 else 0.5) - elif args == ["--opens"]: - show_opens() - elif not args: - show_locks() - else: - sys.exit("usage: zenith-locks [--watch [SECONDS] | --opens]") - - -if __name__ == "__main__": - try: - main() - except KeyboardInterrupt: - pass -- 2.54.0