Merge pull request #198 from sigmaSd/infer2

Remove Lzip because its incorrect, and improve extension comparison
This commit is contained in:
João Marcos Bezerra 2021-11-14 02:11:34 -03:00 committed by GitHub
commit dc78c96c3f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 10 additions and 10 deletions

View File

@ -71,7 +71,7 @@ ouch c file.txt file.zip
# Supported formats # Supported formats
| Format | `.tar` | `.zip` | `.bz`, `.bz2` | `.gz` | `.lz4` | `.xz`, `.lz`, `.lzma` | `.zst` | | Format | `.tar` | `.zip` | `.bz`, `.bz2` | `.gz` | `.lz4` | `.xz`, `.lzma` | `.zst` |
|:---------:|:------:|:------:|:-------------:|:-----:|:------:|:---------------------:|:------:| |:---------:|:------:|:------:|:-------------:|:-----:|:------:|:---------------------:|:------:|
| Supported | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | Supported | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |

View File

@ -5,7 +5,7 @@ use std::{ffi::OsStr, fmt, path::Path};
use self::CompressionFormat::*; use self::CompressionFormat::*;
/// A wrapper around `CompressionFormat` that allows combinations like `tgz` /// A wrapper around `CompressionFormat` that allows combinations like `tgz`
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, Eq)]
#[non_exhaustive] #[non_exhaustive]
pub struct Extension { pub struct Extension {
/// One extension like "tgz" can be made of multiple CompressionFormats ([Tar, Gz]) /// One extension like "tgz" can be made of multiple CompressionFormats ([Tar, Gz])
@ -13,6 +13,12 @@ pub struct Extension {
/// The input text for this extension, like "tgz", "tar" or "xz" /// The input text for this extension, like "tgz", "tar" or "xz"
pub display_text: String, pub display_text: String,
} }
// The display_text should be ignored when comparing extensions
impl PartialEq for Extension {
fn eq(&self, other: &Self) -> bool {
self.compression_formats == other.compression_formats
}
}
impl Extension { impl Extension {
/// # Panics: /// # Panics:
@ -49,7 +55,7 @@ pub enum CompressionFormat {
Bzip, Bzip,
/// .lz4 /// .lz4
Lz4, Lz4,
/// .xz .lzma .lz /// .xz .lzma
Lzma, Lzma,
/// tar, tgz, tbz, tbz2, txz, tlz, tlz4, tlzma, tzst /// tar, tgz, tbz, tbz2, txz, tlz, tlz4, tlzma, tzst
Tar, Tar,
@ -121,7 +127,7 @@ pub fn separate_known_extensions_from_name(mut path: &Path) -> (&Path, Vec<Exten
"bz" | "bz2" => &[Bzip], "bz" | "bz2" => &[Bzip],
"gz" => &[Gzip], "gz" => &[Gzip],
"lz4" => &[Lz4], "lz4" => &[Lz4],
"xz" | "lzma" | "lz" => &[Lzma], "xz" | "lzma" => &[Lzma],
"zst" => &[Zstd], "zst" => &[Zstd],
_ => break, _ => break,
}; };

View File

@ -78,9 +78,6 @@ pub fn try_infer_extension(path: &Path) -> Option<Extension> {
fn is_xz(buf: &[u8]) -> bool { fn is_xz(buf: &[u8]) -> bool {
buf.starts_with(&[0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00]) buf.starts_with(&[0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00])
} }
fn is_lz(buf: &[u8]) -> bool {
buf.starts_with(&[0x4C, 0x5A, 0x49, 0x50])
}
fn is_lz4(buf: &[u8]) -> bool { fn is_lz4(buf: &[u8]) -> bool {
buf.starts_with(&[0x04, 0x22, 0x4D, 0x18]) buf.starts_with(&[0x04, 0x22, 0x4D, 0x18])
} }
@ -112,8 +109,6 @@ pub fn try_infer_extension(path: &Path) -> Option<Extension> {
Some(Extension::new(&[Bzip], "bz2")) Some(Extension::new(&[Bzip], "bz2"))
} else if is_xz(&buf) { } else if is_xz(&buf) {
Some(Extension::new(&[Lzma], "xz")) Some(Extension::new(&[Lzma], "xz"))
} else if is_lz(&buf) {
Some(Extension::new(&[Lzma], "lz"))
} else if is_lz4(&buf) { } else if is_lz4(&buf) {
Some(Extension::new(&[Lz4], "lz4")) Some(Extension::new(&[Lz4], "lz4"))
} else if is_zst(&buf) { } else if is_zst(&buf) {

View File

@ -34,7 +34,6 @@ enum FileExtension {
Bz2, Bz2,
Gz, Gz,
Lz4, Lz4,
Lz,
Lzma, Lzma,
Xz, Xz,
} }