Auto merge of #98098 - bjorn3:archive_refactor, r=michaelwoerister
Remove the source archive functionality of ArchiveWriter We now build archives through strictly additive means rather than taking an existing archive and potentially substracting parts. This is simpler and makes it easier to swap out the archive writer in https://github.com/rust-lang/rust/pull/97485.
This commit is contained in:
commit
92749f04c6
@ -30,25 +30,7 @@ pub(crate) struct ArArchiveBuilder<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
|
impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
|
||||||
fn new(sess: &'a Session, output: &Path, input: Option<&Path>) -> Self {
|
fn new(sess: &'a Session, output: &Path) -> Self {
|
||||||
let (src_archives, entries) = if let Some(input) = input {
|
|
||||||
let read_cache = ReadCache::new(File::open(input).unwrap());
|
|
||||||
let archive = ArchiveFile::parse(&read_cache).unwrap();
|
|
||||||
let mut entries = Vec::new();
|
|
||||||
|
|
||||||
for entry in archive.members() {
|
|
||||||
let entry = entry.unwrap();
|
|
||||||
entries.push((
|
|
||||||
entry.name().to_vec(),
|
|
||||||
ArchiveEntry::FromArchive { archive_index: 0, file_range: entry.file_range() },
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
(vec![read_cache.into_inner()], entries)
|
|
||||||
} else {
|
|
||||||
(vec![], Vec::new())
|
|
||||||
};
|
|
||||||
|
|
||||||
ArArchiveBuilder {
|
ArArchiveBuilder {
|
||||||
sess,
|
sess,
|
||||||
dst: output.to_path_buf(),
|
dst: output.to_path_buf(),
|
||||||
@ -56,24 +38,11 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
|
|||||||
// FIXME fix builtin ranlib on macOS
|
// FIXME fix builtin ranlib on macOS
|
||||||
no_builtin_ranlib: sess.target.is_like_osx,
|
no_builtin_ranlib: sess.target.is_like_osx,
|
||||||
|
|
||||||
src_archives,
|
src_archives: vec![],
|
||||||
entries,
|
entries: vec![],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn src_files(&mut self) -> Vec<String> {
|
|
||||||
self.entries.iter().map(|(name, _)| String::from_utf8(name.clone()).unwrap()).collect()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn remove_file(&mut self, name: &str) {
|
|
||||||
let index = self
|
|
||||||
.entries
|
|
||||||
.iter()
|
|
||||||
.position(|(entry_name, _)| entry_name == name.as_bytes())
|
|
||||||
.expect("Tried to remove file not existing in src archive");
|
|
||||||
self.entries.remove(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn add_file(&mut self, file: &Path) {
|
fn add_file(&mut self, file: &Path) {
|
||||||
self.entries.push((
|
self.entries.push((
|
||||||
file.file_name().unwrap().to_str().unwrap().to_string().into_bytes(),
|
file.file_name().unwrap().to_str().unwrap().to_string().into_bytes(),
|
||||||
@ -105,7 +74,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn build(mut self) {
|
fn build(mut self) -> bool {
|
||||||
enum BuilderKind {
|
enum BuilderKind {
|
||||||
Bsd(ar::Builder<File>),
|
Bsd(ar::Builder<File>),
|
||||||
Gnu(ar::GnuBuilder<File>),
|
Gnu(ar::GnuBuilder<File>),
|
||||||
@ -204,6 +173,8 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
|
|||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let any_members = !entries.is_empty();
|
||||||
|
|
||||||
// Add all files
|
// Add all files
|
||||||
for (entry_name, data) in entries.into_iter() {
|
for (entry_name, data) in entries.into_iter() {
|
||||||
let header = ar::Header::new(entry_name, data.len() as u64);
|
let header = ar::Header::new(entry_name, data.len() as u64);
|
||||||
@ -229,6 +200,8 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> {
|
|||||||
self.sess.fatal(&format!("Ranlib exited with code {:?}", status.code()));
|
self.sess.fatal(&format!("Ranlib exited with code {:?}", status.code()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
any_members
|
||||||
}
|
}
|
||||||
|
|
||||||
fn inject_dll_import_lib(
|
fn inject_dll_import_lib(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user