Skip to content

Commit d7e9178

Browse files
authored
Merge pull request #24 from github/gzip
Add buffered writing and gzip compression for trap files
2 parents 0156de1 + 27c3c88 commit d7e9178

File tree

3 files changed

+100
-8
lines changed

3 files changed

+100
-8
lines changed

Cargo.lock

Lines changed: 47 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

extractor/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ edition = "2018"
77
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
88

99
[dependencies]
10+
flate2 = "1.0"
1011
node-types = { path = "../node-types" }
1112
tree-sitter = "0.17.0"
1213
tree-sitter-ruby = "0.16"

extractor/src/main.rs

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,47 @@
11
mod extractor;
22

33
use clap;
4+
use flate2::write::GzEncoder;
45
use std::fs;
5-
use std::io::BufRead;
6+
use std::io::{BufRead, BufWriter, Write};
67
use std::path::{Path, PathBuf};
78

9+
enum TrapCompression {
10+
None,
11+
Gzip,
12+
}
13+
14+
impl TrapCompression {
15+
fn from_env() -> TrapCompression {
16+
match std::env::var("CODEQL_RUBY_TRAP_COMPRESSION") {
17+
Ok(method) => match TrapCompression::from_string(&method) {
18+
Some(c) => c,
19+
None => {
20+
tracing::error!("Unknown compression method '{}'; using gzip.", &method);
21+
TrapCompression::Gzip
22+
}
23+
},
24+
// Default compression method if the env var isn't set:
25+
Err(_) => TrapCompression::Gzip,
26+
}
27+
}
28+
29+
fn from_string(s: &str) -> Option<TrapCompression> {
30+
match s.to_lowercase().as_ref() {
31+
"none" => Some(TrapCompression::None),
32+
"gzip" => Some(TrapCompression::Gzip),
33+
_ => None,
34+
}
35+
}
36+
37+
fn extension(&self) -> &str {
38+
match self {
39+
TrapCompression::None => ".trap",
40+
TrapCompression::Gzip => ".trap.gz",
41+
}
42+
}
43+
}
44+
845
fn main() -> std::io::Result<()> {
946
tracing_subscriber::fmt()
1047
.with_target(false)
@@ -32,6 +69,7 @@ fn main() -> std::io::Result<()> {
3269
.value_of("output-dir")
3370
.expect("missing --output-dir");
3471
let trap_dir = PathBuf::from(trap_dir);
72+
let trap_compression = TrapCompression::from_env();
3573

3674
let file_list = matches.value_of("file-list").expect("missing --file-list");
3775
let file_list = fs::File::open(file_list)?;
@@ -41,18 +79,27 @@ fn main() -> std::io::Result<()> {
4179
let mut extractor = extractor::create(language, schema);
4280
for line in std::io::BufReader::new(file_list).lines() {
4381
let path = PathBuf::from(line?).canonicalize()?;
44-
let trap_file = path_for(&trap_dir, &path, ".trap");
82+
let trap_file = path_for(&trap_dir, &path, trap_compression.extension());
4583
let src_archive_file = path_for(&src_archive_dir, &path, "");
4684
let trap = extractor.extract(&path)?;
4785
std::fs::create_dir_all(&src_archive_file.parent().unwrap())?;
4886
std::fs::copy(&path, &src_archive_file)?;
4987
std::fs::create_dir_all(&trap_file.parent().unwrap())?;
50-
let mut trap_file = std::fs::File::create(&trap_file)?;
51-
let trap_file: &mut dyn std::io::Write = &mut trap_file;
52-
write!(trap_file, "{}", trap)?;
88+
let trap_file = std::fs::File::create(&trap_file)?;
89+
let mut trap_file = BufWriter::new(trap_file);
90+
match trap_compression {
91+
TrapCompression::None => {
92+
write!(trap_file, "{}", trap)?;
93+
}
94+
TrapCompression::Gzip => {
95+
let mut compressed_writer = GzEncoder::new(trap_file, flate2::Compression::fast());
96+
write!(compressed_writer, "{}", trap)?;
97+
}
98+
}
5399
}
54100
return Ok(());
55101
}
102+
56103
fn path_for(dir: &Path, path: &Path, ext: &str) -> PathBuf {
57104
let mut result = PathBuf::from(dir);
58105
for component in path.components() {

0 commit comments

Comments
 (0)