Output GitLab paths relative to CI_PROJECT_DIR (#3475)

This commit is contained in:
Charlie Marsh 2023-03-12 23:03:37 -04:00 committed by GitHub
parent 297749a3a8
commit 7a80bcec58
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 27 additions and 5 deletions

7
Cargo.lock generated
View file

@ -1503,6 +1503,12 @@ dependencies = [
"once_cell", "once_cell",
] ]
[[package]]
name = "pathdiff"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd"
[[package]] [[package]]
name = "peg" name = "peg"
version = "0.8.1" version = "0.8.1"
@ -1979,6 +1985,7 @@ dependencies = [
"num-traits", "num-traits",
"once_cell", "once_cell",
"path-absolutize", "path-absolutize",
"pathdiff",
"regex", "regex",
"result-like", "result-like",
"ruff_cache", "ruff_cache",

View file

@ -46,6 +46,7 @@ path-absolutize = { workspace = true, features = [
"once_cell_cache", "once_cell_cache",
"use_unix_paths_on_wasm", "use_unix_paths_on_wasm",
] } ] }
pathdiff = { version = "0.2.1" }
regex = { workspace = true } regex = { workspace = true }
result-like = { version = "0.4.6" } result-like = { version = "0.4.6" }
rustc-hash = { workspace = true } rustc-hash = { workspace = true }

View file

@ -74,10 +74,20 @@ pub fn normalize_path_to<P: AsRef<Path>, R: AsRef<Path>>(path: P, project_root:
} }
/// Convert an absolute path to be relative to the current working directory. /// Convert an absolute path to be relative to the current working directory.
pub fn relativize_path(path: impl AsRef<Path>) -> String { pub fn relativize_path<P: AsRef<Path>>(path: P) -> String {
let path = path.as_ref(); let path = path.as_ref();
if let Ok(path) = path.strip_prefix(&*path_dedot::CWD) { if let Ok(path) = path.strip_prefix(&*path_dedot::CWD) {
return format!("{}", path.display()); return format!("{}", path.display());
} }
format!("{}", path.display()) format!("{}", path.display())
} }
/// Convert an absolute path to be relative to the specified project root.
pub fn relativize_path_to<P: AsRef<Path>, R: AsRef<Path>>(path: P, project_root: R) -> String {
format!(
"{}",
pathdiff::diff_paths(&path, project_root)
.expect("Could not diff paths")
.display()
)
}

View file

@ -3,9 +3,9 @@ use std::collections::hash_map::DefaultHasher;
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::fmt::Display; use std::fmt::Display;
use std::hash::{Hash, Hasher}; use std::hash::{Hash, Hasher};
use std::io;
use std::io::{BufWriter, Write}; use std::io::{BufWriter, Write};
use std::path::Path; use std::path::Path;
use std::{env, io};
use annotate_snippets::display_list::{DisplayList, FormatOptions}; use annotate_snippets::display_list::{DisplayList, FormatOptions};
use annotate_snippets::snippet::{Annotation, AnnotationType, Slice, Snippet, SourceAnnotation}; use annotate_snippets::snippet::{Annotation, AnnotationType, Slice, Snippet, SourceAnnotation};
@ -18,7 +18,7 @@ use rustc_hash::FxHashMap;
use serde::Serialize; use serde::Serialize;
use serde_json::json; use serde_json::json;
use ruff::fs::relativize_path; use ruff::fs::{relativize_path, relativize_path_to};
use ruff::linter::FixTable; use ruff::linter::FixTable;
use ruff::logging::LogLevel; use ruff::logging::LogLevel;
use ruff::message::{Location, Message}; use ruff::message::{Location, Message};
@ -341,7 +341,8 @@ impl Printer {
} }
SerializationFormat::Gitlab => { SerializationFormat::Gitlab => {
// Generate JSON with violations in GitLab CI format // Generate JSON with violations in GitLab CI format
// https://docs.gitlab.com/ee/ci/testing/code_quality.html#implementing-a-custom-tool // https://docs.gitlab.com/ee/ci/testing/code_quality.html#implement-a-custom-tool
let project_dir = env::var("CI_PROJECT_DIR").ok();
writeln!(stdout, writeln!(stdout,
"{}", "{}",
serde_json::to_string_pretty( serde_json::to_string_pretty(
@ -354,7 +355,10 @@ impl Printer {
"severity": "major", "severity": "major",
"fingerprint": fingerprint(message), "fingerprint": fingerprint(message),
"location": { "location": {
"path": message.filename, "path": project_dir.as_ref().map_or_else(
|| relativize_path(Path::new(&message.filename)),
|project_dir| relativize_path_to(&message.filename, project_dir),
),
"lines": { "lines": {
"begin": message.location.row(), "begin": message.location.row(),
"end": message.end_location.row() "end": message.end_location.row()