ts, cli: Overrideable workspace program addresses (#308)

This commit is contained in:
Armani Ferrante 2021-05-23 13:57:55 -07:00 committed by GitHub
parent a9179600cd
commit 78d773a6de
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 64 additions and 33 deletions

View File

@ -952,10 +952,9 @@ fn test(
// Bootup validator, if needed.
let validator_handle = match cfg.provider.cluster.url() {
"http://127.0.0.1:8899" => {
match skip_build {
true => None,
false => Some(build(None, false)?),
};
if !skip_build {
build(None, false)?;
}
let flags = match skip_deploy {
true => None,
false => Some(genesis_flags(cfg)?),
@ -1181,8 +1180,6 @@ fn start_test_validator(cfg: &Config, flags: Option<Vec<String>>) -> Result<Chil
Ok(validator_handle)
}
// TODO: Testing and deploys should use separate sections of metadata.
// Similarly, each network should have separate metadata.
fn deploy(
url: Option<String>,
keypair: Option<String>,
@ -1326,28 +1323,6 @@ fn launch(
})
}
// with_workspace ensures the current working directory is always the top level
// workspace directory, i.e., where the `Anchor.toml` file is located, before
// and after the closure invocation.
//
// The closure passed into this function must never change the working directory
// to be outside the workspace. Doing so will have undefined behavior.
fn with_workspace<R>(f: impl FnOnce(&Config, PathBuf, Option<PathBuf>) -> R) -> R {
set_workspace_dir_or_exit();
clear_program_keys().unwrap();
let (cfg, cfg_path, cargo_toml) = Config::discover()
.expect("Previously set the workspace dir")
.expect("Anchor.toml must always exist");
let r = f(&cfg, cfg_path, cargo_toml);
set_workspace_dir_or_exit();
clear_program_keys().unwrap();
r
}
// The Solana CLI doesn't redeploy a program if this file exists.
// So remove it to make all commands explicit.
fn clear_program_keys() -> Result<()> {
@ -1652,3 +1627,25 @@ fn shell(cluster: Option<String>, wallet: Option<String>) -> Result<()> {
Ok(())
})
}
// with_workspace ensures the current working directory is always the top level
// workspace directory, i.e., where the `Anchor.toml` file is located, before
// and after the closure invocation.
//
// The closure passed into this function must never change the working directory
// to be outside the workspace. Doing so will have undefined behavior.
fn with_workspace<R>(f: impl FnOnce(&Config, PathBuf, Option<PathBuf>) -> R) -> R {
set_workspace_dir_or_exit();
clear_program_keys().unwrap();
let (cfg, cfg_path, cargo_toml) = Config::discover()
.expect("Previously set the workspace dir")
.expect("Anchor.toml must always exist");
let r = f(&cfg, cfg_path, cargo_toml);
set_workspace_dir_or_exit();
clear_program_keys().unwrap();
r
}

View File

@ -33,7 +33,8 @@
"find": "^0.3.0",
"js-sha256": "^0.9.0",
"pako": "^2.0.3",
"snake-case": "^3.0.4"
"snake-case": "^3.0.4",
"toml": "^3.0.0"
},
"devDependencies": {
"@commitlint/cli": "^11.0.0",

View File

@ -1,6 +1,8 @@
import camelCase from "camelcase";
import * as toml from "toml";
import { PublicKey } from "@solana/web3.js";
import { Program } from "./program";
import { getProvider } from "./";
let _populatedWorkspace = false;
@ -44,13 +46,24 @@ const workspace = new Proxy({} as any, {
const idlStr = fs.readFileSync(path);
const idl = JSON.parse(idlStr);
const name = camelCase(idl.name, { pascalCase: true });
programs[name] = new Program(
idl,
new PublicKey(idl.metadata.address)
);
if (idl.metadata && idl.metadata.address) {
programs[name] = new Program(
idl,
new PublicKey(idl.metadata.address)
);
}
return programs;
}, workspaceCache);
// Override the workspace programs if the user put them in the config.
const anchorToml = toml.parse(
fs.readFileSync(path.join(projectRoot, "Anchor.toml"), "utf-8")
);
const clusterId = anchorToml.provider.cluster;
if (anchorToml.clusters && anchorToml.clusters[clusterId]) {
attachWorkspaceOverride(workspaceCache, anchorToml.clusters[clusterId]);
}
_populatedWorkspace = true;
}
@ -58,4 +71,19 @@ const workspace = new Proxy({} as any, {
},
});
function attachWorkspaceOverride(
workspaceCache: { [key: string]: Program },
overrideConfig: { [key: string]: string }
) {
Object.keys(overrideConfig).forEach((programName) => {
const wsProgramName = camelCase(programName, { pascalCase: true });
const oldProgram = workspaceCache[wsProgramName];
const overrideAddress = new PublicKey(overrideConfig[programName]);
workspaceCache[wsProgramName] = new Program(
oldProgram.idl,
overrideAddress
);
});
}
export default workspace;

View File

@ -5112,6 +5112,11 @@ to-regex@^3.0.1, to-regex@^3.0.2:
regex-not "^1.0.2"
safe-regex "^1.1.0"
toml@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee"
integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==
tough-cookie@^2.3.3, tough-cookie@~2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"