Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove CometBFT Config from ServerContext #20311

Closed
wants to merge 19 commits into from

Conversation

hieuvubk
Copy link
Contributor

@hieuvubk hieuvubk commented May 7, 2024

Description

Ref: #20288 (comment)


Author Checklist

All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.

I have...

  • included the correct type prefix in the PR title
  • confirmed ! in the type prefix if API or client breaking change
  • targeted the correct branch (see PR Targeting)
  • provided a link to the relevant issue or specification
  • reviewed "Files changed" and left comments if necessary
  • included the necessary unit and integration tests
  • added a changelog entry to CHANGELOG.md
  • updated the relevant documentation or specification, including comments for documenting Go code
  • confirmed all CI checks have passed

Reviewers Checklist

All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.

I have...

  • confirmed the correct type prefix in the PR title
  • confirmed all author checklist items have been addressed
  • reviewed state machine logic, API design and naming, documentation is accurate, tests and test coverage

Summary by CodeRabbit

  • New Features

    • Enhanced server context management with new methods for configuration, logging, and Viper instance retrieval.
    • Introduced type CometConfig with methods for root directory updates and configuration retrieval.
    • Added error handling for configuration type assertion across various commands and functions.
  • Bug Fixes

    • Fixed configuration access issues by ensuring proper type assertions and error management in command functions.
  • Refactor

    • Centralized server context access to use corectx.GetServerContextFromCmd improving consistency and maintainability.
    • Updated various functions to handle the new CometConfig type, ensuring smoother operations and error handling.
  • Documentation

    • Updated command functions documentation to reflect new error handling and configuration management processes.

Copy link
Contributor

coderabbitai bot commented May 7, 2024

Important

Auto Review Skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Walkthrough

The updates across various Go files primarily focus on enhancing configuration handling by introducing type assertions for CometConfig and improving error management. Changes also include method additions for configuration and context management, and adjustments in how configurations are accessed and utilized in commands and database operations. This refactoring aims to standardize and secure the use of configurations throughout the application.

Changes

Files Change Summary
client/snapshot/export.go
client/snapshot/restore.go
Updated to handle configuration via type assertion to CometConfig and adjusted how the home directory is determined.
core/context/server_context.go
server/util.go
Introduced and modified methods for server context and configuration management, including new type CometConfig.
server/cmt_cmds.go
server/rollback.go
x/genutil/client/cli/init.go
x/genutil/client/cli/validate_genesis.go
Modified command functions to type assert and handle configuration as CometConfig. Improved error handling related to configuration access.
x/genutil/client/testutil/helpers.go Enhanced test utilities by adjusting context and configuration handling, and adding necessary imports.

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share
Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger a review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@github-actions github-actions bot added C:CLI C:x/genutil genutil module issues labels May 7, 2024
@hieuvubk hieuvubk marked this pull request as ready for review May 8, 2024 14:14
@hieuvubk hieuvubk requested a review from a team as a code owner May 8, 2024 14:14
@hieuvubk hieuvubk marked this pull request as draft May 8, 2024 14:14
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 23

Review Details

Configuration used: .coderabbit.yml
Review profile: CHILL

Commits Files that changed from the base of the PR and between 5a5c638 and 5e1df8d.
Files ignored due to path filters (2)
  • core/go.mod is excluded by !**/*.mod
  • core/go.sum is excluded by !**/*.sum
Files selected for processing (23)
  • client/snapshot/export.go (2 hunks)
  • client/snapshot/restore.go (3 hunks)
  • core/context/server_context.go (1 hunks)
  • server/cmt_cmds.go (5 hunks)
  • server/rollback.go (1 hunks)
  • server/start.go (7 hunks)
  • server/util.go (6 hunks)
  • server/util_test.go (9 hunks)
  • simapp/simd/cmd/testnet.go (2 hunks)
  • simapp/simd/cmd/testnet_test.go (1 hunks)
  • simapp/test_helpers.go (1 hunks)
  • testutil/network/network.go (3 hunks)
  • testutil/network/util.go (4 hunks)
  • x/genutil/client/cli/collect.go (3 hunks)
  • x/genutil/client/cli/export.go (3 hunks)
  • x/genutil/client/cli/export_test.go (2 hunks)
  • x/genutil/client/cli/genaccount.go (1 hunks)
  • x/genutil/client/cli/genaccount_test.go (1 hunks)
  • x/genutil/client/cli/gentx.go (1 hunks)
  • x/genutil/client/cli/init.go (4 hunks)
  • x/genutil/client/cli/init_test.go (16 hunks)
  • x/genutil/client/cli/validate_genesis.go (1 hunks)
  • x/genutil/client/testutil/helpers.go (3 hunks)
Files not reviewed due to errors (1)
  • testutil/network/network.go (no review received)
Additional Context Used
GitHub Check Runs (1)
golangci-lint failure (11)

client/snapshot/export.go: [failure] 24-24:
ST1005: error strings should not be capitalized (stylecheck)


client/snapshot/restore.go: [failure] 28-28:
ST1005: error strings should not be capitalized (stylecheck)


testutil/network/network.go: [failure] 438-438:
Error return value of gentestutil.WriteAndTrackConfig is not checked (errcheck)


