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] bar v0.1.0 ([..])
335 [COMPILING] bar v0.1.0
336 [COMPILING] foo v0.1.0 (CWD)
343 let mut v
= VendorPackage
::new("bar");
344 v
.file("Cargo.toml", &basic_manifest("bar", "0.1.0"));
345 v
.file("src/lib.rs", "pub fn bar() -> u32 { 1 }");
346 v
.cksum
.package
= Some(cksum
);
352 [COMPILING] bar v0.1.0
353 [COMPILING] foo v0.1.0 (CWD)
360 fn crates_io_then_bad_checksum() {
373 ).file("src/lib.rs", "")
376 Package
::new("bar", "0.1.0").publish();
378 p
.cargo("build").run();
381 VendorPackage
::new("bar")
382 .file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
383 .file("src/lib.rs", "")
390 error: checksum for `bar v0.1.0` changed between lock files
392 this could be indicative of a few possible errors:
394 * the lock file is corrupt
395 * a replacement source in use (e.g. a mirror) returned a different checksum
396 * the source itself may be corrupt in one way or another
398 unable to verify that `bar v0.1.0` is the same as when the lockfile was generated
405 fn bad_file_checksum() {
408 VendorPackage
::new("bar")
409 .file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
410 .file("src/lib.rs", "")
413 let mut f
= t
!(File
::create(paths
::root().join("index/bar/src/lib.rs")));
414 t
!(f
.write_all(b
"fn bar() -> u32 { 0 }"));
428 ).file("src/lib.rs", "")
435 error: the listed checksum of `[..]lib.rs` has changed:
439 directory sources are not intended to be edited, if modifications are \
440 required then it is recommended that [replace] is used with a forked copy of \
447 fn only_dot_files_ok() {
450 VendorPackage
::new("bar")
451 .file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
452 .file("src/lib.rs", "")
454 VendorPackage
::new("foo")
471 ).file("src/lib.rs", "")
474 p
.cargo("build").run();
478 fn random_files_ok() {
481 VendorPackage
::new("bar")
482 .file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
483 .file("src/lib.rs", "")
485 VendorPackage
::new("foo")
503 ).file("src/lib.rs", "")
506 p
.cargo("build").run();
510 fn git_lock_file_doesnt_change() {
511 let git
= git
::new("git", |p
| {
512 p
.file("Cargo.toml", &basic_manifest("git", "0.5.0"))
513 .file("src/lib.rs", "")
516 VendorPackage
::new("git")
517 .file("Cargo.toml", &basic_manifest("git", "0.5.0"))
518 .file("src/lib.rs", "")
533 git = {{ git = '{0}' }}
537 ).file("src/lib.rs", "")
540 p
.cargo("build").run();
542 let mut lock1
= String
::new();
543 t
!(t
!(File
::open(p
.root().join("Cargo.lock"))).read_to_string(&mut lock1
));
545 let root
= paths
::root();
546 t
!(fs
::create_dir(&root
.join(".cargo")));
547 t
!(t
!(File
::create(root
.join(".cargo/config"))).write_all(
552 replace-with = 'my-awesome-local-registry'
554 [source.my-awesome-local-registry]
570 let mut lock2
= String
::new();
571 t
!(t
!(File
::open(p
.root().join("Cargo.lock"))).read_to_string(&mut lock2
));
572 assert_eq
!(lock1
, lock2
, "lock files changed");
576 fn git_override_requires_lockfile() {
577 VendorPackage
::new("git")
578 .file("Cargo.toml", &basic_manifest("git", "0.5.0"))
579 .file("src/lib.rs", "")
593 git = { git = 'https://example.com/' }
595 ).file("src/lib.rs", "")
598 let root
= paths
::root();
599 t
!(fs
::create_dir(&root
.join(".cargo")));
600 t
!(t
!(File
::create(root
.join(".cargo/config"))).write_all(
603 git = 'https://example.com/'
604 replace-with = 'my-awesome-local-registry'
606 [source.my-awesome-local-registry]
615 error: failed to load source for a dependency on `git`
618 Unable to update [..]
621 the source my-git-repo requires a lock file to be present first before it can be
622 used against vendored source code
624 remove the source replacement configuration, generate a lock file, and then
625 restore the source replacement configuration to continue the build
632 fn workspace_different_locations() {
645 ).file("foo/src/lib.rs", "")
646 .file("foo/vendor/baz/Cargo.toml", &basic_manifest("baz", "0.1.0"))
647 .file("foo/vendor/baz/src/lib.rs", "")
648 .file("foo/vendor/baz/.cargo-checksum.json", "{\"files\":{}}")
659 ).file("bar/src/lib.rs", "")
664 target-dir = './target'
667 replace-with = 'my-awesome-local-registry'
669 [source.my-awesome-local-registry]
670 directory = 'foo/vendor'
674 p
.cargo("build").cwd(p
.root().join("foo")).run();
676 .cwd(p
.root().join("bar"))