Skip to content

Commit c9ce0ec

Browse files
committed
Auto merge of #9279 - Revantus:offline_precise, r=alexcrichton
Allow `cargo update` to operate with the --offline flag Closes #9248 Limiting to `--precise` operations as the package should be cached locally prior to the usage of offline. Added an additional test to [offline.rs](tests/testsuite/offline.rs).
2 parents a908cc0 + 61a8f71 commit c9ce0ec

File tree

2 files changed

+125
-6
lines changed

2 files changed

+125
-6
lines changed

src/cargo/ops/cargo_generate_lockfile.rs

-4
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,6 @@ pub fn update_lockfile(ws: &Workspace<'_>, opts: &UpdateOptions<'_>) -> CargoRes
4444
anyhow::bail!("you can't generate a lockfile for an empty workspace.")
4545
}
4646

47-
if opts.config.offline() {
48-
anyhow::bail!("you can't update in the offline mode");
49-
}
50-
5147
// Updates often require a lot of modifications to the registry, so ensure
5248
// that we're synchronized against other Cargos.
5349
let _lock = ws.config().acquire_package_cache_lock()?;

tests/testsuite/offline.rs

+125-2
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ Caused by:
332332
}
333333

334334
#[cargo_test]
335-
fn update_offline() {
335+
fn update_offline_not_cached() {
336336
let p = project()
337337
.file(
338338
"Cargo.toml",
@@ -350,7 +350,15 @@ fn update_offline() {
350350
.build();
351351
p.cargo("update --offline")
352352
.with_status(101)
353-
.with_stderr("error: you can't update in the offline mode[..]")
353+
.with_stderr(
354+
"\
355+
[ERROR] no matching package named `bar` found
356+
location searched: registry `[..]`
357+
required by package `foo v0.0.1 ([..]/foo)`
358+
As a reminder, you're using offline mode (--offline) which can sometimes cause \
359+
surprising resolution failures, if this error is too confusing you may wish to \
360+
retry without the offline flag.",
361+
)
354362
.run();
355363
}
356364

@@ -562,3 +570,118 @@ fn offline_with_all_patched() {
562570

563571
p.cargo("check --offline").run();
564572
}
573+
574+
#[cargo_test]
575+
fn update_offline_cached() {
576+
// Cache a few versions to update against
577+
let p = project().file("src/lib.rs", "").build();
578+
let versions = ["1.2.3", "1.2.5", "1.2.9"];
579+
for vers in versions.iter() {
580+
Package::new("present_dep", vers)
581+
.file("Cargo.toml", &basic_manifest("present_dep", vers))
582+
.file(
583+
"src/lib.rs",
584+
format!(r#"pub fn get_version()->&'static str {{ "{}" }}"#, vers).as_str(),
585+
)
586+
.publish();
587+
// make package cached
588+
p.change_file(
589+
"Cargo.toml",
590+
format!(
591+
r#"
592+
[project]
593+
name = "foo"
594+
version = "0.1.0"
595+
596+
[dependencies]
597+
present_dep = "={}"
598+
"#,
599+
vers
600+
)
601+
.as_str(),
602+
);
603+
p.cargo("build").run();
604+
}
605+
606+
let p2 = project()
607+
.file(
608+
"Cargo.toml",
609+
r#"
610+
[project]
611+
name = "foo"
612+
version = "0.1.0"
613+
614+
[dependencies]
615+
present_dep = "1.2"
616+
"#,
617+
)
618+
.file(
619+
"src/main.rs",
620+
"\
621+
extern crate present_dep;
622+
fn main(){
623+
println!(\"{}\", present_dep::get_version());
624+
}",
625+
)
626+
.build();
627+
628+
p2.cargo("build --offline")
629+
.with_stderr(
630+
"\
631+
[COMPILING] present_dep v1.2.9
632+
[COMPILING] foo v0.1.0 ([CWD])
633+
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
634+
",
635+
)
636+
.run();
637+
p2.rename_run("foo", "with_1_2_9")
638+
.with_stdout("1.2.9")
639+
.run();
640+
// updates happen without updating the index
641+
p2.cargo("update -p present_dep --precise 1.2.3 --offline")
642+
.with_status(0)
643+
.with_stderr(
644+
"\
645+
[UPDATING] present_dep v1.2.9 -> v1.2.3
646+
",
647+
)
648+
.run();
649+
650+
p2.cargo("build --offline")
651+
.with_stderr(
652+
"\
653+
[COMPILING] present_dep v1.2.3
654+
[COMPILING] foo v0.1.0 ([CWD])
655+
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
656+
",
657+
)
658+
.run();
659+
p2.rename_run("foo", "with_1_2_3")
660+
.with_stdout("1.2.3")
661+
.run();
662+
663+
// Offline update should only print package details and not index updating
664+
p2.cargo("update --offline")
665+
.with_status(0)
666+
.with_stderr(
667+
"\
668+
[UPDATING] present_dep v1.2.3 -> v1.2.9
669+
",
670+
)
671+
.run();
672+
673+
// No v1.2.8 loaded into the cache so expect failure.
674+
p2.cargo("update -p present_dep --precise 1.2.8 --offline")
675+
.with_status(101)
676+
.with_stderr(
677+
"\
678+
[ERROR] no matching package named `present_dep` found
679+
location searched: registry `[..]`
680+
required by package `foo v0.1.0 ([..]/foo)`
681+
As a reminder, you're using offline mode (--offline) which can sometimes cause \
682+
surprising resolution failures, if this error is too confusing you may wish to \
683+
retry without the offline flag.
684+
",
685+
)
686+
.run();
687+
}

0 commit comments

Comments
 (0)