Commit d4911f0
authored
Add external public API integration runner (#69)
* Capture install command output in tests
Capture install CLI child output in the dual-backend integration tests
instead of inheriting the test runner streams. The rejection tests now
assert the exact stderr messages, and the success tests assert their
stdout status messages without printing them during passing runs.
Validation:
cargo check
cargo build
cargo clippy --all-targets --all-features -- -D warnings
cargo test
cargo +nightly fmt
* Add external public API runner smoke slice
Add scripts/public_api_suite.py as a Python MCP stdio runner that accepts a prebuilt mcp-repl binary and verifies the R console smoke path through the public repl tool.
Document the runner, record the active migration plan, and remove duplicate raw Rust R console smoke coverage now covered externally.
Validation:
- python3 scripts/public_api_suite.py --binary target/debug/mcp-repl
- python3 -m py_compile scripts/public_api_suite.py
- cargo test --test server_smoke
- cargo test --test docs_contracts docs_index_lists_main_docs
- cargo check
- cargo build
- cargo clippy --all-targets --all-features -- -D warnings
- cargo test
- cargo +nightly fmt
- cargo test --test docs_contracts plans_layout_exists
- git diff --staged --check
* Migrate timeout recovery smoke to public API runner
Add an external public API case that verifies R timeout, busy-input discard, and later recovery through the real MCP stdio surface. Remove the duplicate Rust snapshot smoke test now covered by the external runner, and update testing docs plus the active runner plan.
Validation:
- python3 scripts/public_api_suite.py --binary target/debug/mcp-repl --case r-timeout-busy-recovers
- python3 scripts/public_api_suite.py --binary target/debug/mcp-repl
- python3 -m py_compile scripts/public_api_suite.py
- cargo test --test write_stdin_batch
- cargo check
- cargo build
- cargo clippy --all-targets --all-features -- -D warnings
- cargo test
- cargo +nightly fmt
- cargo insta pending-snapshots
- git diff --check
* Migrate reset state check to public API runner
Move the R repl_reset state-clearing check into scripts/public_api_suite.py so it runs against a built server over MCP stdio. Drop the duplicate Rust public surface test and update testing docs/plan to point at the runner coverage.
Validation:
- python3 scripts/public_api_suite.py --binary target/debug/mcp-repl --case r-reset-clears-state
- python3 scripts/public_api_suite.py --binary target/debug/mcp-repl
- cargo test --test repl_surface
- cargo check
- cargo build
- cargo clippy --all-targets --all-features -- -D warnings
- cargo test
- cargo +nightly fmt
* Run public API suite in CI
Add the external Python public API suite as its own post-build CI step on every matrix target. Use the platform-specific debug binary path so the suite runs against the binary Cargo just built.
Update testing docs and the active migration plan to record that CI now runs this external public API check.
Validation:
- cargo build
- python3 scripts/public_api_suite.py --binary target/debug/mcp-repl
- cargo check
- cargo build
- cargo clippy --all-targets --all-features -- -D warnings
- cargo test
- cargo +nightly fmt
* Reduce slow timeout waits in tests
Shorten artificial timeout sleeps in write_stdin coverage and batch compatible echo-prefix checks into one public session so the slow behavior suite avoids extra fixed waits and real server startups.
Also tighten the external public API timeout recovery case while preserving the busy-discard and recovery assertions.
Validation:
- cargo check
- cargo build
- cargo clippy --all-targets --all-features -- -D warnings
- cargo test
- cargo +nightly fmt
* Silence routine server startup stderr
Remove the routine server startup stderr notice so passing real-server tests do not inherit status noise. Add a CLI regression that starts the real server with closed stdin, asserts the routine notice is absent, and verifies stderr diagnostics remain.
Validation:
- cargo check
- cargo build
- cargo clippy --all-targets --all-features -- -D warnings
- cargo test
- cargo +nightly fmt
* Add quiet nextest CI profile
Add a checked-in nextest ci profile with quiet passing-test output and a default filter that keeps real client integration binaries out of the ordinary suite. Switch CI's ordinary Rust test step to `cargo nextest run --profile ci --show-progress none`, preserving the Windows serial constraint and the separate real Codex integration `cargo test` step.
Validation:
- cargo nextest run --profile ci --show-progress none
- cargo test --test docs_contracts ci_uses_quiet_nextest_profile_for_routine_suite
- cargo check
- cargo build
- cargo clippy --all-targets --all-features -- -D warnings
- cargo test
- cargo +nightly fmt
* Serialize REPL integration tests under nextest
Add a nextest `repl-integration` group with `max-threads = 1` and assign the
process-backed REPL integration binaries to it. Document that the group is for
timing-sensitive server/worker transitions, and extend the docs contract test
so the CI profile keeps this scheduling rule.
Review finding addressed:
- [P1] Serialize timing-sensitive tests under nextest — /Users/tomasz/github/posit-dev/mcp-repl/.github/workflows/ci.yml:98-98
On non-Windows this new nextest step runs individual tests concurrently, but these integration tests still use in-process `lock_test_mutex()` to serialize timing-sensitive REPL sessions; nextest launches each test in a separate process, so the lock no longer protects them. I can reproduce `cargo nextest run --profile ci --show-progress none --test write_stdin_behavior` failing on macOS in `follow_up_after_timeout_spills_when_prefix_and_reply_exceed_threshold`, while the same run with `--test-threads 1` passes. Please serialize these tests globally or with nextest test groups before switching CI.
Response:
The CI profile now serializes the affected REPL integration binaries with a
nextest test group, preserving per-test server isolation while limiting host
concurrency for the timing-sensitive suites.
Validation:
- cargo test --test docs_contracts ci_uses_quiet_nextest_profile_for_routine_suite
- cargo nextest show-config test-groups --profile ci --groups repl-integration
- cargo nextest run --profile ci --show-progress none --test write_stdin_behavior
- cargo +nightly fmt
- cargo check
- cargo build
- cargo clippy --all-targets --all-features -- -D warnings
- cargo test
* Move pager smoke into public API runner
Add a pager command scenario to the external Python runner, including per-case server args and environment so it starts mcp-repl in pager mode with a small page size. Remove the duplicated Rust pager smoke test and update the testing docs.
Validation:
- python3 scripts/public_api_suite.py --binary target/debug/mcp-repl
- cargo +nightly fmt
- cargo check
- cargo build
- cargo clippy --all-targets --all-features -- -D warnings
- cargo test
* Move interrupt prefix coverage to public runner
Add an external public API case that exercises R control-D restart state clearing and control-C interruption with remaining input against the built MCP server. The interrupt path waits for an explicit marker before sending the control prefix, so the check does not rely on a tiny sleep race.
Remove the matching Rust prefix tests and update the public runner docs.
Validation:
- python3 scripts/public_api_suite.py --binary target/debug/mcp-repl --case r-interrupt-restart-prefixes --timeout 45
- cargo test --test interrupt
- cargo check
- cargo build
- cargo clippy --all-targets --all-features -- -D warnings
- cargo test
- cargo +nightly fmt
- python3 scripts/public_api_suite.py --binary target/debug/mcp-repl --timeout 45
* Move output bundle coverage to public runner
Add Python public API scenarios for files-mode output bundles, including text-only bundles, count pruning, timeout backfill through a gate, and size-cap omission. Remove duplicated broad Rust integration tests while keeping narrower Rust edge coverage in place.
Validation:
- python3 scripts/public_api_suite.py --binary target/debug/mcp-repl --case r-output-bundle-files --case r-output-bundle-size-limit
- cargo test --test write_stdin_behavior timeout_output_bundle_is_disclosed_only_after_poll_crosses_hard_spill_threshold -- --exact
- cargo check
- cargo build
- cargo clippy --all-targets --all-features -- -D warnings
- cargo test
- cargo +nightly fmt
- python3 scripts/public_api_suite.py --binary target/debug/mcp-repl
- python3 -m py_compile scripts/public_api_suite.py
* Narrow nextest REPL residue group
Limit the CI nextest `repl-integration` group to the remaining timing-sensitive Rust residue now that pager smoke, interrupt/restart prefixes, and broad files-mode output bundle coverage have moved into the Python public runner.
Update the testing docs, active migration plan, and docs contract so pager flag, R manual, and R vignette binaries stay in the ordinary nextest pool.
Validation:
- cargo test --test docs_contracts ci_uses_quiet_nextest_profile_for_routine_suite
- cargo nextest show-config test-groups --profile ci --groups repl-integration
- cargo nextest run --profile ci --show-progress none --test pager_flags --test r_manuals --test r_vignettes
- cargo check
- cargo build
- cargo clippy --all-targets --all-features -- -D warnings
- cargo test
- cargo +nightly fmt
- cargo nextest run --profile ci --show-progress none
* Pin R public API suite cases
Pin every r-* public API suite case with --interpreter r so an inherited
MCP_REPL_INTERPRETER value cannot redirect those cases to another backend. Add
a regression test that checks all R suite case metadata carries the explicit R
interpreter flag.
Review finding:
[P2] Pin the R interpreter for R public API cases — /Users/tomasz/github/posit-dev/mcp-repl/scripts/public_api_suite.py:782-782
When `MCP_REPL_INTERPRETER` is present in the environment, these `r-*` cases inherit it because the command only adds `--sandbox` and per-case args. Setting `MCP_REPL_INTERPRETER=python` makes the suite launch the Python backend (`r-console-basic` can still pass on `1+1`, while later R-specific cases fail), so the new public API suite no longer reliably exercises R; pass `--interpreter r` for these cases or scrub that env var.
Response:
Added an R suite-case constructor that prepends --interpreter r to every r-* case,
including cases with additional per-case server args.
Validation:
- python3 -m unittest scripts/test_public_api_suite.py (failed before the fix, passes after)
- MCP_REPL_INTERPRETER=python python3 scripts/public_api_suite.py --binary target/debug/mcp-repl
- cargo check
- cargo build
- cargo clippy --all-targets --all-features -- -D warnings
- cargo test
- cargo +nightly fmt
* Separate local and CI nextest profiles
Keep the default nextest profile as the local full test loop so authenticated Codex and Claude integration binaries are included. Add a CI profile filter for unauthenticated workflow runs and remove the CI Codex install/integration step.
Refresh agent/testing docs around the public API suite, nextest usage, validation surfaces, and snapshot workflow. Pin the Codex integration fixture to the Spark model while keeping Claude on haiku, and lock the contract in docs_contracts.
Validation:
- cargo check
- cargo build
- python3 scripts/public_api_suite.py --binary target/debug/mcp-repl
- cargo clippy --all-targets --all-features -- -D warnings
- cargo nextest run --show-progress none
- cargo test
- cargo +nightly fmt
- cargo test --test docs_contracts
- git diff --check
* Detect client auth before live integrations
Codex and Claude live integration tests now preflight CLI launch/auth state and print explicit skip banners when a client cannot run.
The local nextest profile shows successful output for those binaries so skip reasons are visible during normal local runs.
Claude preserves the minimal host CLI environment needed for first-party auth probes while keeping test config isolated.
Validation:
- cargo check
- cargo build
- python3 scripts/public_api_suite.py --binary target/debug/mcp-repl
- cargo clippy --all-targets --all-features -- -D warnings
- cargo nextest run --show-progress none
- cargo test
- cargo +nightly fmt
- git diff --check
* Remove obsolete nextest serial scheduling
Drop the repl-integration nextest test group so local runs use normal nextest scheduling.
Update the docs and docs contract to describe the CI profile as only filtering unauthenticated real-client integrations.
Normalize optional Codex workspace metadata from the wire snapshot so the snapshot is stable under normal parallel scheduling.
Validation:
- cargo test --test docs_contracts
- cargo test --test codex_approvals_tui unix_impl::normalize_wire_snapshot_drops_volatile_turn_metadata_fields
- cargo check
- cargo build
- python3 scripts/public_api_suite.py --binary target/debug/mcp-repl
- cargo clippy --all-targets --all-features -- -D warnings
- cargo nextest run --show-progress none
- cargo test
- cargo +nightly fmt
- git diff --check
* Rename integration test runner
Move the external public API runner under tests/run_integration_tests.py
so the real-binary suite lives with the test harnesses. Update CI,
AGENTS.md, and testing docs to reference the new path, and extend docs
contracts to reject the stale script path.
Validation:
- cargo check
- cargo build
- python3 tests/run_integration_tests.py --binary target/debug/mcp-repl
- cargo clippy --all-targets --all-features -- -D warnings
- cargo nextest run --show-progress none
- cargo test
- cargo +nightly fmt
- git diff --check
* Split cargo test from explicit Rust test suite
Make plain cargo test a small Cargo compatibility check by opting the binary
unit-test target and integration targets out of default Cargo discovery. Add an
explicit Python wrapper around nextest to run those Rust targets, including a CI
profile that excludes live client integrations and a clippy mode for the opted
out targets.
Also stabilize the interrupt prompt-shaped-output test with an explicit marker
instead of a sleep-only fixture, and update CI, AGENTS, docs, and docs-contract
coverage for the new split test entry points.
Validation:
- cargo check
- cargo build
- python3 tests/run_integration_tests.py --binary target/debug/mcp-repl
- cargo clippy --all-targets --all-features -- -D warnings
- python3 tests/run_rust_tests.py --clippy
- python3 tests/run_rust_tests.py --profile default
- cargo test
- cargo +nightly fmt --all -- --check
* Restore real Codex CI integration coverage
Run CI's ordinary Rust suite with nextest directly while keeping all Rust test
targets discoverable by Cargo. Remove the transitional explicit Rust test
wrapper and the Cargo.toml opt-outs that made `cargo test` incomplete.
Install the real Codex CLI in CI and run the Codex integration binary
separately. The Codex smoke test now defaults to backend auto-selection: use
live Spark when `codex login status`, model availability, and local auth are
present; otherwise use the mocked provider. The forced mock and live paths are
documented for targeted validation.
Validation:
- cargo check
- cargo build
- python3 tests/run_integration_tests.py --binary target/debug/mcp-repl
- cargo clippy --all-targets --all-features -- -D warnings
- cargo nextest run --show-progress none
- cargo test
- cargo +nightly fmt --all -- --check
- MCP_REPL_CODEX_BACKEND=mock cargo test -j 1 --test codex_approvals_tui codex_exec_auto_backend_smoke -- --test-threads=1
* Use cargo test for CI Rust suite
Rename the Codex client integration target from codex_approvals_tui to codex_integration so the name matches its broader exec, install, sandbox metadata, and mock-provider coverage.
Remove the nextest profile and CI dependency. CI now installs Codex before the Rust suite, forces MCP_REPL_CODEX_BACKEND=mock, and runs the standard cargo test path with quiet output. This keeps Rust test discovery on Cargo's default path instead of maintaining two Rust runners.
Validation:
- cargo check
- cargo build
- python3 tests/run_integration_tests.py --binary target/debug/mcp-repl
- cargo clippy --all-targets --all-features -- -D warnings
- MCP_REPL_CODEX_BACKEND=mock cargo test -j 1 --test codex_integration codex_exec_auto_backend_smoke -- --test-threads=1
- cargo test --test docs_contracts
- cargo test --quiet
- cargo +nightly fmt --all -- --check
* Shorten interrupt drain setup timeout
Use a 5ms timeout for the prompt-shaped child-output interrupt drain
setup request. This keeps the setup call focused on entering the busy
state before the child output is likely to be drained into the initial
timeout response.
Validation:
- MCP_REPL_CODEX_BACKEND=mock cargo test --quiet --test interrupt files_interrupt_drain_preserves_prompt_shaped_child_stdout -- --nocapture
- cargo check
- cargo build
- python3 tests/run_integration_tests.py --binary target/debug/mcp-repl
- cargo clippy --all-targets --all-features -- -D warnings
- MCP_REPL_CODEX_BACKEND=mock cargo test --quiet
- cargo +nightly fmt
* Stabilize timeout bundle CI tests
Shorten the initial timeout in the hidden timeout bundle spill tests so
slow first-call startup cannot let the initial reply reach the oversized
output disclosure path before the busy follow-up.
Update the Linux Codex wire snapshot for the current Codex CLI metadata,
which no longer includes x-codex-turn-metadata.workspaces.
Validation:
- MCP_REPL_CODEX_BACKEND=mock cargo test --test write_stdin_behavior busy_follow_up_reuses_hidden_timeout_bundle_when_it_first_spills -- --nocapture
- MCP_REPL_CODEX_BACKEND=mock cargo test --test codex_integration codex_exec_wire_sandbox_state_meta -- --nocapture
- cargo check
- cargo build
- python3 tests/run_integration_tests.py --binary target/debug/mcp-repl
- cargo clippy --all-targets --all-features -- -D warnings
- MCP_REPL_CODEX_BACKEND=mock cargo test --quiet
- cargo +nightly fmt
* Clarify public API runner sandbox plan
Clarify that the external Python runner is not itself sandboxed, but each spawned mcp-repl binary still owns and must exercise the sandbox contract.
The next slice now calls for workspace-write sandbox coverage in the Python runner before continuing representative real-binary migration out of Rust.
Validation: cargo test --test docs_contracts1 parent 23da2b7 commit d4911f0
28 files changed
Lines changed: 2041 additions & 968 deletions
File tree
- .github/workflows
- docs
- plans/active
- src
- tests
- snapshots
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
78 | 78 | | |
79 | 79 | | |
80 | 80 | | |
81 | | - | |
82 | | - | |
83 | | - | |
84 | | - | |
| 81 | + | |
85 | 82 | | |
86 | | - | |
| 83 | + | |
87 | 84 | | |
88 | | - | |
| 85 | + | |
89 | 86 | | |
90 | | - | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
91 | 92 | | |
92 | 93 | | |
93 | 94 | | |
| |||
110 | 111 | | |
111 | 112 | | |
112 | 113 | | |
113 | | - | |
| 114 | + | |
114 | 115 | | |
115 | | - | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
116 | 119 | | |
117 | | - | |
| 120 | + | |
118 | 121 | | |
119 | | - | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
120 | 125 | | |
121 | 126 | | |
122 | 127 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| 10 | + | |
10 | 11 | | |
11 | | - | |
| 12 | + | |
12 | 13 | | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
13 | 18 | | |
14 | 19 | | |
15 | 20 | | |
16 | 21 | | |
17 | 22 | | |
18 | 23 | | |
19 | | - | |
| 24 | + | |
20 | 25 | | |
21 | 26 | | |
22 | 27 | | |
| 28 | + | |
| 29 | + | |
23 | 30 | | |
24 | 31 | | |
25 | 32 | | |
| |||
41 | 48 | | |
42 | 49 | | |
43 | 50 | | |
44 | | - | |
45 | | - | |
| 51 | + | |
| 52 | + | |
46 | 53 | | |
47 | 54 | | |
48 | 55 | | |
| |||
60 | 67 | | |
61 | 68 | | |
62 | 69 | | |
63 | | - | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
64 | 74 | | |
65 | 75 | | |
66 | 76 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
63 | 63 | | |
64 | 64 | | |
65 | 65 | | |
66 | | - | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
67 | 75 | | |
68 | 76 | | |
69 | 77 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
84 | 84 | | |
85 | 85 | | |
86 | 86 | | |
87 | | - | |
| 87 | + | |
88 | 88 | | |
89 | 89 | | |
90 | 90 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | | - | |
9 | | - | |
10 | | - | |
11 | | - | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
12 | 13 | | |
13 | 14 | | |
14 | | - | |
15 | | - | |
| 15 | + | |
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
25 | 29 | | |
26 | 30 | | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
27 | 116 | | |
28 | 117 | | |
29 | 118 | | |
30 | 119 | | |
31 | 120 | | |
32 | 121 | | |
| 122 | + | |
33 | 123 | | |
34 | | - | |
| 124 | + | |
35 | 125 | | |
36 | 126 | | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
37 | 134 | | |
38 | 135 | | |
39 | 136 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
785 | 785 | | |
786 | 786 | | |
787 | 787 | | |
788 | | - | |
789 | 788 | | |
790 | 789 | | |
791 | 790 | | |
| |||
0 commit comments