Cleanup cargo registry code (#33879)
This commit is contained in:
parent
7048e72d81
commit
2a5ec4acf8
|
@ -102,7 +102,7 @@ pub(crate) struct Program {
|
||||||
id: Pubkey,
|
id: Pubkey,
|
||||||
_tempdir: Arc<TempDir>,
|
_tempdir: Arc<TempDir>,
|
||||||
meta: PackageMetaData,
|
meta: PackageMetaData,
|
||||||
crate_bytes: CrateTarGz,
|
packed_crate: PackedCrate,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Program {
|
impl Program {
|
||||||
|
@ -117,7 +117,7 @@ impl Program {
|
||||||
if APPEND_CRATE_TO_ELF {
|
if APPEND_CRATE_TO_ELF {
|
||||||
let program_id_str = Program::program_id_to_crate_name(self.id);
|
let program_id_str = Program::program_id_to_crate_name(self.id);
|
||||||
let crate_tar_gz =
|
let crate_tar_gz =
|
||||||
CrateTarGz::new_rebased(&self.crate_bytes, &self.meta, &program_id_str)?;
|
PackedCrate::new_rebased(&self.packed_crate, &self.meta, &program_id_str)?;
|
||||||
let crate_len = u32::to_le_bytes(crate_tar_gz.0.len() as u32);
|
let crate_len = u32::to_le_bytes(crate_tar_gz.0.len() as u32);
|
||||||
program_data.extend_from_slice(&crate_tar_gz.0);
|
program_data.extend_from_slice(&crate_tar_gz.0);
|
||||||
program_data.extend_from_slice(&crate_len);
|
program_data.extend_from_slice(&crate_len);
|
||||||
|
@ -175,8 +175,7 @@ impl Program {
|
||||||
.saturating_sub(length as usize);
|
.saturating_sub(length as usize);
|
||||||
let crate_end = data_len.saturating_sub(sizeof_length);
|
let crate_end = data_len.saturating_sub(sizeof_length);
|
||||||
|
|
||||||
let crate_bytes = CrateTarGz(Bytes::copy_from_slice(&data[crate_start..crate_end]));
|
self.packed_crate = PackedCrate(Bytes::copy_from_slice(&data[crate_start..crate_end]));
|
||||||
self.crate_bytes = crate_bytes;
|
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -200,15 +199,16 @@ impl From<&UnpackedCrate> for Program {
|
||||||
id: value.program_id,
|
id: value.program_id,
|
||||||
_tempdir: value.tempdir.clone(),
|
_tempdir: value.tempdir.clone(),
|
||||||
meta: value.meta.clone(),
|
meta: value.meta.clone(),
|
||||||
crate_bytes: value.crate_bytes.clone(),
|
packed_crate: value.packed_crate.clone(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Contents of a .crate file
|
||||||
#[derive(Clone, Default)]
|
#[derive(Clone, Default)]
|
||||||
pub(crate) struct CrateTarGz(pub(crate) Bytes);
|
pub(crate) struct PackedCrate(pub(crate) Bytes);
|
||||||
|
|
||||||
impl CrateTarGz {
|
impl PackedCrate {
|
||||||
fn new(value: UnpackedCrate) -> Result<Self, Error> {
|
fn new(value: UnpackedCrate) -> Result<Self, Error> {
|
||||||
let mut archive = Builder::new(Vec::new());
|
let mut archive = Builder::new(Vec::new());
|
||||||
archive.mode(HeaderMode::Deterministic);
|
archive.mode(HeaderMode::Deterministic);
|
||||||
|
@ -225,7 +225,7 @@ impl CrateTarGz {
|
||||||
let mut zipped_data = Vec::new();
|
let mut zipped_data = Vec::new();
|
||||||
encoder.read_to_end(&mut zipped_data)?;
|
encoder.read_to_end(&mut zipped_data)?;
|
||||||
|
|
||||||
Ok(CrateTarGz(Bytes::from(zipped_data)))
|
Ok(PackedCrate(Bytes::from(zipped_data)))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new_rebased(&self, meta: &PackageMetaData, target_base: &str) -> Result<Self, Error> {
|
fn new_rebased(&self, meta: &PackageMetaData, target_base: &str) -> Result<Self, Error> {
|
||||||
|
@ -272,8 +272,6 @@ impl CrateTarGz {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) struct CratePackage(pub(crate) Bytes);
|
|
||||||
|
|
||||||
pub(crate) struct UnpackedCrate {
|
pub(crate) struct UnpackedCrate {
|
||||||
meta: PackageMetaData,
|
meta: PackageMetaData,
|
||||||
cksum: String,
|
cksum: String,
|
||||||
|
@ -281,14 +279,14 @@ pub(crate) struct UnpackedCrate {
|
||||||
program_path: String,
|
program_path: String,
|
||||||
program_id: Pubkey,
|
program_id: Pubkey,
|
||||||
keypair: Option<Keypair>,
|
keypair: Option<Keypair>,
|
||||||
crate_bytes: CrateTarGz,
|
packed_crate: PackedCrate,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl UnpackedCrate {
|
impl UnpackedCrate {
|
||||||
fn decompress(crate_bytes: CrateTarGz, meta: PackageMetaData) -> Result<Self, Error> {
|
fn decompress(packed_crate: PackedCrate, meta: PackageMetaData) -> Result<Self, Error> {
|
||||||
let cksum = format!("{:x}", Sha256::digest(&crate_bytes.0));
|
let cksum = format!("{:x}", Sha256::digest(&packed_crate.0));
|
||||||
|
|
||||||
let decoder = GzDecoder::new(crate_bytes.0.as_ref());
|
let decoder = GzDecoder::new(packed_crate.0.as_ref());
|
||||||
let mut archive = Archive::new(decoder);
|
let mut archive = Archive::new(decoder);
|
||||||
|
|
||||||
let tempdir = tempdir()?;
|
let tempdir = tempdir()?;
|
||||||
|
@ -316,22 +314,19 @@ impl UnpackedCrate {
|
||||||
program_path,
|
program_path,
|
||||||
program_id: keypair.pubkey(),
|
program_id: keypair.pubkey(),
|
||||||
keypair: Some(keypair),
|
keypair: Some(keypair),
|
||||||
crate_bytes,
|
packed_crate,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn unpack(value: CratePackage) -> Result<Self, Error> {
|
pub(crate) fn new(bytes: Bytes) -> Result<Self, Error> {
|
||||||
let bytes = value.0;
|
|
||||||
let (meta, offset) = PackageMetaData::new(&bytes)?;
|
let (meta, offset) = PackageMetaData::new(&bytes)?;
|
||||||
|
|
||||||
let (_crate_file_length, length_size) =
|
let (_crate_file_length, length_size) =
|
||||||
PackageMetaData::read_u32_length(&bytes.slice(offset..))?;
|
PackageMetaData::read_u32_length(&bytes.slice(offset..))?;
|
||||||
let crate_bytes = CrateTarGz(bytes.slice(offset.saturating_add(length_size)..));
|
let packed_crate = PackedCrate(bytes.slice(offset.saturating_add(length_size)..));
|
||||||
UnpackedCrate::decompress(crate_bytes, meta)
|
UnpackedCrate::decompress(packed_crate, meta)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl UnpackedCrate {
|
|
||||||
pub(crate) fn publish(
|
pub(crate) fn publish(
|
||||||
&self,
|
&self,
|
||||||
client: Arc<Client>,
|
client: Arc<Client>,
|
||||||
|
@ -362,22 +357,21 @@ impl UnpackedCrate {
|
||||||
id: Pubkey,
|
id: Pubkey,
|
||||||
vers: &str,
|
vers: &str,
|
||||||
client: Arc<Client>,
|
client: Arc<Client>,
|
||||||
) -> Result<(CrateTarGz, PackageMetaData), Error> {
|
) -> Result<(PackedCrate, PackageMetaData), Error> {
|
||||||
let crate_obj = Self::new_empty(id, vers)?;
|
let unpacked = Self::new_empty(id, vers)?;
|
||||||
let mut program = Program::from(&crate_obj);
|
let mut program = Program::from(&unpacked);
|
||||||
program.dump(client)?;
|
program.dump(client)?;
|
||||||
|
|
||||||
// Decompile the program
|
// Decompile the program
|
||||||
// Generate a Cargo.toml
|
// Generate a Cargo.toml
|
||||||
|
|
||||||
let mut meta = crate_obj.meta.clone();
|
let mut meta = unpacked.meta.clone();
|
||||||
|
|
||||||
if APPEND_CRATE_TO_ELF {
|
if APPEND_CRATE_TO_ELF {
|
||||||
let version = program.crate_bytes.version();
|
meta.vers = program.packed_crate.version();
|
||||||
meta.vers = version;
|
Ok((program.packed_crate, meta))
|
||||||
Ok((program.crate_bytes, meta))
|
|
||||||
} else {
|
} else {
|
||||||
CrateTarGz::new(crate_obj).map(|file| (file, meta))
|
PackedCrate::new(unpacked).map(|file| (file, meta))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -421,7 +415,7 @@ impl UnpackedCrate {
|
||||||
program_path,
|
program_path,
|
||||||
program_id: id,
|
program_id: id,
|
||||||
keypair: None,
|
keypair: None,
|
||||||
crate_bytes: CrateTarGz::default(),
|
packed_crate: PackedCrate::default(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
use {
|
use {
|
||||||
crate::{
|
crate::{
|
||||||
client::Client,
|
client::Client,
|
||||||
crate_handler::{CratePackage, Error, Program, UnpackedCrate},
|
crate_handler::{Error, Program, UnpackedCrate},
|
||||||
sparse_index::RegistryIndex,
|
sparse_index::RegistryIndex,
|
||||||
},
|
},
|
||||||
hyper::{
|
hyper::{
|
||||||
|
@ -38,14 +38,15 @@ impl CargoRegistryService {
|
||||||
|
|
||||||
match bytes {
|
match bytes {
|
||||||
Ok(data) => {
|
Ok(data) => {
|
||||||
let Ok(crate_object) = UnpackedCrate::unpack(CratePackage(data)) else {
|
let Ok(unpacked_crate) = UnpackedCrate::new(data) else {
|
||||||
return response_builder::error_response(
|
return response_builder::error_response(
|
||||||
hyper::StatusCode::INTERNAL_SERVER_ERROR,
|
hyper::StatusCode::INTERNAL_SERVER_ERROR,
|
||||||
"Failed to parse the crate information",
|
"Failed to parse the crate information",
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
let Ok(result) =
|
let Ok(result) =
|
||||||
tokio::task::spawn_blocking(move || crate_object.publish(client, index)).await
|
tokio::task::spawn_blocking(move || unpacked_crate.publish(client, index))
|
||||||
|
.await
|
||||||
else {
|
else {
|
||||||
return response_builder::error_response(
|
return response_builder::error_response(
|
||||||
hyper::StatusCode::INTERNAL_SERVER_ERROR,
|
hyper::StatusCode::INTERNAL_SERVER_ERROR,
|
||||||
|
|
Loading…
Reference in New Issue