feat(tui): show deprecated values optionally via --deprecated

This commit is contained in:
Orhun Parmaksız 2022-08-04 02:07:29 +02:00
parent a0b35e1964
commit c39169c5f5
No known key found for this signature in database
GPG key ID: F83424824B3E4B90
8 changed files with 43 additions and 22 deletions

View file

@ -415,6 +415,7 @@ systeroid-tui [options]
--fg-color <color>
set the foreground color [default: white]
-n, --no-docs do not show the kernel documentation
--deprecated include deprecated variables while listing
-h, --help display this help and exit
-V, --version output version information and exit
```

View file

@ -34,6 +34,9 @@ Use this option to set the foreground color. [default: white]
\fB\-n\fR, \fB\-\-no\-docs\fR
Do not show the kernel documentation.
.TP
\fB\-\-deprecated\fR
Include deprecated variables while listing.
.TP
\fB\-h\fR, \fB\-\-help\fR
Display help text and exit.
.TP

View file

@ -19,6 +19,8 @@ pub struct Config {
pub verbose: bool,
/// Whether if the errors should be ignored.
pub ignore_errors: bool,
/// Whether if the deprecated variables should be included while listing.
pub display_deprecated: bool,
/// Whether if the quiet mode is enabled.
pub quiet: bool,
/// Whether if the pager is disabled.
@ -36,6 +38,7 @@ impl Default for Config {
Self {
verbose: false,
ignore_errors: false,
display_deprecated: false,
quiet: false,
no_pager: false,
section_colors: map! {

View file

@ -4,6 +4,7 @@ use crate::error::Result;
use crate::parsers::{parse_kernel_docs, KERNEL_DOCS_PATH};
use crate::sysctl::parameter::Parameter;
use crate::sysctl::section::Section;
use crate::sysctl::DEPRECATED_PARAMS;
use crate::sysctl::{DISABLE_CACHE_ENV, PARAMETERS_CACHE_LABEL, PROC_PATH};
use parseit::globwalk;
use rayon::prelude::*;
@ -33,7 +34,17 @@ impl Sysctl {
}) {
match Parameter::try_from(&ctl) {
Ok(parameter) => {
parameters.push(parameter);
if !config.display_deprecated {
let mut skip_param = false;
if let Some(param_name) = parameter.get_absolute_name() {
skip_param = DEPRECATED_PARAMS.contains(&param_name);
}
if !skip_param {
parameters.push(parameter);
}
} else {
parameters.push(parameter);
}
}
Err(e) => {
if config.verbose {
@ -119,17 +130,17 @@ impl Sysctl {
/// Updates the parameters internally using the given list.
///
/// Keeps the original values.
fn update_params(&mut self, mut parameters: Vec<Parameter>) {
parameters.par_iter_mut().for_each(|parameter| {
if let Some(param) = self
.parameters
fn update_params(&mut self, parameters: Vec<Parameter>) {
self.parameters.par_iter_mut().for_each(|parameter| {
if let Some(param) = parameters
.par_iter()
.find_any(|param| param.name == parameter.name)
{
parameter.value = param.value.to_string();
parameter.description = param.description.clone();
parameter.docs_path = param.docs_path.clone();
parameter.docs_title = param.docs_title.clone();
}
});
self.parameters = parameters;
}
/// Updates the descriptions of the kernel parameters.

View file

@ -30,6 +30,8 @@ pub struct Args {
pub colors: Colors,
/// Do not parse/show Linux kernel documentation.
pub no_docs: bool,
/// Whether if the deprecated variables should be included while listing.
pub display_deprecated: bool,
}
impl Args {
@ -63,6 +65,11 @@ impl Args {
"<color>",
);
opts.optflag("n", "no-docs", "do not show the kernel documentation");
opts.optflag(
"",
"deprecated",
"include deprecated variables while listing",
);
opts.optflag("h", "help", "display this help and exit");
opts.optflag("V", "version", "output version information and exit");
opts
@ -106,6 +113,7 @@ impl Args {
.map_err(|e| eprintln!("error: `{}`", e))
.ok()?,
no_docs: matches.opt_present("n"),
display_deprecated: matches.opt_present("deprecated"),
})
}
}

View file

@ -34,7 +34,11 @@ use tui::terminal::Terminal;
/// Runs `systeroid-tui`.
pub fn run<B: Backend>(args: Args, backend: B) -> Result<()> {
let mut sysctl = Sysctl::init(Config::default())?;
let config = Config {
display_deprecated: args.display_deprecated,
..Default::default()
};
let mut sysctl = Sysctl::init(config)?;
if !args.no_docs {
sysctl.update_docs_from_cache(args.kernel_docs.as_ref(), &Cache::init()?)?;
}

View file

@ -64,22 +64,12 @@ impl<'a, Output: Write> App<'a, Output> {
}
/// Displays all of the available kernel parameters.
pub fn display_parameters(
&mut self,
pattern: Option<Regex>,
display_deprecated: bool,
explain: bool,
) -> Result<()> {
pub fn display_parameters(&mut self, pattern: Option<Regex>, explain: bool) -> Result<()> {
let parameters = self.sysctl.parameters.clone();
let mut parameters = parameters.iter().filter(|parameter| {
if let Some(pattern) = &pattern {
return pattern.is_match(&parameter.name);
}
if !display_deprecated {
if let Some(param_name) = parameter.get_absolute_name() {
return !DEPRECATED_PARAMS.contains(&param_name);
}
}
true
});
if explain {
@ -247,14 +237,14 @@ mod tests {
let mut app = App::new(&mut sysctl, &mut output, OutputType::Default);
app.display_parameters(Regex::new("kernel|vm").ok(), false, false)?;
app.display_parameters(Regex::new("kernel|vm").ok(), false)?;
let result = String::from_utf8_lossy(app.output);
assert!(result.contains("vm.zone_reclaim_mode ="));
assert!(result.contains("kernel.version ="));
app.output.clear();
app.output_type = OutputType::Tree;
app.display_parameters(None, true, false)?;
app.display_parameters(None, false)?;
assert!(String::from_utf8_lossy(app.output).contains("─ osrelease ="));
app.output.clear();

View file

@ -23,6 +23,7 @@ pub fn run<Output: Write>(args: Args, output: &mut Output) -> Result<()> {
let config = Config {
verbose: args.verbose,
ignore_errors: args.ignore_errors,
display_deprecated: args.display_deprecated,
quiet: args.quiet,
no_pager: args.no_pager,
display_type: args.display_type,
@ -37,7 +38,7 @@ pub fn run<Output: Write>(args: Args, output: &mut Output) -> Result<()> {
if args.preload_system_files {
app.preload_from_system()?;
} else if args.values.is_empty() {
app.display_parameters(args.pattern, args.display_deprecated, args.explain)?;
app.display_parameters(args.pattern, args.explain)?;
} else if args.explain {
for param in args.values {
app.display_documentation(&param)?;