2 use std
::collections
::HashMap
;
3 use std
::fs
::{self, File}
;
4 use std
::io
::prelude
::*;
7 use support
::cargo_process
;
10 use support
::registry
::{cksum, Package}
;
11 use support
::{basic_manifest, project, ProjectBuilder}
;
14 let root
= paths
::root();
15 t
!(fs
::create_dir(&root
.join(".cargo")));
16 t
!(t
!(File
::create(root
.join(".cargo/config"))).write_all(
19 replace-with = 'my-awesome-local-registry'
21 [source.my-awesome-local-registry]
27 struct VendorPackage
{
28 p
: Option
<ProjectBuilder
>,
34 package
: Option
<String
>,
35 files
: HashMap
<String
, String
>,
39 fn new(name
: &str) -> VendorPackage
{
41 p
: Some(project().at(&format
!("index/{}", name
))),
43 package
: Some(String
::new()),
44 files
: HashMap
::new(),
49 fn file(&mut self, name
: &str, contents
: &str) -> &mut VendorPackage
{
50 self.p
= Some(self.p
.take().unwrap().file(name
, contents
));
53 .insert(name
.to_string(), cksum(contents
.as_bytes()));
57 fn disable_checksum(&mut self) -> &mut VendorPackage
{
58 self.cksum
.package
= None
;
62 fn no_manifest(mut self) -> Self {
63 self.p
= self.p
.map(|pb
| pb
.no_manifest());
68 let p
= self.p
.take().unwrap();
69 let json
= serde_json
::to_string(&self.cksum
).unwrap();
70 let p
= p
.file(".cargo-checksum.json", &json
);
79 VendorPackage
::new("bar")
80 .file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
81 .file("src/lib.rs", "pub fn bar() {}")
98 "extern crate bar; pub fn foo() { bar::bar(); }",
104 [COMPILING] bar v0.1.0
105 [COMPILING] foo v0.1.0 ([CWD])
112 fn simple_install() {
115 VendorPackage
::new("foo")
116 .file("src/lib.rs", "pub fn foo() {}")
119 VendorPackage
::new("bar")
133 "extern crate foo; pub fn main() { foo::foo(); }",
136 cargo_process("install bar")
138 " Installing bar v0.1.0
141 Finished release [optimized] target(s) in [..]s
142 Installing [..]bar[..]
143 warning: be sure to add `[..]` to your PATH to be able to run the installed binaries
149 fn simple_install_fail() {
152 VendorPackage
::new("foo")
153 .file("src/lib.rs", "pub fn foo() {}")
156 VendorPackage
::new("bar")
171 "extern crate foo; pub fn main() { foo::foo(); }",
174 cargo_process("install bar")
177 " Installing bar v0.1.0
178 error: failed to compile `bar v0.1.0`, intermediate artifacts can be found at `[..]`
181 no matching package named `baz` found
182 location searched: registry `https://github.com/rust-lang/crates.io-index`
183 did you mean: bar, foo
184 required by package `bar v0.1.0`
190 fn install_without_feature_dep() {
193 VendorPackage
::new("foo")
194 .file("src/lib.rs", "pub fn foo() {}")
197 VendorPackage
::new("bar")
208 baz = { version = "9.8.7", optional = true }
215 "extern crate foo; pub fn main() { foo::foo(); }",
218 cargo_process("install bar")
220 " Installing bar v0.1.0
223 Finished release [optimized] target(s) in [..]s
224 Installing [..]bar[..]
225 warning: be sure to add `[..]` to your PATH to be able to run the installed binaries
234 let _
= project().at("index").build();
250 "extern crate bar; pub fn foo() { bar::bar(); }",
257 error: no matching package named `bar` found
258 location searched: [..]
259 required by package `foo v0.1.0 ([..])`
268 VendorPackage
::new("bar-0.1.0")
269 .file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
270 .file("src/lib.rs", "pub fn bar() {}")
271 .file(".cargo-checksum", "")
274 VendorPackage
::new("bar-0.2.0")
275 .file("Cargo.toml", &basic_manifest("bar", "0.2.0"))
276 .file("src/lib.rs", "pub fn bar() {}")
277 .file(".cargo-checksum", "")
294 "extern crate bar; pub fn foo() { bar::bar(); }",
300 [COMPILING] bar v0.1.0
301 [COMPILING] foo v0.1.0 ([CWD])
308 fn crates_io_then_directory() {
323 "extern crate bar; pub fn foo() { bar::bar(); }",
326 let cksum
= Package
::new("bar", "0.1.0")
327 .file("src/lib.rs", "pub fn bar() -> u32 { 0 }")
333 [UPDATING] `[..]` index
334 [DOWNLOADING] crates ...
335 [DOWNLOADED] bar v0.1.0 ([..])
336 [COMPILING] bar v0.1.0
337 [COMPILING] foo v0.1.0 ([CWD])
344 let mut v
= VendorPackage
::new("bar");
345 v
.file("Cargo.toml", &basic_manifest("bar", "0.1.0"));
346 v
.file("src/lib.rs", "pub fn bar() -> u32 { 1 }");
347 v
.cksum
.package
= Some(cksum
);
353 [COMPILING] bar v0.1.0
354 [COMPILING] foo v0.1.0 ([CWD])
361 fn crates_io_then_bad_checksum() {
374 ).file("src/lib.rs", "")
377 Package
::new("bar", "0.1.0").publish();
379 p
.cargo("build").run();
382 VendorPackage
::new("bar")
383 .file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
384 .file("src/lib.rs", "")
391 error: checksum for `bar v0.1.0` changed between lock files
393 this could be indicative of a few possible errors:
395 * the lock file is corrupt
396 * a replacement source in use (e.g. a mirror) returned a different checksum
397 * the source itself may be corrupt in one way or another
399 unable to verify that `bar v0.1.0` is the same as when the lockfile was generated
406 fn bad_file_checksum() {
409 VendorPackage
::new("bar")
410 .file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
411 .file("src/lib.rs", "")
414 let mut f
= t
!(File
::create(paths
::root().join("index/bar/src/lib.rs")));
415 t
!(f
.write_all(b
"fn bar() -> u32 { 0 }"));
429 ).file("src/lib.rs", "")
436 error: the listed checksum of `[..]lib.rs` has changed:
440 directory sources are not intended to be edited, if modifications are \
441 required then it is recommended that [replace] is used with a forked copy of \
448 fn only_dot_files_ok() {
451 VendorPackage
::new("bar")
452 .file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
453 .file("src/lib.rs", "")
455 VendorPackage
::new("foo")
472 ).file("src/lib.rs", "")
475 p
.cargo("build").run();
479 fn random_files_ok() {
482 VendorPackage
::new("bar")
483 .file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
484 .file("src/lib.rs", "")
486 VendorPackage
::new("foo")
504 ).file("src/lib.rs", "")
507 p
.cargo("build").run();
511 fn git_lock_file_doesnt_change() {
512 let git
= git
::new("git", |p
| {
513 p
.file("Cargo.toml", &basic_manifest("git", "0.5.0"))
514 .file("src/lib.rs", "")
517 VendorPackage
::new("git")
518 .file("Cargo.toml", &basic_manifest("git", "0.5.0"))
519 .file("src/lib.rs", "")
534 git = {{ git = '{0}' }}
538 ).file("src/lib.rs", "")
541 p
.cargo("build").run();
543 let mut lock1
= String
::new();
544 t
!(t
!(File
::open(p
.root().join("Cargo.lock"))).read_to_string(&mut lock1
));
546 let root
= paths
::root();
547 t
!(fs
::create_dir(&root
.join(".cargo")));
548 t
!(t
!(File
::create(root
.join(".cargo/config"))).write_all(
553 replace-with = 'my-awesome-local-registry'
555 [source.my-awesome-local-registry]
571 let mut lock2
= String
::new();
572 t
!(t
!(File
::open(p
.root().join("Cargo.lock"))).read_to_string(&mut lock2
));
573 assert_eq
!(lock1
, lock2
, "lock files changed");
577 fn git_override_requires_lockfile() {
578 VendorPackage
::new("git")
579 .file("Cargo.toml", &basic_manifest("git", "0.5.0"))
580 .file("src/lib.rs", "")
594 git = { git = 'https://example.com/' }
596 ).file("src/lib.rs", "")
599 let root
= paths
::root();
600 t
!(fs
::create_dir(&root
.join(".cargo")));
601 t
!(t
!(File
::create(root
.join(".cargo/config"))).write_all(
604 git = 'https://example.com/'
605 replace-with = 'my-awesome-local-registry'
607 [source.my-awesome-local-registry]
616 error: failed to load source for a dependency on `git`
619 Unable to update [..]
622 the source my-git-repo requires a lock file to be present first before it can be
623 used against vendored source code
625 remove the source replacement configuration, generate a lock file, and then
626 restore the source replacement configuration to continue the build
633 fn workspace_different_locations() {
646 ).file("foo/src/lib.rs", "")
647 .file("foo/vendor/baz/Cargo.toml", &basic_manifest("baz", "0.1.0"))
648 .file("foo/vendor/baz/src/lib.rs", "")
649 .file("foo/vendor/baz/.cargo-checksum.json", "{\"files\":{}}")
660 ).file("bar/src/lib.rs", "")
665 target-dir = './target'
668 replace-with = 'my-awesome-local-registry'
670 [source.my-awesome-local-registry]
671 directory = 'foo/vendor'
675 p
.cargo("build").cwd(p
.root().join("foo")).run();
677 .cwd(p
.root().join("bar"))
688 fn version_missing() {
691 VendorPackage
::new("foo")
692 .file("src/lib.rs", "pub fn foo() {}")
695 VendorPackage
::new("bar")
708 .file("src/main.rs", "fn main() {}")
711 cargo_process("install bar")
714 [INSTALLING] bar v0.1.0
715 error: failed to compile [..]
718 failed to select a version for the requirement `foo = \"^2\"`
719 candidate versions found which didn't match: 0.0.1
720 location searched: directory source `[..] (which is replacing registry `[..]`)
721 required by package `bar v0.1.0`
722 perhaps a crate was updated and forgotten to be re-vendored?