mirror of
https://github.com/Llewellynvdm/starship.git
synced 2024-12-25 11:20:01 +00:00
fix(preset): add output-flag to avoid encoding issues (#4926)
This commit is contained in:
parent
4c12a7878b
commit
5e78226a3f
18
build.rs
18
build.rs
@ -34,24 +34,12 @@ fn gen_presets_hook(mut file: &File) -> SdResult<()> {
|
|||||||
.and_then(|v| v.strip_suffix(".toml"))
|
.and_then(|v| v.strip_suffix(".toml"))
|
||||||
.expect("Failed to process filename");
|
.expect("Failed to process filename");
|
||||||
presets.push_str(format!("print::Preset(\"{name}\"),\n").as_str());
|
presets.push_str(format!("print::Preset(\"{name}\"),\n").as_str());
|
||||||
match_arms.push_str(
|
match_arms.push_str(format!(r#""{name}" => include_bytes!(r"{full_path}"),"#).as_str());
|
||||||
format!(
|
|
||||||
r#"
|
|
||||||
"{name}" => {{
|
|
||||||
let stdout = io::stdout();
|
|
||||||
let mut stdout = stdout.lock();
|
|
||||||
let _ = stdout.write_all(include_bytes!(r"{full_path}"));
|
|
||||||
}}
|
|
||||||
"#
|
|
||||||
)
|
|
||||||
.as_str(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
writeln!(
|
writeln!(
|
||||||
file,
|
file,
|
||||||
r#"
|
r#"
|
||||||
use std::io::{{self, Write}};
|
|
||||||
use crate::print;
|
use crate::print;
|
||||||
|
|
||||||
pub fn get_preset_list<'a>() -> &'a [print::Preset] {{
|
pub fn get_preset_list<'a>() -> &'a [print::Preset] {{
|
||||||
@ -60,10 +48,10 @@ pub fn get_preset_list<'a>() -> &'a [print::Preset] {{
|
|||||||
]
|
]
|
||||||
}}
|
}}
|
||||||
|
|
||||||
pub fn print_preset_content(name: &str) {{
|
pub fn get_preset_content(name: &str) -> &[u8] {{
|
||||||
match name {{
|
match name {{
|
||||||
{match_arms}
|
{match_arms}
|
||||||
_ => {{}}
|
_ => unreachable!(),
|
||||||
}}
|
}}
|
||||||
}}
|
}}
|
||||||
"#
|
"#
|
||||||
|
@ -10,7 +10,7 @@ in brackets instead of using the default Starship wording ("via", "on", etc.).
|
|||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
starship preset bracketed-segments > ~/.config/starship.toml
|
starship preset bracketed-segments -o ~/.config/starship.toml
|
||||||
```
|
```
|
||||||
|
|
||||||
[Click to download TOML](/presets/toml/bracketed-segments.toml)
|
[Click to download TOML](/presets/toml/bracketed-segments.toml)
|
||||||
|
@ -13,7 +13,7 @@ This preset changes the symbols for each module to use Nerd Font symbols.
|
|||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
starship preset nerd-font-symbols > ~/.config/starship.toml
|
starship preset nerd-font-symbols -o ~/.config/starship.toml
|
||||||
```
|
```
|
||||||
|
|
||||||
[Click to download TOML](/presets/toml/nerd-font-symbols.toml)
|
[Click to download TOML](/presets/toml/nerd-font-symbols.toml)
|
||||||
|
@ -9,7 +9,7 @@ If toolset files are identified the toolset icon is displayed. If the toolset is
|
|||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
starship preset no-empty-icons > ~/.config/starship.toml
|
starship preset no-empty-icons -o ~/.config/starship.toml
|
||||||
```
|
```
|
||||||
|
|
||||||
[Click to download TOML](/presets/toml/no-empty-icons.toml)
|
[Click to download TOML](/presets/toml/no-empty-icons.toml)
|
||||||
|
@ -12,7 +12,7 @@ This preset will become the default preset in a future release of starship.
|
|||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
starship preset no-nerd-font > ~/.config/starship.toml
|
starship preset no-nerd-font -o ~/.config/starship.toml
|
||||||
```
|
```
|
||||||
|
|
||||||
[Click to download TOML](/presets/toml/no-nerd-font.toml)
|
[Click to download TOML](/presets/toml/no-nerd-font.toml)
|
||||||
|
@ -9,7 +9,7 @@ This preset hides the version of language runtimes. If you work in containers or
|
|||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
starship preset no-runtime-versions > ~/.config/starship.toml
|
starship preset no-runtime-versions -o ~/.config/starship.toml
|
||||||
```
|
```
|
||||||
|
|
||||||
[Click to download TOML](/presets/toml/no-runtime-versions.toml)
|
[Click to download TOML](/presets/toml/no-runtime-versions.toml)
|
||||||
|
@ -14,7 +14,7 @@ It also shows how path substitution works in starship.
|
|||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
starship preset pastel-powerline > ~/.config/starship.toml
|
starship preset pastel-powerline -o ~/.config/starship.toml
|
||||||
```
|
```
|
||||||
|
|
||||||
[Click to download TOML](/presets/toml/pastel-powerline.toml)
|
[Click to download TOML](/presets/toml/pastel-powerline.toml)
|
||||||
|
@ -10,7 +10,7 @@ don't have access to Unicode.
|
|||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
starship preset plain-text-symbols > ~/.config/starship.toml
|
starship preset plain-text-symbols -o ~/.config/starship.toml
|
||||||
```
|
```
|
||||||
|
|
||||||
[Click to download TOML](/presets/toml/plain-text-symbols.toml)
|
[Click to download TOML](/presets/toml/plain-text-symbols.toml)
|
||||||
|
@ -9,7 +9,7 @@ This preset emulates the look and behavior of [Pure](https://github.com/sindreso
|
|||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
starship preset pure-preset > ~/.config/starship.toml
|
starship preset pure-preset -o ~/.config/starship.toml
|
||||||
```
|
```
|
||||||
|
|
||||||
[Click to download TOML](/presets/toml/pure-preset.toml)
|
[Click to download TOML](/presets/toml/pure-preset.toml)
|
||||||
|
@ -13,7 +13,7 @@ This preset is inspired by [tokyo-night-vscode-theme](https://github.com/enkia/t
|
|||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
starship preset tokyo-night > ~/.config/starship.toml
|
starship preset tokyo-night -o ~/.config/starship.toml
|
||||||
```
|
```
|
||||||
|
|
||||||
[Click to download TOML](/presets/toml/tokyo-night.toml)
|
[Click to download TOML](/presets/toml/tokyo-night.toml)
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
use clap::crate_authors;
|
use clap::crate_authors;
|
||||||
use std::io;
|
use std::io;
|
||||||
|
use std::path::PathBuf;
|
||||||
use std::thread::available_parallelism;
|
use std::thread::available_parallelism;
|
||||||
use std::time::SystemTime;
|
use std::time::SystemTime;
|
||||||
|
|
||||||
@ -68,6 +69,9 @@ enum Commands {
|
|||||||
/// The name of preset to be printed
|
/// The name of preset to be printed
|
||||||
#[clap(required_unless_present("list"), value_enum)]
|
#[clap(required_unless_present("list"), value_enum)]
|
||||||
name: Option<print::Preset>,
|
name: Option<print::Preset>,
|
||||||
|
/// Output the preset to a file instead of stdout
|
||||||
|
#[clap(short, long, conflicts_with = "list")]
|
||||||
|
output: Option<PathBuf>,
|
||||||
/// List out all preset names
|
/// List out all preset names
|
||||||
#[clap(short, long)]
|
#[clap(short, long)]
|
||||||
list: bool,
|
list: bool,
|
||||||
@ -202,7 +206,7 @@ fn main() {
|
|||||||
print::module(&module_name, properties);
|
print::module(&module_name, properties);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Commands::Preset { name, list } => print::preset_command(name, list),
|
Commands::Preset { name, list, output } => print::preset_command(name, output, list),
|
||||||
Commands::Config { name, value } => {
|
Commands::Config { name, value } => {
|
||||||
if let Some(name) = name {
|
if let Some(name) = name {
|
||||||
if let Some(value) = value {
|
if let Some(value) = value {
|
||||||
|
32
src/print.rs
32
src/print.rs
@ -4,6 +4,7 @@ use rayon::prelude::*;
|
|||||||
use std::collections::BTreeSet;
|
use std::collections::BTreeSet;
|
||||||
use std::fmt::{Debug, Write as FmtWrite};
|
use std::fmt::{Debug, Write as FmtWrite};
|
||||||
use std::io::{self, Write};
|
use std::io::{self, Write};
|
||||||
|
use std::path::PathBuf;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use terminal_size::terminal_size;
|
use terminal_size::terminal_size;
|
||||||
use unicode_segmentation::UnicodeSegmentation;
|
use unicode_segmentation::UnicodeSegmentation;
|
||||||
@ -464,13 +465,22 @@ impl ValueEnum for Preset {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn preset_command(name: Option<Preset>, list: bool) {
|
pub fn preset_command(name: Option<Preset>, output: Option<PathBuf>, list: bool) {
|
||||||
if list {
|
if list {
|
||||||
println!("{}", preset_list());
|
println!("{}", preset_list());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let variant = name.expect("name argument must be specified");
|
let variant = name.expect("name argument must be specified");
|
||||||
shadow::print_preset_content(variant.0);
|
let content = shadow::get_preset_content(variant.0);
|
||||||
|
if let Some(output) = output {
|
||||||
|
if let Err(err) = std::fs::write(output, content) {
|
||||||
|
eprintln!("Error writing preset to file: {err}");
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
|
} else if let Err(err) = std::io::stdout().write_all(content) {
|
||||||
|
eprintln!("Error writing preset to stdout: {err}");
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn preset_list() -> String {
|
fn preset_list() -> String {
|
||||||
@ -485,6 +495,7 @@ mod test {
|
|||||||
use super::*;
|
use super::*;
|
||||||
use crate::config::StarshipConfig;
|
use crate::config::StarshipConfig;
|
||||||
use crate::test::default_context;
|
use crate::test::default_context;
|
||||||
|
use crate::utils;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn main_prompt() {
|
fn main_prompt() {
|
||||||
@ -595,10 +606,23 @@ mod test {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn preset_command_does_not_panic_on_correct_inputs() {
|
fn preset_command_does_not_panic_on_correct_inputs() {
|
||||||
preset_command(None, true);
|
preset_command(None, None, true);
|
||||||
Preset::value_variants()
|
Preset::value_variants()
|
||||||
.iter()
|
.iter()
|
||||||
.for_each(|v| preset_command(Some(v.clone()), false));
|
.for_each(|v| preset_command(Some(v.clone()), None, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn preset_command_output_to_file() -> std::io::Result<()> {
|
||||||
|
let dir = tempfile::tempdir().unwrap();
|
||||||
|
let path = dir.path().join("preset.toml");
|
||||||
|
preset_command(Some(Preset("nerd-font-symbols")), Some(path.clone()), false);
|
||||||
|
|
||||||
|
let actual = utils::read_file(&path)?;
|
||||||
|
let expected = include_str!("../docs/.vuepress/public/presets/toml/nerd-font-symbols.toml");
|
||||||
|
assert_eq!(actual, expected);
|
||||||
|
|
||||||
|
dir.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
Loading…
Reference in New Issue
Block a user