Skip to content

Commit 48f2268

Browse files
authored
Merge pull request github#13029 from hmac/ruby-autobuilder-refactor
Shared: Share autobuilder code between Ruby and QL
2 parents c91d1cf + 9203efb commit 48f2268

File tree

4 files changed

+112
-71
lines changed

4 files changed

+112
-71
lines changed

ql/extractor/src/autobuilder.rs

Lines changed: 10 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,21 @@
1-
use clap::Args;
21
use std::env;
32
use std::path::PathBuf;
4-
use std::process::Command;
3+
4+
use clap::Args;
5+
6+
use codeql_extractor::autobuilder;
57

68
#[derive(Args)]
79
// The autobuilder takes no command-line options, but this may change in the future.
810
pub struct Options {}
911

1012
pub fn run(_: Options) -> std::io::Result<()> {
11-
let dist = env::var("CODEQL_DIST").expect("CODEQL_DIST not set");
12-
let db = env::var("CODEQL_EXTRACTOR_QL_WIP_DATABASE")
13+
let database = env::var("CODEQL_EXTRACTOR_QL_WIP_DATABASE")
1314
.expect("CODEQL_EXTRACTOR_QL_WIP_DATABASE not set");
14-
let codeql = if env::consts::OS == "windows" {
15-
"codeql.exe"
16-
} else {
17-
"codeql"
18-
};
19-
let codeql: PathBuf = [&dist, codeql].iter().collect();
20-
let mut cmd = Command::new(codeql);
21-
cmd.arg("database")
22-
.arg("index-files")
23-
.arg("--include-extension=.ql")
24-
.arg("--include-extension=.qll")
25-
.arg("--include-extension=.dbscheme")
26-
.arg("--include-extension=.json")
27-
.arg("--include-extension=.jsonc")
28-
.arg("--include-extension=.jsonl")
29-
.arg("--include=**/qlpack.yml")
30-
.arg("--include=deprecated.blame")
31-
.arg("--size-limit=10m")
32-
.arg("--language=ql")
33-
.arg("--working-dir=.")
34-
.arg(db);
3515

36-
for line in env::var("LGTM_INDEX_FILTERS")
37-
.unwrap_or_default()
38-
.split('\n')
39-
{
40-
if let Some(stripped) = line.strip_prefix("include:") {
41-
cmd.arg("--also-match=".to_owned() + stripped);
42-
} else if let Some(stripped) = line.strip_prefix("exclude:") {
43-
cmd.arg("--exclude=".to_owned() + stripped);
44-
}
45-
}
46-
let exit = &cmd.spawn()?.wait()?;
47-
std::process::exit(exit.code().unwrap_or(1))
16+
autobuilder::Autobuilder::new("ql", PathBuf::from(database))
17+
.include_extensions(&[".ql", ".qll", ".dbscheme", ".json", ".jsonc", ".jsonl"])
18+
.include_globs(&["**/qlpack.yml", "deprecated.blame"])
19+
.size_limit("10m")
20+
.run()
4821
}

ruby/extractor/src/autobuilder.rs

Lines changed: 11 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,22 @@
1-
use clap::Args;
21
use std::env;
32
use std::path::PathBuf;
4-
use std::process::Command;
3+
4+
use clap::Args;
5+
6+
use codeql_extractor::autobuilder;
57

68
#[derive(Args)]
79
// The autobuilder takes no command-line options, but this may change in the future.
810
pub struct Options {}
911