x/genutil/client/cli/collect.go: [failure] 29-29:
ST1005: error strings should not be capitalized (stylecheck)


x/genutil/client/cli/export.go: [failure] 37-37:
ST1005: error strings should not be capitalized (stylecheck)


x/genutil/client/cli/genaccount.go: [failure] 44-44:
ST1005: error strings should not be capitalized (stylecheck)


x/genutil/client/cli/gentx.go: [failure] 61-61:
ST1005: error strings should not be capitalized (stylecheck)


x/genutil/client/cli/init.go: [failure] 88-88:
ST1005: error strings should not be capitalized (stylecheck)


x/genutil/client/cli/init_test.go: [failure] 370-370:
Error return value of genutiltest.WriteAndTrackConfig is not checked (errcheck)


x/genutil/client/testutil/helpers.go: [failure] 28-28:
Error return value is not checked (errcheck)

Path-based Instructions (23)
core/context/server_context.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

client/snapshot/restore.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

client/snapshot/export.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

x/genutil/client/testutil/helpers.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

server/rollback.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

x/genutil/client/cli/validate_genesis.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

x/genutil/client/cli/collect.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

simapp/simd/cmd/testnet_test.go (2)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.


Pattern **/*_test.go: "Assess the unit test code assessing sufficient code coverage for the changes associated in the pull request"

x/genutil/client/cli/genaccount_test.go (2)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.


Pattern **/*_test.go: "Assess the unit test code assessing sufficient code coverage for the changes associated in the pull request"

x/genutil/client/cli/genaccount.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

x/genutil/client/cli/export.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

x/genutil/client/cli/init.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

testutil/network/util.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

simapp/test_helpers.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

x/genutil/client/cli/gentx.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

x/genutil/client/cli/export_test.go (2)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.


Pattern **/*_test.go: "Assess the unit test code assessing sufficient code coverage for the changes associated in the pull request"

x/genutil/client/cli/init_test.go (2)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.


Pattern **/*_test.go: "Assess the unit test code assessing sufficient code coverage for the changes associated in the pull request"

server/cmt_cmds.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

server/util_test.go (2)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.


