ripgrep-all/src/adapters/tar.rs

76 lines
2.1 KiB
Rust
Raw Normal View History

2019-06-06 15:59:15 +00:00
use super::*;
use crate::preproc::rga_preproc;
use ::tar::EntryType::Regular;
use failure::*;
use lazy_static::lazy_static;
2019-06-18 10:14:09 +00:00
use log::*;
2019-06-06 15:59:15 +00:00
use std::path::PathBuf;
2019-06-16 09:07:29 +00:00
static EXTENSIONS: &[&str] = &["tar"];
2019-06-06 15:59:15 +00:00
lazy_static! {
static ref METADATA: AdapterMeta = AdapterMeta {
name: "tar".to_owned(),
version: 1,
2019-06-07 22:04:48 +00:00
description: "Reads a tar file as a stream and recurses down into its contents".to_owned(),
2019-06-16 10:19:01 +00:00
recurses: true,
2019-06-11 11:34:04 +00:00
fast_matchers: EXTENSIONS
2019-06-06 15:59:15 +00:00
.iter()
2019-06-11 11:34:04 +00:00
.map(|s| FastMatcher::FileExtension(s.to_string()))
2019-06-06 15:59:15 +00:00
.collect(),
2019-06-11 11:34:04 +00:00
slow_matchers: None
2019-06-06 15:59:15 +00:00
};
}
2019-06-06 21:43:30 +00:00
#[derive(Default)]
2019-06-06 15:59:15 +00:00
pub struct TarAdapter;
impl TarAdapter {
pub fn new() -> TarAdapter {
TarAdapter
}
}
impl GetMetadata for TarAdapter {
2019-06-06 21:43:30 +00:00
fn metadata(&self) -> &AdapterMeta {
2019-06-06 15:59:15 +00:00
&METADATA
}
}
2019-06-06 21:19:59 +00:00
2019-06-06 15:59:15 +00:00
impl FileAdapter for TarAdapter {
2019-06-16 10:19:01 +00:00
fn adapt(&self, ai: AdaptInfo, _detection_reason: &SlowMatcher) -> Fallible<()> {
2019-06-06 15:59:15 +00:00
let AdaptInfo {
filepath_hint,
mut inp,
oup,
line_prefix,
2019-06-07 13:43:19 +00:00
archive_recursion_depth,
2019-06-07 17:00:24 +00:00
config,
2019-06-06 15:59:15 +00:00
..
} = ai;
2019-06-16 09:07:29 +00:00
let mut archive = ::tar::Archive::new(&mut inp);
2019-06-06 15:59:15 +00:00
for entry in archive.entries()? {
2019-06-16 20:48:28 +00:00
let mut file = entry?;
2019-06-06 15:59:15 +00:00
if Regular == file.header().entry_type() {
2019-06-11 18:35:20 +00:00
let path = PathBuf::from(file.path()?.to_owned());
2019-06-18 10:14:09 +00:00
debug!(
2019-06-11 18:35:20 +00:00
"{}|{}: {} bytes",
filepath_hint.display(),
path.display(),
file.header().size()?,
);
2019-06-06 15:59:15 +00:00
let line_prefix = &format!("{}{}: ", line_prefix, path.display());
2019-06-06 21:19:59 +00:00
let ai2: AdaptInfo = AdaptInfo {
filepath_hint: &path,
2019-06-06 21:43:30 +00:00
is_real_file: false,
2019-06-07 13:43:19 +00:00
archive_recursion_depth: archive_recursion_depth + 1,
2019-06-06 21:19:59 +00:00
inp: &mut file,
2019-06-06 21:43:30 +00:00
oup,
2019-06-06 21:19:59 +00:00
line_prefix,
2019-06-07 18:12:24 +00:00
config: config.clone(),
2019-06-06 21:19:59 +00:00
};
2019-06-07 17:00:24 +00:00
rga_preproc(ai2)?;
2019-06-06 15:59:15 +00:00
}
}
Ok(())
}
}