-
Notifications
You must be signed in to change notification settings - Fork 21
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(cli): forge build for tests by default #1473
base: dev
Are you sure you want to change the base?
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,12 +1,16 @@ | ||
import { spawn } from 'node:child_process'; | ||
import path from 'path'; | ||
import fs from 'fs-extra'; | ||
import { glob } from 'glob'; | ||
import { ContractArtifact } from '@usecannon/builder'; | ||
import _ from 'lodash'; | ||
import Debug from 'debug'; | ||
import Debug, { log } from 'debug'; | ||
|
||
import { execPromise } from './helpers'; | ||
import { warn } from './util/console'; | ||
import { bold, gray, red, yellow } from 'chalk'; | ||
import { forgeBuildOptions } from './commands/config/forge/build'; | ||
import { fromFoundryOptionsToArgs, pickForgeBuildOptions } from './util/foundry-options'; | ||
|
||
const debug = Debug('cannon:cli:foundry'); | ||
|
||
|
@@ -72,11 +76,15 @@ export async function getFoundryArtifact(name: string, baseDir = '', includeSour | |
const possibleArtifacts = []; | ||
for (const artifactPath of possibleArtifactPaths) { | ||
const artifactBuffer = await fs.readFile(artifactPath); | ||
possibleArtifacts.push(JSON.parse(artifactBuffer.toString()) as any); | ||
const artifact = JSON.parse(artifactBuffer.toString()) as any; | ||
if (!artifact.ast) { | ||
throw new Error(`Unable to find output from forge with ast for ${inputContractName} (from ${name}). Before running this command, run forge build --ast`); | ||
} | ||
possibleArtifacts.push(artifact); | ||
} | ||
|
||
if (!possibleArtifacts.length) { | ||
throw new Error(`no contract was found by name: ${inputContractName} (from ${name})`); | ||
throw new Error(`Unable to find output from forge with ast for ${inputContractName} (from ${name}). Before running this command, run forge build --ast`); | ||
} | ||
|
||
let artifact = possibleArtifacts[0]; | ||
|
@@ -153,3 +161,40 @@ export async function getFoundryArtifact(name: string, baseDir = '', includeSour | |
linkReferences: artifact.bytecode.linkReferences, | ||
}; | ||
} | ||
|
||
|
||
export async function forgeBuild(options: Record<string, any>, cannonfile: string) { | ||
|
||
const cannonfilePath = path.resolve(cannonfile); | ||
const projectDirectory = path.dirname(cannonfilePath); | ||
|
||
log(bold('Building the foundry project...')); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This could be inside line |
||
if (!options.skipCompile) { | ||
// use --build-info to output build info | ||
// ref: https://github.com/foundry-rs/foundry/pull/7197 | ||
const forgeBuildArgs = [ | ||
'build', | ||
'--build-info', | ||
'--ast', | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove the --ast flag. Context: In a past Forge update (commit #7197) stopped generating AST by default. This creates compatibility issues with older Forge versions, where the AST was generated by default, and using the Instead, the |
||
...fromFoundryOptionsToArgs(pickForgeBuildOptions(options), forgeBuildOptions), | ||
]; | ||
|
||
const forgeBuildProcess = spawn('forge', forgeBuildArgs, { cwd: projectDirectory, shell: true }); | ||
|
||
await new Promise((resolve, reject) => { | ||
forgeBuildProcess.on('exit', (code) => { | ||
if (code === 0) { | ||
log(gray('forge build succeeded')); | ||
} else { | ||
log(red('forge build failed')); | ||
log(red('Make sure "forge build" runs successfully or use the --skip-compile flag.')); | ||
return reject(new Error(`forge build failed with exit code "${code}"`)); | ||
} | ||
|
||
resolve(null); | ||
}); | ||
}); | ||
} else { | ||
log(yellow('Skipping forge build...')); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Here could be something like: |
||
} | ||
} |
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.
The cannon test command now runs forgeBuild, ensuring that artifacts always include the AST. This fix resolves the issue of missing AST in artifacts, so theoretically, this should no longer occur.
Previously, cannon test didn’t trigger a forge build, so forge executes forge build (when it wasn't built or it was the first time like for instance the CI) behind the scenes and by default it does not include the AST.