]> git.proxmox.com Git - cargo.git/commitdiff
Port cargo from toml-rs to toml_edit
authorEd Page <eopage@gmail.com>
Tue, 2 Nov 2021 00:18:32 +0000 (19:18 -0500)
committerEd Page <eopage@gmail.com>
Thu, 13 Jan 2022 15:27:27 +0000 (09:27 -0600)
Benefits:
- A TOML 1.0 compliant parser
- Unblock future work
  - Have `cargo init` add the current crate to the workspace, rather
    than error
  - #5586: Upstream `cargo-add`

34 files changed:
Cargo.toml
benches/capture/Cargo.toml
benches/capture/src/main.rs
crates/cargo-test-support/Cargo.toml
crates/cargo-test-support/src/registry.rs
src/cargo/core/manifest.rs
src/cargo/core/package.rs
src/cargo/core/workspace.rs
src/cargo/ops/cargo_config.rs
src/cargo/ops/cargo_new.rs
src/cargo/ops/cargo_output_metadata.rs
src/cargo/ops/common_for_install_and_uninstall.rs
src/cargo/ops/lockfile.rs
src/cargo/ops/vendor.rs
src/cargo/util/config/key.rs
src/cargo/util/config/mod.rs
src/cargo/util/config/target.rs
src/cargo/util/toml/mod.rs
tests/testsuite/bad_config.rs
tests/testsuite/build.rs
tests/testsuite/config.rs
tests/testsuite/config_cli.rs
tests/testsuite/config_include.rs
tests/testsuite/features_namespaced.rs
tests/testsuite/git.rs
tests/testsuite/install.rs
tests/testsuite/install_upgrade.rs
tests/testsuite/login.rs
tests/testsuite/logout.rs
tests/testsuite/package.rs
tests/testsuite/patch.rs
tests/testsuite/publish.rs
tests/testsuite/weak_dep_features.rs
tests/testsuite/workspaces.rs

index 21f0bfd49e658cb7ce8e45b929befdd7d1bd8c12..b8660191bc5a79d54edb82e0e7661d9f95479fb8 100644 (file)
@@ -57,7 +57,7 @@ strip-ansi-escapes = "0.1.0"
 tar = { version = "0.4.36", default-features = false }
 tempfile = "3.0"
 termcolor = "1.1"
-toml = "0.5.7"
+toml_edit =  { version = "0.13", features = ["serde", "easy"] }
 unicode-xid = "0.2.0"
 url = "2.2.2"
 walkdir = "2.2"
index 38d57b288d7b6627d768449fb2756f6fc7bce072..5d124c34f3d2f86be9e4f02287a90fa59554fc27 100644 (file)
@@ -9,4 +9,4 @@ description = "Tool for capturing a real-world workspace for benchmarking."
 cargo_metadata = "0.14.0"
 flate2 = { version = "1.0.3", default-features = false, features = ["zlib"] }
 tar = { version = "0.4.35", default-features = false }
-toml = "0.5.8"
+toml_edit =  { version = "0.9.1", features = ["easy"] }
index f6f02c4ba051eabf13e8bd31ed4b48926678b705..8656c63c3ee43282a6253a23170d00a1c4a7c810 100644 (file)
@@ -8,6 +8,7 @@ use flate2::{Compression, GzBuilder};
 use std::fs;
 use std::path::{Path, PathBuf};
 use std::process::Command;
