Skip to content

Commit 061290a

Browse files
committed
brew-rs: support some flags for list and search command
Signed-off-by: botantony <antonsm21@gmail.com>
1 parent 62b53c9 commit 061290a

File tree

2 files changed

+138
-29
lines changed

2 files changed

+138
-29
lines changed

Library/Homebrew/rust/brew-rs/src/commands/list.rs

Lines changed: 86 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,104 @@
11
use crate::BrewResult;
22
use crate::delegate;
33
use crate::homebrew;
4+
use anyhow::anyhow;
45
use std::fs;
56
use std::io;
67
use std::path::{Path, PathBuf};
78
use std::process::ExitCode;
89

10+
#[derive(Default)]
11+
struct Args<'a> {
12+
formula: bool,
13+
cask: bool,
14+
packages: Vec<&'a str>,
15+
}
16+
917
pub fn run(args: &[String]) -> BrewResult<ExitCode> {
10-
if args[1..]
11-
.iter()
12-
.any(|arg| arg.starts_with('-') || arg.contains('/'))
13-
{
14-
return delegate::run(args);
15-
}
18+
let parsed_args = {
19+
let mut result = Args::default();
20+
let mut args_iter = args.iter();
21+
args_iter.next(); // Skip `list`
22+
for arg in args_iter {
23+
match arg.as_str() {
24+
"--formula" | "--formulae" => {
25+
if result.cask {
26+
return Err(anyhow!(
27+
"Conflicting flags: `{}` and `{}`",
28+
arg,
29+
args.iter()
30+
.find(|s| s.as_str() == "--cask" || s.as_str() == "--casks")
31+
.unwrap()
32+
));
33+
} else {
34+
result.formula = true;
35+
}
36+
}
37+
"--cask" | "--casks" => {
38+
if result.formula {
39+
return Err(anyhow!(
40+
"Conflicting flags: `{}` and `{}`",
41+
arg,
42+
args.iter()
43+
.find(|s| s.as_str() == "--formula" || s.as_str() == "--formulae")
44+
.unwrap()
45+
));
46+
} else {
47+
result.cask = true;
48+
}
49+
}
50+
s if !s.starts_with('-') && !s.contains('/') => result.packages.push(s),
51+
_ => return delegate::run(args),
52+
}
53+
}
54+
if !result.formula && !result.cask {
55+
result.formula = true;
56+
result.cask = true;
57+
}
58+
result
59+
};
1660

1761
let cellar = homebrew::cellar_path()?;
1862
let prefix = homebrew::prefix_path()?;
1963
let caskroom = homebrew::caskroom_path()?;
2064

21-
if args.len() == 1 {
22-
let formulae = homebrew::installed_names(&cellar)?;
23-
let casks = homebrew::installed_names(&caskroom)?;
65+
if parsed_args.packages.is_empty() {
66+
let formulae = if parsed_args.formula {
67+
homebrew::installed_names(&cellar)?
68+
} else {
69+
Vec::new()
70+
};
71+
let casks = if parsed_args.cask {
72+
homebrew::installed_names(&caskroom)?
73+
} else {
74+
Vec::new()
75+
};
2476
homebrew::print_sections(&formulae, &casks);
2577
return Ok(ExitCode::SUCCESS);
2678
}
2779

2880
let mut missing = Vec::new();
2981
let mut listed_any = false;
3082

31-
for name in &args[1..] {
32-
match list_formula_paths(&cellar, &prefix, name)? {
33-
FormulaPaths::Paths(paths) => {
34-
if listed_any {
35-
println!();
83+
for name in parsed_args.packages {
84+
if parsed_args.formula {
85+
match list_formula_paths(&cellar, &prefix, name)? {
86+
FormulaPaths::Paths(paths) => {
87+
if listed_any {
88+
println!();
89+
}
90+
println!("{}", paths.join("\n"));
91+
listed_any = true;
92+
continue;
3693
}
37-
println!("{}", paths.join("\n"));
38-
listed_any = true;
39-
continue;
94+
FormulaPaths::Delegate => return delegate::run(args),
95+
FormulaPaths::Missing => {}
4096
}
41-
FormulaPaths::Delegate => return delegate::run(args),
42-
FormulaPaths::Missing => {}
4397
}
4498

45-
if let Some(paths) = list_cask_paths(&caskroom, name)? {
99+
if parsed_args.cask
100+
&& let Some(paths) = list_cask_paths(&caskroom, name)?
101+
{
46102
if listed_any {
47103
println!();
48104
}
@@ -51,12 +107,20 @@ pub fn run(args: &[String]) -> BrewResult<ExitCode> {
51107
continue;
52108
}
53109

54-
missing.push(name.clone());
110+
missing.push(name);
55111
}
56112

113+
let keg_or_cask = if parsed_args.formula && parsed_args.cask {
114+
"keg or cask"
115+
} else if parsed_args.formula {
116+
"keg"
117+
} else {
118+
"cask"
119+
};
120+
57121
if !missing.is_empty() {
58122
for name in missing {
59-
eprintln!("No such keg or cask: {name}");
123+
eprintln!("No such {keg_or_cask}: {name}");
60124
}
61125
return Ok(ExitCode::FAILURE);
62126
}

Library/Homebrew/rust/brew-rs/src/commands/search.rs

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,34 @@ use crate::matcher::Matcher;
55
use rust_fuzzy_search::fuzzy_search_threshold;
66
use std::process::ExitCode;
77

8+
#[derive(Default)]
9+
struct Args<'a> {
10+
formula: bool,
11+
cask: bool,
12+
package_name: Option<&'a str>,
13+
}
14+
815
pub fn run(args: &[String]) -> BrewResult<ExitCode> {
9-
if args.len() != 2 || args[1].starts_with('-') {
10-
return delegate::run(args);
11-
}
16+
let parsed_args = {
17+
let mut result = Args::default();
18+
let mut args_iter = args.iter();
19+
args_iter.next(); // Skip `search`
20+
for arg in args_iter {
21+
match arg.as_str() {
22+
"--formula" | "--formulae" => result.formula = true,
23+
"--cask" | "--casks" => result.cask = true,
24+
s if !s.starts_with('-') && result.package_name.is_none() => {
25+
result.package_name = Some(s)
26+
}
27+
_ => return delegate::run(args),
28+
}
29+
}
30+
if !result.formula && !result.cask {
31+
result.formula = true;
32+
result.cask = true;
33+
}
34+
result
35+
};
1236

1337
let api_cache = homebrew::cache_api_path()?;
1438
let formula_names = match homebrew::read_lines(&api_cache.join("formula_names.txt")) {
@@ -20,12 +44,33 @@ pub fn run(args: &[String]) -> BrewResult<ExitCode> {
2044
Err(_) => return delegate::run(args),
2145
};
2246

23-
let matcher = Matcher::try_from(args[1].as_str())?;
24-
let matched_formulae = matched_names(&formula_names, &matcher);
25-
let matched_casks = matched_names(&cask_names, &matcher);
47+
let package_name = match parsed_args.package_name {
48+
Some(package_name) => package_name,
49+
_ => return delegate::run(args),
50+
};
51+
52+
let matcher = Matcher::try_from(package_name)?;
53+
let matched_formulae = if parsed_args.formula {
54+
matched_names(&formula_names, &matcher)
55+
} else {
56+
Vec::new()
57+
};
58+
let matched_casks = if parsed_args.cask {
59+
matched_names(&cask_names, &matcher)
60+
} else {
61+
Vec::new()
62+
};
63+
64+
let formulae_or_casks = if parsed_args.formula && parsed_args.cask {
65+
"formulae or casks"
66+
} else if parsed_args.formula {
67+
"formulae"
68+
} else {
69+
"casks"
70+
};
2671

2772
if matched_formulae.is_empty() && matched_casks.is_empty() {
28-
eprintln!("No formulae or casks found for {:?}.", args[1]);
73+
eprintln!("No {formulae_or_casks} found for {:?}.", package_name);
2974
return Ok(ExitCode::FAILURE);
3075
}
3176

0 commit comments

Comments
 (0)