1 use std
::collections
::HashMap
;
2 use std
::fs
::{self, File}
;
3 use std
::io
::prelude
::*;
8 use crate::support
::cargo_process
;
9 use crate::support
::git
;
10 use crate::support
::paths
;
11 use crate::support
::registry
::{cksum, Package}
;
12 use crate::support
::{basic_manifest, project, ProjectBuilder}
;
15 let root
= paths
::root();
16 t
!(fs
::create_dir(&root
.join(".cargo")));
17 t
!(t
!(File
::create(root
.join(".cargo/config"))).write_all(
20 replace-with = 'my-awesome-local-registry'
22 [source.my-awesome-local-registry]
28 struct VendorPackage
{
29 p
: Option
<ProjectBuilder
>,
35 package
: Option
<String
>,
36 files
: HashMap
<String
, String
>,
40 fn new(name
: &str) -> VendorPackage
{
42 p
: Some(project().at(&format
!("index/{}", name
))),
44 package
: Some(String
::new()),
45 files
: HashMap
::new(),
50 fn file(&mut self, name
: &str, contents
: &str) -> &mut VendorPackage
{
51 self.p
= Some(self.p
.take().unwrap().file(name
, contents
));
54 .insert(name
.to_string(), cksum(contents
.as_bytes()));
58 fn disable_checksum(&mut self) -> &mut VendorPackage
{
59 self.cksum
.package
= None
;
63 fn no_manifest(mut self) -> Self {
64 self.p
= self.p
.map(|pb
| pb
.no_manifest());
69 let p
= self.p
.take().unwrap();
70 let json
= serde_json
::to_string(&self.cksum
).unwrap();
71 let p
= p
.file(".cargo-checksum.json", &json
);
80 VendorPackage
::new("bar")
81 .file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
82 .file("src/lib.rs", "pub fn bar() {}")
100 "extern crate bar; pub fn foo() { bar::bar(); }",
107 [COMPILING] bar v0.1.0
108 [COMPILING] foo v0.1.0 ([CWD])
116 fn simple_install() {
119 VendorPackage
::new("foo")
120 .file("src/lib.rs", "pub fn foo() {}")
123 VendorPackage
::new("bar")
138 "extern crate foo; pub fn main() { foo::foo(); }",
142 cargo_process("install bar")
144 " Installing bar v0.1.0
147 Finished release [optimized] target(s) in [..]s
148 Installing [..]bar[..]
149 warning: be sure to add `[..]` to your PATH to be able to run the installed binaries
156 fn simple_install_fail() {
159 VendorPackage
::new("foo")
160 .file("src/lib.rs", "pub fn foo() {}")
163 VendorPackage
::new("bar")
179 "extern crate foo; pub fn main() { foo::foo(); }",
183 cargo_process("install bar")
186 " Installing bar v0.1.0
187 error: failed to compile `bar v0.1.0`, intermediate artifacts can be found at `[..]`
190 no matching package named `baz` found
191 location searched: registry `https://github.com/rust-lang/crates.io-index`
192 perhaps you meant: bar or foo
193 required by package `bar v0.1.0`
200 fn install_without_feature_dep() {
203 VendorPackage
::new("foo")
204 .file("src/lib.rs", "pub fn foo() {}")
207 VendorPackage
::new("bar")
218 baz = { version = "9.8.7", optional = true }
226 "extern crate foo; pub fn main() { foo::foo(); }",
230 cargo_process("install bar")
232 " Installing bar v0.1.0
235 Finished release [optimized] target(s) in [..]s
236 Installing [..]bar[..]
237 warning: be sure to add `[..]` to your PATH to be able to run the installed binaries
247 let _
= project().at("index").build();
264 "extern crate bar; pub fn foo() { bar::bar(); }",
272 error: no matching package named `bar` found
273 location searched: [..]
274 required by package `foo v0.1.0 ([..])`
284 VendorPackage
::new("bar-0.1.0")
285 .file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
286 .file("src/lib.rs", "pub fn bar() {}")
287 .file(".cargo-checksum", "")
290 VendorPackage
::new("bar-0.2.0")
291 .file("Cargo.toml", &basic_manifest("bar", "0.2.0"))
292 .file("src/lib.rs", "pub fn bar() {}")
293 .file(".cargo-checksum", "")
311 "extern crate bar; pub fn foo() { bar::bar(); }",
318 [COMPILING] bar v0.1.0
319 [COMPILING] foo v0.1.0 ([CWD])
327 fn crates_io_then_directory() {
343 "extern crate bar; pub fn foo() { bar::bar(); }",
347 let cksum
= Package
::new("bar", "0.1.0")
348 .file("src/lib.rs", "pub fn bar() -> u32 { 0 }")
354 [UPDATING] `[..]` index
355 [DOWNLOADING] crates ...
356 [DOWNLOADED] bar v0.1.0 ([..])
357 [COMPILING] bar v0.1.0
358 [COMPILING] foo v0.1.0 ([CWD])
366 let mut v
= VendorPackage
::new("bar");
367 v
.file("Cargo.toml", &basic_manifest("bar", "0.1.0"));
368 v
.file("src/lib.rs", "pub fn bar() -> u32 { 1 }");
369 v
.cksum
.package
= Some(cksum
);
375 [COMPILING] bar v0.1.0
376 [COMPILING] foo v0.1.0 ([CWD])
384 fn crates_io_then_bad_checksum() {
398 .file("src/lib.rs", "")
401 Package
::new("bar", "0.1.0").publish();
403 p
.cargo("build").run();
406 VendorPackage
::new("bar")
407 .file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
408 .file("src/lib.rs", "")
415 error: checksum for `bar v0.1.0` changed between lock files
417 this could be indicative of a few possible errors:
419 * the lock file is corrupt
420 * a replacement source in use (e.g., a mirror) returned a different checksum
421 * the source itself may be corrupt in one way or another
423 unable to verify that `bar v0.1.0` is the same as when the lockfile was generated
431 fn bad_file_checksum() {
434 VendorPackage
::new("bar")
435 .file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
436 .file("src/lib.rs", "")
439 let mut f
= t
!(File
::create(paths
::root().join("index/bar/src/lib.rs")));
440 t
!(f
.write_all(b
"fn bar() -> u32 { 0 }"));
455 .file("src/lib.rs", "")
462 error: the listed checksum of `[..]lib.rs` has changed:
466 directory sources are not intended to be edited, if modifications are \
467 required then it is recommended that [replace] is used with a forked copy of \
475 fn only_dot_files_ok() {
478 VendorPackage
::new("bar")
479 .file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
480 .file("src/lib.rs", "")
482 VendorPackage
::new("foo")
500 .file("src/lib.rs", "")
503 p
.cargo("build").run();
507 fn random_files_ok() {
510 VendorPackage
::new("bar")
511 .file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
512 .file("src/lib.rs", "")
514 VendorPackage
::new("foo")
533 .file("src/lib.rs", "")
536 p
.cargo("build").run();
540 fn git_lock_file_doesnt_change() {
541 let git
= git
::new("git", |p
| {
542 p
.file("Cargo.toml", &basic_manifest("git", "0.5.0"))
543 .file("src/lib.rs", "")
547 VendorPackage
::new("git")
548 .file("Cargo.toml", &basic_manifest("git", "0.5.0"))
549 .file("src/lib.rs", "")
564 git = {{ git = '{0}' }}
569 .file("src/lib.rs", "")
572 p
.cargo("build").run();
574 let mut lock1
= String
::new();
575 t
!(t
!(File
::open(p
.root().join("Cargo.lock"))).read_to_string(&mut lock1
));
577 let root
= paths
::root();
578 t
!(fs
::create_dir(&root
.join(".cargo")));
579 t
!(t
!(File
::create(root
.join(".cargo/config"))).write_all(
584 replace-with = 'my-awesome-local-registry'
586 [source.my-awesome-local-registry]
604 let mut lock2
= String
::new();
605 t
!(t
!(File
::open(p
.root().join("Cargo.lock"))).read_to_string(&mut lock2
));
606 assert_eq
!(lock1
, lock2
, "lock files changed");
610 fn git_override_requires_lockfile() {
611 VendorPackage
::new("git")
612 .file("Cargo.toml", &basic_manifest("git", "0.5.0"))
613 .file("src/lib.rs", "")
627 git = { git = 'https://example.com/' }
630 .file("src/lib.rs", "")
633 let root
= paths
::root();
634 t
!(fs
::create_dir(&root
.join(".cargo")));
635 t
!(t
!(File
::create(root
.join(".cargo/config"))).write_all(
638 git = 'https://example.com/'
639 replace-with = 'my-awesome-local-registry'
641 [source.my-awesome-local-registry]
650 error: failed to load source for a dependency on `git`
653 Unable to update [..]
656 the source my-git-repo requires a lock file to be present first before it can be
657 used against vendored source code
659 remove the source replacement configuration, generate a lock file, and then
660 restore the source replacement configuration to continue the build
668 fn workspace_different_locations() {
682 .file("foo/src/lib.rs", "")
683 .file("foo/vendor/baz/Cargo.toml", &basic_manifest("baz", "0.1.0"))
684 .file("foo/vendor/baz/src/lib.rs", "")
685 .file("foo/vendor/baz/.cargo-checksum.json", "{\"files\":{}}")
697 .file("bar/src/lib.rs", "")
702 target-dir = './target'
705 replace-with = 'my-awesome-local-registry'
707 [source.my-awesome-local-registry]
708 directory = 'foo/vendor'
713 p
.cargo("build").cwd("foo").run();
726 fn version_missing() {
729 VendorPackage
::new("foo")
730 .file("src/lib.rs", "pub fn foo() {}")
733 VendorPackage
::new("bar")
746 .file("src/main.rs", "fn main() {}")
749 cargo_process("install bar")
752 [INSTALLING] bar v0.1.0
753 error: failed to compile [..]
756 failed to select a version for the requirement `foo = \"^2\"`
757 candidate versions found which didn't match: 0.0.1
758 location searched: directory source `[..] (which is replacing registry `[..]`)
759 required by package `bar v0.1.0`
760 perhaps a crate was updated and forgotten to be re-vendored?