+use toml_edit::easy as toml;
 
 fn main() {
     let force = std::env::args().any(|arg| arg == "-f");
index 7d57d9f02c72bd2c652c1aacfcc3104715eaf8c9..8bafa2217103b0a5bb0b57ed7854ff68a4191dff 100644 (file)
@@ -21,7 +21,7 @@ remove_dir_all = "0.5"
 serde_json = "1.0"
 tar = { version = "0.4.18", default-features = false }
 termcolor = "1.1.2"
-toml = "0.5.7"
+toml_edit =  { version = "0.9.1", features = ["serde", "easy"] }
 url = "2.2.2"
 
 [features]
index ecddf8eef6550a31cace48a3f764fe9986bc7254..8a219750f367c419be1330b30035f3325afc1c13 100644 (file)
@@ -709,7 +709,7 @@ impl Package {
         if !self.cargo_features.is_empty() {
             manifest.push_str(&format!(
                 "cargo-features = {}\n\n",
-                toml::to_string(&self.cargo_features).unwrap()
+                toml_edit::ser::to_item(&self.cargo_features).unwrap()
             ));
         }
 
index b0bc0576a7a5bd2de1cbf2d2a94e92c54a38d7c5..4bf015619d3705bdde90478f9137fb4084e36be8 100644 (file)
@@ -9,6 +9,7 @@ use anyhow::Context as _;
 use semver::Version;
 use serde::ser;
 use serde::Serialize;
+use toml_edit::easy as toml;
 use url::Url;
 
 use crate::core::compiler::{CompileKind, CrateType};
index c447610f2c9ff6ddd18bd25ffe03281ab239f46b..0ebe0277e78d5494e8551bb631a078a5dc5a3c0d 100644 (file)
@@ -16,6 +16,7 @@ use lazycell::LazyCell;
 use log::{debug, warn};
 use semver::Version;
 use serde::Serialize;
+use toml_edit::easy as toml;
 
 use crate::core::compiler::{CompileKind, RustcTargetData};
 use crate::core::dependency::DepKind;
@@ -199,7 +200,7 @@ impl Package {
             .manifest()
             .original()
             .prepare_for_publish(ws, self.root())?;
-        let toml = toml::to_string(&manifest)?;
+        let toml = toml::to_string_pretty(&manifest)?;
         Ok(format!("{}\n{}", MANIFEST_PREAMBLE, toml))
     }
 
index a5b1de0649650a516a87ffd0b5a8cda6f0c5031e..046f0b60671bab2f949410c27fb2f629ecc10377 100644 (file)
@@ -8,6 +8,7 @@ use anyhow::{bail, Context as _};
 use glob::glob;
 use itertools::Itertools;
 use log::debug;
+use toml_edit::easy as toml;
 use url::Url;
 
 use crate::core::features::Features;
index e84e84edf0da78dd3680b73c010b60c1d5c5acfd..99d3baf7f506b1fccdb18b9723f74cf19333e2ca 100644 (file)
@@ -127,19 +127,24 @@ fn print_toml(config: &Config, opts: &GetOptions<'_>, key: &ConfigKey, cv: &CV)
             config,
             "{} = {}{}",
             key,
-            toml::to_string(&val).unwrap(),
+            toml_edit::Value::from(val),
             origin(def)
         ),
         CV::List(vals, _def) => {
             if opts.show_origin {
                 drop_println!(config, "{} = [", key);
                 for (val, def) in vals {
-                    drop_println!(config, "    {}, # {}", toml::to_string(&val).unwrap(), def);
+                    drop_println!(
+                        config,
+                        "    {}, # {}",
+                        toml_edit::ser::to_item(&val).unwrap(),
+                        def
+                    );
                 }
                 drop_println!(config, "]");
             } else {
-                let vals: Vec<&String> = vals.iter().map(|x| &x.0).collect();
-                drop_println!(config, "{} = {}", key, toml::to_string(&vals).unwrap());
+                let vals: toml_edit::Array = vals.iter().map(|x| &x.0).collect();
+                drop_println!(config, "{} = {}", key, vals);
             }
         }
         CV::Table(table, _def) => {
index 2011428099adde12d9075692c2381239ab4bd293..85d8beaf7707032be1e3f0e47813bcb87fc73142 100644 (file)
@@ -12,6 +12,7 @@ use std::io::{BufRead, BufReader, ErrorKind};
 use std::path::{Path, PathBuf};
 use std::process::Command;
 use std::str::{from_utf8, FromStr};
+use toml_edit::easy as toml;
 
 #[derive(Clone, Copy, Debug, PartialEq)]
 pub enum VersionControl {
index 8cb3951dd4d351e2eab7b684a1a02a61734a4da5..1bc26c689422de694bae57ec9edae33ca9940cca 100644 (file)
@@ -10,6 +10,7 @@ use cargo_platform::Platform;
 use serde::Serialize;
 use std::collections::BTreeMap;
 use std::path::PathBuf;
+use toml_edit::easy as toml;
 
 const VERSION: u32 = 1;
 
index 444e57cfddb612ad8283d9b8a9d0b7f2a20a8da6..a529e19e7e182f71a36ae0b5e020a92d6e00a6da 100644 (file)
@@ -7,6 +7,7 @@ use std::rc::Rc;
 
 use anyhow::{bail, format_err, Context as _};
 use serde::{Deserialize, Serialize};
+use toml_edit::easy as toml;
 
 use crate::core::compiler::Freshness;
 use crate::core::{Dependency, FeatureValue, Package, PackageId, Source, SourceId};
index ec0255ff479f4766fee1d8dd89f3c4a9c867f469..8743520ad0c271ccd3383a1f6afdedae333c2b51 100644 (file)
@@ -6,6 +6,7 @@ use crate::util::toml as cargo_toml;
 use crate::util::Filesystem;
 
 use anyhow::Context as _;
+use toml_edit::easy as toml;
 
 pub fn load_pkg_lockfile(ws: &Workspace<'_>) -> CargoResult<Option<Resolve>> {
     if !ws.root().join("Cargo.lock").exists() {
@@ -100,7 +101,7 @@ fn resolve_to_string_orig(
 }
 
 fn serialize_resolve(resolve: &Resolve, orig: Option<&str>) -> String {
-    let toml = toml::Value::try_from(resolve).unwrap();
+    let toml = toml_edit::ser::to_item(resolve).unwrap();
 
     let mut out = String::new();
 
@@ -139,7 +140,7 @@ fn serialize_resolve(resolve: &Resolve, orig: Option<&str>) -> String {
 
     let deps = toml["package"].as_array().unwrap();
     for dep in deps {
-        let dep = dep.as_table().unwrap();
+        let dep = dep.as_inline_table().unwrap();
 
         out.push_str("[[package]]\n");
         emit_package(dep, &mut out);
@@ -149,14 +150,23 @@ fn serialize_resolve(resolve: &Resolve, orig: Option<&str>) -> String {
         let list = patch["unused"].as_array().unwrap();
         for entry in list {
             out.push_str("[[patch.unused]]\n");
-            emit_package(entry.as_table().unwrap(), &mut out);
+            emit_package(entry.as_inline_table().unwrap(), &mut out);
             out.push('\n');
         }
     }
 
     if let Some(meta) = toml.get("metadata") {
-        out.push_str("[metadata]\n");
-        out.push_str(&meta.to_string());
+        // 1. We need to ensure we print the entire tree, not just the direct members of `metadata`
+        //    (which `toml_edit::Table::to_string` only shows)
+        // 2. We need to ensure all children tables have `metadata.` prefix
+        let meta_table = meta
+            .clone()
+            .into_table()
+            .expect("validation ensures this is a table");
+        let mut meta_doc = toml_edit::Document::new();
+        meta_doc["metadata"] = toml_edit::Item::Table(meta_table);
+
+        out.push_str(&meta_doc.to_string());
     }
 
     // Historical versions of Cargo in the old format accidentally left trailing
@@ -190,7 +200,7 @@ fn are_equal_lockfiles(orig: &str, current: &str, ws: &Workspace<'_>) -> bool {
     orig.lines().eq(current.lines())
 }
 
-fn emit_package(dep: &toml::value::Table, out: &mut String) {
+fn emit_package(dep: &toml_edit::InlineTable, out: &mut String) {
     out.push_str(&format!("name = {}\n", &dep["name"]));
     out.push_str(&format!("version = {}\n", &dep["version"]));
 
index 8ecb802d7b8a5e377a4945ad13097552a8ce8e79..eb1d8f636371cf7e1c9a82768b3ffe39e4138eb7 100644 (file)
@@ -12,6 +12,7 @@ use std::collections::{BTreeMap, BTreeSet, HashMap};
 use std::fs::{self, File, OpenOptions};
 use std::io::{Read, Write};
 use std::path::{Path, PathBuf};
+use toml_edit::easy as toml;
 
 pub struct VendorOptions<'a> {
     pub no_delete: bool,
index 4ac119174a725ba47ff786ea42ffc8df2cf8eab1..181b7c56a9ff51be9ed01bd54b6fefc37e6ad609 100644 (file)
@@ -111,6 +111,6 @@ fn escape_key_part<'a>(part: &'a str) -> Cow<'a, str> {
         Cow::Borrowed(part)
     } else {
         // This is a bit messy, but toml doesn't expose a function to do this.
-        Cow::Owned(toml::to_string(&toml::Value::String(part.to_string())).unwrap())
+        Cow::Owned(toml_edit::Value::from(part).to_string())
     }
 }
index fdf981f051f9b8c7aa770cdab01f845264f97a4b..22cbc198d7696d9f1f93542d882f84cba971db30 100644 (file)
@@ -79,6 +79,7 @@ use cargo_util::paths;
 use curl::easy::Easy;
 use lazycell::LazyCell;
 use serde::Deserialize;
+use toml_edit::easy as toml;
 use url::Url;
 
 mod de;
index d259b970633a6611797e30b2d5c40f68946ea035..dac2e55b5bad7cd5af698eeb65faafbf7a78553a 100644 (file)
@@ -4,6 +4,7 @@ use crate::util::CargoResult;
 use serde::Deserialize;
 use std::collections::{BTreeMap, HashMap};
 use std::path::PathBuf;
+use toml_edit::easy as toml;
 
 /// Config definition of a `[target.'cfg(…)']` table.
 ///
index d973930c73e6967cb026231fbbd877da3cc3da29..217f7ce114e76455763b396bae0db2fa6b752cf8 100644 (file)
@@ -13,6 +13,7 @@ use semver::{self, VersionReq};
 use serde::de;
 use serde::ser;
 use serde::{Deserialize, Serialize};
+use toml_edit::easy as toml;
 use url::Url;
 
 use crate::core::compiler::{CompileKind, CompileTarget};
@@ -77,16 +78,21 @@ pub fn read_manifest_from_str(
         let pretty_filename = manifest_file
             .strip_prefix(config.cwd())
             .unwrap_or(manifest_file);
-        parse(contents, pretty_filename, config)?
+        parse_document(contents, pretty_filename, config)?
     };
 
     // Provide a helpful error message for a common user error.
     if let Some(package) = toml.get("package").or_else(|| toml.get("project")) {
         if let Some(feats) = package.get("cargo-features") {
+            let mut feats = feats.clone();
+            if let Some(value) = feats.as_value_mut() {
+                // Only keep formatting inside of the `[]` and not formatting around it
+                value.decor_mut().clear();
+            }
             bail!(
                 "cargo-features = {} was found in the wrong location: it \
                  should be set at the top of Cargo.toml before any tables",
-                toml::to_string(feats).unwrap()
+                feats.to_string()
             );
         }
     }
@@ -164,6 +170,16 @@ pub fn parse(toml: &str, _file: &Path, _config: &Config) -> CargoResult<toml::Va
         .map_err(|e| anyhow::Error::from(e).context("could not parse input as TOML"))
 }
 
+pub fn parse_document(
+    toml: &str,
+    _file: &Path,
+    _config: &Config,
+) -> CargoResult<toml_edit::Document> {
+    // At the moment, no compatibility checks are needed.
+    toml.parse()
+        .map_err(|e| anyhow::Error::from(e).context("could not parse input as TOML"))
+}
+
 type TomlLibTarget = TomlTarget;
 type TomlBinTarget = TomlTarget;
 type TomlExampleTarget = TomlTarget;
index ef06da3e3ac82a5f20c083e55f2a9e66631679d1..06f9b449b263b6250f4327b2f4d7500c6597c434 100644 (file)
@@ -196,7 +196,12 @@ Caused by:
   could not parse input as TOML
 
 Caused by:
-  expected an equals, found eof at line 1 column 2
+  TOML parse error at line 1, column 2
+    |
+  1 | 4
+    |  ^
+  Unexpected end of input
+  Expected `.` or `=`
 ",
         )
         .run();
@@ -442,7 +447,13 @@ Caused by:
   could not parse input as TOML
 
 Caused by:
-  expected a table key, found a newline at line 8 column 27
+  TOML parse error at line 8, column 27
+    |
+  8 |                 native = {
+    |                           ^
+  Unexpected `
+  `
+  Expected key
 ",
         )
         .run();
@@ -781,7 +792,26 @@ fn invalid_toml_historically_allowed_fails() {
 
     p.cargo("build")
         .with_status(101)
-        .with_stderr_contains("  expected newline, found an identifier at line 1 column 7")
+        .with_stderr(
+            "\
+error: could not load Cargo configuration
+
+Caused by:
+  could not parse TOML configuration in `[..]`
+
+Caused by:
+  could not parse input as TOML
+
+Caused by:
+  TOML parse error at line 1, column 7
+    |
+  1 | [bar] baz = 2
+    |       ^
+  Unexpected `b`
+  Expected newline or end of input
+  While parsing a Table Header
+",
+        )
         .run();
 }
 
index 474a74575309bae0c199ab99509b42fbfaed9b2b..8927d6a6c699d73ddf39c0642ca3460666642941 100644 (file)
@@ -198,7 +198,12 @@ Caused by:
   could not parse input as TOML
 
 Caused by:
-  invalid TOML value, did you mean to use a quoted string? at line 3 column 23
+  TOML parse error at line 3, column 23
+    |
+  3 |                 foo = bar
+    |                       ^
+  Unexpected `b`
+  Expected quoted string
 ",
         )
         .run();
@@ -218,7 +223,12 @@ Caused by:
   could not parse input as TOML
 
 Caused by:
-  invalid TOML value, did you mean to use a quoted string? at line 1 column 5
+  TOML parse error at line 1, column 5
+    |
+  1 | a = bar
+    |     ^
+  Unexpected `b`
+  Expected quoted string
 ",
         )
         .run();
@@ -2740,7 +2750,12 @@ Caused by:
   could not parse input as TOML
 
 Caused by:
-  expected an equals, found an identifier at line 1 column 6
+  TOML parse error at line 1, column 6
+    |
+  1 | this is not valid toml
+    |      ^
+  Unexpected `i`
+  Expected `.` or `=`
 ",
         )
         .run();
index 95549cfc3874e7ddc8cba18d4c6004a5f8e2f68b..c3c61a868ea0e7f774b5da37f624348a64c12270 100644 (file)
@@ -700,7 +700,12 @@ Caused by:
   could not parse input as TOML
 
 Caused by:
-  expected an equals, found eof at line 1 column 5",
+  TOML parse error at line 1, column 5
+  |
+1 | asdf
+  |     ^
+Unexpected end of input
+Expected `.` or `=`",
     );
 }
 
@@ -769,8 +774,14 @@ expected a list, but found a integer for `l3` in [..]/.cargo/config",
     // "invalid number" here isn't the best error, but I think it's just toml.rs.
     assert_error(
         config.get::<L>("bad-env").unwrap_err(),
-        "error in environment variable `CARGO_BAD_ENV`: \
-         could not parse TOML list: invalid TOML value, did you mean to use a quoted string? at line 1 column 8",
+        "\
+error in environment variable `CARGO_BAD_ENV`: could not parse TOML list: TOML parse error at line 1, column 8
+  |
+1 | value=[zzz]
+  |        ^
+Unexpected `z`
+Expected newline or `#`
+",
     );
 
     // Try some other sequence-like types.
@@ -1059,7 +1070,13 @@ Caused by:
   could not parse input as TOML
 
 Caused by:
-  dotted key attempted to extend non-table type at line 2 column 15",
+  TOML parse error at line 3, column 1
+  |
+3 | ssl-version.min = 'tlsv1.2'
+  | ^
+Dotted key `ssl-version` attempted to extend non-table type (string)
+
+",
     );
     assert!(config
         .get::<Option<SslVersionConfig>>("http.ssl-version")
@@ -1494,8 +1511,8 @@ fn all_profile_options() {
         package: Some(overrides),
         ..base_settings
     };
-    let profile_toml = ::toml::to_string(&profile).unwrap();
-    let roundtrip: toml::TomlProfile = ::toml::from_str(&profile_toml).unwrap();
-    let roundtrip_toml = ::toml::to_string(&roundtrip).unwrap();
+    let profile_toml = toml_edit::easy::to_string(&profile).unwrap();
+    let roundtrip: toml::TomlProfile = toml_edit::easy::from_str(&profile_toml).unwrap();
+    let roundtrip_toml = toml_edit::easy::to_string(&roundtrip).unwrap();
     compare::assert_match_exact(&profile_toml, &roundtrip_toml);
 }
