use std::path::PathBuf;
use anyhow::{Context, Result};
use tracing::{info, warn};
use crate::{
api::symbol_sets::{self, SymbolSetUpload},
invocation_context::context,
sourcemaps::{plain::inject::is_javascript_file, source_pairs::read_pairs},
utils::files::delete_files,
};
#[derive(clap::Args, Clone)]
pub struct Args {
#[arg(short, long)]
pub directory: PathBuf,
#[arg(short, long)]
pub public_path_prefix: Option<String>,
#[arg(short, long)]
pub ignore: Vec<String>,
#[arg(long, default_value = "false")]
pub delete_after: bool,
#[arg(long, default_value = "50")]
pub batch_size: usize,
#[arg(long)]
pub project: Option<String>,
#[arg(long)]
pub version: Option<String>,
#[arg(long, default_value = "false")]
pub skip_ssl_verification: bool,
}
pub fn upload_cmd(args: &Args) -> Result<()> {
if args.project.is_some() || args.version.is_some() {
warn!("`--project` and `--version` are deprecated and do nothing. Set project and version during `inject` instead.");
}
context().capture_command_invoked("sourcemap_upload");
upload(args)
}
pub fn upload(args: &Args) -> Result<()> {
if args.project.is_some() || args.version.is_some() {
warn!("`--project` and `--version` are deprecated and do nothing. Set project and version during `inject` instead.");
}
let pairs = read_pairs(
&args.directory,
&args.ignore,
is_javascript_file,
&args.public_path_prefix,
)?;
let sourcemap_paths = pairs
.iter()
.map(|pair| pair.sourcemap.inner.path.clone())
.collect::<Vec<_>>();
info!("Found {} chunks to upload", pairs.len());
let uploads = pairs
.into_iter()
.map(TryInto::try_into)
.collect::<Result<Vec<SymbolSetUpload>>>()
.context("While preparing files for upload")?;
symbol_sets::upload(&uploads, args.batch_size)?;
if args.delete_after {
delete_files(sourcemap_paths).context("While deleting sourcemaps")?;
}
Ok(())
}