Skip to content

Commit 5ad7f5a

Browse files
committed
use llvm-cov to get code coverage
1 parent d6acc41 commit 5ad7f5a

File tree

7 files changed

+106
-80
lines changed

7 files changed

+106
-80
lines changed

.github/workflows/ci.yml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,24 @@ jobs:
1313
- uses: actions/checkout@v4
1414

1515
- name: rust toolchain
16-
uses: dtolnay/rust-toolchain@stable
16+
uses: dtolnay/rust-toolchain@nightly
17+
with:
18+
components: rustfmt, clippy
1719

1820
- uses: Swatinem/rust-cache@v2
1921

2022
- name: Run Clippy and Format
2123
run: |
2224
cargo fmt --all --check
23-
cargo clippy --release
25+
cargo clippy --workspace --all-targets --all-features
2426
25-
- name: Install Cargo Tarpaulin
27+
- name: Install Cargo LLVM Cov
2628
uses: taiki-e/install-action@v2
2729
with:
28-
tool: cargo-tarpaulin
30+
tool: cargo-llvm-cov
2931

3032
- name: Test with Coverage
31-
run: cargo tarpaulin --workspace --timeout 120 --out xml
33+
run: cargo +nightly llvm-cov --cobertura --output-path cobertura.xml
3234

3335
- name: Upload coverage reports to Codecov
3436
uses: codecov/codecov-action@v4

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,4 @@ panic = "abort"
4040
[lints.rust]
4141
unsafe_code = "forbid"
4242
warnings = "deny"
43+
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(coverage_nightly)'] }

src/diffline.rs

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,25 @@ pub fn init(diff: DiffChoice) {
3838
DIFF_CHOICE.set(diff).unwrap();
3939
}
4040

41-
#[cfg(not(tarpaulin_include))]
41+
#[cfg_attr(coverage_nightly, coverage(off))]
4242
pub fn show(old: &str, new: &str) {
43-
show_difflines(old, new, *DIFF_CHOICE.get().unwrap(), |res| match res {
44-
diff::Result::Left(l) => {
45-
diff!(del "{}", l);
46-
}
47-
diff::Result::Both(l, _) => {
48-
diff!("{}", l);
49-
}
50-
diff::Result::Right(r) => {
51-
diff!(add "{}", r);
52-
}
53-
})
43+
show_difflines(
44+
old,
45+
new,
46+
*DIFF_CHOICE.get().unwrap(),
47+
#[cfg_attr(coverage_nightly, coverage(off))]
48+
|res| match res {
49+
diff::Result::Left(l) => {
50+
diff!(del "{}", l);
51+
}
52+
diff::Result::Both(l, _) => {
53+
diff!("{}", l);
54+
}
55+
diff::Result::Right(r) => {
56+
diff!(add "{}", r);
57+
}
58+
},
59+
)
5460
}
5561

5662
fn show_difflines(old: &str, new: &str, diff: DiffChoice, out: impl Fn(diff::Result<&str>)) {
@@ -104,12 +110,10 @@ mod test {
104110
fn show() {
105111
let old = "line1\nline2\nline3";
106112
let new = "line1\nline2\nline4";
107-
super::show_difflines(old, new, DiffChoice::None, |_| {
108-
panic!("should not be called")
109-
});
113+
super::show_difflines(old, new, DiffChoice::None, |_| unreachable!());
110114
super::show_difflines(old, new, DiffChoice::Short, |res| match res {
111115
diff::Result::Left(l) => assert_eq!(l, "line3"),
112-
diff::Result::Both(_, _) => panic!("should not be called"),
116+
diff::Result::Both(_, _) => unreachable!(),
113117
diff::Result::Right(r) => assert_eq!(r, "line4"),
114118
});
115119
super::show_difflines(old, new, DiffChoice::Full, |res| match res {

src/main.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
2+
13
use std::{
24
fs,
35
path::{Path, PathBuf},
@@ -36,13 +38,16 @@ struct Cli {
3638
entries: Vec<PathBuf>,
3739
}
3840

39-
#[cfg(not(tarpaulin_include))]
41+
#[cfg_attr(coverage_nightly, coverage(off))]
4042
fn main() {
41-
std::panic::set_hook(Box::new(|info| {
42-
if let Some(info) = info.payload().downcast_ref::<&str>() {
43-
error!("Fatal": "{}", info);
44-
}
45-
}));
43+
std::panic::set_hook(Box::new(
44+
#[cfg_attr(coverage_nightly, coverage(off))]
45+
|info| {
46+
if let Some(info) = info.payload().downcast_ref::<&str>() {
47+
error!("Fatal": "{}", info);
48+
}
49+
},
50+
));
4651

4752
let args = Cli::parse();
4853

src/term.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub fn color_choice() -> ColorChoice {
2020
*COLOR_CHOICE.get().unwrap_or(&ColorChoice::Auto)
2121
}
2222

23-
#[cfg(not(tarpaulin_include))]
23+
#[cfg_attr(coverage_nightly, coverage(off))]
2424
pub fn term_println(
2525
mut stream: StandardStream,
2626
color: Option<Color>,

src/typstdep.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,14 @@ mod test {
8282
assert_eq!(dep.namespace(), "preview");
8383
assert_eq!(dep.name(), "package");
8484
assert_eq!(dep.version().to_string(), "1.2.3");
85+
86+
let mut package = String::from("@preview/package:1.2.");
87+
for _ in 0..100 {
88+
package.push('0');
89+
}
90+
91+
let dep = TypstDep::from_str(&package);
92+
assert!(dep.is_err());
8593
}
8694

8795
#[test]

src/upgrade.rs

Lines changed: 58 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub struct TypstNodeUpgrader<'a> {
1717
}
1818

1919
impl<'a> TypstNodeUpgrader<'a> {
20-
#[cfg(not(tarpaulin_include))]
20+
#[cfg_attr(coverage_nightly, coverage(off))]
2121
pub fn new(root: &'a SyntaxNode, verbose: bool, compatible: bool) -> Self {
2222
Self::new_with_upgrader_builder(root, verbose, compatible, TypstDepUpgrader::build)
2323
}
@@ -101,57 +101,67 @@ struct TypstDepUpgrader {
101101
}
102102

103103
impl TypstDepUpgrader {
104-
#[cfg(not(tarpaulin_include))]
104+
#[cfg_attr(coverage_nightly, coverage(off))]
105105
fn build(dep: &TypstDep) -> Self {
106-
static TYPST_PACKAGE_META: Lazy<HashMap<String, Vec<Version>>> = Lazy::new(|| {
107-
let mut retry_count = 5;
108-
let resp = loop {
109-
match reqwest::blocking::get("https://packages.typst.org/preview/index.json") {
110-
Ok(resp) => break resp,
111-
Err(_) if retry_count > 0 => {
112-
retry_count -= 1;
113-
warn!(
114-
"Failed to fetch package metadata, retrying... ({} attempts left)",
115-
retry_count,
116-
);
106+
static TYPST_PACKAGE_META: Lazy<HashMap<String, Vec<Version>>> = Lazy::new(
107+
#[cfg_attr(coverage_nightly, coverage(off))]
108+
|| {
109+
let mut retry_count = 5;
110+
let resp = loop {
111+
match reqwest::blocking::get("https://packages.typst.org/preview/index.json") {
112+
Ok(resp) => break resp,
113+
Err(_) if retry_count > 0 => {
114+
retry_count -= 1;
115+
warn!(
116+
"Failed to fetch package metadata, retrying... ({} attempts left)",
117+
retry_count,
118+
);
119+
}
120+
Err(_) => panic!("Failed to fetch package metadata"),
117121
}
118-
Err(_) => panic!("Failed to fetch package metadata"),
119-
}
120-
};
121-
let raw_meta = resp
122-
.json::<serde_json::Value>()
123-
.expect("Failed to parse package metadata")
124-
.as_array()
125-
.expect("Invalid package metadata")
126-
.iter()
127-
.map(|v| {
128-
let package = v.as_object().expect("Invalid package metadata");
129-
let name = package
130-
.get("name")
131-
.expect("Package name not found")
132-
.as_str()
133-
.unwrap();
134-
let version = Version::parse(
135-
package
136-
.get("version")
137-
.expect("Package version not found")
138-
.as_str()
139-
.unwrap(),
122+
};
123+
let raw_meta = resp
124+
.json::<serde_json::Value>()
125+
.expect("Failed to parse package metadata")
126+
.as_array()
127+
.expect("Invalid package metadata")
128+
.iter()
129+
.map(
130+
#[cfg_attr(coverage_nightly, coverage(off))]
131+
|v| {
132+
let package = v.as_object().expect("Invalid package metadata");
133+
let name = package
134+
.get("name")
135+
.expect("Package name not found")
136+
.as_str()
137+
.unwrap();
138+
let version = Version::parse(
139+
package
140+
.get("version")
141+
.expect("Package version not found")
142+
.as_str()
143+
.unwrap(),
144+
)
145+
.unwrap();
146+
(name.to_string(), version)
147+
},
140148
)
141-
.unwrap();
142-
(name.to_string(), version)
143-
})
144-
.collect::<Vec<_>>();
145-
146-
let mut result = HashMap::new();
147-
for (name, version) in raw_meta {
148-
result.entry(name).or_insert_with(Vec::new).push(version);
149-
}
149+
.collect::<Vec<_>>();
150150

151-
result
152-
});
151+
let mut result = HashMap::new();
152+
for (name, version) in raw_meta {
153+
result.entry(name).or_insert_with(Vec::new).push(version);
154+
}
155+
156+
result
157+
},
158+
);
153159

154-
Self::build_with_query(dep, |name| TYPST_PACKAGE_META.get(name).cloned())
160+
Self::build_with_query(
161+
dep,
162+
#[cfg_attr(coverage_nightly, coverage(off))]
163+
|name| TYPST_PACKAGE_META.get(name).cloned(),
164+
)
155165
}
156166

157167
fn build_with_query<Q, R>(dep: &TypstDep, query: Q) -> Self
@@ -301,11 +311,7 @@ mod test {
301311
$ext,
302312
)).unwrap();
303313

304-
let old_tree = if matches!($ext, "typ" | "typst") {
305-
typst_syntax::parse(&entry)
306-
} else {
307-
typst_syntax::parse_code(&entry)
308-
};
314+
let old_tree = typst_syntax::parse(&entry);
309315
let new_compat = TypstNodeUpgrader::new_with_upgrader_builder(
310316
&old_tree,
311317
true,

0 commit comments

Comments
 (0)