1012
pub fn run(_: Options) -> std::io::Result<()> {
11-
let dist = env::var("CODEQL_DIST").expect("CODEQL_DIST not set");
12-
let db = env::var("CODEQL_EXTRACTOR_RUBY_WIP_DATABASE")
13+
let database = env::var("CODEQL_EXTRACTOR_RUBY_WIP_DATABASE")
1314
.expect("CODEQL_EXTRACTOR_RUBY_WIP_DATABASE not set");
14-
let codeql = if env::consts::OS == "windows" {
15-
"codeql.exe"
16-
} else {
17-
"codeql"
18-
};
19-
let codeql: PathBuf = [&dist, codeql].iter().collect();
20-
let mut cmd = Command::new(codeql);
21-
cmd.arg("database")
22-
.arg("index-files")
23-
.arg("--include-extension=.rb")
24-
.arg("--include-extension=.erb")
25-
.arg("--include-extension=.gemspec")
26-
.arg("--include=**/Gemfile")
27-
.arg("--exclude=**/.git")
28-
.arg("--size-limit=5m")
29-
.arg("--language=ruby")
30-
.arg("--working-dir=.")
31-
.arg(db);
3215

33-
for line in env::var("LGTM_INDEX_FILTERS")
34-
.unwrap_or_default()
35-
.split('\n')
36-
{
37-
if let Some(stripped) = line.strip_prefix("include:") {
38-
cmd.arg("--also-match=".to_owned() + stripped);
39-
} else if let Some(stripped) = line.strip_prefix("exclude:") {
40-
cmd.arg("--exclude=".to_owned() + stripped);
41-
}
42-
}
43-
let exit = &cmd.spawn()?.wait()?;
44-
std::process::exit(exit.code().unwrap_or(1))
16+
autobuilder::Autobuilder::new("ruby", PathBuf::from(database))
17+
.include_extensions(&[".rb", ".erb", ".gemspec"])
18+
.include_globs(&["**/Gemfile"])
19+
.exclude_globs(&["**/.git"])
20+
.size_limit("5m")
21+
.run()
4522
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
use std::env;
2+
use std::path::PathBuf;
3+
use std::process::Command;
4+
5+
pub struct Autobuilder {
6+
include_extensions: Vec<String>,
7+
include_globs: Vec<String>,
8+
exclude_globs: Vec<String>,
9+
language: String,
10+
database: PathBuf,
11+
size_limit: Option<String>,
12+
}
13+
14+
impl Autobuilder {
15+
pub fn new(language: &str, database: PathBuf) -> Self {
16+
Self {
17+
language: language.to_string(),
18+
database: database,
19+
include_extensions: vec![],
20+
include_globs: vec![],
21+
exclude_globs: vec![],
22+
size_limit: None,
23+
}
24+
}
25+
26+
pub fn include_extensions(&mut self, exts: &[&str]) -> &mut Self {
27+
self.include_extensions = exts.into_iter().map(|s| String::from(*s)).collect();
28+
self
29+
}
30+
31+
pub fn include_globs(&mut self, globs: &[&str]) -> &mut Self {
32+
self.include_globs = globs.into_iter().map(|s| String::from(*s)).collect();
33+
self
34+
}
35+
36+
pub fn exclude_globs(&mut self, globs: &[&str]) -> &mut Self {
37+
self.exclude_globs = globs.into_iter().map(|s| String::from(*s)).collect();
38+
self
39+
}
40+
41+
pub fn size_limit(&mut self, limit: &str) -> &mut Self {
42+
self.size_limit = Some(limit.to_string());
43+
self
44+
}
45+
46+
pub fn run(&self) -> std::io::Result<()> {
47+
let dist = env::var("CODEQL_DIST").expect("CODEQL_DIST not set");
48+
let codeql = if env::consts::OS == "windows" {
49+
"codeql.exe"
50+
} else {
51+
"codeql"
52+
};
53+
let codeql: PathBuf = [&dist, codeql].iter().collect();
54+
let mut cmd = Command::new(codeql);
55+
cmd.arg("database").arg("index-files");
56+
57+
for ext in &self.include_extensions {
58+
cmd.arg(format!("--include-extension={}", ext));
59+
}
60+
61+
for glob in &self.include_globs {
62+
cmd.arg(format!("--include={}", glob));
63+
}
64+
65+
for glob in &self.exclude_globs {
66+
cmd.arg(format!("--exclude={}", glob));
67+
}
68+
69+
if let Some(limit) = &self.size_limit {
70+
cmd.arg(format!("--size-limit={}", limit));
71+
}
72+
73+
cmd.arg(format!("--language={}", &self.language));
74+
cmd.arg("--working-dir=.");
75+
cmd.arg(&self.database);
76+
77+
for line in env::var("LGTM_INDEX_FILTERS")
78+
.unwrap_or_default()
79+
.split('\n')
80+
{
81+
if let Some(stripped) = line.strip_prefix("include:") {
82+
cmd.arg("--also-match=".to_owned() + stripped);
83+
} else if let Some(stripped) = line.strip_prefix("exclude:") {
84+
cmd.arg("--exclude=".to_owned() + stripped);
85+
}
86+
}
87+
let exit = &cmd.spawn()?.wait()?;
88+
std::process::exit(exit.code().unwrap_or(1))
89+
}
90+
}

shared/tree-sitter-extractor/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
pub mod autobuilder;
12
pub mod diagnostics;
23
pub mod extractor;
34
pub mod file_paths;

0 commit comments

Comments
 (0)