-
Notifications
You must be signed in to change notification settings - Fork 1.8k
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
fix(forge
): pin tags/revs for deps
#9522
base: master
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this makes sense overall, 2 scenarios was thinking of
- update deps of dependencies
forge init
and then install specific tagforge install OpenZeppelin/openzeppelin-contracts@tag=v4.9.4
. This will result in 2 deps inlib/openzeppelin-contracts/lib
:
erc4626-tests
forge-std
forge update
updates dependencies of Oz dependency, resulting in 3 deps
erc4626-tests
forge-std
halmos-cheatcodes
This probably cannot be fixed even when openzeppelin-contracts
contracts will add its own forge-submodule-info.json
?
- updating dependency to a different version
- cd in
lib/openzeppelin-contracts/
andgit checkout v5.0.2
forge update
silently checks outv4.9.4
- in order to persist then
forge-submodule-info.json
should be manually edited and"lib/openzeppelin-contracts":{"Tag":"v4.9.4"}
updated to"lib/openzeppelin-contracts":{"Tag":"v5.0.2"}
Maybe on forge update
we should print out versions (and should follow up with docs / book update).
(1). Yeah, this is because we run (2) Deps can be updated along with the values in |
crates/forge/bin/cmd/install.rs
Outdated
@@ -19,6 +20,8 @@ use yansi::Paint; | |||
static DEPENDENCY_VERSION_TAG_REGEX: LazyLock<Regex> = | |||
LazyLock::new(|| Regex::new(r"^v?\d+(\.\d+)*$").unwrap()); | |||
|
|||
pub const FORGE_SUBMODULES_INFO: &str = "forge-submodules-info.json"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we rename this foundry.lock
? Considering it effectively serves as a lockfile not intended to be manually edited and checked in
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
to add to this point, should we maybe put it in lib
dir instead prj root?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it makes sense to put it in the root as it is related to .gitmodules
Motivation
Closes #7225
git submodule
doesn't have support for pinning to tags/revisions, onlybranches
in.gitmodules
forge
when updating deps.forge install OpenZeppelin/[email protected]
.git submodule status
shows the oz dep checked out at OpenZeppelin/openzeppelin-contracts@69c8defforge update
Solution
Maintain a file
submodules-info.json
that consists of a mapping fromlib_path
toTagType
. This file is committed with everyforge install
.Every time
forge update
is run, this file is inferred to correctly check out the dep and maintaintag
orrev
pinning if specified.In case we want to override a dep and set a new tag, this can be done like so:
forge update owner/dep@new-tag
TODO