From 41d4b71d7c90c74cf02d0783977bb98721affc0f Mon Sep 17 00:00:00 2001 From: Ethan Brierley Date: Thu, 8 Aug 2024 08:31:57 +0100 Subject: [PATCH] Enable `cargo override` to be run correctly as a cargo subcommand Fixes #23 This makes it possible to run `cargo override --path ../dep` where previously `cargo-override --path ../dep` had to be used. --- src/lib.rs | 24 +++++++++++++++++------- src/main.rs | 4 ++-- tests/tests.rs | 38 ++++++++++++-------------------------- 3 files changed, 31 insertions(+), 35 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 159582e..f70eff2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,14 +12,24 @@ pub static DEFAULT_REGISTRY: &str = "crates-io"; pub static CARGO_TOML: &str = "Cargo.toml"; #[derive(Parser, Debug)] -#[command(author, version, about, long_about = None)] -pub struct Args { - #[arg(short, long)] - pub path: String, +#[command(bin_name = "cargo")] +pub struct Cli { + #[command(subcommand)] + pub command: CargoInvocation, } -pub fn run(working_dir: &Path, args: Args) -> anyhow::Result<()> { - let patch_manifest_path = patch_manifest(working_dir, &args.path)?; +#[derive(Parser, Debug)] +pub enum CargoInvocation { + #[command(name = "override")] + Override { path: String }, +} + +pub fn run(working_dir: &Path, args: Cli) -> anyhow::Result<()> { + let Cli { + command: CargoInvocation::Override { path }, + } = args; + + let patch_manifest_path = patch_manifest(working_dir, &path)?; let project_manifest_path = project_manifest(working_dir)?; @@ -37,7 +47,7 @@ pub fn run(working_dir: &Path, args: Args) -> anyhow::Result<()> { let project_patch_overrides_table = create_subtable(project_patch_table, DEFAULT_REGISTRY, false)?; - let Ok(new_patch) = format!("{{ path = \"{}\" }}", args.path).parse::() else { + let Ok(new_patch) = format!("{{ path = \"{}\" }}", path).parse::() else { todo!("We haven't escaped the path so we can't be sure this will parse") }; diff --git a/src/main.rs b/src/main.rs index d0b080b..7babf9c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,11 @@ use std::env::current_dir; -use cargo_override::{run, Args}; +use cargo_override::{run, Cli}; use clap::Parser; fn main() { - let args = Args::parse(); + let args = Cli::parse(); if let Err(e) = run(¤t_dir().unwrap(), args) { eprintln!("error: {e}"); diff --git a/tests/tests.rs b/tests/tests.rs index ec71fca..817aee3 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -8,7 +8,7 @@ use std::{ path::{Path, PathBuf}, }; -use cargo_override::{run, Args, CARGO_TOML}; +use cargo_override::{run, CargoInvocation, Cli, CARGO_TOML}; use fake::{Fake, Faker}; use googletest::{ @@ -42,12 +42,7 @@ fn patch_exists() { &Manifest::new(Header::basic(patch_crate_name)).render(), ); - let result = run( - working_dir, - Args { - path: patch_folder.to_string(), - }, - ); + let result = run(working_dir, override_path(patch_folder)); expect_that!(result, ok(eq(()))); let manifest = fs::read_to_string(working_dir_manifest_path).unwrap(); @@ -95,12 +90,7 @@ fn patch_exists_put_project_does_not_have_dep() { &Manifest::new(Header::basic("patch-package")).render(), ); - let result = run( - working_dir, - Args { - path: patch_folder.to_string(), - }, - ); + let result = run(working_dir, override_path(patch_folder)); expect_that!(result, err(anything())); } @@ -128,7 +118,7 @@ fn missing_manifest() { File::create_new(patch_manifest).expect("failed to create patch manifest file"); - let result = run(working_dir, Args { path: patch_folder }); + let result = run(working_dir, override_path(patch_folder)); expect_that!( result, @@ -145,12 +135,7 @@ fn patch_path_doesnt_exist() { let patch_folder: String = Faker.fake(); - let result = run( - working_dir, - Args { - path: patch_folder.clone(), - }, - ); + let result = run(working_dir, override_path(patch_folder.clone())); expect_that!( result, @@ -171,12 +156,7 @@ fn patch_manifest_doesnt_exist() { fs::create_dir(patch_folder_path).expect("failed to create patch folder"); - let result = run( - working_dir, - Args { - path: patch_folder.clone(), - }, - ); + let result = run(working_dir, override_path(patch_folder.clone())); expect_that!( result, @@ -186,3 +166,9 @@ fn patch_manifest_doesnt_exist() { )))) ) } + +fn override_path(path: impl Into) -> Cli { + Cli { + command: CargoInvocation::Override { path: path.into() }, + } +}