Move generating static assets to a cargo-xtask task (#196)

* Move generating static assets to a `cargo-xtask` task

* Generate static assets

* Remove now unused build dependencies

* Fix CI
This commit is contained in:
CosmicHorror 2023-06-04 11:54:10 -06:00 committed by GitHub
parent 1d56bc897d
commit c025993529
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 340 additions and 32 deletions

2
.cargo/config.toml Normal file
View file

@ -0,0 +1,2 @@
[alias]
xtask = "run --package xtask --"

View file

@ -57,7 +57,6 @@ jobs:
if: ${{ matrix.use-cross == true }} if: ${{ matrix.use-cross == true }}
shell: bash shell: bash
run: | run: |
mkdir .cargo
cat > .cargo/config.toml <<EOF cat > .cargo/config.toml <<EOF
[target.${{ matrix.target }}] [target.${{ matrix.target }}]
rustflags = ["--cfg", "sd_cross_compile"] rustflags = ["--cfg", "sd_cross_compile"]

29
Cargo.lock generated
View file

@ -145,9 +145,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.2.7" version = "4.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34d21f9bf1b425d2968943631ec91202fe5e837264063503708b83013f8fc938" checksum = "b4ed2379f8603fa2b7509891660e802b88c70a79a6427a70abb5968054de2c28"
dependencies = [ dependencies = [
"clap_builder", "clap_builder",
"clap_derive", "clap_derive",
@ -156,9 +156,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_builder" name = "clap_builder"
version = "4.2.7" version = "4.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "914c8c79fb560f238ef6429439a30023c862f7a28e688c58f7203f12b29970bd" checksum = "72394f3339a76daf211e57d4bcb374410f3965dcc606dd0e03738c7888766980"
dependencies = [ dependencies = [
"anstream", "anstream",
"anstyle", "anstyle",
@ -170,18 +170,18 @@ dependencies = [
[[package]] [[package]]
name = "clap_complete" name = "clap_complete"
version = "4.2.2" version = "4.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36774babb166352bb4f7b9cb16f781ffa3439d2a8f12cd31bea85a38c888fea3" checksum = "7f6b5c519bab3ea61843a7923d074b04245624bb84a64a8c150f5deb014e388b"
dependencies = [ dependencies = [
"clap", "clap",
] ]
[[package]] [[package]]
name = "clap_derive" name = "clap_derive"
version = "4.2.0" version = "4.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4" checksum = "59e9ef9a08ee1c0e1f2e162121665ac45ac3783b0f897db7244ae75ad9a8f65b"
dependencies = [ dependencies = [
"heck", "heck",
"proc-macro2", "proc-macro2",
@ -191,9 +191,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_lex" name = "clap_lex"
version = "0.4.1" version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b"
[[package]] [[package]]
name = "colorchoice" name = "colorchoice"
@ -913,3 +913,12 @@ name = "windows_x86_64_msvc"
version = "0.48.0" version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
[[package]]
name = "xtask"
version = "0.1.0"
dependencies = [
"clap",
"clap_complete",
"man",
]

View file

@ -1,3 +1,9 @@
[workspace]
members = [
".",
"xtask",
]
[package] [package]
name = "sd" name = "sd"
version = "0.7.6" version = "0.7.6"
@ -28,11 +34,6 @@ clap = { version = "4.2.7", features = ["derive", "deprecated", "wrap_help"] }
assert_cmd = "1.0.3" assert_cmd = "1.0.3"
anyhow = "1.0.38" anyhow = "1.0.38"
[build-dependencies]
clap = "4.2.7"
clap_complete = "4.2.2"
man = "0.3.0"
[profile.release] [profile.release]
opt-level = 3 opt-level = 3
lto = true lto = true

46
gen/completions/_sd Normal file
View file

@ -0,0 +1,46 @@
#compdef sd
autoload -U is-at-least
_sd() {
typeset -A opt_args
typeset -a _arguments_options
local ret=1
if is-at-least 5.2; then
_arguments_options=(-s -S -C)
else
_arguments_options=(-s -C)
fi
local context curcontext="$curcontext" state line
_arguments "${_arguments_options[@]}" \
'-n+[Limit the number of replacements]:REPLACEMENTS: ' \
'-f+[Regex flags. May be combined (like \`-f mc\`).]:FLAGS: ' \
'--flags=[Regex flags. May be combined (like \`-f mc\`).]:FLAGS: ' \
'-p[Output result into stdout and do not modify files]' \
'--preview[Output result into stdout and do not modify files]' \
'-F[Treat FIND and REPLACE_WITH args as literal strings]' \
'--fixed-strings[Treat FIND and REPLACE_WITH args as literal strings]' \
'-r[Recursively replace files]' \
'-h[Print help (see more with '\''--help'\'')]' \
'--help[Print help (see more with '\''--help'\'')]' \
'-V[Print version]' \
'--version[Print version]' \
':find -- The regexp or string (if -s) to search for:' \
':replace_with -- What to replace each match with. Unless in string mode, you may use captured values like $1, $2, etc:' \
'*::files -- The path to file(s). This is optional - sd can also read from STDIN. {n}{n}Note\: sd modifies files in-place by default. See documentation for examples:_files' \
&& ret=0
}
(( $+functions[_sd_commands] )) ||
_sd_commands() {
local commands; commands=()
_describe -t commands 'sd commands' commands "$@"
}
if [ "$funcstack[1]" = "_sd" ]; then
_sd "$@"
else
compdef _sd sd
fi

42
gen/completions/_sd.ps1 Normal file
View file

@ -0,0 +1,42 @@
using namespace System.Management.Automation
using namespace System.Management.Automation.Language
Register-ArgumentCompleter -Native -CommandName 'sd' -ScriptBlock {
param($wordToComplete, $commandAst, $cursorPosition)
$commandElements = $commandAst.CommandElements
$command = @(
'sd'
for ($i = 1; $i -lt $commandElements.Count; $i++) {
$element = $commandElements[$i]
if ($element -isnot [StringConstantExpressionAst] -or
$element.StringConstantType -ne [StringConstantType]::BareWord -or
$element.Value.StartsWith('-') -or
$element.Value -eq $wordToComplete) {
break
}
$element.Value
}) -join ';'
$completions = @(switch ($command) {
'sd' {
[CompletionResult]::new('-n', 'n', [CompletionResultType]::ParameterName, 'Limit the number of replacements')
[CompletionResult]::new('-f', 'f', [CompletionResultType]::ParameterName, 'Regex flags. May be combined (like `-f mc`).')
[CompletionResult]::new('--flags', 'flags', [CompletionResultType]::ParameterName, 'Regex flags. May be combined (like `-f mc`).')
[CompletionResult]::new('-p', 'p', [CompletionResultType]::ParameterName, 'Output result into stdout and do not modify files')
[CompletionResult]::new('--preview', 'preview', [CompletionResultType]::ParameterName, 'Output result into stdout and do not modify files')
[CompletionResult]::new('-F', 'F', [CompletionResultType]::ParameterName, 'Treat FIND and REPLACE_WITH args as literal strings')
[CompletionResult]::new('--fixed-strings', 'fixed-strings', [CompletionResultType]::ParameterName, 'Treat FIND and REPLACE_WITH args as literal strings')
[CompletionResult]::new('-r', 'r', [CompletionResultType]::ParameterName, 'Recursively replace files')
[CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help (see more with ''--help'')')
[CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help (see more with ''--help'')')
[CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Print version')
[CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version')
break
}
})
$completions.Where{ $_.CompletionText -like "$wordToComplete*" } |
Sort-Object -Property ListItemText
}

50
gen/completions/sd.bash Normal file
View file

@ -0,0 +1,50 @@
_sd() {
local i cur prev opts cmd
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
cmd=""
opts=""
for i in ${COMP_WORDS[@]}
do
case "${cmd},${i}" in
",$1")
cmd="sd"
;;
*)
;;
esac
done
case "${cmd}" in
sd)
opts="-p -F -r -n -f -h -V --preview --fixed-strings --flags --help --version <FIND> <REPLACE_WITH> [FILES]..."
if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
return 0
fi
case "${prev}" in
-n)
COMPREPLY=($(compgen -f "${cur}"))
return 0
;;
--flags)
COMPREPLY=($(compgen -f "${cur}"))
return 0
;;
-f)
COMPREPLY=($(compgen -f "${cur}"))
return 0
;;
*)
COMPREPLY=()
;;
esac
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
return 0
;;
esac
}
complete -F _sd -o bashdefault -o default sd

36
gen/completions/sd.elv Normal file
View file

@ -0,0 +1,36 @@
use builtin;
use str;
set edit:completion:arg-completer[sd] = {|@words|
fn spaces {|n|
builtin:repeat $n ' ' | str:join ''
}
fn cand {|text desc|
edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc
}
var command = 'sd'
for word $words[1..-1] {
if (str:has-prefix $word '-') {
break
}
set command = $command';'$word
}
var completions = [
&'sd'= {
cand -n 'Limit the number of replacements'
cand -f 'Regex flags. May be combined (like `-f mc`).'
cand --flags 'Regex flags. May be combined (like `-f mc`).'
cand -p 'Output result into stdout and do not modify files'
cand --preview 'Output result into stdout and do not modify files'
cand -F 'Treat FIND and REPLACE_WITH args as literal strings'
cand --fixed-strings 'Treat FIND and REPLACE_WITH args as literal strings'
cand -r 'Recursively replace files'
cand -h 'Print help (see more with ''--help'')'
cand --help 'Print help (see more with ''--help'')'
cand -V 'Print version'
cand --version 'Print version'
}
]
$completions[$command]
}

7
gen/completions/sd.fish Normal file
View file

@ -0,0 +1,7 @@
complete -c sd -s n -d 'Limit the number of replacements' -r
complete -c sd -s f -l flags -d 'Regex flags. May be combined (like `-f mc`).' -r
complete -c sd -s p -l preview -d 'Output result into stdout and do not modify files'
complete -c sd -s F -l fixed-strings -d 'Treat FIND and REPLACE_WITH args as literal strings'
complete -c sd -s r -d 'Recursively replace files'
complete -c sd -s h -l help -d 'Print help (see more with \'--help\')'
complete -c sd -s V -l version -d 'Print version'

63
gen/sd.1 Normal file
View file

@ -0,0 +1,63 @@
.TH SD 1
.SH NAME
sd
.SH SYNOPSIS
\fBsd\fR [FLAGS] find replace_with [FILES]
.SH FLAGS
.TP
\fB\-p\fR, \fB\-\-preview\fR
Emit the replacement to STDOUT
.TP
\fB\-s\fR, \fB\-\-string\-mode\fR
Treat expressions as non\-regex strings.
.TP
\fB\-f\fR, \fB\-\-flags\fR
Regex flags. May be combined (like `\-f mc`).
c \- case\-sensitive
i \- case\-insensitive
m \- multi\-line matching
w \- match full words only
.SH EXIT STATUS
.TP
\fB0\fR
Successful program execution.
.TP
\fB1\fR
Unsuccessful program execution.
.TP
\fB101\fR
The program panicked.
.SH EXAMPLES
.TP
String\-literal mode
\fB$ echo 'lots((([]))) of special chars' | sd \-s '((([])))' ''\fR
.br
lots of special chars
.TP
Regex use. Let's trim some trailing whitespace
\fB$ echo 'lorem ipsum 23 ' | sd '\s+$' ''\fR
.br
lorem ipsum 23
.TP
Indexed capture groups
\fB$ echo 'cargo +nightly watch' | sd '(\w+)\s+\+(\w+)\s+(\w+)' 'cmd: $1, channel: $2, subcmd: $3'\fR
.br
cmd: cargo, channel: nightly, subcmd: watch
.TP
Named capture groups
\fB$ echo "123.45" | sd '(?P<dollars>\d+)\.(?P<cents>\d+)' '$dollars dollars and $cents cents'\fR
.br
123 dollars and 45 cents
.TP
Find & replace in file
\fB$ sd 'window.fetch' 'fetch' http.js\fR
.TP
Find & replace from STDIN an emit to STDOUT
\fB$ sd 'window.fetch' 'fetch' < http.js\fR

10
xtask/Cargo.toml Normal file
View file

@ -0,0 +1,10 @@
[package]
name = "xtask"
version = "0.1.0"
edition = "2021"
publish = false
[dependencies]
clap = "4.3.1"
clap_complete = "4.3.1"
man = "0.3.0"

View file

@ -1,25 +1,30 @@
include!("src/cli.rs"); include!("../../src/cli.rs");
fn main() { use std::{fs, path::Path};
use std::{env::var, fs};
use clap::{CommandFactory, ValueEnum}; use clap::{CommandFactory, ValueEnum};
use clap_complete::{generate_to, Shell}; use clap_complete::{generate_to, Shell};
use man::prelude::*;
let out_dir = var("SHELL_COMPLETIONS_DIR").or(var("OUT_DIR")).unwrap(); pub fn gen() {
let gen_dir = Path::new("gen");
gen_shell(gen_dir);
gen_man(gen_dir);
}
fs::create_dir_all(&out_dir).unwrap(); fn gen_shell(base_dir: &Path) {
let completions_dir = base_dir.join("completions");
fs::create_dir_all(&completions_dir).unwrap();
let mut cmd = Options::command(); let mut cmd = Options::command();
for &shell in Shell::value_variants() { for &shell in Shell::value_variants() {
generate_to(shell, &mut cmd, "sd", &out_dir).unwrap(); generate_to(shell, &mut cmd, "sd", &completions_dir).unwrap();
}
} }
create_man_page(); fn gen_man(base_dir: &Path) {
} let man_path = base_dir.join("sd.1");
fn create_man_page() {
use man::prelude::*;
let page = Manual::new("sd") let page = Manual::new("sd")
.flag( .flag(
Flag::new() Flag::new()
@ -84,8 +89,5 @@ w - match full words only
) )
.render(); .render();
let mut man_path = std::fs::write(man_path, page).unwrap();
std::path::PathBuf::from(std::env::var("OUT_DIR").unwrap());
man_path.push("sd.1");
std::fs::write(man_path, page).expect("Error writing man page");
} }

41
xtask/src/main.rs Normal file
View file

@ -0,0 +1,41 @@
use std::{
env,
path::{Path, PathBuf},
};
use clap::{Parser, Subcommand};
mod gen;
#[derive(Parser)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
/// Generate static assets
Gen,
}
fn main() {
let Cli { command } = Cli::parse();
env::set_current_dir(project_root()).unwrap();
match command {
Commands::Gen => gen::gen(),
}
}
fn project_root() -> PathBuf {
Path::new(
&env::var("CARGO_MANIFEST_DIR")
.unwrap_or_else(|_| env!("CARGO_MANIFEST_DIR").to_owned()),
)
.ancestors()
.nth(1)
.unwrap()
.to_path_buf()
}