mirror of
https://github.com/casey/just.git
synced 2024-09-11 05:55:31 +03:00
Allow setting echoed recipe line color (#1670)
This commit is contained in:
parent
6a2b85c31c
commit
22e103361f
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,4 +1,5 @@
|
||||
.DS_Store
|
||||
.idea
|
||||
/.vagrant
|
||||
/README.html
|
||||
/book/en/build
|
||||
|
@ -20,7 +20,7 @@ _just() {
|
||||
|
||||
case "${cmd}" in
|
||||
just)
|
||||
opts=" -n -q -u -v -e -l -h -V -f -d -c -s --check --dry-run --highlight --no-dotenv --no-highlight --quiet --shell-command --clear-shell-args --unsorted --unstable --verbose --changelog --choose --dump --edit --evaluate --fmt --init --list --summary --variables --help --version --chooser --color --dump-format --list-heading --list-prefix --justfile --set --shell --shell-arg --working-directory --command --completions --show --dotenv-filename --dotenv-path <ARGUMENTS>... "
|
||||
opts=" -n -q -u -v -e -l -h -V -f -d -c -s --check --dry-run --highlight --no-dotenv --no-highlight --quiet --shell-command --clear-shell-args --unsorted --unstable --verbose --changelog --choose --dump --edit --evaluate --fmt --init --list --summary --variables --help --version --chooser --color --command-color --dump-format --list-heading --list-prefix --justfile --set --shell --shell-arg --working-directory --command --completions --show --dotenv-filename --dotenv-path <ARGUMENTS>... "
|
||||
if [[ ${cur} == -* ]] ; then
|
||||
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
|
||||
return 0
|
||||
@ -48,6 +48,10 @@ _just() {
|
||||
COMPREPLY=($(compgen -W "auto always never" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--command-color)
|
||||
COMPREPLY=($(compgen -W "black blue cyan green purple red yellow" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
--dump-format)
|
||||
COMPREPLY=($(compgen -W "just json" -- "${cur}"))
|
||||
return 0
|
||||
|
@ -16,6 +16,7 @@ edit:completion:arg-completer[just] = [@words]{
|
||||
&'just'= {
|
||||
cand --chooser 'Override binary invoked by `--choose`'
|
||||
cand --color 'Print colorful output'
|
||||
cand --command-color 'Echo recipe lines in <COMMAND-COLOR>'
|
||||
cand --dump-format 'Dump justfile as <FORMAT>'
|
||||
cand --list-heading 'Print <TEXT> before list'
|
||||
cand --list-prefix 'Print <TEXT> before each list item'
|
||||
|
@ -11,6 +11,7 @@ complete -c just -a '(__fish_just_complete_recipes)'
|
||||
# autogenerated completions
|
||||
complete -c just -n "__fish_use_subcommand" -l chooser -d 'Override binary invoked by `--choose`'
|
||||
complete -c just -n "__fish_use_subcommand" -l color -d 'Print colorful output' -r -f -a "auto always never"
|
||||
complete -c just -n "__fish_use_subcommand" -l command-color -d 'Echo recipe lines in <COMMAND-COLOR>' -r -f -a "black blue cyan green purple red yellow"
|
||||
complete -c just -n "__fish_use_subcommand" -l dump-format -d 'Dump justfile as <FORMAT>' -r -f -a "just json"
|
||||
complete -c just -n "__fish_use_subcommand" -l list-heading -d 'Print <TEXT> before list'
|
||||
complete -c just -n "__fish_use_subcommand" -l list-prefix -d 'Print <TEXT> before each list item'
|
||||
|
@ -21,6 +21,7 @@ Register-ArgumentCompleter -Native -CommandName 'just' -ScriptBlock {
|
||||
'just' {
|
||||
[CompletionResult]::new('--chooser', 'chooser', [CompletionResultType]::ParameterName, 'Override binary invoked by `--choose`')
|
||||
[CompletionResult]::new('--color', 'color', [CompletionResultType]::ParameterName, 'Print colorful output')
|
||||
[CompletionResult]::new('--command-color', 'command-color', [CompletionResultType]::ParameterName, 'Echo recipe lines in <COMMAND-COLOR>')
|
||||
[CompletionResult]::new('--dump-format', 'dump-format', [CompletionResultType]::ParameterName, 'Dump justfile as <FORMAT>')
|
||||
[CompletionResult]::new('--list-heading', 'list-heading', [CompletionResultType]::ParameterName, 'Print <TEXT> before list')
|
||||
[CompletionResult]::new('--list-prefix', 'list-prefix', [CompletionResultType]::ParameterName, 'Print <TEXT> before each list item')
|
||||
|
@ -17,6 +17,7 @@ _just() {
|
||||
local common=(
|
||||
'--chooser=[Override binary invoked by `--choose`]' \
|
||||
'--color=[Print colorful output]: :(auto always never)' \
|
||||
'--command-color=[Echo recipe lines in <COMMAND-COLOR>]: :(black blue cyan green purple red yellow)' \
|
||||
'--dump-format=[Dump justfile as <FORMAT>]: :(just json)' \
|
||||
'--list-heading=[Print <TEXT> before list]' \
|
||||
'--list-prefix=[Print <TEXT> before each list item]' \
|
||||
|
@ -76,8 +76,12 @@ impl Color {
|
||||
self.restyle(Style::new().fg(Cyan).bold())
|
||||
}
|
||||
|
||||
pub(crate) fn command(self) -> Self {
|
||||
self.restyle(Style::new().bold())
|
||||
pub(crate) fn command(self, foreground: Option<ansi_term::Color>) -> Self {
|
||||
self.restyle(Style {
|
||||
foreground,
|
||||
is_bold: true,
|
||||
..Style::default()
|
||||
})
|
||||
}
|
||||
|
||||
pub(crate) fn parameter(self) -> Self {
|
||||
|
@ -15,6 +15,7 @@ pub(crate) const CHOOSE_HELP: &str = "Select one or more recipes to run using a
|
||||
pub(crate) struct Config {
|
||||
pub(crate) check: bool,
|
||||
pub(crate) color: Color,
|
||||
pub(crate) command_color: Option<ansi_term::Color>,
|
||||
pub(crate) dotenv_filename: Option<String>,
|
||||
pub(crate) dotenv_path: Option<PathBuf>,
|
||||
pub(crate) dry_run: bool,
|
||||
@ -85,6 +86,7 @@ mod arg {
|
||||
pub(crate) const CHOOSER: &str = "CHOOSER";
|
||||
pub(crate) const CLEAR_SHELL_ARGS: &str = "CLEAR-SHELL-ARGS";
|
||||
pub(crate) const COLOR: &str = "COLOR";
|
||||
pub(crate) const COMMAND_COLOR: &str = "COMMAND-COLOR";
|
||||
pub(crate) const DOTENV_FILENAME: &str = "DOTENV-FILENAME";
|
||||
pub(crate) const DOTENV_PATH: &str = "DOTENV-PATH";
|
||||
pub(crate) const DRY_RUN: &str = "DRY-RUN";
|
||||
@ -110,6 +112,23 @@ mod arg {
|
||||
pub(crate) const COLOR_NEVER: &str = "never";
|
||||
pub(crate) const COLOR_VALUES: &[&str] = &[COLOR_AUTO, COLOR_ALWAYS, COLOR_NEVER];
|
||||
|
||||
pub(crate) const COMMAND_COLOR_BLACK: &str = "black";
|
||||
pub(crate) const COMMAND_COLOR_BLUE: &str = "blue";
|
||||
pub(crate) const COMMAND_COLOR_CYAN: &str = "cyan";
|
||||
pub(crate) const COMMAND_COLOR_GREEN: &str = "green";
|
||||
pub(crate) const COMMAND_COLOR_PURPLE: &str = "purple";
|
||||
pub(crate) const COMMAND_COLOR_RED: &str = "red";
|
||||
pub(crate) const COMMAND_COLOR_YELLOW: &str = "yellow";
|
||||
pub(crate) const COMMAND_COLOR_VALUES: &[&str] = &[
|
||||
COMMAND_COLOR_BLACK,
|
||||
COMMAND_COLOR_BLUE,
|
||||
COMMAND_COLOR_CYAN,
|
||||
COMMAND_COLOR_GREEN,
|
||||
COMMAND_COLOR_PURPLE,
|
||||
COMMAND_COLOR_RED,
|
||||
COMMAND_COLOR_YELLOW,
|
||||
];
|
||||
|
||||
pub(crate) const DUMP_FORMAT_JSON: &str = "json";
|
||||
pub(crate) const DUMP_FORMAT_JUST: &str = "just";
|
||||
pub(crate) const DUMP_FORMAT_VALUES: &[&str] = &[DUMP_FORMAT_JUST, DUMP_FORMAT_JSON];
|
||||
@ -142,6 +161,13 @@ impl Config {
|
||||
.default_value(arg::COLOR_AUTO)
|
||||
.help("Print colorful output"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name(arg::COMMAND_COLOR)
|
||||
.long("command-color")
|
||||
.takes_value(true)
|
||||
.possible_values(arg::COMMAND_COLOR_VALUES)
|
||||
.help("Echo recipe lines in <COMMAND-COLOR>"),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name(arg::DRY_RUN)
|
||||
.short("n")
|
||||
@ -396,6 +422,25 @@ impl Config {
|
||||
}
|
||||
}
|
||||
|
||||
fn command_color_from_matches(matches: &ArgMatches) -> ConfigResult<Option<ansi_term::Color>> {
|
||||
if let Some(value) = matches.value_of(arg::COMMAND_COLOR) {
|
||||
match value {
|
||||
arg::COMMAND_COLOR_BLACK => Ok(Some(ansi_term::Color::Black)),
|
||||
arg::COMMAND_COLOR_BLUE => Ok(Some(ansi_term::Color::Blue)),
|
||||
arg::COMMAND_COLOR_CYAN => Ok(Some(ansi_term::Color::Cyan)),
|
||||
arg::COMMAND_COLOR_GREEN => Ok(Some(ansi_term::Color::Green)),
|
||||
arg::COMMAND_COLOR_PURPLE => Ok(Some(ansi_term::Color::Purple)),
|
||||
arg::COMMAND_COLOR_RED => Ok(Some(ansi_term::Color::Red)),
|
||||
arg::COMMAND_COLOR_YELLOW => Ok(Some(ansi_term::Color::Yellow)),
|
||||
value => Err(ConfigError::Internal {
|
||||
message: format!("Invalid argument `{value}` to --command-color."),
|
||||
}),
|
||||
}
|
||||
} else {
|
||||
Ok(None)
|
||||
}
|
||||
}
|
||||
|
||||
fn dump_format_from_matches(matches: &ArgMatches) -> ConfigResult<DumpFormat> {
|
||||
let value = matches
|
||||
.value_of(arg::DUMP_FORMAT)
|
||||
@ -422,6 +467,7 @@ impl Config {
|
||||
};
|
||||
|
||||
let color = Self::color_from_matches(matches)?;
|
||||
let command_color = Self::command_color_from_matches(matches)?;
|
||||
|
||||
let set_count = matches.occurrences_of(arg::SET);
|
||||
let mut overrides = BTreeMap::new();
|
||||
@ -593,6 +639,7 @@ impl Config {
|
||||
.unwrap_or(" ")
|
||||
.to_owned(),
|
||||
color,
|
||||
command_color,
|
||||
invocation_directory,
|
||||
search_config,
|
||||
shell_args,
|
||||
|
@ -182,7 +182,7 @@ impl<'src, D> Recipe<'src, D> {
|
||||
|| !((quiet_command ^ self.quiet) || config.verbosity.quiet())
|
||||
{
|
||||
let color = if config.highlight {
|
||||
config.color.command()
|
||||
config.color.command(config.command_color)
|
||||
} else {
|
||||
config.color
|
||||
};
|
||||
|
@ -20,6 +20,18 @@ test! {
|
||||
stdout: "foo",
|
||||
}
|
||||
|
||||
test! {
|
||||
name: command_color,
|
||||
justfile: "
|
||||
x:
|
||||
echo XYZ
|
||||
",
|
||||
args: ("--color", "always", "--command-color", "cyan"),
|
||||
stdout: "XYZ\n",
|
||||
stderr: "\u{1b}[1;36mecho XYZ\u{1b}[0m\n",
|
||||
status: EXIT_SUCCESS,
|
||||
}
|
||||
|
||||
test! {
|
||||
name: no_binary,
|
||||
justfile: "
|
||||
|
Loading…
Reference in New Issue
Block a user