index 745525012eb1634d96c5d1bf593f7845731305ad..8cc5d1dd4dfbafb50bb3ef629a846b68bf36b5bf 100644 (file)
@@ -287,7 +287,13 @@ fn bad_parse() {
 failed to parse --config argument `abc`
 
 Caused by:
-  expected an equals, found eof at line 1 column 4",
+  TOML parse error at line 1, column 4
+  |
+1 | abc
+  |    ^
+Unexpected end of input
+Expected `.` or `=`
+",
     );
 }
 
index aff2a78afd85608379179532829a3b3cd3b6ace0..349e0dce467fb80d0ffe32d7677cbf857be22ffc 100644 (file)
@@ -277,6 +277,12 @@ fn cli_path() {
 failed to parse --config argument `missing.toml`
 
 Caused by:
-  expected an equals, found eof at line 1 column 13",
+  TOML parse error at line 1, column 13
+  |
+1 | missing.toml
+  |             ^
+Unexpected end of input
+Expected `.` or `=`
+",
     );
 }
index 78cdc2b151042ba91161231efd9886cdfade02ba..da77906a2952d1710ea2f745941eca12bc93cddc 100644 (file)
@@ -950,6 +950,7 @@ version = "0.1.0"
 description = "foo"
 homepage = "https://example.com/"
 license = "MIT"
+
 [dependencies.opt-dep1]
 version = "1.0"
 optional = true
@@ -1056,6 +1057,7 @@ version = "0.1.0"
 description = "foo"
 homepage = "https://example.com/"
 license = "MIT"
+
 [dependencies.bar]
 version = "1.0"
 optional = true
index 293c5db1857a8b1fb7eee4c72e97f7a4cfd86a7e..4db0f6ed6d5d5f104b5bde4f30c733344db1c54d 100644 (file)
@@ -2439,7 +2439,13 @@ Caused by:
   could not parse input as TOML
 
 Caused by:
-  duplicate key: `categories` for key `project` at line 10 column 21",
+  TOML parse error at line 8, column 21
+    |
+  8 |                     categories = [\"algorithms\"]
+    |                     ^
+  Duplicate key `categories` in table `project`
+
+",
             path2url(&git_root),
             path2url(&git_root),
         ))
index b28b3743c23b8edfc2e51f997825937327607992..c4a63edb39f0ed791cd4d01d78bcd1b731fc3c2b 100644 (file)
@@ -924,7 +924,12 @@ Caused by:
   invalid TOML found for metadata
 
 Caused by:
-  unexpected character[..]
+  TOML parse error at line 1, column 1
+    |
+  1 | [..] = { \"foo 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)\" = [\"foo[EXE]\"] }
+    | ^
+  Unexpected `[..]`
+  Expected key or end of input
 ",
         )
         .run();
index 1a18bc211e768d6f42b5d089bce9b08d7ac52682..a1e69f5143abf70b8aceff0a91feca4991c7f799 100644 (file)
@@ -6,6 +6,7 @@ use std::env;
 use std::fs;
 use std::path::PathBuf;
 use std::sync::atomic::{AtomicUsize, Ordering};
+use toml_edit::easy as toml;
 
 use cargo_test_support::install::{cargo_home, exe};
 use cargo_test_support::paths::CargoPathExt;
index b69616ff81b4a03225bdbc72d85001cfd9cf7256..14def0d50e3c664f1b39f7ac45b84458d4cb94a1 100644 (file)
@@ -6,6 +6,7 @@ use cargo_test_support::{cargo_process, paths, t};
 use std::fs::{self, OpenOptions};
 use std::io::prelude::*;
 use std::path::PathBuf;
+use toml_edit::easy as toml;
 
 const TOKEN: &str = "test-token";
 const TOKEN2: &str = "test-token2";
index 606a06c8484a01f922f617d1c2ff5bf0d866d869..d491ede13bf95d2d96ad06f149fe03a1ce747b38 100644 (file)
@@ -3,6 +3,7 @@
 use cargo_test_support::install::cargo_home;
 use cargo_test_support::{cargo_process, registry};
 use std::fs;
+use toml_edit::easy as toml;
 
 #[cargo_test]
 fn gated() {
index 054189a08e9141bae879791e6dc9d511d8d4d689..071b6fdd9d2449de77a6bc6a916a79c2767c403d 100644 (file)
@@ -1005,6 +1005,7 @@ license = "MIT"
 
 [package.metadata]
 foo = "bar"
+
 [dependencies.abc]
 version = "1.0"
 
index 28b5fbfe0754d8b7f2a6e4273aad9d9fc576577c..ca10815b3308b2b2f408cc743c6d165d0d965a47 100644 (file)
@@ -5,6 +5,7 @@ use cargo_test_support::paths;
 use cargo_test_support::registry::{self, Package};
 use cargo_test_support::{basic_manifest, project};
 use std::fs;
+use toml_edit::easy as toml;
 
 #[cargo_test]
 fn replace() {
index 8085259fb2c21ba77b356ac7ba89196e460b13c4..f5f85cd94b921db00600c05724730399803186ab 100644 (file)
@@ -1178,6 +1178,7 @@ fn publish_git_with_version() {
                      authors = []\n\
                      description = \"foo\"\n\
                      license = \"MIT\"\n\
+                     \n\
                      [dependencies.dep1]\n\
                      version = \"1.0\"\n\
                     ",
@@ -1283,8 +1284,6 @@ homepage = "foo"
 documentation = "foo"
 license = "MIT"
 repository = "foo"
-
-[dev-dependencies]
 "#,
                 cargo::core::package::MANIFEST_PREAMBLE
             ),
index 6d7d8857dd09d0081832ea76f4311abee60904f0..07d8647008193ba15542e73a3c9ebf08d275e6f0 100644 (file)
@@ -608,6 +608,7 @@ version = "0.1.0"
 description = "foo"
 homepage = "https://example.com/"
 license = "MIT"
+
 [dependencies.bar]
 version = "1.0"
 optional = true
index 777c6d13af558794d16e957dbecee3403c2963b5..9b12e5c6013b207fac5bbef034286776c433cb8e 100644 (file)
@@ -1065,7 +1065,12 @@ Caused by:
   could not parse input as TOML
 
 Caused by:
-  expected an equals, found eof at line 1 column 5
+  TOML parse error at line 1, column 5
+    |
+  1 | asdf
+    |     ^
+  Unexpected end of input
+  Expected `.` or `=`
      Created binary (application) `bar` package
 ",
         )