Pattern **/*_test.go: "Assess the unit test code assessing sufficient code coverage for the changes associated in the pull request"

server/util.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

simapp/simd/cmd/testnet.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

testutil/network/network.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

server/start.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

Additional comments not posted (33)
x/genutil/client/cli/genaccount_test.go (1)

79-80: Ensure the serverCtx is correctly initialized with the new configuration handling.

testutil/network/util.go (1)

35-35: Ensure the CometConfig is correctly asserted from the server context.

simapp/test_helpers.go (1)

232-232: Ensure the CometConfig is correctly used in the application constructor for network simulation tests.

x/genutil/client/cli/export_test.go (3)

71-71: Ensure that the writeAndTrackDefaultConfig function is properly defined and used, as it is critical for setting up the test environment.

Verification successful

The verification process has confirmed the existence and usage of the writeAndTrackDefaultConfig function within the x/genutil/client/cli directory. The function is defined in init_test.go and is used in multiple test files including init_test.go, genaccount_test.go, and export_test.go. This confirms that the function is an integral part of the setup for various test environments across different test suites.

Given this information, the review comment concerning the proper definition and usage of writeAndTrackDefaultConfig in the context of setting up the test environment is accurate. The function is indeed defined and utilized appropriately across the test files.

Conclusion:

  • The writeAndTrackDefaultConfig function is properly defined and used across multiple test files, confirming its critical role in setting up the test environment.
Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify the existence and usage of `writeAndTrackDefaultConfig` function.

# Test: Search for the function definition and usage. Expect: At least one definition and one usage.
rg --type go $'writeAndTrackDefaultConfig'

Length of output: 953


71-71: The implementation of mockExporter is robust, ensuring that all necessary conditions are checked before proceeding with the export operation.


71-71: The test cases in TestExportCLI are comprehensive and effectively test the functionality of the export CLI, including edge cases and error handling.

x/genutil/client/cli/init_test.go (7)

Line range hint 68-79: Ensure proper error handling when retrieving server context.


100-101: Check for potential type assertion issues with CometConfig.

Verification successful

The output from the script indicates widespread use of type assertions with CometConfig across the codebase. However, the script does not provide sufficient context to determine if error handling after these assertions is consistently implemented. For instance, it's unclear what actions are taken when the ok variable from the assertions is false, which is crucial to prevent runtime errors.

To fully verify the handling of type assertions for CometConfig, a deeper analysis of the code surrounding these assertions is necessary. This would involve checking the subsequent lines of code after each assertion to see how the success or failure of the assertion is handled.


The detailed output from the script provides a comprehensive view of how type assertions for CometConfig are handled across the codebase. From the context provided, it is evident that:

  • In many instances, the type assertion is followed by a check on the boolean ok. If the assertion fails (ok is false), an error is returned, typically with a message indicating that the configuration could not be converted. This pattern is consistent across various files such as genaccount.go, validate_genesis.go, gentx.go, export.go, collect.go, init.go, and others.
  • There are also cases where the type assertion does not explicitly check the result (ok), but these are mostly in test setups or less critical code paths, which might be designed to fail loudly (through a panic) if the configuration is incorrect.

Given this analysis, it appears that the critical parts of the codebase do handle type assertion failures appropriately by checking the result of the assertion and handling the error case. This suggests that the initial concern about potential type assertion issues with CometConfig may not be as significant, at least in the critical execution paths where error handling is crucial.

Conclusion:
The handling of type assertions for CometConfig in the codebase is generally robust, with appropriate error checks following the assertions in critical sections of the code. This should mitigate the risk of runtime panics due to failed type assertions in these areas.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify that type assertion for `CometConfig` is handled correctly across the codebase.

# Test: Search for type assertion usage. Expect: Proper error handling for failed assertions.
rg --type go $'CometConfig'

Length of output: 3627



Script:

#!/bin/bash
# Description: Further investigate the handling of type assertions for `CometConfig` to ensure proper error handling.

# Search for files where type assertions are used and display lines surrounding the assertion to check for error handling.
rg --type go -C 3 $'CometConfig'

Length of output: 17467


Line range hint 130-141: Review the consistency of context handling in test environments.

Verification successful

The review comment suggested verifying the consistency of context handling in test environments, specifically focusing on the usage of context.WithValue across various test files in the Go codebase.

Analysis of Script Output:

The script output shows multiple instances of context.WithValue being used across various test files. The usage pattern seems consistent in terms of how context values are being set, particularly with keys like client.ClientContextKey and server.ServerContextKey. This pattern is repeated across different modules, indicating a standardized approach to context handling within test environments.

Conclusion:

The usage of context.WithValue across different test files is consistent, adhering to a common pattern of setting context values, which aligns with the expected standard practices in Go for passing contextual data within applications. This consistency is crucial for maintaining test reliability and ensuring that context-dependent functionalities are correctly tested.

Given the evidence from the script output, it can be concluded that the context handling in the test environments is consistent and aligns with the practices outlined in the review comment.


Consistent Context Handling in Test Environments Verified

  • The usage of context.WithValue is consistent across various test files.
  • Common keys like client.ClientContextKey and server.ServerContextKey are used uniformly, ensuring that context data is handled reliably across tests.
Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Ensure consistent context handling in test environments.

# Test: Search for context handling patterns in test files. Expect: Consistent usage.
rg --type go --glob '*_test.go' $'context.WithValue'

Length of output: 7254


Line range hint 156-167: Validate the integration of corectx.ServerContextKey with server context.

Verification successful

The search results from the script indicate that the corectx.ServerContextKey is used consistently across multiple files in the x/genutil/client/cli/init_test.go and in one utility file (server/util.go). The usage pattern context.WithValue(ctx, corectx.ServerContextKey, serverCtx) is consistent, suggesting that the integration of corectx.ServerContextKey with the server context is implemented correctly across these instances.

Given this information, it appears that the integration of corectx.ServerContextKey with the server context is correctly implemented in the provided context and other parts of the codebase where it is used.

Integration of corectx.ServerContextKey with server context verified:

  • The key is consistently used to store serverCtx in the context across multiple test files and utility files.
  • The pattern of usage aligns with standard practices for context values in Go.
Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Check the integration of `corectx.ServerContextKey` with server context.

# Test: Search for usage of `corectx.ServerContextKey`. Expect: Correct integration.
rg --type go $'corectx.ServerContextKey'

Length of output: 917


Line range hint 248-260: Ensure that the chain ID is correctly propagated through the context.

Verification successful

The output from the rg command shows multiple instances across the codebase where the WithChainID method is used to set the chain ID in various contexts. This method is defined in types/context.go and client/context.go, indicating that it is a standard method for setting the chain ID in a context object.

From the output, it's evident that the method WithChainID is consistently used across different test files and in the main application code to propagate the chain ID through the context. This includes the file x/genutil/client/cli/init_test.go, which is the file under review. The method is used in the same way as in other parts of the codebase, suggesting that the chain ID is likely being propagated correctly as intended.

Given this information, it appears that the chain ID is being set and propagated correctly through the context in the provided code snippet, as well as in other parts of the codebase where similar context manipulations are performed.

Conclusion:
The review comment concerning the propagation of the chain ID through the context in the specified lines of x/genutil/client/cli/init_test.go seems to be addressed correctly in the code. The usage of WithChainID is consistent with its implementation and usage in other parts of the codebase.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Confirm that the chain ID is correctly propagated through the context.

# Test: Search for chain ID propagation in context. Expect: Correct propagation.
rg --type go $'WithChainID'

Length of output: 3149


Line range hint 295-307: Check for correct handling of initial height in blockchain initialization.


Line range hint 328-340: Review error handling for negative initial heights in blockchain tests.

server/cmt_cmds.go (5)

77-80: Ensure robust error handling for type assertion failures in ShowNodeIDCmd.

Verification successful

The verification of the ShowNodeIDCmd function in the server/cmt_cmds.go file confirms that there is robust error handling for type assertion failures. The function includes a check (ok) to ensure that the type assertion to CometConfig is successful, and it returns an error message if the assertion fails. This aligns with best practices for handling potential runtime errors due to type assertions in Go.

Conclusion:

  • The error handling for type assertion failures in the ShowNodeIDCmd function is implemented correctly and robustly.
Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify robust error handling for type assertion failures.

# Test: Search for type assertion error handling in command functions. Expect: Robust error handling.
rg --type go $'CometConfig'

Length of output: 3627



Script:

#!/bin/bash
# Description: Verify robust error handling for type assertion failures in the ShowNodeIDCmd function.

# Test: Search for type assertion error handling in ShowNodeIDCmd function. Expect: Robust error handling.
rg --type go -C 10 'ShowNodeIDCmd' server/cmt_cmds.go

Length of output: 694


100-103: Check for consistent error messages across type assertion failures.

Verification successful

The review comment requested verification of the consistency of error messages across type assertion failures in the Go codebase, specifically focusing on the error message "Can not convert cometbft config".

Analysis of Script Output:

The script executed a search across the Go files in the repository for the specific error message "Can not convert cometbft config". The results show that this error message is used consistently in multiple files and locations within the codebase. The files and functions where this error message appears include various CLI tools, server management commands, and client operations related to the cometbft configuration.

Conclusion:

The error message "Can not convert cometbft config" is consistently used across the codebase in the context of type assertion failures related to the cometbft configuration. This consistency aligns with the intent of the review comment to ensure uniform error handling for type assertion failures.

Final Response:

The error message "Can not convert cometbft config" is consistently used across the codebase in scenarios of type assertion failures. This includes various modules such as CLI tools, server commands, and client operations, ensuring uniformity in error reporting.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Ensure consistent error messages for type assertion failures.

# Test: Search for error messages related to type assertions. Expect: Consistency across the codebase.
rg --type go $'Can not convert cometbft config'

Length of output: 1445


137-140: Review the handling of private validator files in ShowAddressCmd.

Verification successful

The search results from the script indicate that the handling of private validator files is implemented in several places across the codebase, including in the server/cmt_cmds.go file, which is relevant to the review comment. The method LoadFilePV from the pvm package is used to load the private validator files, which suggests a standardized approach to handling these files.

Here are the specific findings from the script output:

  • The LoadFilePV method is used in server/cmt_cmds.go to load private validator files using the configuration settings PrivValidatorKeyFile() and PrivValidatorStateFile().
  • This method is also used in other parts of the codebase, indicating a consistent approach to handling private validator files.

Given this information, it appears that the handling of private validator files in ShowAddressCmd is consistent with other parts of the application, and there are no immediate signs of incorrect or insecure handling based on the script output.

Conclusion:
The handling of private validator files in ShowAddressCmd seems to be implemented correctly and securely, as evidenced by the usage of LoadFilePV method with appropriate configuration settings across the codebase.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify the handling of private validator files in `ShowAddressCmd`.

# Test: Search for handling of private validator files. Expect: Correct and secure handling.
rg --type go $'PrivValidatorKeyFile'

Length of output: 974


376-379: Ensure error handling for configuration conversion in BootstrapStateCmd.

Verification successful

The verification process focused on confirming the implementation of error handling for configuration conversion in the BootstrapStateCmd function within the server/cmt_cmds.go file. The provided script output shows multiple instances where CometConfig is used across various files, including the specific file in question.

From the output, it is evident that the server/cmt_cmds.go file contains lines where the configuration is attempted to be converted to CometConfig with a check on the success of the conversion (ok). If the conversion is not successful, an error is returned, which aligns with the requirement for proper error handling as mentioned in the review comment.

Given this information, it can be concluded that the error handling for configuration conversion in BootstrapStateCmd is implemented correctly as per the requirements specified in the review comment.

Final Conclusion:
The error handling for configuration conversion in BootstrapStateCmd within the server/cmt_cmds.go file is implemented correctly, and the review comment has been verified successfully.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Confirm error handling for configuration conversion in `BootstrapStateCmd`.

# Test: Search for configuration conversion error handling. Expect: Proper implementation.
rg --type go $'CometConfig'

Length of output: 3627


396-396: Validate the use of node.BootstrapState with correct parameters.

Verification successful

The usage of node.BootstrapState in server/cmt_cmds.go matches the only occurrence found in the codebase, as confirmed by the script output. Without additional context or errors indicating a mismatch in parameter types or order, it appears that the function is being called with the correct parameters.

  • server/cmt_cmds.go:396: The function node.BootstrapState is called with parameters cmd.Context(), cfg.Config, cmtcfg.DefaultDBProvider, getGenDocProvider(cfg.Config), uint64(height), and nil.
Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Check the use of `node.BootstrapState` with correct parameters.

# Test: Search for usage of `node.BootstrapState`. Expect: Correct parameter usage.
rg --type go $'node.BootstrapState'

Length of output: 188

server/util_test.go (8)

86-86: Verify the creation of the CometBFT configuration in tests.

Verification successful

The review comment regarding the verification of the creation of the CometBFT configuration in tests has been successfully verified. The script output confirms that server/util_test.go includes multiple checks where GetConfig is used to retrieve and assert the configuration as server.CometConfig, which aligns with the expected handling of the CometBFT configuration in these tests.

  • server/util_test.go: Multiple instances of type assertion with server.CometConfig confirm the creation and correct handling of the CometBFT configuration.
Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Ensure the creation of the CometBFT configuration in tests.

# Test: Search for CometBFT configuration creation in test files. Expect: Correct creation.
rg --type go --glob '*_test.go' $'GetConfig'

Length of output: 1879


150-155: Check for correct database backend configuration from config.toml.

Verification successful

The review comment asked to verify the correct database backend configuration from config.toml. The investigation revealed that the actual configuration file is templated within server/config/toml.go, which includes a setting for app-db-backend. This setting is designed to specify the database backend type for the application and snapshots databases, with a fallback to the db_backend value set in CometBFT's config.toml if left empty.

The relevant configuration line from server/config/toml.go is:

app-db-backend = "{{ .BaseConfig.AppDBBackend }}"

This indicates that the AppDBBackend is configurable and can be set through this template. The actual value would be determined at runtime based on the environment or default settings provided in the application's configuration management.

Given this information, the configuration for the database backend appears to be correctly set up to be specified via the configuration template, and the application logic in server/util_test.go is designed to use this configuration. Therefore, the review comment is consistent with the findings in the codebase.

Conclusion:

  • The database backend configuration is correctly set up to be specified in the configuration template (server/config/toml.go).
  • The application logic in server/util_test.go uses this configuration appropriately.
Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify correct database backend configuration from `config.toml`.

# Test: Search for database backend configuration in `config.toml`. Expect: Correct configuration.
rg --type go $'DBBackend'

Length of output: 2925



Script:

#!/bin/bash
# Description: Check the contents of `config.toml` or equivalent to verify the database backend configuration.

# Search for `config.toml` or equivalent configuration files and display their contents.
fd 'config.toml' --exec cat {}

Length of output: 32



Script:

#!/bin/bash
# Description: Search for any TOML configuration files and inspect specific configuration files mentioned earlier.

# Search for any .toml files in the repository.
fd '\.toml$'

# Display contents of server/config/toml.go and server/config/config.go to inspect database backend configuration.
cat server/config/toml.go
cat server/config/config.go

Length of output: 21505


225-230: Ensure that RPC listen address settings are correctly applied from command flags.

Verification successful

The review comment requested verification that the RPC listen address settings are correctly applied from command flags. The provided script searched for occurrences of RPC.ListenAddress in Go files to check how it's being set and used across the codebase.

Analysis of Script Output:

  • The RPC.ListenAddress is set in multiple files, indicating that it's a configurable parameter.
  • In testutil/network/network.go, the address is set to an empty string, a specific configuration, or dynamically using a port number.
  • In server/start.go, the address is used to create a new RPC client.
  • In simapp/simd/cmd/testnet.go, the address is set dynamically for testnet configurations.

Conclusion:

The script output shows that RPC.ListenAddress is being set and used in various parts of the codebase, including dynamic settings based on command flags or configurations. This suggests that the RPC listen address settings are indeed being applied from command flags as expected.

Given this information, the review comment appears to be verified as the code does handle the RPC listen address settings correctly in relation to command flags.

The RPC listen address settings are correctly applied from command flags as evidenced by their usage and setting across multiple files in the codebase.
- `testutil/network/network.go`: Address set and used in network configurations.
- `server/start.go`: Address used to initialize RPC clients.
- `simapp/simd/cmd/testnet.go`: Address dynamically set for testnet nodes.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Confirm that RPC listen address settings are correctly applied from command flags.

# Test: Search for RPC listen address settings in command flags. Expect: Correct application.
rg --type go $'RPC.ListenAddress'

Length of output: 1143


268-273: Validate the setting of RPC listen address from environment variables.


382-387: Review the precedence of configuration settings from command flags.


405-410: Assess the precedence of configuration settings from environment variables.


428-433: Confirm the precedence of configuration settings from config files.


451-456: Check the default configuration settings when no other sources are provided.

Verification successful

The review comment's concern about verifying the default configuration settings for RPC.ListenAddress when no other sources are provided has been addressed. The test in server/util_test.go explicitly checks that the default value is "tcp://127.0.0.1:26657", confirming the expected default setting. This aligns with the findings from the script outputs and confirms the default configuration.

  • File: server/util_test.go
  • Test Function: TestInterceptConfigsPreRunHandlerPrecedenceConfigDefault
  • Expected Default: "tcp://127.0.0.1:26657"
Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify the default configuration settings when no other sources are provided.

# Test: Search for default configuration settings. Expect: Correct defaults.
rg --type go $'RPC.ListenAddress'

Length of output: 1143



Script:

#!/bin/bash
# Description: Search for the initialization of RPC.ListenAddress in a global context or when no other configuration sources are provided.

# Search for the initialization of RPC.ListenAddress in the main configuration or startup files.
rg --type go -C 5 "RPC.ListenAddress" | grep -i "default"

Length of output: 224



Script:

#!/bin/bash
# Description: Search for more comprehensive context around the initialization of RPC.ListenAddress to identify the default setting.

# Search for the initialization of RPC.ListenAddress in the main configuration or startup files without filtering for "default".
rg --type go -C 10 "RPC.ListenAddress"

Length of output: 14930

server/util.go (6)

45-45: Ensure ServerContextKey is consistently used across all files.

Verification successful

The usage of ServerContextKey across the codebase has been verified and found to be consistent. The key is used appropriately in various contexts, primarily for setting and retrieving server-related configurations in the context. This consistent usage aligns with the expectations set in the original code review comment.

  • server/util.go: Defines and uses ServerContextKey correctly.
  • core/context/server_context.go: Also defines ServerContextKey, ensuring it's available for broader use.
  • Various test and implementation files: Utilize ServerContextKey consistently for context management related to server configurations.
Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify that `ServerContextKey` is used consistently across all files.

# Test: Search for the usage of `ServerContextKey`. Expect: Consistent usage across all files.
rg --type go 'ServerContextKey'

Length of output: 3076


47-49: Confirm that the interfaces are correctly implemented by Context and CometConfig.


61-63: Ensure that GetCometConfigFromViper handles all error scenarios appropriately.


78-86: Review the use of SetRoot to ensure it correctly updates all necessary configuration paths.

Verification successful

The verification process focused on ensuring that the SetRoot function in the server/util.go file correctly updates all necessary configuration paths. The function is designed to update various configuration paths related to base_config, rpc, p2p, mempool, and consensus by setting their root_dir to the provided rootDir string.

From the output of the executed script, it is evident that the SetRoot function modifies the root_dir for all the specified configuration paths as intended in the code snippet provided. There are no indications of missing updates or errors in the paths being set.

Given this information, the function appears to be implemented correctly with respect to the paths it is intended to update. Therefore, the review comment has been verified as accurate based on the current implementation in the codebase.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify that `SetRoot` updates all necessary configuration paths.

# Test: Check for the correct setting of configuration paths in `SetRoot`.
ast-grep --lang go --pattern $'func (ctx *Context) SetRoot($_) { $$$ }'

Length of output: 479


88-91: Confirm that SetRoot on CometConfig returns a modified configuration object, maintaining immutability.

Verification successful

The verification process has confirmed that the SetRoot method in the CometConfig class indeed returns a modified configuration object, as indicated by the method signature and the return statement in the code. This aligns with the requirement for maintaining immutability by ensuring that any modifications return a new or modified instance of the configuration object rather than altering the original instance directly.

Here's the breakdown of the method:

  • The method signature func (config CometConfig) SetRoot(root string) corectx.CometConfig indicates that it returns a CometConfig object.
  • The method body modifies the configuration by calling config.Config.SetRoot(root).
  • It then returns the config object, which is a modified version of the original due to the SetRoot call.

This confirms that the method behaves as expected in terms of maintaining immutability by not altering the original configuration object directly but instead returning a modified version.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify that `SetRoot` on `CometConfig` maintains immutability by returning a modified configuration object.

# Test: Check for the return of a modified configuration object in `SetRoot`.
ast-grep --lang go --pattern $'func (config CometConfig) SetRoot($_) corectx.CometConfig { $$$ }'

Length of output: 293


93-100: Validate error handling and default configuration logic in GetCometConfigFromViper.

Verification successful

The review comment requested verification of the error handling and default configuration logic in the GetCometConfigFromViper function. The provided script output confirms the structure and logic of the function as described in the snippet from the review.

Here's a breakdown of the function's logic based on the script output:

  1. The function initializes a default configuration using cmtcfg.DefaultConfig().
  2. It attempts to unmarshal the Viper configuration into this default configuration.
  3. If an error occurs during unmarshaling (err != nil), the function returns a new CometConfig object initialized again with the default configuration.
  4. If no error occurs, it returns a CometConfig object initialized with the successfully unmarshaled configuration.

This confirms that the function has appropriate error handling: it gracefully handles unmarshaling errors by reverting to a default configuration. Additionally, the logic for handling the default configuration is correctly implemented, ensuring that a valid configuration object is always returned.

Based on this analysis, the error handling and default configuration logic in GetCometConfigFromViper function is implemented as expected.

The error handling and default configuration logic in `GetCometConfigFromViper` function are correctly implemented as per the requirements.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify error handling and default configuration logic in `GetCometConfigFromViper`.

# Test: Check for error handling and default configuration logic.
ast-grep --lang go --pattern $'func GetCometConfigFromViper($_) corectx.CometConfig { $$$ }'

Length of output: 472

simapp/simd/cmd/testnet.go (1)

164-164: Review the logic in initTestnetFiles to ensure it correctly initializes files based on the provided configuration.

Verification successful

The provided output from the shell script execution gives a detailed view of the initTestnetFiles function in the simapp/simd/cmd/testnet.go file. This function is responsible for initializing testnet files based on the provided configuration, as indicated by the review comment.

Analysis of initTestnetFiles Function:

  1. Configuration Handling:

    • The function starts by setting up default configurations and adjusting them based on the arguments provided (args). This includes settings for the chain ID, gas prices, API, and telemetry configurations.
    • It also handles different network configurations based on whether the setup is for a single machine or multiple nodes.
  2. Directory and File Management:

    • Directories for each node are created, and configuration files are set up within these directories.
    • The function handles errors robustly by cleaning up the output directory if any part of the initialization fails.
  3. Node and Validator Initialization:

    • For each validator, it generates node IDs, public keys, and initial transactions.
    • It also handles the creation of accounts and balances, and constructs genesis files.
  4. Final Steps:

    • After setting up individual nodes, it collects and initializes general files required for the genesis state of the blockchain.
    • Successfully initialized directories are confirmed with a printed message.

Conclusion:

The function initTestnetFiles appears to be comprehensive in handling various aspects of file and configuration initialization for setting up a testnet. It takes into account different scenarios (e.g., single machine setup), handles errors effectively, and ensures that all necessary files and configurations are correctly set up based on the provided arguments.

Given the detailed implementation and the handling of various configurations and error scenarios, it seems that the function is correctly initializing files based on the provided configuration, as required by the review comment.

Final Response:

The initTestnetFiles function in simapp/simd/cmd/testnet.go is implemented to comprehensively handle the initialization of testnet files and configurations. It adjusts settings based on input arguments, manages file and directory setups, initializes nodes and validators, and handles errors effectively. This aligns with the expectations set in the review comment.

  • File Path: simapp/simd/cmd/testnet.go
  • Function: initTestnetFiles
Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify that `initTestnetFiles` correctly initializes files based on the provided configuration.

# Test: Check for correct file initialization logic in `initTestnetFiles`.
ast-grep --lang go --pattern $'func initTestnetFiles($_, $_, $_, $_, $_, $_) error { $$$ }'

Length of output: 12006

server/start.go Outdated
Comment on lines 255 to 258
config, ok := svrCtx.GetConfig().(CometConfig)
if !ok {
return fmt.Errorf("Can not convert cometbft config")
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Ensure proper error message formatting.

- return fmt.Errorf("Can not convert cometbft config")
+ return fmt.Errorf("cannot convert CometBFT config")

This change improves the grammatical correctness and consistency of error messages.


Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
config, ok := svrCtx.GetConfig().(CometConfig)
if !ok {
return fmt.Errorf("Can not convert cometbft config")
}
config, ok := svrCtx.GetConfig().(CometConfig)
if !ok {
return fmt.Errorf("cannot convert CometBFT config")
}

server/start.go Outdated
Comment on lines 315 to 318
cmtCfg, ok := svrCtx.GetConfig().(CometConfig)
if !ok {
return fmt.Errorf("Can not convert cometbft config")
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Ensure proper error message formatting.

- return fmt.Errorf("Can not convert cometbft config")
+ return fmt.Errorf("cannot convert CometBFT config")

This change improves the grammatical correctness and consistency of error messages.


Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
cmtCfg, ok := svrCtx.GetConfig().(CometConfig)
if !ok {
return fmt.Errorf("Can not convert cometbft config")
}
cmtCfg, ok := svrCtx.GetConfig().(CometConfig)
if !ok {
return fmt.Errorf("cannot convert CometBFT config")
}

server/start.go Outdated
Comment on lines 770 to 773
config, ok := ctx.GetConfig().(CometConfig)
if !ok {
return nil, fmt.Errorf("Can not convert cometbft config")
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Ensure proper error message formatting.

- return nil, fmt.Errorf("Can not convert cometbft config")
+ return nil, fmt.Errorf("cannot convert CometBFT config")

This change improves the grammatical correctness and consistency of error messages.


Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
config, ok := ctx.GetConfig().(CometConfig)
if !ok {
return nil, fmt.Errorf("Can not convert cometbft config")
}
config, ok := ctx.GetConfig().(CometConfig)
if !ok {
return nil, fmt.Errorf("cannot convert CometBFT config")
}

Comment on lines 42 to 45
config, ok := serverCtx.GetConfig().(server.CometConfig)
if !ok {
return fmt.Errorf("Can not convert cometbft config")
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Refactor error message to start with a lowercase letter.

-				return fmt.Errorf("Can not convert cometbft config")
+				return fmt.Errorf("cannot convert cometbft config")

Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
config, ok := serverCtx.GetConfig().(server.CometConfig)
if !ok {
return fmt.Errorf("Can not convert cometbft config")
}
config, ok := serverCtx.GetConfig().(server.CometConfig)
if !ok {
return fmt.Errorf("cannot convert cometbft config")

Comment on lines 35 to 38
config, ok := serverCtx.GetConfig().(server.CometConfig)
if !ok {
return fmt.Errorf("Can not convert cometbft config")
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Refactor error message to start with a lowercase letter.

-				return fmt.Errorf("Can not convert cometbft config")
+				return fmt.Errorf("cannot convert cometbft config")

Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
config, ok := serverCtx.GetConfig().(server.CometConfig)
if !ok {
return fmt.Errorf("Can not convert cometbft config")
}
config, ok := serverCtx.GetConfig().(server.CometConfig)
if !ok {
return fmt.Errorf("cannot convert cometbft config")

config := serverCtx.Config
config, ok := serverCtx.GetConfig().(server.CometConfig)
if !ok {
return fmt.Errorf("Can not convert cometbft config")
Copy link
Contributor

Choose a reason for hiding this comment

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

Error messages should start with a lowercase letter.

- return fmt.Errorf("Can not convert cometbft config")
+ return fmt.Errorf("cannot convert cometbft config")

Following Go conventions, error strings should not be capitalized unless they begin with proper nouns or acronyms.


Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
return fmt.Errorf("Can not convert cometbft config")
return fmt.Errorf("cannot convert cometbft config")

Comment on lines 27 to 30
config, ok := serverCtx.GetConfig().(server.CometConfig)
if !ok {
return fmt.Errorf("Can not convert cometbft config")
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Consider handling the type assertion failure more gracefully.

Instead of returning an error immediately, you might log this incident or attempt a recovery strategy, depending on the application's criticality and design.

@@ -57,7 +57,9 @@ func Test_TestnetCmd(t *testing.T) {
err = genutiltest.ExecInitCmd(moduleManager, home, encodingConfig.Codec)
require.NoError(t, err)

serverCtx := server.NewContext(viper.New(), cfg, logger)
serverCtx := server.NewContext(viper.New(), logger)
err = genutiltest.WriteAndTrackConfig(serverCtx.GetViper(), home, cfg)
Copy link
Contributor

Choose a reason for hiding this comment

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

Check the error returned by WriteAndTrackConfig.

- err = genutiltest.WriteAndTrackConfig(serverCtx.GetViper(), home, cfg)
+ err = genutiltest.WriteAndTrackConfig(serverCtx.GetViper(), home, cfg)
+ require.NoError(t, err)

Ignoring errors can lead to runtime issues where invalid or nil configurations are used, potentially causing panics or incorrect behavior.


Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
err = genutiltest.WriteAndTrackConfig(serverCtx.GetViper(), home, cfg)
err = genutiltest.WriteAndTrackConfig(serverCtx.GetViper(), home, cfg)
require.NoError(t, err)

@@ -141,7 +141,7 @@ Example:
}

serverCtx := server.GetServerContextFromCmd(cmd)
config := serverCtx.Config
config := serverCtx.GetConfig().(server.CometConfig)
Copy link
Contributor

Choose a reason for hiding this comment

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

Tip

Codebase Verification

The verification process has revealed that the type assertion for CometConfig in the file simapp/simd/cmd/testnet.go does not include a check for the success of the type assertion (ok). This pattern of checking the type assertion with ok is consistently used in other parts of the codebase, as shown by the results from the ast-grep command.

Here are the specific findings:

  • In the file simapp/simd/cmd/testnet.go, the type assertion is performed without checking if it was successful, which could potentially lead to a runtime panic if the assertion fails.
  • Other files in the codebase, such as ./x/genutil/client/cli/validate_genesis.go, ./x/genutil/client/cli/init.go, and several others, include a check (ok) to safely handle the type assertion.

Given these observations, it is recommended to adjust the type assertion in simapp/simd/cmd/testnet.go to include a safety check. This will align it with the rest of the codebase and prevent potential runtime errors.

Recommended Changes:

  • Update the type assertion in simapp/simd/cmd/testnet.go to include a check for its success, similar to other parts of the codebase.
Analysis chain

Ensure that the type assertion for CometConfig is safe and handled correctly.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify that the type assertion for `CometConfig` is safe and handled correctly.

# Test: Check for the safe handling of type assertion in `GetServerContextFromCmd`.
ast-grep --lang go --pattern $'serverCtx.GetConfig().(server.CometConfig)'

Length of output: 1337

Comment on lines +368 to +371
func writeAndTrackDefaultConfig(v *viper.Viper, home string) {
cfg, _ := genutiltest.CreateDefaultCometConfig(home)
genutiltest.WriteAndTrackConfig(v, home, cfg)
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Handle the error return value of genutiltest.WriteAndTrackConfig.

- genutiltest.WriteAndTrackConfig(v, home, cfg)
+ if err := genutiltest.WriteAndTrackConfig(v, home, cfg); err != nil {
+     // Handle error appropriately
+ }

Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
func writeAndTrackDefaultConfig(v *viper.Viper, home string) {
cfg, _ := genutiltest.CreateDefaultCometConfig(home)
genutiltest.WriteAndTrackConfig(v, home, cfg)
}
func writeAndTrackDefaultConfig(v *viper.Viper, home string) {
cfg, _ := genutiltest.CreateDefaultCometConfig(home)
if err := genutiltest.WriteAndTrackConfig(v, home, cfg); err != nil {
// Handle error appropriately
}
}

Copy link
Member

Choose a reason for hiding this comment

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

We don't want anything comet specific in core.

I would just replace this whole file by

type LoggerContextKey struct{}
type ConfigContextKey struct{}

@tac0turtle
Copy link
Member

I dont think we need this pr? @julienrbrt

@julienrbrt
Copy link
Member

We actually do, we need to kill the notion of server context so the same commands can work for server v0 and server v2

@tac0turtle
Copy link
Member

closing in favour of #20422

@tac0turtle tac0turtle closed this May 17, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C:CLI C:x/genutil genutil module issues
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants