refactor!(steps/node): make PNPM a separated step (#114)

This commit is contained in:
pan93412
2022-11-03 20:39:12 +08:00
committed by Thomas Schönauer
parent 7a83f38ca8
commit 623a11cf21
2 changed files with 76 additions and 18 deletions

View File

@@ -351,6 +351,7 @@ fn run() -> Result<()> {
runner.execute(Step::Kakoune, "Kakoune", || kakoune::upgrade_kak_plug(&ctx))?; runner.execute(Step::Kakoune, "Kakoune", || kakoune::upgrade_kak_plug(&ctx))?;
runner.execute(Step::Node, "npm", || node::run_npm_upgrade(&ctx))?; runner.execute(Step::Node, "npm", || node::run_npm_upgrade(&ctx))?;
runner.execute(Step::Node, "yarn", || node::run_yarn_upgrade(&ctx))?; runner.execute(Step::Node, "yarn", || node::run_yarn_upgrade(&ctx))?;
runner.execute(Step::Node, "pnpm", || node::run_pnpm_upgrade(&ctx))?;
runner.execute(Step::Containers, "Containers", || containers::run_containers(&ctx))?; runner.execute(Step::Containers, "Containers", || containers::run_containers(&ctx))?;
runner.execute(Step::Deno, "deno", || node::deno_upgrade(&ctx))?; runner.execute(Step::Deno, "deno", || node::deno_upgrade(&ctx))?;
runner.execute(Step::Composer, "composer", || generic::run_composer_update(&ctx))?; runner.execute(Step::Composer, "composer", || generic::run_composer_update(&ctx))?;

View File

@@ -1,5 +1,6 @@
#![allow(unused_imports)] #![allow(unused_imports)]
use std::fmt::Display;
#[cfg(unix)] #[cfg(unix)]
use std::os::unix::prelude::MetadataExt; use std::os::unix::prelude::MetadataExt;
use std::path::PathBuf; use std::path::PathBuf;
@@ -17,24 +18,71 @@ use crate::terminal::print_separator;
use crate::utils::{require, PathExt}; use crate::utils::{require, PathExt};
use crate::{error::SkipStep, execution_context::ExecutionContext}; use crate::{error::SkipStep, execution_context::ExecutionContext};
enum NPMVariant {
Npm,
Pnpm,
}
impl NPMVariant {
const fn long_name(&self) -> &str {
match self {
NPMVariant::Npm => "Node Package Manager",
NPMVariant::Pnpm => "PNPM",
}
}
const fn short_name(&self) -> &str {
match self {
NPMVariant::Npm => "npm",
NPMVariant::Pnpm => "pnpm",
}
}
const fn is_npm(&self) -> bool {
matches!(self, NPMVariant::Npm)
}
}
impl Display for NPMVariant {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.short_name())
}
}
#[allow(clippy::upper_case_acronyms)] #[allow(clippy::upper_case_acronyms)]
struct NPM { struct NPM {
command: PathBuf, command: PathBuf,
variant: NPMVariant,
} }
impl NPM { impl NPM {
fn new(command: PathBuf) -> Self { fn new(command: PathBuf, variant: NPMVariant) -> Self {
Self { command } Self { command, variant }
}
/// Is the “NPM” version larger than 8.11.0?
fn is_npm_8(&self) -> bool {
let v = self.version();
self.variant.is_npm() && matches!(v, Ok(v) if v >= Version::new(8, 11, 0))
}
/// Get the most suitable “global location” argument
/// of this NPM instance.
///
/// If the “NPM” version is larger than 8.11.0, we use
/// `--location=global`; otherwise, use `-g`.
fn global_location_arg(&self) -> &str {
if self.is_npm_8() {
"--location=global"
} else {
"-g"
}
} }
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
fn root(&self) -> Result<PathBuf> { fn root(&self) -> Result<PathBuf> {
let version = self.version()?; let args = ["root", self.global_location_arg()];
let args = if version < Version::new(8, 11, 0) {
["root", "-g"]
} else {
["root", "--location=global"]
};
Command::new(&self.command) Command::new(&self.command)
.args(args) .args(args)
.check_output() .check_output()
@@ -50,13 +98,8 @@ impl NPM {
} }
fn upgrade(&self, run_type: RunType, use_sudo: bool) -> Result<()> { fn upgrade(&self, run_type: RunType, use_sudo: bool) -> Result<()> {
print_separator("Node Package Manager"); print_separator(self.variant.long_name());
let version = self.version()?; let args = ["update", self.global_location_arg()];
let args = if version < Version::new(8, 11, 0) {
["update", "-g"]
} else {
["update", "--location=global"]
};
if use_sudo { if use_sudo {
run_type.execute("sudo").args(args).check_run()?; run_type.execute("sudo").args(args).check_run()?;
} else { } else {
@@ -70,7 +113,7 @@ impl NPM {
pub fn should_use_sudo(&self) -> Result<bool> { pub fn should_use_sudo(&self) -> Result<bool> {
let npm_root = self.root()?; let npm_root = self.root()?;
if !npm_root.exists() { if !npm_root.exists() {
return Err(SkipStep(format!("NPM root at {} doesn't exist", npm_root.display(),)).into()); return Err(SkipStep(format!("{} root at {} doesn't exist", self.variant, npm_root.display())).into());
} }
let metadata = std::fs::metadata(&npm_root)?; let metadata = std::fs::metadata(&npm_root)?;
@@ -134,7 +177,7 @@ impl Yarn {
pub fn should_use_sudo(&self) -> Result<bool> { pub fn should_use_sudo(&self) -> Result<bool> {
let yarn_root = self.root()?; let yarn_root = self.root()?;
if !yarn_root.exists() { if !yarn_root.exists() {
return Err(SkipStep(format!("NPM root at {} doesn't exist", yarn_root.display(),)).into()); return Err(SkipStep(format!("Yarn root at {} doesn't exist", yarn_root.display(),)).into());
} }
let metadata = std::fs::metadata(&yarn_root)?; let metadata = std::fs::metadata(&yarn_root)?;
@@ -173,7 +216,7 @@ fn should_use_sudo_yarn(yarn: &Yarn, ctx: &ExecutionContext) -> Result<bool> {
} }
pub fn run_npm_upgrade(ctx: &ExecutionContext) -> Result<()> { pub fn run_npm_upgrade(ctx: &ExecutionContext) -> Result<()> {
let npm = require("pnpm").or_else(|_| require("npm")).map(NPM::new)?; let npm = require("npm").map(|b| NPM::new(b, NPMVariant::Npm))?;
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
{ {
@@ -186,6 +229,20 @@ pub fn run_npm_upgrade(ctx: &ExecutionContext) -> Result<()> {
} }
} }
pub fn run_pnpm_upgrade(ctx: &ExecutionContext) -> Result<()> {
let pnpm = require("pnpm").map(|b| NPM::new(b, NPMVariant::Pnpm))?;
#[cfg(target_os = "linux")]
{
pnpm.upgrade(ctx.run_type(), should_use_sudo(&pnpm, ctx)?)
}
#[cfg(not(target_os = "linux"))]
{
pnpm.upgrade(ctx.run_type(), false)
}
}
pub fn run_yarn_upgrade(ctx: &ExecutionContext) -> Result<()> { pub fn run_yarn_upgrade(ctx: &ExecutionContext) -> Result<()> {
let yarn = require("yarn").map(Yarn::new)?; let yarn = require("yarn").map(Yarn::new)?;