Add atuin status (#830)

Useful for debugging, checking the state of things, and for if you
forget your username!
This commit is contained in:
Ellie Huxtable 2023-03-30 06:45:49 +01:00 committed by GitHub
parent ca5e58ad01
commit 0d16a113c5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 58 additions and 1 deletions

12
Cargo.lock generated
View File

@ -80,6 +80,7 @@ dependencies = [
"chrono", "chrono",
"clap", "clap",
"clap_complete", "clap_complete",
"colored",
"crossbeam-channel", "crossbeam-channel",
"crossterm", "crossterm",
"directories", "directories",
@ -383,6 +384,17 @@ dependencies = [
"os_str_bytes", "os_str_bytes",
] ]
[[package]]
name = "colored"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd"
dependencies = [
"atty",
"lazy_static",
"winapi",
]
[[package]] [[package]]
name = "config" name = "config"
version = "0.13.2" version = "0.13.2"

View File

@ -75,6 +75,7 @@ tiny-bip39 = "1"
futures-util = "0.3" futures-util = "0.3"
ratatui = "0.20.1" ratatui = "0.20.1"
fuzzy-matcher = "0.3.7" fuzzy-matcher = "0.3.7"
colored = "2.0.0"
[dependencies.tracing-subscriber] [dependencies.tracing-subscriber]
version = "0.3" version = "0.3"

View File

@ -69,6 +69,7 @@ pub struct IndexResponse {
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
pub struct StatusResponse { pub struct StatusResponse {
pub count: i64, pub count: i64,
pub username: String,
pub deleted: Vec<String>, pub deleted: Vec<String>,
} }

View File

@ -31,5 +31,9 @@ pub async fn status<DB: Database>(
}, },
}; };
Ok(Json(StatusResponse { count, deleted })) Ok(Json(StatusResponse {
count,
deleted,
username: user.username,
}))
} }

View File

@ -6,6 +6,7 @@ use atuin_client::{database::Database, settings::Settings};
mod login; mod login;
mod logout; mod logout;
mod register; mod register;
mod status;
#[derive(Subcommand)] #[derive(Subcommand)]
#[command(infer_subcommands = true)] #[command(infer_subcommands = true)]
@ -32,6 +33,8 @@ pub enum Cmd {
#[arg(long)] #[arg(long)]
base64: bool, base64: bool,
}, },
Status,
} }
impl Cmd { impl Cmd {
@ -41,6 +44,7 @@ impl Cmd {
Self::Login(l) => l.run(&settings).await, Self::Login(l) => l.run(&settings).await,
Self::Logout => logout::run(&settings), Self::Logout => logout::run(&settings),
Self::Register(r) => r.run(&settings).await, Self::Register(r) => r.run(&settings).await,
Self::Status => status::run(&settings, db).await,
Self::Key { base64 } => { Self::Key { base64 } => {
use atuin_client::encryption::{encode_key, load_key}; use atuin_client::encryption::{encode_key, load_key};
let key = load_key(&settings).wrap_err("could not load encryption key")?; let key = load_key(&settings).wrap_err("could not load encryption key")?;

View File

@ -0,0 +1,35 @@
use atuin_client::{
api_client, database::Database, encryption::load_encoded_key, settings::Settings,
};
use colored::Colorize;
use eyre::Result;
pub async fn run(settings: &Settings, db: &impl Database) -> Result<()> {
let client = api_client::Client::new(
&settings.sync_address,
&settings.session_token,
load_encoded_key(settings)?,
)?;
let status = client.status().await?;
let last_sync = Settings::last_sync()?;
let local_count = db.history_count().await?;
println!("{}", "[Local]".green());
if settings.auto_sync {
println!("Sync frequency: {}", settings.sync_frequency);
println!("Last sync: {last_sync}");
}
println!("History count: {local_count}\n");
if settings.auto_sync {
println!("{}", "[Remote]".green());
println!("Address: {}", settings.sync_address);
println!("Username: {}", status.username);
println!("History count: {}", status.count);
}
Ok(())
}