Some but not all of the upload routine

This commit is contained in:
2025-05-27 19:19:09 -05:00
parent 54487622c0
commit c731cd963c
2 changed files with 73 additions and 3 deletions

View File

@@ -5,7 +5,7 @@ edition = "2024"
[dependencies] [dependencies]
clap = { version = "4.0.7", features = ["derive", "env"] } clap = { version = "4.0.7", features = ["derive", "env"] }
reqwest = { version = "0.11.13", features = ["json"] } reqwest = { version = "0.11.13", features = ["json", "stream", "multipart"] }
serde = { version = "1.0.152", features = ["derive"] } serde = { version = "1.0.152", features = ["derive"] }
tokio = { version = "1.24.2", features = ["macros", "rt-multi-thread"] } tokio = { version = "1.24.2", features = ["macros", "rt-multi-thread"] }

View File

@@ -1,7 +1,12 @@
use gt_tools::CreateReleaseOption; use gt_tools::CreateReleaseOption;
use gt_tools::{ReleaseInfo, cli::Args}; use gt_tools::{ReleaseInfo, cli::Args};
use reqwest::multipart::Part;
use std::env; use std::collections::HashMap;
use std::{
env,
fs
};
use clap::Parser; use clap::Parser;
@@ -49,9 +54,18 @@ async fn main() -> Result<(), Error> {
println!("Release Tag: {tag_name}"); println!("Release Tag: {tag_name}");
println!("Creating?: {create}"); println!("Creating?: {create}");
println!("Files..."); println!("Files...");
for file in files { for file in &files {
println!("--- {file}"); println!("--- {file}");
} }
// TODO: Pre-create the release, if it doesn't exist.
// TODO: Find an existing release and use it's ID, if it does
do_upload_release(
&client,
&args.gitea_url,
&args.repo,
52usize,
files
).await?;
} }
} }
@@ -110,3 +124,59 @@ async fn do_create_release(
println!("{:?}", result); println!("{:?}", result);
Ok(()) Ok(())
} }
async fn do_upload_release(
client: &reqwest::Client,
gitea_url: &str,
repo: &str,
release_id: usize,
files: Vec<String>,
) -> Result<(), Error> {
let token = env::var("RELEASE_KEY_GITEA").expect(
"You must set the RELEASE_KEY_GITEA environment variable so the Gitea API can be used.",
);
let request_url = format!(
"{gitea_url}{front}{repo}{back}/{id}/assets",
front = API_RELEASE_FRONT,
back = API_RELEASE_BACK,
id = release_id
);
// Setup a "partial request". I'll need to loop over the files, so I'll
// clone this a bunch of times for each one
let partial_request = client
.post(request_url)
.header(USER_AGENT, "gt-tools-test-agent")
.header(ACCEPT, "application/json")
// .header("Content-Type", "multipart/form-data")
.header("Authorization", format!("token {}", token));
// Ensure all files exists before starting the uploads
for file in &files {
assert!(fs::exists(file)
.expect(&format!("Can't check existence of {file}"))
);
}
for file in files {
if let Some(request) = partial_request.try_clone() {
println!("Uploading file {}", &file);
let data = reqwest::multipart::Part::stream(fs::read(&file).unwrap())
.file_name("attachment")
.mime_str("text/plain")?;
let form= reqwest::multipart::Form::new()
.part("attachment", data);
let request = request
.multipart(form)
.query(&[("name", &file)]);
dbg!(&request);
let response = request.send().await?;
dbg!(&response);
dbg!(&response.text().await?);
} else {
panic!("Failed to clone the RequestBuilder during file upload loop.");
}
}
Ok(())
}