// except according to those terms.
extern crate toml;
-extern crate rustc_serialize;
+#[macro_use]
+extern crate serde_derive;
+extern crate serde;
use std::collections::BTreeMap;
use std::env;
"s390x-unknown-linux-gnu",
"sparc64-unknown-linux-gnu",
"wasm32-unknown-emscripten",
+ "x86_64-linux-android",
"x86_64-apple-darwin",
"x86_64-apple-ios",
"x86_64-pc-windows-gnu",
"x86_64-pc-windows-gnu",
];
+#[derive(Serialize)]
+#[serde(rename_all = "kebab-case")]
struct Manifest {
manifest_version: String,
date: String,
pkg: BTreeMap<String, Package>,
}
-#[derive(RustcEncodable)]
+#[derive(Serialize)]
struct Package {
version: String,
target: BTreeMap<String, Target>,
}
-#[derive(RustcEncodable)]
+#[derive(Serialize)]
struct Target {
available: bool,
url: Option<String>,
hash: Option<String>,
+ xz_url: Option<String>,
+ xz_hash: Option<String>,
components: Option<Vec<Component>>,
extensions: Option<Vec<Component>>,
}
-#[derive(RustcEncodable)]
+impl Target {
+ fn unavailable() -> Target {
+ Target {
+ available: false,
+ url: None,
+ hash: None,
+ xz_url: None,
+ xz_hash: None,
+ components: None,
+ extensions: None,
+ }
+ }
+}
+
+#[derive(Serialize)]
struct Component {
pkg: String,
target: String,
self.rls_version = self.version("rls", "x86_64-unknown-linux-gnu");
self.digest_and_sign();
- let Manifest { manifest_version, date, pkg } = self.build_manifest();
-
- // Unfortunately we can't use derive(RustcEncodable) here because the
- // version field is called `manifest-version`, not `manifest_version`.
- // In lieu of that just create the table directly here with a `BTreeMap`
- // and wrap it up in a `Value::Table`.
- let mut manifest = BTreeMap::new();
- manifest.insert("manifest-version".to_string(),
- toml::Value::String(manifest_version));
- manifest.insert("date".to_string(), toml::Value::String(date.clone()));
- manifest.insert("pkg".to_string(), toml::encode(&pkg));
- let manifest = toml::Value::Table(manifest).to_string();
-
+ let manifest = self.build_manifest();
let filename = format!("channel-rust-{}.toml", self.rust_release);
- self.write_manifest(&manifest, &filename);
+ self.write_manifest(&toml::to_string(&manifest).unwrap(), &filename);
let filename = format!("channel-rust-{}-date.txt", self.rust_release);
- self.write_date_stamp(&date, &filename);
+ self.write_date_stamp(&manifest.date, &filename);
if self.rust_release != "beta" && self.rust_release != "nightly" {
- self.write_manifest(&manifest, "channel-rust-stable.toml");
- self.write_date_stamp(&date, "channel-rust-stable-date.txt");
+ self.write_manifest(&toml::to_string(&manifest).unwrap(), "channel-rust-stable.toml");
+ self.write_date_stamp(&manifest.date, "channel-rust-stable-date.txt");
}
}
let digest = match self.digests.remove(&filename) {
Some(digest) => digest,
None => {
- pkg.target.insert(host.to_string(), Target {
- available: false,
- url: None,
- hash: None,
- components: None,
- extensions: None,
- });
+ pkg.target.insert(host.to_string(), Target::unavailable());
continue
}
};
+ let xz_filename = filename.replace(".tar.gz", ".tar.xz");
+ let xz_digest = self.digests.remove(&xz_filename);
let mut components = Vec::new();
let mut extensions = Vec::new();
pkg.target.insert(host.to_string(), Target {
available: true,
- url: Some(self.url("rust", host)),
+ url: Some(self.url(&filename)),
hash: Some(digest),
+ xz_url: xz_digest.as_ref().map(|_| self.url(&xz_filename)),
+ xz_hash: xz_digest,
components: Some(components),
extensions: Some(extensions),
});
let filename = self.filename(pkgname, name);
let digest = match self.digests.remove(&filename) {
Some(digest) => digest,
- None => {
- return (name.to_string(), Target {
- available: false,
- url: None,
- hash: None,
- components: None,
- extensions: None,
- })
- }
+ None => return (name.to_string(), Target::unavailable()),
};
+ let xz_filename = filename.replace(".tar.gz", ".tar.xz");
+ let xz_digest = self.digests.remove(&xz_filename);
(name.to_string(), Target {
available: true,
- url: Some(self.url(pkgname, name)),
+ url: Some(self.url(&filename)),
hash: Some(digest),
+ xz_url: xz_digest.as_ref().map(|_| self.url(&xz_filename)),
+ xz_hash: xz_digest,
components: None,
extensions: None,
})
});
}
- fn url(&self, component: &str, target: &str) -> String {
+ fn url(&self, filename: &str) -> String {
format!("{}/{}/{}",
self.s3_address,
self.date,
- self.filename(component, target))
+ filename)
}
fn filename(&self, component: &str, target: &str) -> String {