Skip to content

Add ApplyPipeline logic#2275

Merged
findolor merged 7 commits intomainfrom
local-db-apply-pipeline
Nov 4, 2025
Merged

Add ApplyPipeline logic#2275
findolor merged 7 commits intomainfrom
local-db-apply-pipeline

Conversation

@findolor
Copy link
Copy Markdown
Collaborator

@findolor findolor commented Oct 27, 2025

Motivation

See issues:

Solution

  • Add apply pipeline

Checks

By submitting this for review, I'm confirming I've done the following:

  • made this PR as small as possible
  • unit-tested any new functionality
  • linked any relevant issues or PRs
  • included screenshots (if this involves a front-end change)

Summary by CodeRabbit

  • New Features

    • Enhanced error handling in batch processing operations to provide better feedback on failures.
    • Improved token decimal management for more accurate data processing.
  • Chores

    • Optimized database synchronization pipeline with robust transaction support and better data ordering.

@findolor findolor added this to the LocalDB Implementation milestone Oct 27, 2025
@findolor findolor requested review from 0xgleb and hardyjosh October 27, 2025 13:37
@findolor findolor self-assigned this Oct 27, 2025
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Oct 27, 2025

Walkthrough

Introduces DefaultApplyPipeline, a concrete implementation of the ApplyPipeline trait that constructs SQL statement batches from logs and decoded events. Updates the trait interface to accept existing token rows and return error-aware results.

Changes

Cohort / File(s) Summary
Trait Interface Update
crates/common/src/local_db/pipeline/mod.rs
Modified ApplyPipeline::build_batch signature: added existing_tokens: &[Erc20TokenRow] parameter and changed return type from SqlStatementBatch to Result<SqlStatementBatch, LocalDbError> for error handling.
New Concrete Implementation
crates/common/src/local_db/pipeline/adapters/apply.rs
Introduced DefaultApplyPipeline struct implementing the ApplyPipeline trait. Implements build_batch to construct decimals maps, generate SQL statements in order (raw events, ERC20 upserts, decoded deposits, watermark), wrap in transaction, and handle errors. Implements persist to execute batches via LocalDbQueryExecutor. Includes extensive test suite.
Module Export
crates/common/src/local_db/pipeline/adapters/mod.rs
Added public module declaration for apply, exposing DefaultApplyPipeline alongside existing events and tokens modules.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

  • Key areas requiring attention:
    • Logic correctness in build_batch: decimals map construction, SQL statement ordering (raw events → erc20 upserts → decoded deposits → watermark), and transaction wrapping
    • Error handling paths, particularly when token decimals are missing
    • Test coverage comprehensiveness for edge cases (only raw logs, mixed inputs, deterministic batch shapes)
    • Impact of trait signature changes on existing trait implementers and callers

Possibly related PRs

Suggested reviewers

  • hardyjosh
  • 0xgleb

Pre-merge checks and finishing touches

✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Add ApplyPipeline logic' directly summarizes the main change: introducing new ApplyPipeline trait implementation and related pipeline adapter logic.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch local-db-apply-pipeline

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 37881d2 and dd68806.

