• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

dustinblackman / cargo-run-bin / 7055422475

01 Dec 2023 03:33AM UTC coverage: 59.236% (-4.5%) from 63.696%
7055422475

push

github

dustinblackman
feat: Add Windows support

12 of 27 new or added lines in 3 files covered. (44.44%)

16 existing lines in 1 file now uncovered.

279 of 471 relevant lines covered (59.24%)

12.14 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/cli.rs
1
use std::env;
2

3
use anyhow::bail;
4
use anyhow::Result;
5
use clap::Arg;
6
use clap::ArgMatches;
7
use clap::Command;
8
use owo_colors::OwoColorize;
9

10
use crate::binary;
11
use crate::cargo_config;
12
use crate::metadata;
13
use crate::shims;
14

15
#[cfg(test)]
16
#[path = "cli_integration_test.rs"]
17
mod cli_integration_test;
18

19
fn install_all_binaries() -> Result<()> {
×
20
    let binary_packages = metadata::get_binary_packages()?;
×
21
    for binary_package in binary_packages {
×
22
        binary::install(binary_package)?;
×
23
    }
24

25
    println!("{}", "Done!".green());
×
26
    return Ok(());
×
27
}
×
28

29
fn sync_aliases() -> Result<()> {
30
    cargo_config::sync_aliases()?;
×
31
    println!("{}", "Done!".green());
×
32
    return Ok(());
×
33
}
×
34

35
fn run_binary(binary_name: String, args: Vec<String>) -> Result<()> {
×
36
    let binary_packages = metadata::get_binary_packages()?;
×
37
    let binary_package = binary_packages.iter().find(|&e| {
×
38
        return e.package == binary_name
×
39
            || (e.bin_target.is_some() && e.bin_target.as_deref().unwrap() == binary_name);
×
40
    });
×
41
    if binary_package.is_none() {
×
42
        bail!(format!("No package found for binary {binary_name}"));
×
43
    }
×
44

45
    let bin_path = binary::install(binary_package.unwrap().clone())?;
×
46
    shims::sync()?;
×
47
    binary::run(bin_path, args)?;
×
48

49
    return Ok(());
×
50
}
×
51

52
fn arg_used(matches: &ArgMatches, arg_long: &str) -> bool {
53
    if let Some(used) = matches.get_one::<bool>(arg_long) {
×
54
        if *used {
×
55
            return true;
×
56
        }
×
57
    }
×
58

59
    if let Some(sub) = matches.subcommand_matches("bin") {
×
60
        if let Some(used) = sub.get_one::<bool>(arg_long) {
×
61
            if *used {
×
62
                return true;
×
63
            }
×
64
        }
×
65
    }
×
66

67
    return false;
×
68
}
×
69

70
pub fn run() -> Result<()> {
×
71
    let arg_sync_aliases = Arg::new("sync-aliases")
×
72
        .short('s')
×
73
        .long("sync-aliases")
×
74
        .num_args(0)
×
75
        .help("Sync aliases for cargo-* commands in .cargo/config.toml");
×
76

×
77
    let arg_install = Arg::new("install")
×
78
        .short('i')
×
79
        .long("install")
×
80
        .num_args(0)
×
81
        .help("Install/build all configured binaries, skips entries that are already installed.");
×
82

×
83
    let arg_help = Arg::new("help")
×
84
        .short('h')
×
85
        .long("help")
×
86
        .num_args(0)
×
87
        .help("Print help");
×
88

×
89
    // @deprecated: Use --install.
×
90
    let arg_build = Arg::new("build")
×
91
        .short('b')
×
92
        .long("build")
×
93
        .hide(true)
×
94
        .num_args(0);
×
95

×
96
    let mut app = Command::new("cargo-bin")
×
97
        .about(env!("CARGO_PKG_DESCRIPTION"))
×
98
        .author(env!("CARGO_PKG_AUTHORS"))
×
99
        .version(env!("CARGO_PKG_VERSION"))
×
100
        .arg_required_else_help(false)
×
101
        .ignore_errors(true)
×
102
        .arg(arg_sync_aliases.clone())
×
103
        .arg(arg_install.clone())
×
104
        .arg(arg_build.clone())
×
105
        .subcommand(
×
106
            Command::new("bin")
×
107
                .hide(true)
×
108
                .disable_help_flag(true)
×
109
                .arg(arg_sync_aliases)
×
110
                .arg(arg_install)
×
111
                .arg(arg_build)
×
112
                .arg(arg_help),
×
113
        );
×
114

×
115
    let matches = app.clone().get_matches();
×
116

×
117
    if arg_used(&matches, "sync-aliases") {
×
118
        sync_aliases()?;
×
119
    } else if arg_used(&matches, "install") || arg_used(&matches, "build") {
×
120
        install_all_binaries()?;
×
121
    } else if arg_used(&matches, "help") {
×
122
        app.print_long_help()?;
×
123
    } else {
124
        let mut args: Vec<_> = env::args().collect();
×
NEW
125
        let start_index = args
×
NEW
126
            .iter()
×
NEW
127
            .position(|e| return e.ends_with("/cargo-bin") || e.ends_with("cargo-bin.exe"));
×
128
        if start_index.is_none() || start_index.unwrap() == (args.len() + 1) {
×
129
            app.print_long_help()?;
×
130
            return Ok(());
×
131
        }
×
132

×
133
        let mut bin_index = start_index.unwrap() + 1;
×
134
        if args[bin_index] == "bin" {
×
135
            bin_index += 1;
×
136
        }
×
137

138
        let binary_name = args[bin_index].clone();
×
139
        args.drain(0..(bin_index + 1));
×
140

×
141
        run_binary(binary_name, args)?;
×
142
    }
143

144
    return Ok(());
×
145
}
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc