From c23a457e72abe608715ac76f076f47dc42af07a5 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 30 May 2024 20:31:44 +0200 Subject: Merging upstream version 1.74.1+dfsg1. Signed-off-by: Daniel Baumann --- vendor/cargo_metadata/.cargo-checksum.json | 2 +- vendor/cargo_metadata/Cargo.toml | 8 +- vendor/cargo_metadata/clippy.toml | 3 + vendor/cargo_metadata/src/lib.rs | 118 +++++++++++++++++++----- vendor/cargo_metadata/src/messages.rs | 135 +++++++++++++++++++++++++++- vendor/cargo_metadata/tests/test_samples.rs | 49 +++++++++- 6 files changed, 281 insertions(+), 34 deletions(-) create mode 100644 vendor/cargo_metadata/clippy.toml (limited to 'vendor/cargo_metadata') diff --git a/vendor/cargo_metadata/.cargo-checksum.json b/vendor/cargo_metadata/.cargo-checksum.json index f9382f9be..a2fc9f56f 100644 --- a/vendor/cargo_metadata/.cargo-checksum.json +++ b/vendor/cargo_metadata/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"2e68a86864c8d2c00e40f0f9d53a8507cc69bc124f1779e795b5334451ce75bb","Cargo.toml":"f65896251407de9805f19d3825b0ecbe407c83a650d924bacf4909ed38fe131f","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"6be7aaba23d8646b470a966eef2f00c9fa04cf4d1de25cfb71680cef562e1574","src/dependency.rs":"c593ddc73d863c5712e2aba58b5f4d9bd915a5ac0bc17df71642aa79aa93bfdc","src/diagnostic.rs":"fee47d27390f1026ff99ffade5dfd2ab3e9b9839c3f33ce91a7dcde875551374","src/errors.rs":"797afd61efdd843ae570d9e972dd2425d33823d4a78c0c488028493dffb45c7a","src/lib.rs":"d6a2fda234146c23bd9f86be9bb90ba3515b52e3ef7699faf4e12469a41e9bbe","src/messages.rs":"a8e3ee31dc8cce5762b4b085be29fe4d7189a789f3a149ef2b6c17604d94528b","tests/selftest.rs":"73afd494c1bf7dd4e1a99971e9ff66a0e21fc7bf3e327663df15d2350dcdfc70","tests/test_samples.rs":"ee2b4737adfa1930c1610bb3ec0fc94b7f1a3691bb09545da69044eef2f5ba6b"},"package":"eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a"} \ No newline at end of file +{"files":{"CHANGELOG.md":"2e68a86864c8d2c00e40f0f9d53a8507cc69bc124f1779e795b5334451ce75bb","Cargo.toml":"cc68bf23ad777a381d94a2d0a40758412d7ba5323750965427cb6b4537616fbd","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"6be7aaba23d8646b470a966eef2f00c9fa04cf4d1de25cfb71680cef562e1574","clippy.toml":"0eb773e1a242ba7e06f0ca5c23be71b5989f4952fe18cae35e5322066e706495","src/dependency.rs":"c593ddc73d863c5712e2aba58b5f4d9bd915a5ac0bc17df71642aa79aa93bfdc","src/diagnostic.rs":"fee47d27390f1026ff99ffade5dfd2ab3e9b9839c3f33ce91a7dcde875551374","src/errors.rs":"797afd61efdd843ae570d9e972dd2425d33823d4a78c0c488028493dffb45c7a","src/lib.rs":"f436be9c0ded5ce27198ba145dce70673e37d0d53728e11b12276ef0c55741ec","src/messages.rs":"b16fd1d8a1a7099d371edb5d2e1495871afb61856025b0128a9e2262517e2099","tests/selftest.rs":"73afd494c1bf7dd4e1a99971e9ff66a0e21fc7bf3e327663df15d2350dcdfc70","tests/test_samples.rs":"f5015e6635935b505ad9a09caf8b05b980ff248adaaaf7bde166f8bce2152823"},"package":"e7daec1a2a2129eeba1644b220b4647ec537b0b5d4bfd6876fcc5a540056b592"} \ No newline at end of file diff --git a/vendor/cargo_metadata/Cargo.toml b/vendor/cargo_metadata/Cargo.toml index a976b5ae0..6ae78b7b0 100644 --- a/vendor/cargo_metadata/Cargo.toml +++ b/vendor/cargo_metadata/Cargo.toml @@ -11,9 +11,9 @@ [package] edition = "2018" -rust-version = "1.42.0" +rust-version = "1.56.0" name = "cargo_metadata" -version = "0.15.4" +version = "0.17.0" authors = ["Oliver Schneider "] description = "structured access to the output of `cargo metadata`" readme = "README.md" @@ -21,8 +21,8 @@ license = "MIT" repository = "https://github.com/oli-obk/cargo_metadata" [package.metadata.cargo_metadata_test] -some_field = true other_field = "foo" +some_field = true [dependencies.camino] version = "1.0.7" @@ -32,7 +32,7 @@ features = ["serde1"] version = "0.1.2" [dependencies.derive_builder] -version = "0.11.1" +version = "0.12" optional = true [dependencies.semver] diff --git a/vendor/cargo_metadata/clippy.toml b/vendor/cargo_metadata/clippy.toml new file mode 100644 index 000000000..bfb8bfe2d --- /dev/null +++ b/vendor/cargo_metadata/clippy.toml @@ -0,0 +1,3 @@ +disallowed-types = [ + { path = "std::collections::HashMap", reason = "HashMap's key order is unspecified and thus serializing such a type will result in a random output, use BTreeMap instead." } +] \ No newline at end of file diff --git a/vendor/cargo_metadata/src/lib.rs b/vendor/cargo_metadata/src/lib.rs index 627511773..c222c130e 100644 --- a/vendor/cargo_metadata/src/lib.rs +++ b/vendor/cargo_metadata/src/lib.rs @@ -81,7 +81,7 @@ use camino::Utf8PathBuf; #[cfg(feature = "builder")] use derive_builder::Builder; -use std::collections::{BTreeMap, HashMap}; +use std::collections::BTreeMap; use std::env; use std::ffi::OsString; use std::fmt; @@ -92,7 +92,7 @@ use std::str::from_utf8; pub use camino; pub use semver; -use semver::{Version, VersionReq}; +use semver::Version; #[cfg(feature = "builder")] pub use dependency::DependencyBuilder; @@ -102,14 +102,15 @@ pub use errors::{Error, Result}; #[allow(deprecated)] pub use messages::parse_messages; pub use messages::{ - Artifact, ArtifactProfile, BuildFinished, BuildScript, CompilerMessage, Message, MessageIter, + Artifact, ArtifactDebuginfo, ArtifactProfile, BuildFinished, BuildScript, CompilerMessage, + Message, MessageIter, }; #[cfg(feature = "builder")] pub use messages::{ ArtifactBuilder, ArtifactProfileBuilder, BuildFinishedBuilder, BuildScriptBuilder, CompilerMessageBuilder, }; -use serde::{Deserialize, Serialize, Serializer}; +use serde::{Deserialize, Deserializer, Serialize}; mod dependency; pub mod diagnostic; @@ -117,6 +118,7 @@ mod errors; mod messages; /// An "opaque" identifier for a package. +/// /// It is possible to inspect the `repr` field, if the need arises, but its /// precise format is an implementation detail and is subject to change. /// @@ -128,7 +130,7 @@ pub struct PackageId { pub repr: String, } -impl std::fmt::Display for PackageId { +impl fmt::Display for PackageId { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fmt::Display::fmt(&self.repr, f) } @@ -139,18 +141,6 @@ fn is_null(value: &serde_json::Value) -> bool { matches!(value, serde_json::Value::Null) } -/// Helper to ensure that hashmaps serialize in sorted order, to make -/// serialization deterministic. -fn sorted_map( - value: &HashMap, - serializer: S, -) -> std::result::Result { - value - .iter() - .collect::>() - .serialize(serializer) -} - #[derive(Clone, Serialize, Deserialize, Debug)] #[cfg_attr(feature = "builder", derive(Builder))] #[non_exhaustive] @@ -323,8 +313,7 @@ pub struct Package { /// Targets provided by the crate (lib, bin, example, test, ...) pub targets: Vec, /// Features provided by the crate, mapped to the features required by that feature. - #[serde(serialize_with = "sorted_map")] - pub features: HashMap>, + pub features: BTreeMap>, /// Path containing the `Cargo.toml` pub manifest_path: Utf8PathBuf, /// Categories as given in the `Cargo.toml` @@ -392,7 +381,9 @@ pub struct Package { /// The minimum supported Rust version of this package. /// /// This is always `None` if running with a version of Cargo older than 1.58. - pub rust_version: Option, + #[serde(default)] + #[serde(deserialize_with = "deserialize_rust_version")] + pub rust_version: Option, } impl Package { @@ -418,6 +409,9 @@ impl Package { } /// The source of a package such as crates.io. +/// +/// It is possible to inspect the `repr` field, if the need arises, but its +/// precise format is an implementation detail and is subject to change. #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] #[serde(transparent)] pub struct Source { @@ -432,7 +426,7 @@ impl Source { } } -impl std::fmt::Display for Source { +impl fmt::Display for Source { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fmt::Display::fmt(&self.repr, f) } @@ -615,7 +609,7 @@ pub struct MetadataCommand { other_options: Vec, /// Arbitrary environment variables to set when running `cargo`. These will be merged into /// the calling environment, overriding any which clash. - env: HashMap, + env: BTreeMap, /// Show stderr verbose: bool, } @@ -754,7 +748,7 @@ impl MetadataCommand { .or_else(|| env::var("CARGO").map(PathBuf::from).ok()) .unwrap_or_else(|| PathBuf::from("cargo")); let mut cmd = Command::new(cargo); - cmd.args(&["metadata", "--format-version", "1"]); + cmd.args(["metadata", "--format-version", "1"]); if self.no_deps { cmd.arg("--no-deps"); @@ -810,3 +804,81 @@ impl MetadataCommand { Self::parse(stdout) } } + +/// As per the Cargo Book the [`rust-version` field](https://doc.rust-lang.org/cargo/reference/manifest.html#the-rust-version-field) must: +/// +/// > be a bare version number with two or three components; +/// > it cannot include semver operators or pre-release identifiers. +/// +/// [`semver::Version`] however requires three components. This function takes +/// care of appending `.0` if the provided version number only has two components +/// and ensuring that it does not contain a pre-release version or build metadata. +fn deserialize_rust_version<'de, D>( + deserializer: D, +) -> std::result::Result, D::Error> +where + D: Deserializer<'de>, +{ + let mut buf = match Option::::deserialize(deserializer)? { + None => return Ok(None), + Some(buf) => buf, + }; + + for char in buf.chars() { + if char == '-' { + return Err(serde::de::Error::custom( + "pre-release identifiers are not supported in rust-version", + )); + } else if char == '+' { + return Err(serde::de::Error::custom( + "build metadata is not supported in rust-version", + )); + } + } + + if buf.matches('.').count() == 1 { + // e.g. 1.0 -> 1.0.0 + buf.push_str(".0"); + } + + Ok(Some( + Version::parse(&buf).map_err(serde::de::Error::custom)?, + )) +} + +#[cfg(test)] +mod test { + use semver::Version; + + #[derive(Debug, serde::Deserialize)] + struct BareVersion( + #[serde(deserialize_with = "super::deserialize_rust_version")] Option, + ); + + fn bare_version(str: &str) -> Version { + serde_json::from_str::(&format!(r#""{}""#, str)) + .unwrap() + .0 + .unwrap() + } + + fn bare_version_err(str: &str) -> String { + serde_json::from_str::(&format!(r#""{}""#, str)) + .unwrap_err() + .to_string() + } + + #[test] + fn test_deserialize_rust_version() { + assert_eq!(bare_version("1.2"), Version::new(1, 2, 0)); + assert_eq!(bare_version("1.2.0"), Version::new(1, 2, 0)); + assert_eq!( + bare_version_err("1.2.0-alpha"), + "pre-release identifiers are not supported in rust-version" + ); + assert_eq!( + bare_version_err("1.2.0+123"), + "build metadata is not supported in rust-version" + ); + } +} diff --git a/vendor/cargo_metadata/src/messages.rs b/vendor/cargo_metadata/src/messages.rs index ea2abd250..028cd726e 100644 --- a/vendor/cargo_metadata/src/messages.rs +++ b/vendor/cargo_metadata/src/messages.rs @@ -2,8 +2,8 @@ use super::{Diagnostic, PackageId, Target}; use camino::Utf8PathBuf; #[cfg(feature = "builder")] use derive_builder::Builder; -use serde::{Deserialize, Serialize}; -use std::fmt; +use serde::{de, ser, Deserialize, Serialize}; +use std::fmt::{self, Write}; use std::io::{self, BufRead, Read}; /// Profile settings used to determine which compiler flags to use for a @@ -15,8 +15,9 @@ use std::io::{self, BufRead, Read}; pub struct ArtifactProfile { /// Optimization level. Possible values are 0-3, s or z. pub opt_level: String, - /// The amount of debug info. 0 for none, 1 for limited, 2 for full - pub debuginfo: Option, + /// The kind of debug information. + #[serde(default)] + pub debuginfo: ArtifactDebuginfo, /// State of the `cfg(debug_assertions)` directive, enabling macros like /// `debug_assert!` pub debug_assertions: bool, @@ -26,6 +27,132 @@ pub struct ArtifactProfile { pub test: bool, } +/// The kind of debug information included in the artifact. +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +#[non_exhaustive] +pub enum ArtifactDebuginfo { + /// No debug information. + None, + /// Line directives only. + LineDirectivesOnly, + /// Line tables only. + LineTablesOnly, + /// Debug information without type or variable-level information. + Limited, + /// Full debug information. + Full, + /// An unknown integer level. + /// + /// This may be produced by a version of rustc in the future that has + /// additional levels represented by an integer that are not known by this + /// version of `cargo_metadata`. + UnknownInt(i64), + /// An unknown string level. + /// + /// This may be produced by a version of rustc in the future that has + /// additional levels represented by a string that are not known by this + /// version of `cargo_metadata`. + UnknownString(String), +} + +impl Default for ArtifactDebuginfo { + fn default() -> Self { + ArtifactDebuginfo::None + } +} + +impl ser::Serialize for ArtifactDebuginfo { + fn serialize(&self, serializer: S) -> Result + where + S: ser::Serializer, + { + match self { + Self::None => 0.serialize(serializer), + Self::LineDirectivesOnly => "line-directives-only".serialize(serializer), + Self::LineTablesOnly => "line-tables-only".serialize(serializer), + Self::Limited => 1.serialize(serializer), + Self::Full => 2.serialize(serializer), + Self::UnknownInt(n) => n.serialize(serializer), + Self::UnknownString(s) => s.serialize(serializer), + } + } +} + +impl<'de> de::Deserialize<'de> for ArtifactDebuginfo { + fn deserialize(d: D) -> Result + where + D: de::Deserializer<'de>, + { + struct Visitor; + + impl<'de> de::Visitor<'de> for Visitor { + type Value = ArtifactDebuginfo; + + fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + formatter.write_str("an integer or string") + } + + fn visit_i64(self, value: i64) -> Result + where + E: de::Error, + { + let debuginfo = match value { + 0 => ArtifactDebuginfo::None, + 1 => ArtifactDebuginfo::Limited, + 2 => ArtifactDebuginfo::Full, + n => ArtifactDebuginfo::UnknownInt(n), + }; + Ok(debuginfo) + } + + fn visit_u64(self, value: u64) -> Result + where + E: de::Error, + { + self.visit_i64(value as i64) + } + + fn visit_str(self, value: &str) -> Result + where + E: de::Error, + { + let debuginfo = match value { + "none" => ArtifactDebuginfo::None, + "limited" => ArtifactDebuginfo::Limited, + "full" => ArtifactDebuginfo::Full, + "line-directives-only" => ArtifactDebuginfo::LineDirectivesOnly, + "line-tables-only" => ArtifactDebuginfo::LineTablesOnly, + s => ArtifactDebuginfo::UnknownString(s.to_string()), + }; + Ok(debuginfo) + } + + fn visit_unit(self) -> Result + where + E: de::Error, + { + Ok(ArtifactDebuginfo::None) + } + } + + d.deserialize_any(Visitor) + } +} + +impl fmt::Display for ArtifactDebuginfo { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ArtifactDebuginfo::None => f.write_char('0'), + ArtifactDebuginfo::Limited => f.write_char('1'), + ArtifactDebuginfo::Full => f.write_char('2'), + ArtifactDebuginfo::LineDirectivesOnly => f.write_str("line-directives-only"), + ArtifactDebuginfo::LineTablesOnly => f.write_str("line-tables-only"), + ArtifactDebuginfo::UnknownInt(n) => write!(f, "{}", n), + ArtifactDebuginfo::UnknownString(s) => f.write_str(s), + } + } +} + /// A compiler-generated file. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] #[cfg_attr(feature = "builder", derive(Builder))] diff --git a/vendor/cargo_metadata/tests/test_samples.rs b/vendor/cargo_metadata/tests/test_samples.rs index 3c747c595..15128b075 100644 --- a/vendor/cargo_metadata/tests/test_samples.rs +++ b/vendor/cargo_metadata/tests/test_samples.rs @@ -4,7 +4,9 @@ extern crate semver; extern crate serde_json; use camino::Utf8PathBuf; -use cargo_metadata::{CargoOpt, DependencyKind, Edition, Metadata, MetadataCommand}; +use cargo_metadata::{ + ArtifactDebuginfo, CargoOpt, DependencyKind, Edition, Message, Metadata, MetadataCommand, +}; #[test] fn old_minimal() { @@ -210,7 +212,7 @@ fn all_the_fields() { if ver >= semver::Version::parse("1.58.0").unwrap() { assert_eq!( all.rust_version, - Some(semver::VersionReq::parse("1.56").unwrap()) + Some(semver::Version::parse("1.56.0").unwrap()) ); } @@ -645,3 +647,46 @@ fn basic_workspace_root_package_exists() { "ex_bin" ); } + +#[test] +fn debuginfo_variants() { + // Checks behavior for the different debuginfo variants. + let variants = [ + ("0", ArtifactDebuginfo::None), + ("1", ArtifactDebuginfo::Limited), + ("2", ArtifactDebuginfo::Full), + ( + "\"line-directives-only\"", + ArtifactDebuginfo::LineDirectivesOnly, + ), + ("\"line-tables-only\"", ArtifactDebuginfo::LineTablesOnly), + ("3", ArtifactDebuginfo::UnknownInt(3)), + ( + "\"abc\"", + ArtifactDebuginfo::UnknownString("abc".to_string()), + ), + ("null", ArtifactDebuginfo::None), + ]; + for (value, expected) in variants { + let s = r#"{"reason":"compiler-artifact","package_id":"cargo_metadata 0.16.0 (path+file:////cargo_metadata)","manifest_path":"/cargo_metadata/Cargo.toml","target":{"kind":["lib"],"crate_types":["lib"],"name":"cargo_metadata","src_path":"/cargo_metadata/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},"profile":{"opt_level":"0","debuginfo":DEBUGINFO,"debug_assertions":true,"overflow_checks":true,"test":false},"features":["default"],"filenames":["/cargo_metadata/target/debug/deps/libcargo_metadata-27f582f7187b9a2c.rmeta"],"executable":null,"fresh":false}"#; + let message: Message = serde_json::from_str(&s.replace("DEBUGINFO", value)).unwrap(); + match message { + Message::CompilerArtifact(artifact) => { + assert_eq!(artifact.profile.debuginfo, expected); + let de_s = serde_json::to_string(&artifact.profile.debuginfo).unwrap(); + // Note: Roundtrip does not retain null value. + if value == "null" { + assert_eq!(artifact.profile.debuginfo.to_string(), "0"); + assert_eq!(de_s, "0"); + } else { + assert_eq!( + artifact.profile.debuginfo.to_string(), + value.trim_matches('"') + ); + assert_eq!(de_s, value); + } + } + _ => panic!("unexpected {:?}", message), + } + } +} -- cgit v1.2.3