mirror of
https://github.com/atuinsh/atuin.git
synced 2024-11-25 17:54:55 +01:00
fix(dotfiles): unquote aliases before quoting (#1976)
* fix(dotfiles): unquote aliases before quoting * tests
This commit is contained in:
parent
8b8844887b
commit
bf88b42cec
@ -2,6 +2,8 @@ use std::borrow::Cow;
|
||||
use std::env;
|
||||
use std::path::PathBuf;
|
||||
|
||||
use eyre::{eyre, Result};
|
||||
|
||||
use rand::RngCore;
|
||||
use uuid::Uuid;
|
||||
|
||||
@ -144,6 +146,30 @@ pub trait Escapable: AsRef<str> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn unquote(s: &str) -> Result<String> {
|
||||
if s.chars().count() < 2 {
|
||||
return Err(eyre!("not enough chars"));
|
||||
}
|
||||
|
||||
let quote = s.chars().next().unwrap();
|
||||
|
||||
// not quoted, do nothing
|
||||
if quote != '"' && quote != '\'' && quote != '`' {
|
||||
return Ok(s.to_string());
|
||||
}
|
||||
|
||||
if s.chars().last().unwrap() != quote {
|
||||
return Err(eyre!("unexpected eof, quotes do not match"));
|
||||
}
|
||||
|
||||
// removes quote characters
|
||||
// the sanity checks performed above ensure that the quotes will be ASCII and this will not
|
||||
// panic
|
||||
let s = &s[1..s.len() - 1];
|
||||
|
||||
Ok(s.to_string())
|
||||
}
|
||||
|
||||
impl<T: AsRef<str>> Escapable for T {}
|
||||
|
||||
#[cfg(test)]
|
||||
|
@ -6,6 +6,7 @@ use atuin_client::record::sqlite_store::SqliteStore;
|
||||
// While we will support a range of shell config, I'd rather have a larger number of small records
|
||||
// + stores, rather than one mega config store.
|
||||
use atuin_common::record::{DecryptedData, Host, HostId};
|
||||
use atuin_common::utils::unquote;
|
||||
use eyre::{bail, ensure, eyre, Result};
|
||||
|
||||
use atuin_client::record::encryption::PASETO_V4;
|
||||
@ -142,7 +143,11 @@ impl AliasStore {
|
||||
let mut config = String::new();
|
||||
|
||||
for alias in aliases {
|
||||
config.push_str(&format!("alias {}='{}'\n", alias.name, alias.value));
|
||||
// If it's quoted, remove the quotes. If it's not quoted, do nothing.
|
||||
let value = unquote(alias.value.as_str()).unwrap_or(alias.value.clone());
|
||||
|
||||
// we're about to quote it ourselves anyway!
|
||||
config.push_str(&format!("alias {}='{}'\n", alias.name, value));
|
||||
}
|
||||
|
||||
Ok(config)
|
||||
@ -336,14 +341,17 @@ mod tests {
|
||||
let alias = AliasStore::new(store, host_id, key);
|
||||
|
||||
alias.set("k", "kubectl").await.unwrap();
|
||||
|
||||
alias.set("gp", "git push").await.unwrap();
|
||||
alias
|
||||
.set("kgap", "'kubectl get pods --all-namespaces'")
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
let mut aliases = alias.aliases().await.unwrap();
|
||||
|
||||
aliases.sort_by_key(|a| a.name.clone());
|
||||
|
||||
assert_eq!(aliases.len(), 2);
|
||||
assert_eq!(aliases.len(), 3);
|
||||
|
||||
assert_eq!(
|
||||
aliases[0],
|
||||
@ -360,5 +368,23 @@ mod tests {
|
||||
value: String::from("kubectl")
|
||||
}
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
aliases[2],
|
||||
Alias {
|
||||
name: String::from("kgap"),
|
||||
value: String::from("'kubectl get pods --all-namespaces'")
|
||||
}
|
||||
);
|
||||
|
||||
let build = alias.posix().await.expect("failed to build aliases");
|
||||
|
||||
assert_eq!(
|
||||
build,
|
||||
"alias gp='git push'
|
||||
alias k='kubectl'
|
||||
alias kgap='kubectl get pods --all-namespaces'
|
||||
"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user