📒 Files selected for processing (2)
  • crates/common/src/local_db/pipeline/adapters/apply.rs (1 hunks)
  • crates/common/src/local_db/pipeline/mod.rs (1 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
crates/*/{src,tests,benches,examples}/**/*.rs

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Rust code must pass clippy with all warnings denied (cargo clippy --workspace --all-targets --all-features -D warnings)

Files:

  • crates/common/src/local_db/pipeline/mod.rs
  • crates/common/src/local_db/pipeline/adapters/apply.rs
crates/**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

Rust code lives in the workspace under crates/* (e.g., cli, common, bindings, js_api, quote, subgraph, settings, math, integration_tests)

Files:

  • crates/common/src/local_db/pipeline/mod.rs
  • crates/common/src/local_db/pipeline/adapters/apply.rs
**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

**/*.rs: Format Rust with nix develop -c cargo fmt --all
Lint Rust with nix develop -c rainix-rs-static (preconfigured flags)
Use snake_case for Rust crates/modules and PascalCase for types

Files:

  • crates/common/src/local_db/pipeline/mod.rs
  • crates/common/src/local_db/pipeline/adapters/apply.rs
🧠 Learnings (7)
📓 Common learnings
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:25:47.873Z
Learning: After each new commit review for rainlanguage/rain.orderbook repository, generate a PR size report in a separate comment with the format: "TOTAL=number ADDITIONS=number DELETIONS=number". This report should exclude irrelevant files such as lock files (e.g., package-lock.json, cargo.lock).
📚 Learning: 2025-10-06T11:13:29.956Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 2123
File: crates/common/src/raindex_client/local_db/mod.rs:23-29
Timestamp: 2025-10-06T11:13:29.956Z
Learning: In `crates/common/src/raindex_client/local_db/mod.rs`, the `Default` implementation for `LocalDb` that creates an RPC client pointing to `http://localhost:4444` is acceptable because the RPC client must be explicitly configured before actual usage in production scenarios.

Applied to files:

  • crates/common/src/local_db/pipeline/adapters/apply.rs
📚 Learning: 2025-06-04T10:21:01.388Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1907
File: packages/orderbook/test/common/test.test.ts:75-77
Timestamp: 2025-06-04T10:21:01.388Z
Learning: The DotrainOrder.create API in packages/orderbook/test/common/test.test.ts is internal and not used directly in consumer applications, so API changes here don't require external breaking change documentation.

Applied to files:

  • crates/common/src/local_db/pipeline/adapters/apply.rs
📚 Learning: 2025-10-25T21:06:38.487Z
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 2246
File: packages/orderbook/scripts/buildCjs.js:38-53
Timestamp: 2025-10-25T21:06:38.487Z
Learning: In the rain.orderbook repository, build scripts in packages/orderbook/scripts/ (such as buildCjs.js and buildEsm.js) should keep duplicated logic separate rather than extracting to shared utilities, even when identical, to allow future divergence and to surface breaking changes as early failures.

Applied to files:

  • crates/common/src/local_db/pipeline/adapters/apply.rs
📚 Learning: 2025-05-27T06:16:12.195Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1874
File: tauri-app/src-tauri/src/transaction_status.rs:87-114
Timestamp: 2025-05-27T06:16:12.195Z
Learning: In tauri-app/src-tauri/src/transaction_status.rs, testing one WriteTransactionStatus variant (like PendingPrepare) is sufficient for the update_status_and_emit method since all variants follow the same code path through the From<WriteTransactionStatus<T>> implementation.

Applied to files:

  • crates/common/src/local_db/pipeline/adapters/apply.rs
📚 Learning: 2025-05-20T10:20:08.206Z
Learnt from: 0xgleb
Repo: rainlanguage/rain.orderbook PR: 1859
File: crates/quote/src/quote_debug.rs:472-492
Timestamp: 2025-05-20T10:20:08.206Z
Learning: In the Rain Orderbook codebase, the `#[tokio::test(flavor = "multi_thread")]` annotation is specifically needed for tests that use `LocalEvm`, not just for consistency across all async tests.

Applied to files:

  • crates/common/src/local_db/pipeline/adapters/apply.rs
📚 Learning: 2025-06-17T16:21:24.384Z
Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1903
File: crates/settings/src/yaml/orderbook.rs:371-377
Timestamp: 2025-06-17T16:21:24.384Z
Learning: In crates/settings/src/yaml/orderbook.rs tests, the user findolor considers RPC ordering in Vec<Url> assertions to be intentional and not a test brittleness issue. The ordering of RPCs in tests should be preserved as specified.

Applied to files:

  • crates/common/src/local_db/pipeline/adapters/apply.rs
🧬 Code graph analysis (1)
crates/common/src/local_db/pipeline/adapters/apply.rs (5)
crates/common/src/local_db/pipeline/mod.rs (3)
  • decode (204-207)
  • build_batch (257-265)
  • persist (269-271)
crates/common/src/local_db/insert.rs (2)
  • decoded_events_to_statements (95-154)
  • generate_erc20_token_statements (240-274)
crates/common/src/local_db/query/update_last_synced_block/mod.rs (1)
  • build_update_last_synced_block_stmt (5-10)
crates/common/src/local_db/query/sql_statement_batch.rs (3)
  • is_transaction (30-35)
  • len (65-67)
  • statements (61-63)
crates/common/src/local_db/query/sql_statement.rs (1)
  • sql (60-62)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Deploy-Preview-Push
🔇 Additional comments (7)
crates/common/src/local_db/pipeline/mod.rs (1)

256-265: LGTM: Well-justified breaking changes to the trait.

The addition of existing_tokens parameter and the change to return Result<SqlStatementBatch, LocalDbError> are both necessary improvements:

  • existing_tokens enables implementations to merge existing token decimals with new upserts for accurate decimal conversion
  • The Result return type properly surfaces errors like missing token decimals during batch construction

The implementation in apply.rs correctly leverages both changes.

crates/common/src/local_db/pipeline/adapters/apply.rs (6)

21-33: LGTM: Clean zero-sized type design.

The use of a zero-sized struct with const fn new() is idiomatic for stateless pipeline implementations. The derives are appropriate for this use case.


46-59: LGTM: Robust decimals map construction with proper precedence.

The implementation correctly:

  • Filters out invalid addresses from existing tokens using filter_map
  • Chains upserts after existing tokens, ensuring upserts take precedence in the HashMap
  • Handles the edge case where existing token addresses might be malformed

The test coverage validates this behavior thoroughly (lines 294-347, 350-396).


61-82: LGTM: Correct statement ordering and transaction wrapping.

The SQL batch construction follows a logical order:

  1. Raw events (base data)
  2. Token upserts (metadata dependencies)
  3. Decoded events (depends on token metadata)
  4. Watermark update (progress marker)

The ensure_transaction() call guarantees atomicity. The test coverage (lines 763-825) validates this ordering.


85-91: LGTM: Defensive transaction wrapping ensures correctness.

The batch.clone().ensure_transaction() pattern is defensive programming that:

  • Handles batches that may not be pre-wrapped (though build_batch always wraps)
  • Requires cloning since we only have a reference
  • Is idempotent (validated by test at lines 534-567)

The slight inefficiency is justified by the robustness and testability it provides.

Based on learnings


94-979: Excellent test coverage demonstrating production readiness.

The test suite is comprehensive and well-structured, covering:

  • ✅ Transaction semantics (wrapping, idempotency, preservation)
  • ✅ Error propagation and handling
  • ✅ Decimals resolution precedence (upserts > existing)
  • ✅ Edge cases (invalid addresses, missing decimals, duplicate upserts)
  • ✅ Statement ordering invariants
  • ✅ Determinism and idempotency
  • ✅ Multi-token scenarios
  • ✅ All event types (deposits, withdrawals)

The test helpers (MockDb, FailingDb, event builders) are well-designed for maintainability.


70-70: No overflow risk; cast is safe for all real-world chain IDs.

The cast from u64 to u32 cannot overflow in practice. Real EVM chain IDs (Ethereum: 1, Polygon: 137, Arbitrum: 42161, etc.) are all well below u32::MAX (4,294,967,295). The u64 type in TargetKey is intentional for forward-compatible multi-chain support per downstream PR roadmap. Only Arbitrum (42161) is currently supported (SUPPORTED_LOCAL_DB_CHAINS), and all test values fit safely within u32 range.


Comment @coderabbitai help to get the list of available commands and usage tips.

@findolor
Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Oct 27, 2025

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

db.execute_batch(&stmts).await.map_err(LocalDbError::from)
}

