From d1bdd552e9d20f11eb6104698ed71ba224b7ed34 Mon Sep 17 00:00:00 2001 From: Piotr Maks Date: Thu, 28 May 2020 22:53:25 +0200 Subject: [PATCH 1/6] Enable deflated compression method for any flate2 backend Allow using other than default flate2 backend for deflated compression method. The motivation for this change was to allow using different backends in dependent crates. --- examples/write_dir.rs | 12 +++++++++-- src/compression.rs | 26 ++++++++++++++++++----- src/read.rs | 30 ++++++++++++++++++++++----- src/write.rs | 48 +++++++++++++++++++++++++++++++++++-------- 4 files changed, 96 insertions(+), 20 deletions(-) diff --git a/examples/write_dir.rs b/examples/write_dir.rs index 7f87fa7f..a89801c9 100644 --- a/examples/write_dir.rs +++ b/examples/write_dir.rs @@ -14,9 +14,17 @@ fn main() { const METHOD_STORED: Option = Some(zip::CompressionMethod::Stored); -#[cfg(feature = "deflate")] +#[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" +))] const METHOD_DEFLATED: Option = Some(zip::CompressionMethod::Deflated); -#[cfg(not(feature = "deflate"))] +#[cfg(not(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" +)))] const METHOD_DEFLATED: Option = None; #[cfg(feature = "bzip2")] diff --git a/src/compression.rs b/src/compression.rs index 86358b3e..40916f94 100644 --- a/src/compression.rs +++ b/src/compression.rs @@ -7,8 +7,12 @@ use std::fmt; pub enum CompressionMethod { /// The file is stored (no compression) Stored, - /// Deflate in pure rust - #[cfg(feature = "deflate")] + /// Deflate using any flate2 backend + #[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" + ))] Deflated, /// File is compressed using BZIP2 algorithm #[cfg(feature = "bzip2")] @@ -22,7 +26,11 @@ impl CompressionMethod { pub fn from_u16(val: u16) -> CompressionMethod { match val { 0 => CompressionMethod::Stored, - #[cfg(feature = "deflate")] + #[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" + ))] 8 => CompressionMethod::Deflated, #[cfg(feature = "bzip2")] 12 => CompressionMethod::Bzip2, @@ -34,7 +42,11 @@ impl CompressionMethod { pub fn to_u16(self) -> u16 { match self { CompressionMethod::Stored => 0, - #[cfg(feature = "deflate")] + #[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" + ))] CompressionMethod::Deflated => 8, #[cfg(feature = "bzip2")] CompressionMethod::Bzip2 => 12, @@ -66,7 +78,11 @@ mod test { fn methods() -> Vec { let mut methods = Vec::new(); methods.push(CompressionMethod::Stored); - #[cfg(feature = "deflate")] + #[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" + ))] methods.push(CompressionMethod::Deflated); #[cfg(feature = "bzip2")] methods.push(CompressionMethod::Bzip2); diff --git a/src/read.rs b/src/read.rs index 52fe75cf..dfc80a17 100644 --- a/src/read.rs +++ b/src/read.rs @@ -13,7 +13,11 @@ use crate::cp437::FromCp437; use crate::types::{DateTime, System, ZipFileData}; use podio::{LittleEndian, ReadPodExt}; -#[cfg(feature = "deflate")] +#[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" +))] use flate2::read::DeflateDecoder; #[cfg(feature = "bzip2")] @@ -279,7 +283,11 @@ impl ZipArchive { enum ZipFileReader<'a> { NoReader, Stored(Crc32Reader>), - #[cfg(feature = "deflate")] + #[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" + ))] Deflated(Crc32Reader>>), #[cfg(feature = "bzip2")] Bzip2(Crc32Reader>>), @@ -296,7 +304,11 @@ fn make_reader<'a>( ) -> ZipResult> { match compression_method { CompressionMethod::Stored => Ok(ZipFileReader::Stored(Crc32Reader::new(reader, crc32))), - #[cfg(feature = "deflate")] + #[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" + ))] CompressionMethod::Deflated => { let deflate_reader = DeflateDecoder::new(reader); Ok(ZipFileReader::Deflated(Crc32Reader::new( @@ -420,7 +432,11 @@ fn get_reader<'a>(reader: &'a mut ZipFileReader<'_>) -> &'a mut dyn Read { match *reader { ZipFileReader::NoReader => panic!("ZipFileReader was in an invalid state"), ZipFileReader::Stored(ref mut r) => r as &mut dyn Read, - #[cfg(feature = "deflate")] + #[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" + ))] ZipFileReader::Deflated(ref mut r) => r as &mut dyn Read, #[cfg(feature = "bzip2")] ZipFileReader::Bzip2(ref mut r) => r as &mut dyn Read, @@ -560,7 +576,11 @@ impl<'a> Drop for ZipFile<'a> { let mut reader = match innerreader { ZipFileReader::NoReader => panic!("ZipFileReader was in an invalid state"), ZipFileReader::Stored(crcreader) => crcreader.into_inner(), - #[cfg(feature = "deflate")] + #[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" + ))] ZipFileReader::Deflated(crcreader) => crcreader.into_inner().into_inner(), #[cfg(feature = "bzip2")] ZipFileReader::Bzip2(crcreader) => crcreader.into_inner().into_inner(), diff --git a/src/write.rs b/src/write.rs index d7ed628e..f0d622ec 100644 --- a/src/write.rs +++ b/src/write.rs @@ -11,7 +11,11 @@ use std::io; use std::io::prelude::*; use std::mem; -#[cfg(feature = "deflate")] +#[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" +))] use flate2::write::DeflateEncoder; #[cfg(feature = "bzip2")] @@ -20,7 +24,11 @@ use bzip2::write::BzEncoder; enum GenericZipWriter { Closed, Storer(W), - #[cfg(feature = "deflate")] + #[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" + ))] Deflater(DeflateEncoder), #[cfg(feature = "bzip2")] Bzip2(BzEncoder), @@ -77,9 +85,17 @@ impl FileOptions { /// Construct a new FileOptions object pub fn default() -> FileOptions { FileOptions { - #[cfg(feature = "deflate")] + #[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" + ))] compression_method: CompressionMethod::Deflated, - #[cfg(not(feature = "deflate"))] + #[cfg(not(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" + )))] compression_method: CompressionMethod::Stored, #[cfg(feature = "time")] last_modified_time: DateTime::from_time(time::now()).unwrap_or_default(), @@ -384,7 +400,11 @@ impl GenericZipWriter { let bare = match mem::replace(self, GenericZipWriter::Closed) { GenericZipWriter::Storer(w) => w, - #[cfg(feature = "deflate")] + #[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" + ))] GenericZipWriter::Deflater(w) => w.finish()?, #[cfg(feature = "bzip2")] GenericZipWriter::Bzip2(w) => w.finish()?, @@ -399,7 +419,11 @@ impl GenericZipWriter { *self = match compression { CompressionMethod::Stored => GenericZipWriter::Storer(bare), - #[cfg(feature = "deflate")] + #[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" + ))] CompressionMethod::Deflated => GenericZipWriter::Deflater(DeflateEncoder::new( bare, flate2::Compression::default(), @@ -419,7 +443,11 @@ impl GenericZipWriter { fn ref_mut(&mut self) -> Option<&mut dyn Write> { match *self { GenericZipWriter::Storer(ref mut w) => Some(w as &mut dyn Write), - #[cfg(feature = "deflate")] + #[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" + ))] GenericZipWriter::Deflater(ref mut w) => Some(w as &mut dyn Write), #[cfg(feature = "bzip2")] GenericZipWriter::Bzip2(ref mut w) => Some(w as &mut dyn Write), @@ -444,7 +472,11 @@ impl GenericZipWriter { fn current_compression(&self) -> Option { match *self { GenericZipWriter::Storer(..) => Some(CompressionMethod::Stored), - #[cfg(feature = "deflate")] + #[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" + ))] GenericZipWriter::Deflater(..) => Some(CompressionMethod::Deflated), #[cfg(feature = "bzip2")] GenericZipWriter::Bzip2(..) => Some(CompressionMethod::Bzip2), From 061a58cf7dc5f83c9324ac887229a4ee8b7448ac Mon Sep 17 00:00:00 2001 From: Jeremy Aube Date: Sun, 21 Jun 2020 11:38:39 -0400 Subject: [PATCH 2/6] Removed the default zip comment for ZipWriter to an empty string --- src/write.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/write.rs b/src/write.rs index a7ee92c7..2598f196 100644 --- a/src/write.rs +++ b/src/write.rs @@ -176,7 +176,7 @@ impl ZipWriter { files: Vec::new(), stats: Default::default(), writing_to_file: false, - comment: "zip-rs".into(), + comment: "".into(), } } From d382f04e5a2005971fda802e9920ea72d932a6be Mon Sep 17 00:00:00 2001 From: Jeremy Aube Date: Sun, 21 Jun 2020 12:38:36 -0400 Subject: [PATCH 3/6] Change default comment to String::new() and fixed tests --- src/read.rs | 2 +- src/write.rs | 9 +++++---- tests/data/mimetype.zip | Bin 159 -> 153 bytes 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/read.rs b/src/read.rs index ac721533..06d2540d 100644 --- a/src/read.rs +++ b/src/read.rs @@ -714,7 +714,7 @@ mod test { let mut v = Vec::new(); v.extend_from_slice(include_bytes!("../tests/data/mimetype.zip")); let reader = ZipArchive::new(io::Cursor::new(v)).unwrap(); - assert!(reader.comment() == b"zip-rs"); + assert!(reader.comment() == b""); } #[test] diff --git a/src/write.rs b/src/write.rs index 2598f196..f1d762dd 100644 --- a/src/write.rs +++ b/src/write.rs @@ -176,7 +176,7 @@ impl ZipWriter { files: Vec::new(), stats: Default::default(), writing_to_file: false, - comment: "".into(), + comment: String::new(), } } @@ -616,7 +616,7 @@ mod test { .write(b"writing to a directory is not allowed, and will not write any data") .is_err()); let result = writer.finish().unwrap(); - assert_eq!(result.get_ref().len(), 114); + assert_eq!(result.get_ref().len(), 108); assert_eq!( *result.get_ref(), &[ @@ -624,7 +624,7 @@ mod test { 0, 0, 5, 0, 0, 0, 116, 101, 115, 116, 47, 80, 75, 1, 2, 46, 3, 20, 0, 0, 0, 0, 0, 163, 165, 15, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 65, 0, 0, 0, 0, 116, 101, 115, 116, 47, 80, 75, 5, 6, 0, 0, 0, 0, 1, 0, - 1, 0, 51, 0, 0, 0, 35, 0, 0, 0, 6, 0, 122, 105, 112, 45, 114, 115 + 1, 0, 51, 0, 0, 0, 35, 0, 0, 0, 0, 0, ] as &[u8] ); } @@ -642,7 +642,8 @@ mod test { .write(b"application/vnd.oasis.opendocument.text") .unwrap(); let result = writer.finish().unwrap(); - assert_eq!(result.get_ref().len(), 159); + + assert_eq!(result.get_ref().len(), 153); let mut v = Vec::new(); v.extend_from_slice(include_bytes!("../tests/data/mimetype.zip")); assert_eq!(result.get_ref(), &v); diff --git a/tests/data/mimetype.zip b/tests/data/mimetype.zip index 78f98224e8a226a235a08304f717015dfa97aef5..2d651cbeb35f66322568234766b6b933f651dadc 100644 GIT binary patch delta 9 QcmbQwIFoV0bS4G{01poWWB>pF delta 15 WcmbQqIG=ICbPhI#s>}l2qGA9hNCedY From 6e652446dda430e5fa1988d3e057249adbedb713 Mon Sep 17 00:00:00 2001 From: Marli Frost Date: Tue, 23 Jun 2020 15:48:50 +0100 Subject: [PATCH 4/6] feat: define the crate's MSRV --- .github/workflows/ci.yaml | 2 +- README.md | 11 +++++++++++ src/types.rs | 1 - 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3e25bed6..1e7b3953 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,7 +16,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, macOS-latest, windows-latest] - rust: [stable] + rust: [stable, 1.34.0] steps: - uses: actions/checkout@master diff --git a/README.md b/README.md index 8f4d219f..9a062c57 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,17 @@ The features available are: All of these are enabled by default. +MSRV +---- + +Our current Minimum Supported Rust Version is **1.34.0**. When adding features, +we will follow these guidelines: + +- We will always support the latest four minor Rust versions. This gives you a 6 + month window to upgrade your compiler. +- Any change to the MSRV will be accompanied with a **minor** version bump + - While the crate is pre-1.0, this will be a change to the PATCH version. + Examples -------- diff --git a/src/types.rs b/src/types.rs index e23fab9b..a855c923 100644 --- a/src/types.rs +++ b/src/types.rs @@ -1,6 +1,5 @@ //! Types that specify what is contained in a ZIP. -#[non_exhaustive] #[derive(Clone, Copy, Debug, PartialEq)] pub enum System { Dos = 0, From 2f0e14574e89ec4d50e2a909a2a51547f5d312db Mon Sep 17 00:00:00 2001 From: Marli Frost Date: Tue, 23 Jun 2020 16:15:21 +0100 Subject: [PATCH 5/6] refactor: make crate 1.34.0 compatible --- src/compression.rs | 6 ++++-- src/write.rs | 28 +++++++++++++++------------- tests/end_to_end.rs | 2 +- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/compression.rs b/src/compression.rs index f34e2b3c..3c607195 100644 --- a/src/compression.rs +++ b/src/compression.rs @@ -2,6 +2,7 @@ use std::fmt; +#[allow(deprecated)] /// Compression methods for the contents of a ZIP file. #[derive(Copy, Clone, PartialEq, Debug)] pub enum CompressionMethod { @@ -28,13 +29,14 @@ impl CompressionMethod { note = "implementation details are being removed from the public API" )] pub fn from_u16(val: u16) -> CompressionMethod { + #[allow(deprecated)] match val { 0 => CompressionMethod::Stored, #[cfg(feature = "deflate")] 8 => CompressionMethod::Deflated, #[cfg(feature = "bzip2")] 12 => CompressionMethod::Bzip2, - #[allow(deprecated)] + v => CompressionMethod::Unsupported(v), } } @@ -45,13 +47,13 @@ impl CompressionMethod { note = "implementation details are being removed from the public API" )] pub fn to_u16(self) -> u16 { + #[allow(deprecated)] match self { CompressionMethod::Stored => 0, #[cfg(feature = "deflate")] CompressionMethod::Deflated => 8, #[cfg(feature = "bzip2")] CompressionMethod::Bzip2 => 12, - #[allow(deprecated)] CompressionMethod::Unsupported(v) => v, } } diff --git a/src/write.rs b/src/write.rs index f1d762dd..5468a286 100644 --- a/src/write.rs +++ b/src/write.rs @@ -397,20 +397,22 @@ impl GenericZipWriter { } }; - *self = match compression { - CompressionMethod::Stored => GenericZipWriter::Storer(bare), - #[cfg(feature = "deflate")] - CompressionMethod::Deflated => GenericZipWriter::Deflater(DeflateEncoder::new( - bare, - flate2::Compression::default(), - )), - #[cfg(feature = "bzip2")] - CompressionMethod::Bzip2 => { - GenericZipWriter::Bzip2(BzEncoder::new(bare, bzip2::Compression::Default)) - } + *self = { #[allow(deprecated)] - CompressionMethod::Unsupported(..) => { - return Err(ZipError::UnsupportedArchive("Unsupported compression")) + match compression { + CompressionMethod::Stored => GenericZipWriter::Storer(bare), + #[cfg(feature = "deflate")] + CompressionMethod::Deflated => GenericZipWriter::Deflater(DeflateEncoder::new( + bare, + flate2::Compression::default(), + )), + #[cfg(feature = "bzip2")] + CompressionMethod::Bzip2 => { + GenericZipWriter::Bzip2(BzEncoder::new(bare, bzip2::Compression::Default)) + } + CompressionMethod::Unsupported(..) => { + return Err(ZipError::UnsupportedArchive("Unsupported compression")) + } } }; diff --git a/tests/end_to_end.rs b/tests/end_to_end.rs index cf5986bb..6268920a 100644 --- a/tests/end_to_end.rs +++ b/tests/end_to_end.rs @@ -39,7 +39,7 @@ fn read_zip_file(zip_file: &mut Cursor>) -> zip::result::ZipResult>(); assert_eq!(file_names, expected_file_names); From a43661c19719b08ec8a6ac7bd3520e924ca2dafa Mon Sep 17 00:00:00 2001 From: Plecra <60934058+Plecra@users.noreply.github.com> Date: Tue, 23 Jun 2020 17:41:27 +0100 Subject: [PATCH 6/6] chore: apply formatting --- src/write.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/write.rs b/src/write.rs index f5239298..6a12816f 100644 --- a/src/write.rs +++ b/src/write.rs @@ -421,11 +421,11 @@ impl GenericZipWriter { #[allow(deprecated)] match compression { CompressionMethod::Stored => GenericZipWriter::Storer(bare), - #[cfg(any( - feature = "deflate", - feature = "deflate-miniz", - feature = "deflate-zlib" - ))] + #[cfg(any( + feature = "deflate", + feature = "deflate-miniz", + feature = "deflate-zlib" + ))] CompressionMethod::Deflated => GenericZipWriter::Deflater(DeflateEncoder::new( bare, flate2::Compression::default(),