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

dustinblackman / cargo-run-bin / 9808928607

05 Jul 2024 01:15PM UTC coverage: 88.016% (+3.8%) from 84.19%
9808928607

push

github

dustinblackman
chore: Fix lint

3 of 3 new or added lines in 2 files covered. (100.0%)

18 existing lines in 3 files now uncovered.

448 of 509 relevant lines covered (88.02%)

35.99 hits per line

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

94.62
/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

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

14
fn install_all_binaries() -> Result<()> {
4✔
15
    let binary_packages = metadata::get_binary_packages()?;
4✔
16
    for binary_package in binary_packages {
48✔
17
        binary::install(binary_package)?;
44✔
18
    }
19

20
    println!("\x1b[32mDone!\x1b[0m");
4✔
21
    return Ok(());
4✔
22
}
4✔
23

24
fn sync_aliases() -> Result<()> {
2✔
25
    cargo_config::sync_aliases()?;
2✔
26
    println!("\x1b[32mDone!\x1b[0m");
2✔
27
    return Ok(());
2✔
28
}
2✔
29

30
fn run_binary(binary_name: String, args: Vec<String>) -> Result<()> {
4✔
31
    let binary_packages = metadata::get_binary_packages()?;
4✔
32
    let binary_package = binary_packages.iter().find(|&e| {
34✔
33
        return e.package == binary_name
34✔
34
            || (e.bin_target.is_some() && e.bin_target.as_deref().unwrap() == binary_name);
32✔
35
    });
34✔
36
    if binary_package.is_none() {
4✔
37
        bail!(format!("No package found for binary {binary_name}"));
2✔
38
    }
2✔
39

40
    let bin_path = binary::install(binary_package.unwrap().clone())?;
2✔
41
    shims::sync()?;
2✔
42
    binary::run(bin_path, args)?;
2✔
43

UNCOV
44
    return Ok(());
×
45
}
2✔
46

47
fn arg_used(matches: &ArgMatches, arg_long: &str) -> bool {
36✔
48
    if let Some(used) = matches.get_one::<bool>(arg_long) {
36✔
49
        if *used {
23✔
50
            return true;
3✔
51
        }
20✔
52
    }
13✔
53

54
    if let Some(sub) = matches.subcommand_matches("bin") {
33✔
55
        if let Some(used) = sub.get_one::<bool>(arg_long) {
20✔
56
            if *used {
10✔
57
                return true;
4✔
58
            }
6✔
59
        }
10✔
60
    }
13✔
61

62
    return false;
29✔
63
}
36✔
64

65
pub fn run() -> Result<()> {
12✔
66
    let arg_sync_aliases = Arg::new("sync-aliases")
12✔
67
        .short('s')
12✔
68
        .long("sync-aliases")
12✔
69
        .num_args(0)
12✔
70
        .help("Sync aliases for cargo-* commands in .cargo/config.toml");
12✔
71

12✔
72
    let arg_install = Arg::new("install")
12✔
73
        .short('i')
12✔
74
        .long("install")
12✔
75
        .num_args(0)
12✔
76
        .help("Install/build all configured binaries, skips entries that are already installed.");
12✔
77

12✔
78
    let arg_help = Arg::new("help")
12✔
79
        .short('h')
12✔
80
        .long("help")
12✔
81
        .num_args(0)
12✔
82
        .help("Print help");
12✔
83

12✔
84
    let arg_version = Arg::new("version")
12✔
85
        .short('V')
12✔
86
        .long("version")
12✔
87
        .num_args(0)
12✔
88
        .help("Print version");
12✔
89

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

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

12✔
119
    let matches = app.clone().get_matches();
12✔
120

12✔
121
    if arg_used(&matches, "sync-aliases") {
12✔
122
        sync_aliases()?;
2✔
123
    } else if arg_used(&matches, "install") || arg_used(&matches, "build") {
10✔
124
        install_all_binaries()?;
4✔
125
    } else if arg_used(&matches, "help") {
6✔
126
        app.print_long_help()?;
1✔
127
    } else if arg_used(&matches, "version") {
5✔
UNCOV
128
        println!("cargo-run-bin {}", env!("CARGO_PKG_VERSION"));
×
129
    } else {
×
130
        let mut args: Vec<_> = env::args().collect();
5✔
131
        let start_index = args
5✔
132
            .iter()
5✔
133
            .position(|e| return e.ends_with("/cargo-bin") || e.ends_with("cargo-bin.exe"));
5✔
134
        if start_index.is_none() || start_index.unwrap() == (args.len() + 1) {
5✔
UNCOV
135
            app.print_long_help()?;
×
136
            return Ok(());
×
137
        }
5✔
138

5✔
139
        let mut bin_index = start_index.unwrap() + 1;
5✔
140
        if args[bin_index] == "bin" {
5✔
141
            bin_index += 1;
2✔
142
        }
3✔
143
        if bin_index >= args.len() {
5✔
UNCOV
144
            app.print_long_help()?;
×
145
            return Ok(());
×
146
        }
5✔
147

5✔
148
        let binary_name = args[bin_index].clone();
5✔
149
        args.drain(0..(bin_index + 1));
5✔
150

5✔
151
        run_binary(binary_name, args)?;
5✔
152
    }
153

154
    return Ok(());
7✔
155
}
9✔
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

© 2026 Coveralls, Inc