// export_dump: default no-op via trait default
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what's this?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was supposed to be a function with no-op implementation for client side apply pipeline but i decided to only add this to the producer side pipeline to create dumps out of each orderbook db. this can be removed as this is not a shared function anymore

Ok(batch.ensure_transaction())
}

async fn persist<DB>(&self, db: &DB, batch: &SqlStatementBatch) -> Result<(), LocalDbError>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

given this doesn't do anything with self, should this really be here?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this allows us to use the persist function as pipeline.persist(). with that it's much easier to mock the implementation and write tests

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why can't this be a generic that takes a phantom type if all it needs is type level info?

Base automatically changed from local-db-tokens-pipeline to main November 4, 2025 12:02
@findolor findolor merged commit 9cee19b into main Nov 4, 2025
28 of 29 checks passed
@findolor findolor deleted the local-db-apply-pipeline branch November 4, 2025 16:15
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Nov 4, 2025

@coderabbitai assess this PR size classification for the totality of the PR with the following criterias and report it in your comment:

S/M/L PR Classification Guidelines:

This guide helps classify merged pull requests by effort and complexity rather than just line count. The goal is to assess the difficulty and scope of changes after they have been completed.

Small (S)

Characteristics:

  • Simple bug fixes, typos, or minor refactoring
  • Single-purpose changes affecting 1-2 files
  • Documentation updates
  • Configuration tweaks
  • Changes that require minimal context to review

Review Effort: Would have taken 5-10 minutes

Examples:

  • Fix typo in variable name
  • Update README with new instructions
  • Adjust configuration values
  • Simple one-line bug fixes
  • Import statement cleanup

Medium (M)

