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

feat(gnovm): packages loader #2932

Draft
wants to merge 33 commits into
base: master
Choose a base branch
from
Draft

Conversation

n0izn0iz
Copy link
Contributor

@n0izn0iz n0izn0iz commented Oct 10, 2024

WIP

Continuation of #2201
Taking #2904 into account

This implements a Load function with a similar interface to the packages.Load go function

Screenshot 2024-10-11 at 13 50 18
Contributors' checklist...
  • Added new tests, or not needed, or not feasible
  • Provided an example (e.g. screenshot) to aid review or the PR is self-explanatory
  • Updated the official documentation or not needed
  • No breaking changes were made, or a BREAKING CHANGE: xxx message was included in the description
  • Added references to related issues and PRs
  • Provided any useful hints for running manual tests
  • Added new benchmarks to generated graphs, if any. More info here.

@github-actions github-actions bot added 🧾 package/realm Tag used for new Realms or Packages. 📦 🤖 gnovm Issues or PRs gnovm related 📦 ⛰️ gno.land Issues or PRs gno.land package related labels Oct 10, 2024
Copy link

codecov bot commented Oct 10, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

📢 Thoughts on this report? Let us know!

Signed-off-by: Norman Meier <[email protected]>
Signed-off-by: Norman Meier <[email protected]>
Signed-off-by: Norman Meier <[email protected]>
Signed-off-by: Norman Meier <[email protected]>
Signed-off-by: Norman Meier <[email protected]>
Signed-off-by: Norman Meier <[email protected]>
Signed-off-by: Norman Meier <[email protected]>
Signed-off-by: Norman Meier <[email protected]>
@n0izn0iz n0izn0iz changed the title feat(gnovm): package resolver lib feat(gnovm): packages loader Oct 11, 2024
Signed-off-by: Norman Meier <[email protected]>
@@ -0,0 +1 @@
module gno.land
Copy link
Member

Choose a reason for hiding this comment

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

do we need this file?

if we need it, please explain in a comment.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

please see #2904 (comment) and tell me what you think

Copy link
Contributor Author

@n0izn0iz n0izn0iz Oct 11, 2024

Choose a reason for hiding this comment

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

I think the best would be to have a gno.work file at repo root to support multiple modules in a monorepo
But in that case we need to implement the gno work commands

