1
1
mod extractor;
2
2
3
3
use clap;
4
+ use flate2:: write:: GzEncoder ;
4
5
use std:: fs;
5
- use std:: io:: BufRead ;
6
+ use std:: io:: { BufRead , BufWriter , Write } ;
6
7
use std:: path:: { Path , PathBuf } ;
7
8
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
+
8
45
fn main ( ) -> std:: io:: Result < ( ) > {
9
46
tracing_subscriber:: fmt ( )
10
47
. with_target ( false )
@@ -32,6 +69,7 @@ fn main() -> std::io::Result<()> {
32
69
. value_of ( "output-dir" )
33
70
. expect ( "missing --output-dir" ) ;
34
71
let trap_dir = PathBuf :: from ( trap_dir) ;
72
+ let trap_compression = TrapCompression :: from_env ( ) ;
35
73
36
74
let file_list = matches. value_of ( "file-list" ) . expect ( "missing --file-list" ) ;
37
75
let file_list = fs:: File :: open ( file_list) ?;
@@ -41,18 +79,27 @@ fn main() -> std::io::Result<()> {
41
79
let mut extractor = extractor:: create ( language, schema) ;
42
80
for line in std:: io:: BufReader :: new ( file_list) . lines ( ) {
43
81
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 ( ) ) ;
45
83
let src_archive_file = path_for ( & src_archive_dir, & path, "" ) ;
46
84
let trap = extractor. extract ( & path) ?;
47
85
std:: fs:: create_dir_all ( & src_archive_file. parent ( ) . unwrap ( ) ) ?;
48
86
std:: fs:: copy ( & path, & src_archive_file) ?;
49
87
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
+ }
53
99
}
54
100
return Ok ( ( ) ) ;
55
101
}
102
+
56
103
fn path_for ( dir : & Path , path : & Path , ext : & str ) -> PathBuf {
57
104
let mut result = PathBuf :: from ( dir) ;
58
105
for component in path. components ( ) {
0 commit comments