Skip to content

Commit 8c86a98

Browse files
Merge #1183
1183: Fix error when using certain config values in Cargo.toml r=Emilgardis a=Emilgardis `pre-build = "file"` and `image.toolchain` had a bad serialization, this fixes that Closes #1182 Co-authored-by: Emil Gardström <[email protected]>
2 parents 1d9d310 + 6a57d01 commit 8c86a98

File tree

6 files changed

+69
-11
lines changed

6 files changed

+69
-11
lines changed

.changes/1183.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"description": "resolve issue when using `pre-build` and `image.toolchain` in `Cargo.toml`",
3+
"type": "fixed",
4+
"issues": [1182]
5+
}

src/cross_toml.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -855,6 +855,29 @@ mod tests {
855855
Ok(())
856856
}
857857

858+
#[test]
859+
pub fn fully_populated_roundtrip() -> Result<()> {
860+
let cfg = r#"
861+
[target.a]
862+
xargo = false
863+
build-std = true
864+
image.name = "local"
865+
image.toolchain = ["x86_64-unknown-linux-gnu"]
866+
dockerfile.file = "Dockerfile"
867+
dockerfile.context = ".."
868+
pre-build = ["sh"]
869+
zig = true
870+
871+
[target.b]
872+
pre-build = "sh"
873+
zig = "2.17"
874+
"#;
875+
876+
let (cfg, _) = CrossToml::parse_from_cross(cfg, &mut m!())?;
877+
serde_json::from_value::<CrossToml>(serde_json::to_value(cfg)?)?;
878+
Ok(())
879+
}
880+
858881
#[test]
859882
pub fn merge() -> Result<()> {
860883
let cfg1_str = r#"

src/docker/custom.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,29 @@ pub enum Dockerfile<'a> {
2525
},
2626
}
2727

28-
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
28+
#[derive(Debug, Clone, PartialEq, Eq, serde::Deserialize)]
2929
pub enum PreBuild {
3030
/// A path to a file to copy or a single line to `RUN` if line comes from env
3131
Single { line: String, env: bool },
3232
/// Lines to execute in a single `RUN`
3333
Lines(Vec<String>),
3434
}
3535

36+
impl serde::Serialize for PreBuild {
37+
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
38+
match self {
39+
PreBuild::Single { line, .. } => serializer.serialize_str(line),
40+
PreBuild::Lines(lines) => {
41+
use serde::ser::SerializeSeq;
42+
let mut seq = serializer.serialize_seq(Some(lines.len()))?;
43+
for line in lines {
44+
seq.serialize_element(line)?;
45+
}
46+
seq.end()
47+
}
48+
}
49+
}
50+
}
3651
impl FromStr for PreBuild {
3752
type Err = std::convert::Infallible;
3853

src/docker/image.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,8 @@ impl std::fmt::Display for PossibleImage {
104104
/// The architecture/platform to use in the image
105105
///
106106
/// https://github.com/containerd/containerd/blob/release/1.6/platforms/platforms.go#L63
107-
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
108-
#[serde(try_from = "&str")]
107+
#[derive(Debug, Clone, PartialEq, Eq, serde::Deserialize)]
108+
#[serde(try_from = "String")]
109109
pub struct ImagePlatform {
110110
/// CPU architecture, x86_64, aarch64 etc
111111
pub architecture: Architecture,
@@ -141,14 +141,20 @@ impl Default for ImagePlatform {
141141
}
142142
}
143143

144-
impl TryFrom<&str> for ImagePlatform {
144+
impl TryFrom<String> for ImagePlatform {
145145
type Error = <Self as std::str::FromStr>::Err;
146146

147-
fn try_from(value: &str) -> Result<Self, Self::Error> {
147+
fn try_from(value: String) -> Result<Self, Self::Error> {
148148
value.parse()
149149
}
150150
}
151151

152+
impl Serialize for ImagePlatform {
153+
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
154+
serializer.serialize_str(&format!("{}={}", self.docker_platform(), self.target))
155+
}
156+
}
157+
152158
impl std::str::FromStr for ImagePlatform {
153159
type Err = eyre::Report;
154160
// [os/arch[/variant]=]toolchain

src/lib.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ pub use self::rustc::{TargetList, VersionMetaExt};
7070
pub const CROSS_LABEL_DOMAIN: &str = "org.cross-rs";
7171

7272
#[allow(non_camel_case_types)]
73-
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Hash, Serialize)]
74-
#[serde(from = "&str")]
73+
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Hash)]
74+
#[serde(from = "&str", into = "String")]
7575
#[serde(rename_all = "snake_case")]
7676
pub enum TargetTriple {
7777
Other(String),
@@ -261,6 +261,12 @@ impl From<String> for TargetTriple {
261261
}
262262
}
263263

264+
impl Serialize for TargetTriple {
265+
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
266+
serializer.serialize_str(self.triple())
267+
}
268+
}
269+
264270
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize)]
265271
#[serde(from = "String")]
266272
pub enum Target {

src/tests/toml.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,17 @@ fn toml_check() -> Result<(), Box<dyn std::error::Error>> {
6161
text_line_no(&contents, fence.range().start),
6262
);
6363
let mut msg_info = crate::shell::MessageInfo::default();
64-
assert!(if !cargo {
64+
let toml = if !cargo {
6565
crate::cross_toml::CrossToml::parse_from_cross(&fence_content, &mut msg_info)?
6666
} else {
6767
crate::cross_toml::CrossToml::parse_from_cargo(&fence_content, &mut msg_info)?
6868
.unwrap_or_default()
69-
}
70-
.1
71-
.is_empty());
69+
};
70+
assert!(toml.1.is_empty());
71+
72+
// TODO: Add serde_path_to_error
73+
// Check if roundtrip works, needed for merging Cross.toml and Cargo.toml
74+
serde_json::from_value::<crate::cross_toml::CrossToml>(serde_json::to_value(toml.0)?)?;
7275
}
7376
}
7477
Ok(())

0 commit comments

Comments
 (0)