Signed-off-by: kjuulh <contact@kjuulh.io>
This commit is contained in:
@@ -3,6 +3,53 @@ pub struct Archive {}
|
||||
|
||||
use std::io::Cursor;
|
||||
|
||||
use super::file_reader::Files;
|
||||
|
||||
impl Archive {
|
||||
pub fn new() -> Self {
|
||||
Self {}
|
||||
}
|
||||
|
||||
pub async fn create_archive(&self, files: Files) -> anyhow::Result<ArchiveFile> {
|
||||
tracing::trace!("archiving files: {}", files.len());
|
||||
|
||||
let buffer = Vec::new();
|
||||
let cursor = Cursor::new(buffer);
|
||||
|
||||
let mut tar_builder = tar::Builder::new(cursor);
|
||||
|
||||
for file in files {
|
||||
let abs_file_path = file.path;
|
||||
|
||||
let mut fd = std::fs::File::open(&abs_file_path)?;
|
||||
if let Some(rel) = file.relative {
|
||||
tracing::trace!("archiving rel file: {}", rel.display());
|
||||
tar_builder.append_file(&rel, &mut fd)?;
|
||||
} else {
|
||||
tracing::trace!("archiving file: {}", abs_file_path.display());
|
||||
tar_builder.append_file(&abs_file_path, &mut fd)?;
|
||||
}
|
||||
}
|
||||
|
||||
tar_builder.finish()?;
|
||||
|
||||
let cursor = tar_builder.into_inner()?;
|
||||
let buffer = cursor.into_inner();
|
||||
|
||||
Ok(buffer.into())
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ArchiveFile {
|
||||
pub content: Vec<u8>,
|
||||
}
|
||||
|
||||
impl From<Vec<u8>> for ArchiveFile {
|
||||
fn from(value: Vec<u8>) -> Self {
|
||||
Self { content: value }
|
||||
}
|
||||
}
|
||||
|
||||
pub mod extensions {
|
||||
|
||||
use std::{env::temp_dir, path::PathBuf};
|
||||
@@ -11,6 +58,7 @@ pub mod extensions {
|
||||
use tokio::io::AsyncWriteExt;
|
||||
use uuid::Uuid;
|
||||
|
||||
use crate::app::SharedLocalApp;
|
||||
use crate::{app::SharedApp, services::release_manager::models::ArtifactID};
|
||||
|
||||
use crate::services::file_store::FileStore;
|
||||
@@ -28,6 +76,12 @@ pub mod extensions {
|
||||
}
|
||||
}
|
||||
|
||||
impl ArchiveExt for SharedLocalApp {
|
||||
fn archive(&self) -> Archive {
|
||||
Archive::new()
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
pub trait ArchiveUploadExt {
|
||||
async fn upload_archive(
|
||||
@@ -89,50 +143,3 @@ pub mod extensions {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
use super::file_reader::Files;
|
||||
|
||||
impl Archive {
|
||||
pub fn new() -> Self {
|
||||
Self {}
|
||||
}
|
||||
|
||||
pub async fn create_archive(&self, files: Files) -> anyhow::Result<ArchiveFile> {
|
||||
tracing::trace!("archiving files: {}", files.len());
|
||||
|
||||
let buffer = Vec::new();
|
||||
let cursor = Cursor::new(buffer);
|
||||
|
||||
let mut tar_builder = tar::Builder::new(cursor);
|
||||
|
||||
for file in files {
|
||||
let abs_file_path = file.path;
|
||||
|
||||
let mut fd = std::fs::File::open(&abs_file_path)?;
|
||||
if let Some(rel) = file.relative {
|
||||
tracing::trace!("archiving rel file: {}", rel.display());
|
||||
tar_builder.append_file(&rel, &mut fd)?;
|
||||
} else {
|
||||
tracing::trace!("archiving file: {}", abs_file_path.display());
|
||||
tar_builder.append_file(&abs_file_path, &mut fd)?;
|
||||
}
|
||||
}
|
||||
|
||||
tar_builder.finish()?;
|
||||
|
||||
let cursor = tar_builder.into_inner()?;
|
||||
let buffer = cursor.into_inner();
|
||||
|
||||
Ok(buffer.into())
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ArchiveFile {
|
||||
pub content: Vec<u8>,
|
||||
}
|
||||
|
||||
impl From<Vec<u8>> for ArchiveFile {
|
||||
fn from(value: Vec<u8>) -> Self {
|
||||
Self { content: value }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user