mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-02 06:42:02 +00:00
Output GitLab paths relative to CI_PROJECT_DIR
(#3475)
This commit is contained in:
parent
297749a3a8
commit
7a80bcec58
4 changed files with 27 additions and 5 deletions
7
Cargo.lock
generated
7
Cargo.lock
generated
|
@ -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",
|
||||||
|
|
|
@ -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 }
|
||||||
|
|
|
@ -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()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue