feat: add --ids-only flag to --list mode for scripting

Outputs one ID per line with no header. Errors if used with any mode
other than --list. Works with both local and client (remote) list.
This commit is contained in:
2026-03-17 15:04:10 -03:00
parent 2452da52ef
commit cb56a398fa
5 changed files with 37 additions and 2 deletions

View File

@@ -237,6 +237,10 @@ pub struct OptionsArgs {
#[arg(help("Display file sizes with units"))]
pub human_readable: bool,
#[arg(long)]
#[arg(help("Only output item IDs (for scripting)"))]
pub ids_only: bool,
#[arg(short, long, action = clap::ArgAction::Count, conflicts_with("quiet"))]
#[arg(help("Increase message verbosity, can be given more than once"))]
pub verbose: u8,

View File

@@ -191,6 +191,8 @@ pub struct Settings {
pub table_config: TableConfig,
#[serde(default)]
pub human_readable: bool,
#[serde(default)]
pub ids_only: bool,
pub output_format: Option<String>,
#[serde(default)]
pub quiet: bool,
@@ -277,6 +279,10 @@ impl Settings {
config_builder = config_builder.set_override("human_readable", true)?;
}
if args.options.ids_only {
config_builder = config_builder.set_override("ids_only", true)?;
}
if let Some(output_format) = &args.options.output_format {
config_builder =
config_builder.set_override("output_format", output_format.as_str())?;

View File

@@ -196,6 +196,15 @@ fn main() -> Result<(), Error> {
.exit();
}
// Validate ids-only usage
if settings.ids_only && mode != KeepModes::List {
cmd.error(
ErrorKind::InvalidValue,
"--ids-only can only be used with --list mode",
)
.exit();
}
debug!("MAIN: args: {args:?}");
debug!("MAIN: ids: {ids:?}");
debug!("MAIN: tags: {tags:?}");

View File

@@ -1,6 +1,6 @@
use crate::client::KeepClient;
use crate::modes::common::{
ColumnType, OutputFormat, format_size, render_list_table_with_format, settings_output_format,
format_size, render_list_table_with_format, settings_output_format, ColumnType, OutputFormat,
};
use clap::Command;
use log::debug;
@@ -21,6 +21,13 @@ pub fn mode(
.collect();
let items = client.list_items(tags, "newest", 0, 100, &meta_filter)?;
if settings.ids_only {
for item in &items {
println!("{}", item.id);
}
return Ok(());
}
let output_format = settings_output_format(settings);
match output_format {

View File

@@ -5,7 +5,7 @@
/// including table, JSON, and YAML.
use crate::config;
use crate::modes::common::ColumnType;
use crate::modes::common::{OutputFormat, apply_color, apply_table_attribute, format_size};
use crate::modes::common::{apply_color, apply_table_attribute, format_size, OutputFormat};
use crate::services::item_service::ItemService;
use crate::services::types::ItemWithMeta;
use anyhow::{Context, Result};
@@ -104,6 +104,15 @@ pub fn mode_list(
.collect();
let items_with_meta = item_service.list_items(conn, tags, &meta_filter)?;
if settings.ids_only {
for item_with_meta in &items_with_meta {
if let Some(id) = item_with_meta.item.id {
println!("{id}");
}
}
return Ok(());
}
let output_format = crate::modes::common::settings_output_format(settings);
if output_format != OutputFormat::Table {