diff --git a/src/rustup/config.rs b/src/rustup/config.rs index 4ed3fd55f1..916eb19b3e 100644 --- a/src/rustup/config.rs +++ b/src/rustup/config.rs @@ -277,17 +277,29 @@ impl Cfg { pub fn update_all_channels(&self) -> Result)>> { let toolchains = try!(self.list_toolchains()); - let updates = toolchains.into_iter() - .map(|name| { - let result = self.get_toolchain(&name, true) - .and_then(|t| t.install_from_dist()); - if let Err(ref e) = result { + // Convert the toolchain strings to Toolchain values + let toolchains = toolchains.into_iter(); + let toolchains = toolchains.map(|n| (n.clone(), self.get_toolchain(&n, true))); + + // Filter out toolchains that don't track a release channel + let toolchains = toolchains.filter(|&(_, ref t)| { + t.as_ref().map(|t| t.is_tracking()).unwrap_or(false) + }); + + // Update toolchains and collect the results + let toolchains = toolchains.map(|(n, t)| { + let t = t.and_then(|t| { + let t = t.install_from_dist(); + if let Err(ref e) = t { self.notify_handler.call(Notification::NonFatalError(e)); } - (name, result) - }).collect(); + t + }); - Ok(updates) + (n, t) + }); + + Ok(toolchains.collect()) } pub fn check_metadata_version(&self) -> Result<()> { diff --git a/tests/cli-rustup.rs b/tests/cli-rustup.rs index 12e7072843..1de82ced7c 100644 --- a/tests/cli-rustup.rs +++ b/tests/cli-rustup.rs @@ -438,3 +438,18 @@ fn show_toolchain_env_not_installed() { assert!(stderr.starts_with("error: toolchain 'nightly' is not installed\n")); }); } + +// #422 +#[test] +fn update_doesnt_update_non_tracking_channels() { + setup(&|config| { + expect_ok(config, &["rustup", "default", "nightly"]); + expect_ok(config, &["rustup", "update", "nightly-2015-01-01"]); + let mut cmd = clitools::cmd(config, "rustup", &["update"]); + clitools::env(config, &mut cmd); + let out = cmd.output().unwrap(); + let stderr = String::from_utf8(out.stderr).unwrap(); + assert!(!stderr.contains( + for_host!("syncing channel updates for 'nightly-2015-01-01-{}'"))); + }); +}