mod edit;
mod list;
mod reset;
mod set;
use clap::Subcommand;
use jj_lib::repo_path::RepoPathBuf;
use tracing::instrument;
use self::edit::SparseEditArgs;
use self::edit::cmd_sparse_edit;
use self::list::SparseListArgs;
use self::list::cmd_sparse_list;
use self::reset::SparseResetArgs;
use self::reset::cmd_sparse_reset;
use self::set::SparseSetArgs;
use self::set::cmd_sparse_set;
use crate::cli_util::CommandHelper;
use crate::cli_util::WorkspaceCommandHelper;
use crate::cli_util::print_checkout_stats;
use crate::command_error::CommandError;
use crate::command_error::internal_error_with_message;
use crate::ui::Ui;
#[derive(Subcommand, Clone, Debug)]
pub(crate) enum SparseCommand {
Edit(SparseEditArgs),
List(SparseListArgs),
Reset(SparseResetArgs),
Set(SparseSetArgs),
}
#[instrument(skip_all)]
pub(crate) async fn cmd_sparse(
ui: &mut Ui,
command: &CommandHelper,
subcommand: &SparseCommand,
) -> Result<(), CommandError> {
match subcommand {
SparseCommand::Edit(args) => cmd_sparse_edit(ui, command, args).await,
SparseCommand::List(args) => cmd_sparse_list(ui, command, args).await,
SparseCommand::Reset(args) => cmd_sparse_reset(ui, command, args).await,
SparseCommand::Set(args) => cmd_sparse_set(ui, command, args).await,
}
}
async fn update_sparse_patterns_with(
ui: &mut Ui,
workspace_command: &mut WorkspaceCommandHelper,
f: impl FnOnce(&mut Ui, &[RepoPathBuf]) -> Result<Vec<RepoPathBuf>, CommandError>,
) -> Result<(), CommandError> {
let (mut locked_ws, wc_commit) = workspace_command.start_working_copy_mutation().await?;
let new_patterns = f(ui, locked_ws.locked_wc().sparse_patterns()?)?;
let stats = locked_ws
.locked_wc()
.set_sparse_patterns(new_patterns)
.await
.map_err(|err| internal_error_with_message("Failed to update working copy paths", err))?;
let operation_id = locked_ws.locked_wc().old_operation_id().clone();
locked_ws.finish(operation_id).await?;
print_checkout_stats(ui, &stats, &wc_commit)?;
Ok(())
}