@@ -40,7 +40,7 @@ func TestMachineTestMemPackage(t *testing.T) {
Name: tt.name,
F: func(t2 *testing.T) { //nolint:thelper
rootDir := filepath.Join("..", "..")
store := TestStore(rootDir, "test", os.Stdin, os.Stdout, os.Stderr, ImportModeStdlibsOnly)
store := TestStore(rootDir, "test", nil, os.Stdin, os.Stdout, os.Stderr, ImportModeStdlibsOnly)
Copy link
Member

Choose a reason for hiding this comment

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

create a variable that you set to nil, so we now what is this parameter.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

done in 0123512

func DownloadModule(pkgPath string, dst string) error {
modFilePath := filepath.Join(dst, ModfileName)
if _, err := os.Stat(modFilePath); os.IsNotExist(err) {
fmt.Fprintln(os.Stderr, "gno: downloading", pkgPath)
Copy link
Member

Choose a reason for hiding this comment

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

we usually don't use os.StdXXX, but stdouterr from a struct (io something) which is passed when needed.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

done in e648305

}
}

// write gno.mod
Copy link
Member

Choose a reason for hiding this comment

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

do we need this?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

it depends, but to keep sanity, I think we do, see: #2904 (comment)

Copy link
Contributor Author

@n0izn0iz n0izn0iz Oct 11, 2024

Choose a reason for hiding this comment

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

If you first download a sub-module, for example gno.land/p/demo/json/eisel_lemire
it will create the $GNOHOME/pkg/mod/gno.land/p/demo/json directory since it's a parent directory.
To know that the gno.land/p/demo/json package needs to be downloaded, I'm checking for the presence of $GNOHOME/pkg/mod/gno.land/p/demo/json/gno.mod

@@ -617,3 +592,21 @@ func shouldRun(filter filterMatch, path string) bool {
ok, _ := filter.matches(elem, matchString)
return ok
}

// Adapted from https://yourbasic.org/golang/formatting-byte-size-to-human-readable-format/
func prettySize(nb int64) string {
Copy link
Member

Choose a reason for hiding this comment

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

why moving this from util?

Copy link
Contributor Author

@n0izn0iz n0izn0iz Oct 11, 2024

Choose a reason for hiding this comment

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

conflict resolution fail, reverted in 53c5770

Dir string `json:",omitempty"`
ImportPath string `json:",omitempty"`
Name string `json:",omitempty"`
Root string `json:",omitempty"`
Copy link
Member

Choose a reason for hiding this comment

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

add comments to explain the fields.

this one for instance, is it the "location of the package that can be either specified locally or automatically cached on the disk"? or something else?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

done in 457b0c9

n0izn0iz and others added 7 commits October 11, 2024 17:46
Signed-off-by: Norman Meier <[email protected]>
Signed-off-by: Norman Meier <[email protected]>
Signed-off-by: Norman Meier <[email protected]>
Signed-off-by: Norman Meier <[email protected]>
Signed-off-by: Norman Meier <[email protected]>
@thehowl
Copy link
Member

thehowl commented Oct 17, 2024

Thanks <3

thehowl added a commit that referenced this pull request Dec 7, 2024
A step towards the importer package (#2932) and future of `gno.mod`
(#2904)

- BREAKING CHANGE: remove `require` statement support from `gno.mod`
- BREAKING CHANGE: remove `-v` (verbose) and `--remote` flags in `gno
mod download`
- Don't require version specification in `gno.mod`'s `replace`
statements
- Use `.gno` files `import` statements to find dependencies
- Extract and refacto imports gathering utils in `gnovm/pkg/packages`
- Add `gnovm/cmd/gno/internal/pkgdownload.PackageFetcher` interface
- Implement `PackageFetcher` using `vm/qfile` queries in
`gnovm/cmd/gno/internal/pkgdownload/rpcpackagefetcher`
- Rewrite single package download routine in
`gnovm/cmd/gno/internal/pkgdownload`
- Move and refacto dependencies download routine in
`gnovm/cmd/gno/download_deps.go`
- Add a `--remote-overrides` flag for `gno mod download` that takes
`chain-domain=rpc-url` comma-separated pairs to override endpoints used
to fetch packages
- Add and use a testing implementation of `PackageFetcher` called
`examplesPackageFetcher` that serves package from the `examples`
directory for testing purposes (download tests before this PR use the
portal loop public endpoint)
- Make `ReadMemPackage` and it's dependencies error-out instead of
panicking
- Create panicking `MemPackage` utils that wrap the erroring ones and
use them at existing callsites

I decided to do this first to avoid having multiple ways to resolve
dependencies lying around in the codebase and causing confusion in
subsequent steps

<details><summary>Contributors' checklist...</summary>

- [x] Added new tests, or not needed, or not feasible
- [ ] Provided an example (e.g. screenshot) to aid review or the PR is
self-explanatory
- [ ] Updated the official documentation or not needed
- [x] No breaking changes were made, or a `BREAKING CHANGE: xxx` message
was included in the description
- [x] Added references to related issues and PRs
- [ ] Provided any useful hints for running manual tests
</details>

---------

Signed-off-by: Norman Meier <[email protected]>
Co-authored-by: Morgan Bazalgette <[email protected]>
omarsy pushed a commit to TERITORI/gno that referenced this pull request Dec 7, 2024
…ng#3123)

A step towards the importer package (gnolang#2932) and future of `gno.mod`
(gnolang#2904)

- BREAKING CHANGE: remove `require` statement support from `gno.mod`
- BREAKING CHANGE: remove `-v` (verbose) and `--remote` flags in `gno
mod download`
- Don't require version specification in `gno.mod`'s `replace`
statements
- Use `.gno` files `import` statements to find dependencies
- Extract and refacto imports gathering utils in `gnovm/pkg/packages`
- Add `gnovm/cmd/gno/internal/pkgdownload.PackageFetcher` interface
- Implement `PackageFetcher` using `vm/qfile` queries in
`gnovm/cmd/gno/internal/pkgdownload/rpcpackagefetcher`
- Rewrite single package download routine in
`gnovm/cmd/gno/internal/pkgdownload`
- Move and refacto dependencies download routine in
`gnovm/cmd/gno/download_deps.go`
- Add a `--remote-overrides` flag for `gno mod download` that takes
`chain-domain=rpc-url` comma-separated pairs to override endpoints used
to fetch packages
- Add and use a testing implementation of `PackageFetcher` called
`examplesPackageFetcher` that serves package from the `examples`
directory for testing purposes (download tests before this PR use the
portal loop public endpoint)
- Make `ReadMemPackage` and it's dependencies error-out instead of
panicking
- Create panicking `MemPackage` utils that wrap the erroring ones and
use them at existing callsites

I decided to do this first to avoid having multiple ways to resolve
dependencies lying around in the codebase and causing confusion in
subsequent steps

<details><summary>Contributors' checklist...</summary>

- [x] Added new tests, or not needed, or not feasible
- [ ] Provided an example (e.g. screenshot) to aid review or the PR is
self-explanatory
- [ ] Updated the official documentation or not needed
- [x] No breaking changes were made, or a `BREAKING CHANGE: xxx` message
was included in the description
- [x] Added references to related issues and PRs
- [ ] Provided any useful hints for running manual tests
</details>

---------

Signed-off-by: Norman Meier <[email protected]>
Co-authored-by: Morgan Bazalgette <[email protected]>
@thehowl
Copy link
Member

thehowl commented Dec 8, 2024

@n0izn0iz what are other dependencies awaiting before tackling merging this one?

@Gno2D2
Copy link
Collaborator

Gno2D2 commented Dec 8, 2024

I'm a bot that assists the Gno Core team in maintaining this repository. My role is to ensure that contributors understand and follow our guidelines, helping to streamline the development process.

The following requirements must be fulfilled before a pull request can be merged.
Some requirement checks are automated and can be verified by the CI, while others need manual verification by a staff member.

These requirements are defined in this configuration file.

Automated Checks

🔴 Maintainers must be able to edit this pull request (more info)
🔴 The pull request head branch must be up-to-date with its base (more info)

Manual Checks

No manual checks match this pull request.

Debug
Automated Checks
Maintainers must be able to edit this pull request (more info)

If

🟢 Condition met
└── 🟢 On every pull request

Then

🔴 Requirement not satisfied
└── 🔴 Maintainer can modify this pull request

The pull request head branch must be up-to-date with its base (more info)

If

🟢 Condition met
└── 🟢 On every pull request

Then

🔴 Requirement not satisfied
└── 🔴 Head branch (TERITORI:gno-resolver) is up to date with base (master): behind by 115 / ahead by 33

@n0izn0iz
Copy link
Contributor Author

n0izn0iz commented Dec 8, 2024

I wonder if I should do the genesis stdlibs first, I'm not sure how these two would interact since we need to return the source dir of packages for tooling like gnopls and I'm not sure if we should download them from the remote and how we should store them if we do. Also not sure how to proceed with the embedded ones if we don't download them

Villaquiranm pushed a commit to Villaquiranm/gno that referenced this pull request Dec 9, 2024
…ng#3123)

A step towards the importer package (gnolang#2932) and future of `gno.mod`
(gnolang#2904)

- BREAKING CHANGE: remove `require` statement support from `gno.mod`
- BREAKING CHANGE: remove `-v` (verbose) and `--remote` flags in `gno
mod download`
- Don't require version specification in `gno.mod`'s `replace`
statements
- Use `.gno` files `import` statements to find dependencies
- Extract and refacto imports gathering utils in `gnovm/pkg/packages`
- Add `gnovm/cmd/gno/internal/pkgdownload.PackageFetcher` interface
- Implement `PackageFetcher` using `vm/qfile` queries in
`gnovm/cmd/gno/internal/pkgdownload/rpcpackagefetcher`
- Rewrite single package download routine in
`gnovm/cmd/gno/internal/pkgdownload`
- Move and refacto dependencies download routine in
`gnovm/cmd/gno/download_deps.go`
- Add a `--remote-overrides` flag for `gno mod download` that takes
`chain-domain=rpc-url` comma-separated pairs to override endpoints used
to fetch packages
- Add and use a testing implementation of `PackageFetcher` called
`examplesPackageFetcher` that serves package from the `examples`
directory for testing purposes (download tests before this PR use the
portal loop public endpoint)
- Make `ReadMemPackage` and it's dependencies error-out instead of
panicking
- Create panicking `MemPackage` utils that wrap the erroring ones and
use them at existing callsites

I decided to do this first to avoid having multiple ways to resolve
dependencies lying around in the codebase and causing confusion in
subsequent steps

<details><summary>Contributors' checklist...</summary>

- [x] Added new tests, or not needed, or not feasible
- [ ] Provided an example (e.g. screenshot) to aid review or the PR is
self-explanatory
- [ ] Updated the official documentation or not needed
- [x] No breaking changes were made, or a `BREAKING CHANGE: xxx` message
was included in the description
- [x] Added references to related issues and PRs
- [ ] Provided any useful hints for running manual tests
</details>

---------

Signed-off-by: Norman Meier <[email protected]>
Co-authored-by: Morgan Bazalgette <[email protected]>
r3v4s pushed a commit to gnoswap-labs/gno that referenced this pull request Dec 10, 2024
…ng#3123)

A step towards the importer package (gnolang#2932) and future of `gno.mod`
(gnolang#2904)

- BREAKING CHANGE: remove `require` statement support from `gno.mod`
- BREAKING CHANGE: remove `-v` (verbose) and `--remote` flags in `gno
mod download`
- Don't require version specification in `gno.mod`'s `replace`
statements
- Use `.gno` files `import` statements to find dependencies
- Extract and refacto imports gathering utils in `gnovm/pkg/packages`
- Add `gnovm/cmd/gno/internal/pkgdownload.PackageFetcher` interface
- Implement `PackageFetcher` using `vm/qfile` queries in
`gnovm/cmd/gno/internal/pkgdownload/rpcpackagefetcher`
- Rewrite single package download routine in
`gnovm/cmd/gno/internal/pkgdownload`
- Move and refacto dependencies download routine in
`gnovm/cmd/gno/download_deps.go`
- Add a `--remote-overrides` flag for `gno mod download` that takes
`chain-domain=rpc-url` comma-separated pairs to override endpoints used
to fetch packages
- Add and use a testing implementation of `PackageFetcher` called
`examplesPackageFetcher` that serves package from the `examples`
directory for testing purposes (download tests before this PR use the
portal loop public endpoint)
- Make `ReadMemPackage` and it's dependencies error-out instead of
panicking
- Create panicking `MemPackage` utils that wrap the erroring ones and
use them at existing callsites

I decided to do this first to avoid having multiple ways to resolve
dependencies lying around in the codebase and causing confusion in
subsequent steps

<details><summary>Contributors' checklist...</summary>

- [x] Added new tests, or not needed, or not feasible
- [ ] Provided an example (e.g. screenshot) to aid review or the PR is
self-explanatory
- [ ] Updated the official documentation or not needed
- [x] No breaking changes were made, or a `BREAKING CHANGE: xxx` message
was included in the description
- [x] Added references to related issues and PRs
- [ ] Provided any useful hints for running manual tests
</details>

---------

Signed-off-by: Norman Meier <[email protected]>
Co-authored-by: Morgan Bazalgette <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
📦 ⛰️ gno.land Issues or PRs gno.land package related 📦 🤖 gnovm Issues or PRs gnovm related 🧾 package/realm Tag used for new Realms or Packages.
Projects
Status: No status
Status: Triage
Development

Successfully merging this pull request may close these issues.

4 participants