Characteristics:

  • Feature additions or enhancements
  • Refactoring that touches multiple files but maintains existing behavior
  • Breaking changes with backward compatibility
  • Changes requiring some domain knowledge to review

Review Effort: Would have taken 15-30 minutes

Examples:

  • Add new feature or component
  • Refactor common utility functions
  • Update dependencies with minor breaking changes
  • Add new component with tests
  • Performance optimizations
  • More complex bug fixes

Large (L)

Characteristics:

  • Major feature implementations
  • Breaking changes or API redesigns
  • Complex refactoring across multiple modules
  • New architectural patterns or significant design changes
  • Changes requiring deep context and multiple review rounds

Review Effort: Would have taken 45+ minutes

Examples:

  • Complete new feature with frontend/backend changes
  • Protocol upgrades or breaking changes
  • Major architectural refactoring
  • Framework or technology upgrades

Additional Factors to Consider

When deciding between sizes, also consider:

  • Test coverage impact: More comprehensive test changes lean toward larger classification
  • Risk level: Changes to critical systems bump up a size category
  • Team familiarity: Novel patterns or technologies increase complexity

Notes:

  • the assessment must be for the totality of the PR, that means comparing the base branch to the last commit of the PR
  • the assessment output must be exactly one of: S, M or L (single-line comment) in format of: SIZE={S/M/L}
  • do not include any additional text, only the size classification
  • your assessment comment must not include tips or additional sections
  • do NOT tag me or anyone else on your comment

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Nov 4, 2025

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Get PR diff stats for PR #2275
gh pr view 2275 --json additions,deletions,changedFiles,files

# Get the actual diff to assess complexity
gh pr diff 2275 --patch > /tmp/pr_2275.diff
wc -l /tmp/pr_2275.diff

Length of output: 349


SIZE=L


🧠 Learnings used
Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:42.275Z
Learning: For PR #1884, after each commit review, I should provide a new comment with a PR size report in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding irrelevant files such as lock files (package-lock.json, cargo.lock, etc.).

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:42.275Z
Learning: After each commit in PR #1884, I should provide a new comment with the PR size report in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`. The report should exclude irrelevant files such as lock files (e.g., package-lock.json, cargo.lock).

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:25:47.873Z
Learning: After each new commit review for rainlanguage/rain.orderbook repository, generate a PR size report in a separate comment with the format: "TOTAL=number ADDITIONS=number DELETIONS=number". This report should exclude irrelevant files such as lock files (e.g., package-lock.json, cargo.lock).

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:25:47.873Z
Learning: After each new commit review for rainlanguage/rain.orderbook repository, generate a PR size report in a separate comment with the exact format: "TOTAL=number\nADDITIONS=number\nDELETIONS=number". This report should exclude irrelevant files such as lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, cargo.lock).

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T22:14:22.646Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, I must consistently report the PR size after EVERY new commit in the exact format "TOTAL=number\nADDITIONS=number\nDELETIONS=number" without any formatting blocks. The report must exclude lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, cargo.lock) and can be included either as part of the review or as a separate comment.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T22:14:22.646Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, I must consistently report the PR size after EVERY new commit in the exact format "TOTAL=number\nADDITIONS=number\nDELETIONS=number" without any additional text or formatting blocks. The report must exclude lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, cargo.lock) and can be included either as part of the review or as a separate comment.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T22:46:08.530Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, the PR size report should be the only content in the comment - no text before it, no text after it, no formatting blocks, just the raw report in the exact format: "TOTAL=number\nADDITIONS=number\nDELETIONS=number". The report must exclude lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, cargo.lock).

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1971
File: .github/workflows/vercel-docs-prod.yaml:32-34
Timestamp: 2025-07-11T12:30:09.245Z
Learning: findolor prefers not to pin Node versions explicitly in GitHub Actions workflows when using Nix with webapp-shell, considering the current setup sufficient for deterministic builds in the rainlanguage/rain.orderbook project.

Learnt from: findolor
Repo: rainlanguage/rain.orderbook PR: 1971
File: .github/workflows/vercel-docs-prod.yaml:10-14
Timestamp: 2025-07-11T12:29:49.284Z
Learning: In GitHub Actions workflows for the rainlanguage/rain.orderbook project, findolor is comfortable with job names that may seem misleading (like "Deploy-Docs-Preview" in a production workflow) when there's only one job in the workflow, as the context makes it clear enough.

Learnt from: rouzwelt
Repo: rainlanguage/rain.orderbook PR: 0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants