From 4be916acda402869c62b33e4e2c0dc600230bb46 Mon Sep 17 00:00:00 2001 From: Onur Aslan Date: Sun, 17 Feb 2019 15:04:09 +0300 Subject: [PATCH] Get rid of old files --- Cargo.lock | 3091 ------------------------- Cargo.toml | 56 - README.md | 153 -- Vagrantfile | 153 -- azure-pipelines.yml | 101 - build.rs | 51 - rustfmt.toml | 2 - src/bin/cratesfyi.rs | 248 -- src/db/add_package.rs | 456 ---- src/db/file.rs | 177 -- src/db/mod.rs | 215 -- src/docbuilder/chroot_builder.rs | 505 ---- src/docbuilder/crates.rs | 85 - src/docbuilder/metadata.rs | 186 -- src/docbuilder/mod.rs | 117 - src/docbuilder/options.rs | 113 - src/docbuilder/queue.rs | 100 - src/error.rs | 7 - src/lib.rs | 51 - src/utils/build_doc.rs | 240 -- src/utils/copy.rs | 124 - src/utils/daemon.rs | 174 -- src/utils/github_updater.rs | 185 -- src/utils/html.rs | 74 - src/utils/mod.rs | 19 - src/utils/pubsubhubbub.rs | 22 - src/utils/release_activity_updater.rs | 78 - src/utils/rustc_version.rs | 47 - src/web/badge/Cargo.toml | 15 - src/web/badge/DejaVuSans.ttf | Bin 756072 -> 0 bytes src/web/badge/LICENSE | 70 - src/web/badge/badge.rs | 171 -- src/web/builds.rs | 140 -- src/web/crate_details.rs | 242 -- src/web/error.rs | 68 - src/web/file.rs | 80 - src/web/mod.rs | 541 ----- src/web/opensearch.xml | 6 - src/web/page.rs | 101 - src/web/pool.rs | 29 - src/web/releases.rs | 581 ----- src/web/rustdoc.rs | 273 --- src/web/sitemap.rs | 49 - src/web/source.rs | 251 -- templates/about.hbs | 130 -- templates/builds.hbs | 43 - templates/crate_details.hbs | 78 - templates/error.hbs | 2 - templates/footer.hbs | 3 - templates/header.hbs | 26 - templates/navigation.hbs | 82 - templates/navigation_rustdoc.hbs | 102 - templates/releases.hbs | 66 - templates/releases_activity.hbs | 41 - templates/releases_feed.hbs | 21 - templates/releases_queue.hbs | 22 - templates/rustdoc.hbs | 17 - templates/sitemap.hbs | 9 - templates/source.hbs | 38 - templates/style.scss | 728 ------ 60 files changed, 10855 deletions(-) delete mode 100644 Cargo.lock delete mode 100644 Cargo.toml delete mode 100644 README.md delete mode 100644 Vagrantfile delete mode 100644 azure-pipelines.yml delete mode 100644 build.rs delete mode 100644 rustfmt.toml delete mode 100644 src/bin/cratesfyi.rs delete mode 100644 src/db/add_package.rs delete mode 100644 src/db/file.rs delete mode 100644 src/db/mod.rs delete mode 100644 src/docbuilder/chroot_builder.rs delete mode 100644 src/docbuilder/crates.rs delete mode 100644 src/docbuilder/metadata.rs delete mode 100644 src/docbuilder/mod.rs delete mode 100644 src/docbuilder/options.rs delete mode 100644 src/docbuilder/queue.rs delete mode 100644 src/error.rs delete mode 100644 src/lib.rs delete mode 100644 src/utils/build_doc.rs delete mode 100644 src/utils/copy.rs delete mode 100644 src/utils/daemon.rs delete mode 100644 src/utils/github_updater.rs delete mode 100644 src/utils/html.rs delete mode 100644 src/utils/mod.rs delete mode 100644 src/utils/pubsubhubbub.rs delete mode 100644 src/utils/release_activity_updater.rs delete mode 100644 src/utils/rustc_version.rs delete mode 100644 src/web/badge/Cargo.toml delete mode 100644 src/web/badge/DejaVuSans.ttf delete mode 100644 src/web/badge/LICENSE delete mode 100644 src/web/badge/badge.rs delete mode 100644 src/web/builds.rs delete mode 100644 src/web/crate_details.rs delete mode 100644 src/web/error.rs delete mode 100644 src/web/file.rs delete mode 100644 src/web/mod.rs delete mode 100644 src/web/opensearch.xml delete mode 100644 src/web/page.rs delete mode 100644 src/web/pool.rs delete mode 100644 src/web/releases.rs delete mode 100644 src/web/rustdoc.rs delete mode 100644 src/web/sitemap.rs delete mode 100644 src/web/source.rs delete mode 100644 templates/about.hbs delete mode 100644 templates/builds.hbs delete mode 100644 templates/crate_details.hbs delete mode 100644 templates/error.hbs delete mode 100644 templates/footer.hbs delete mode 100644 templates/header.hbs delete mode 100644 templates/navigation.hbs delete mode 100644 templates/navigation_rustdoc.hbs delete mode 100644 templates/releases.hbs delete mode 100644 templates/releases_activity.hbs delete mode 100644 templates/releases_feed.hbs delete mode 100644 templates/releases_queue.hbs delete mode 100644 templates/rustdoc.hbs delete mode 100644 templates/sitemap.hbs delete mode 100644 templates/source.hbs delete mode 100644 templates/style.scss diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index 762758a4c..000000000 --- a/Cargo.lock +++ /dev/null @@ -1,3091 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -[[package]] -name = "adler32" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "aho-corasick" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "memchr 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ansi_term" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "antidote" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "approx" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "arrayref" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "arrayvec" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "atty" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "backtrace" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "backtrace-sys" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "badge" -version = "0.2.0" -dependencies = [ - "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rusttype 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "base64" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "base64" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "bitflags" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "bitflags" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "block-buffer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "bodyparser" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "iron 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "persistent 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "buf_redux" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "build_const" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "byte-tools" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "byteorder" -version = "1.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "bytes" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "bytesize" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "cargo" -version = "0.35.0" -source = "git+https://github.com/rust-lang/cargo.git#9f1f786c94468809cf772c4a8e14ffa8e10ebbca" -dependencies = [ - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "bytesize 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", - "core-foundation 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crates-io 0.23.0 (git+https://github.com/rust-lang/cargo.git)", - "crossbeam-utils 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crypto-hash 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "curl 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", - "curl-sys 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "filetime 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "flate2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fs2 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fwdansi 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "git2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "git2-curl 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "home 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ignore 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "im-rc 12.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jobserver 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "libgit2-sys 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "miow 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "opener 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-workspace-hack 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustfix 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "same-file 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_ignored 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", - "shell-escape 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tar 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "url_serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "cc" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "cfg-if" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "clap" -version = "2.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "commoncrypto" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "commoncrypto-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "commoncrypto-sys" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "comrak" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "entities 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "pest_derive 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "twoway 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "typed-arena 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode_categories 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "conduit-mime-types" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "constant_time_eq" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "core-foundation" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "core-foundation" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "core-foundation-sys" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "core-foundation-sys" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "crates-index-diff" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "git2 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crates-io" -version = "0.23.0" -source = "git+https://github.com/rust-lang/cargo.git#9f1f786c94468809cf772c4a8e14ffa8e10ebbca" -dependencies = [ - "curl 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "cratesfyi" -version = "0.6.0" -dependencies = [ - "badge 0.2.0", - "cargo 0.35.0 (git+https://github.com/rust-lang/cargo.git)", - "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", - "comrak 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crates-index-diff 4.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "git2 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)", - "handlebars-iron 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)", - "html5ever 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)", - "iron 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "magic 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "params 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "postgres 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "r2d2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "r2d2_postgres 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "reqwest 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", - "router 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "sass-rs 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slug 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "staticfile 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crc" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-channel" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-epoch 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-deque" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-epoch 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-utils" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "crossbeam-utils" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crypto-hash" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "commoncrypto 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crypto-mac" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "curl" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "curl-sys 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.37 (registry+https://github.com/rust-lang/crates.io-index)", - "schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "curl-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "libnghttp2-sys 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libz-sys 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.37 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "digest" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "dtoa" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "dtoa" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "encoding_rs" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "entities" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "env_logger" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "error" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "failure" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "failure_derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.11 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "fallible-iterator" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "filetime" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "filetime" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "flate2" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "libz-sys 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", - "miniz-sys 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "fnv" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "fs2" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "futf" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "futures" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "futures-cpupool" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "fwdansi" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "memchr 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "generic-array" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "git2" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "libgit2-sys 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.37 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "git2" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "libgit2-sys 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.37 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "git2-curl" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "curl 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", - "git2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "glob" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "globset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aho-corasick 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "h2" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "string 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "handlebars" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "pest 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "handlebars-iron" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "handlebars 0.24.2 (registry+https://github.com/rust-lang/crates.io-index)", - "iron 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "hex" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "hex" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "hmac" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crypto-mac 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "home" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "html5ever" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "markup5ever 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.13.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "http" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "httparse" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "humantime" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "hyper" -version = "0.10.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "hyper" -version = "0.12.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "hyper-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.11 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "idna" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ignore" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-channel 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "globset 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "same-file 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 2.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "im-rc" -version = "12.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "indexmap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "iovec" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "iron" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "conduit-mime-types 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "error 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "modifier 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "itoa" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "itoa" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "jobserver" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "language-tags" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "lazy_static" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "lazy_static" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "lazycell" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "libc" -version = "0.2.43" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "libflate" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "libgit2-sys" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "curl-sys 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "libssh2-sys 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libz-sys 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.37 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "libnghttp2-sys" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "libssh2-sys" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "libz-sys 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.37 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "libz-sys" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "lock_api" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "log" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "log" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "mac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "magic" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "magic-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "magic-sys" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "markup5ever" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache_codegen 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tendril 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "matches" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "md5" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "memchr" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "memchr" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "memchr" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "memoffset" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "mime" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "mime" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "mime_guess" -version = "1.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "mime_guess" -version = "2.0.0-alpha.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "mime 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "miniz-sys" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "mio" -version = "0.6.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "mio-uds" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "miow" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "miow" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "modifier" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "mount" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "iron 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sequence_trie 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "multipart" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "buf_redux 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mime_guess 1.8.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "native-tls" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.37 (registry+https://github.com/rust-lang/crates.io-index)", - "schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "net2" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "nodrop" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "num" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-bigint 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)", - "num-complex 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", - "num-rational 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "num-bigint" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "num-complex" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "num-integer" -version = "0.1.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "num-iter" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "num-rational" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-bigint 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)", - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "num-traits" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "num-traits" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "num_cpus" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "opener" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "openssl" -version = "0.10.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.37 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "openssl-probe" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "openssl-sys" -version = "0.9.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ordered-float" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "owning_ref" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "params" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bodyparser 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "iron 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "multipart 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "urlencoded 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "parking_lot" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lock_api 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "parking_lot_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "percent-encoding" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "persistent" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "iron 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "pest" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "pest" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "pest_derive" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "phf" -version = "0.7.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "phf_codegen" -version = "0.7.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "phf_generator 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "phf_generator" -version = "0.7.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "phf_shared" -version = "0.7.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "pkg-config" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "plugin" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "postgres" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "fallible-iterator 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "postgres-protocol 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "postgres-shared 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "postgres-protocol" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "fallible-iterator 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hmac 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "md5 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stringprep 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "postgres-shared" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "fallible-iterator 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "hex 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", - "postgres-protocol 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "proc-macro2" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "proc-macro2" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "quick-error" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "quote" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "quote" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "quote" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "r2d2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "scheduled-thread-pool 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "r2d2_postgres" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "postgres 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", - "postgres-shared 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "r2d2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "redox_syscall" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "redox_termios" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aho-corasick 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "utf8-ranges 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aho-corasick 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "utf8-ranges 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex-syntax" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex-syntax" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "remove_dir_all" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "reqwest" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "encoding_rs 0.8.10 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.11 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper-tls 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libflate 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mime 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_urlencoded 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "uuid 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "route-recognizer" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "router" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "iron 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "route-recognizer 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "rustc-serialize" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "rustc-workspace-hack" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rustfix" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rusttype" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "approx 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "ordered-float 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stb_truetype 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ryu" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "safemem" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "safemem" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "same-file" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "sass-rs" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "sass-sys 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "sass-sys" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "schannel" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "scheduled-thread-pool" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "scopeguard" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "security-framework" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "security-framework-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "sequence_trie" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "serde" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "serde" -version = "1.0.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_derive" -version = "1.0.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_ignored" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_json" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "dtoa 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_json" -version = "1.0.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_urlencoded" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "sha2" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "block-buffer 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", - "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "shell-escape" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "siphasher" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "slab" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "slug" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unidecode 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "smallvec" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "socket2" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stable_deref_trait" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "staticfile" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "filetime 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", - "iron 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "mount 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stb_truetype" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "string" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "string_cache" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", - "precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache_codegen 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "string_cache_codegen" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "phf_generator 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "string_cache_shared" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "stringprep" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "strsim" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "syn" -version = "0.11.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "syn" -version = "0.13.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "syn" -version = "0.15.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "synom" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "synstructure" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.11 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tar" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "filetime 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tempdir" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tempfile" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tendril" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "utf-8 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "termcolor" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "termion" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "textwrap" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "thread_local" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "time" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-current-thread 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-fs 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-udp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-uds 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-codec" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-current-thread" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-executor" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-fs" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-io" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-reactor" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-tcp" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-threadpool" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-deque 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-timer" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-udp" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tokio-uds" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "toml" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "traitobject" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "try-lock" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "twoway" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "memchr 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "typeable" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "typed-arena" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "typemap" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unsafe-any 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "typenum" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "ucd-util" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unicase" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "unicase" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "unicode-normalization" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unicode-width" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unicode-xid" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unidecode" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unreachable" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "unsafe-any" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "url" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "url_serde" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "urlencoded" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bodyparser 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "iron 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "utf-8" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "utf8-ranges" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "uuid" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "vcpkg" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "vec_map" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "version_check" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "walkdir" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "walkdir" -version = "2.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "same-file 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "want" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi-util" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "wincolor" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ws2_32-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[metadata] -"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" -"checksum aho-corasick 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "68f56c7353e5a9547cbd76ed90f7bb5ffc3ba09d4ea9bd1d8c06c8b1142eeb5a" -"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -"checksum antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34fde25430d87a9388dadbe6e34d7f72a462c8b43ac8d309b42b0a8505d7e2a5" -"checksum approx 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f71f10b5c4946a64aad7b8cf65e3406cd3da22fc448595991d22423cf6db67b4" -"checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" -"checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" -"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" -"checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a" -"checksum backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c66d56ac8dabd07f6aacdaf633f4b8262f5b3601a810a0dcddffd5c22c69daa0" -"checksum base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9" -"checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" -"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" -"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" -"checksum block-buffer 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a076c298b9ecdb530ed9d967e74a6027d6a7478924520acddcddc24c1c8ab3ab" -"checksum bodyparser 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6928e817538b74a73d1dd6e9a942a2a35c632a597b6bb14fd009480f859a6bf5" -"checksum buf_redux 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "861b9d19b9f5cb40647242d10d0cb0a13de0a96d5ff8c8a01ea324fa3956eb7d" -"checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" -"checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" -"checksum byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "90492c5858dd7d2e78691cfb89f90d273a2800fc11d98f60786e5d87e2f83781" -"checksum bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "0ce55bd354b095246fc34caf4e9e242f5297a7fd938b090cadfea6eee614aa62" -"checksum bytesize 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "716960a18f978640f25101b5cbf1c6f6b0d3192fab36a2d98ca96f0ecbe41010" -"checksum cargo 0.35.0 (git+https://github.com/rust-lang/cargo.git)" = "" -"checksum cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "f159dfd43363c4d08055a07703eb7a3406b0dac4d0584d96965a3262db3c9d16" -"checksum cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4e7bb64a8ebb0d856483e1e682ea3422f883c5f5615a90d51a2c82fe87fdd3" -"checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum commoncrypto 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d056a8586ba25a1e4d61cb090900e495952c7886786fc55f909ab2f819b69007" -"checksum commoncrypto-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1fed34f46747aa73dfaa578069fd8279d2818ade2b55f38f22a9401c7f4083e2" -"checksum comrak 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a9bd60be8877a3343d25b9a3dadbaf7f02f9ac843b54e663ecef73e29e8b9c6b" -"checksum conduit-mime-types 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "95ca30253581af809925ef68c2641cc140d6183f43e12e0af4992d53768bd7b8" -"checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" -"checksum core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "286e0b41c3a20da26536c6000a280585d519fd07b3956b43aed8a79e9edce980" -"checksum core-foundation 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "58667b9a618a37ea8c4c4cb5298703e5dfadcd3698c79f54fc43e6a2e94733ea" -"checksum core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa" -"checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" -"checksum crates-index-diff 4.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0bd2579b790a03abb6ffcffbc0d1ac9cb00acd545ef8e5887b464a580131660a" -"checksum crates-io 0.23.0 (git+https://github.com/rust-lang/cargo.git)" = "" -"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" -"checksum crossbeam-channel 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7b85741761b7f160bc5e7e0c14986ef685b7f8bf9b7ad081c60c604bb4649827" -"checksum crossbeam-deque 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3486aefc4c0487b9cb52372c97df0a48b8c249514af1ee99703bf70d2f2ceda1" -"checksum crossbeam-epoch 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "30fecfcac6abfef8771151f8be4abc9e4edc112c2bcb233314cafde2680536e9" -"checksum crossbeam-epoch 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c90f1474584f38e270b5b613e898c8c328aa4f3dea85e0a27ac2e642f009416" -"checksum crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "677d453a17e8bd2b913fa38e8b9cf04bcdbb5be790aa294f2389661d72036015" -"checksum crossbeam-utils 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c55913cc2799171a550e307918c0a360e8c16004820291bf3b638969b4a01816" -"checksum crypto-hash 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "09de9ee0fc255ace04c7fa0763c9395a945c37c8292bb554f8d48361d1dcf1b4" -"checksum crypto-mac 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0999b4ff4d3446d4ddb19a63e9e00c1876e75cd7000d20e57a693b4b3f08d958" -"checksum curl 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)" = "c7c9d851c825e0c033979d4516c9173bc19a78a96eb4d6ae51d4045440eafa16" -"checksum curl-sys 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)" = "721c204978be2143fab0a84b708c49d79d1f6100b8785610f456043a90708870" -"checksum digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "03b072242a8cbaf9c145665af9d250c59af3b958f83ed6824e13533cf76d5b90" -"checksum dtoa 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0dd841b58510c9618291ffa448da2e4e0f699d984d436122372f446dae62263d" -"checksum dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d301140eb411af13d3115f9a562c85cc6b541ade9dfa314132244aaee7489dd" -"checksum encoding_rs 0.8.10 (registry+https://github.com/rust-lang/crates.io-index)" = "065f4d0c826fdaef059ac45487169d918558e3cf86c9d89f6e81cf52369126e5" -"checksum entities 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5320ae4c3782150d900b79807611a59a99fc9a1d61d686faafc24b93fc8d7ca" -"checksum env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "afb070faf94c85d17d50ca44f6ad076bce18ae92f0037d350947240a36e9d42e" -"checksum error 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "a6e606f14042bb87cc02ef6a14db6c90ab92ed6f62d87e69377bc759fd7987cc" -"checksum failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6dd377bcc1b1b7ce911967e3ec24fa19c3224394ec05b54aa7b083d498341ac7" -"checksum failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "64c2d913fe8ed3b6c6518eedf4538255b989945c14c2a7d5cbff62a5e2120596" -"checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" -"checksum fallible-iterator 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea79295a7a3e0d77f19e763cf1fe7189cd95fc2b36735ea0ea6b711a7380f509" -"checksum filetime 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "714653f3e34871534de23771ac7b26e999651a0a228f47beb324dfdf1dd4b10f" -"checksum filetime 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "da4b9849e77b13195302c174324b5ba73eec9b236b24c221a61000daefb95c5f" -"checksum flate2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4af030962d89d62aa52cd9492083b1cd9b2d1a77764878102a6c0f86b4d5444d" -"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" -"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" -"checksum fs2 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" -"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" -"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b" -"checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" -"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" -"checksum fwdansi 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34dd4c507af68d37ffef962063dfa1944ce0dd4d5b82043dbab1dabe088610c3" -"checksum generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef25c5683767570c2bbd7deba372926a55eaae9982d7726ee2a1050239d45b9d" -"checksum git2 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "591f8be1674b421644b6c030969520bc3fa12114d2eb467471982ed3e9584e71" -"checksum git2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c7339329bfa14a00223244311560d11f8f489b453fb90092af97f267a6090ab0" -"checksum git2-curl 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d58551e903ed7e2d6fe3a2f3c7efa3a784ec29b19d0fbb035aaf0497c183fbdd" -"checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" -"checksum globset 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4743617a7464bbda3c8aec8558ff2f9429047e025771037df561d383337ff865" -"checksum h2 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "a27e7ed946e8335bdf9a191bc1b9b14a03ba822d013d2f58437f4fabcbd7fc2c" -"checksum handlebars 0.24.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1060eaf359ded4fc5827db4591949fff18b0b736821c94c347a441d7019c2545" -"checksum handlebars-iron 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6b8e885e22dfcf8fbb0ce797cb402b82b6cafea35100a42790bd84c32b718040" -"checksum hex 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d6a22814455d41612f41161581c2883c0c6a1c41852729b17d5ed88f01e153aa" -"checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" -"checksum hmac 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44f3bdb08579d99d7dc761c0e266f13b5f2ab8c8c703b9fc9ef333cd8f48f55e" -"checksum home 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "80dff82fb58cfbbc617fb9a9184b010be0529201553cda50ad04372bc2333aff" -"checksum html5ever 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b04478cf718862650a0bf66acaf8f2f8c906fbc703f35c916c1f4211b069a364" -"checksum http 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "24f58e8c2d8e886055c3ead7b28793e1455270b5fb39650984c224bc538ba581" -"checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" -"checksum humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0484fda3e7007f2a4a0d9c3a703ca38c71c54c55602ce4660c419fd32e188c9e" -"checksum hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "368cb56b2740ebf4230520e2b90ebb0461e69034d85d1945febd9b3971426db2" -"checksum hyper 0.12.11 (registry+https://github.com/rust-lang/crates.io-index)" = "78d50abbd1790e0f4c74cb1d4a2211b439bac661d54107ad5564c55e77906762" -"checksum hyper-tls 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "32cd73f14ad370d3b4d4b7dce08f69b81536c82e39fcc89731930fe5788cd661" -"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -"checksum ignore 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "36ecfc5ad80f0b1226df948c562e2cddd446096be3f644c95106400eae8a5e01" -"checksum im-rc 12.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4591152fd573cf453a890b5f9fdc5c328a751a0785539316739d5f85e5c468c" -"checksum indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08173ba1e906efb6538785a8844dd496f5d34f0a2d88038e95195172fc667220" -"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" -"checksum iron 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2440ae846e7a8c7f9b401db8f6e31b4ea5e7d3688b91761337da7e054520c75b" -"checksum itoa 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ae3088ea4baeceb0284ee9eea42f591226e6beaecf65373e41b38d95a1b8e7a1" -"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" -"checksum jobserver 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "60af5f849e1981434e4a31d3d782c4774ae9b434ce55b101a96ecfd09147e8be" -"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -"checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" -"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" -"checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" -"checksum lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddba4c30a78328befecec92fc94970e53b3ae385827d28620f0f5bb2493081e0" -"checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d" -"checksum libflate 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "21138fc6669f438ed7ae3559d5789a5f0ba32f28c1f0608d1e452b0bb06ee936" -"checksum libgit2-sys 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)" = "48441cb35dc255da8ae72825689a95368bf510659ae1ad55dc4aa88cb1789bf1" -"checksum libnghttp2-sys 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ffbfb81475cc9f625e44f3a8f8b9cf7173815ae1c7cc2fa91853ec009e38198" -"checksum libssh2-sys 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "126a1f4078368b163bfdee65fbab072af08a1b374a5551b21e87ade27b1fbf9d" -"checksum libz-sys 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)" = "4401fe74560a0d46fce3464625ac8aa7a79d291dd28cee021d18852d5191c280" -"checksum lock_api 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775751a3e69bde4df9b38dd00a1b5d6ac13791e4223d4a0506577f0dd27cfb7a" -"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" -"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" -"checksum mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" -"checksum magic 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "96f74caec41a12630bb8fd9546530a41addb720eb0c10593855f59ce96a779aa" -"checksum magic-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17442cc60e34d501588c95bc976da04b6a87c51ab02370e95e1c2893a52df16c" -"checksum markup5ever 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfedc97d5a503e96816d10fedcd5b42f760b2e525ce2f7ec71f6a41780548475" -"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" -"checksum md5 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "79c56d6a0b07f9e19282511c83fc5b086364cbae4ba8c7d5f190c3d9b0425a48" -"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20" -"checksum memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "148fab2e51b4f1cfc66da2a7c32981d1d3c083a803978268bb11fe4b86925e7a" -"checksum memchr 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b3629fe9fdbff6daa6c33b90f7c08355c1aca05a3d01fa8063b822fcf185f3b" -"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" -"checksum mime 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "4b082692d3f6cf41b453af73839ce3dfc212c4411cbb2441dff80a716e38bd79" -"checksum mime_guess 1.8.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2d4c0961143b8efdcfa29c3ae63281601b446a4a668165454b6c90f8024954c5" -"checksum mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30de2e4613efcba1ec63d8133f344076952090c122992a903359be5a4f99c3ed" -"checksum miniz-sys 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "609ce024854aeb19a0ef7567d348aaa5a746b32fb72e336df7fcc16869d7e2b4" -"checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" -"checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" -"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" -"checksum miow 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "396aa0f2003d7df8395cb93e09871561ccc3e785f0acb369170e8cc74ddf9226" -"checksum modifier 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41f5c9112cb662acd3b204077e0de5bc66305fa8df65c8019d5adb10e9ab6e58" -"checksum mount 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "32245731923cd096899502fc4c4317cfd09f121e80e73f7f576cf3777a824256" -"checksum multipart 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b16d6498fe5b0c2f6d973fd9753da099948834f96584d628e44a75f0d2955b03" -"checksum native-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8b0a7bd714e83db15676d31caf968ad7318e9cc35f93c85a90231c8f22867549" -"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" -"checksum new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0cdc457076c78ab54d5e0d6fa7c47981757f1e34dc39ff92787f217dede586c4" -"checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" -"checksum num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "4703ad64153382334aa8db57c637364c322d3372e097840c72000dabdcf6156e" -"checksum num-bigint 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)" = "e63899ad0da84ce718c14936262a41cee2c79c981fc0a0e7c7beb47d5a07e8c1" -"checksum num-complex 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "b288631d7878aaf59442cffd36910ea604ecd7745c36054328595114001c9656" -"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" -"checksum num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "af3fdbbc3291a5464dc57b03860ec37ca6bf915ed6ee385e7c6c052c422b2124" -"checksum num-rational 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ee314c74bd753fc86b4780aa9475da469155f3848473a261d2d18e35245a784e" -"checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" -"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" -"checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" -"checksum opener 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "176cd8eadff5ef9fa5c6d19452535662c02c6bf29b3d594a3fc01f749bb24c94" -"checksum openssl 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "5af9e83eb3c51ee806387d26a43056f3246d865844caa6dd704d2ba7e831c264" -"checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" -"checksum openssl-sys 0.9.37 (registry+https://github.com/rust-lang/crates.io-index)" = "d4edbc8dfa63f557aee3a498179af2cc6a989e12ba1751840046c79afc9e615a" -"checksum ordered-float 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2f0015e9e8e28ee20c581cfbfe47c650cedeb9ed0721090e0b7ebb10b9cdbcc2" -"checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" -"checksum params 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "421e9f2c30e80365c9672709be664bfc84f73b088720d1cc1f4e99675814bb37" -"checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" -"checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" -"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" -"checksum persistent 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c9c94f2ef72dc272c6bcc8157ccf2bc7da14f4c58c69059ac2fc48492d6916" -"checksum pest 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0a6dda33d67c26f0aac90d324ab2eb7239c819fc7b2552fe9faa4fe88441edc8" -"checksum pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0fce5d8b5cc33983fc74f78ad552b5522ab41442c4ca91606e4236eb4b5ceefc" -"checksum pest_derive 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3294f437119209b084c797604295f40227cffa35c57220b1e99a6ff3bf8ee4" -"checksum phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "cb325642290f28ee14d8c6201159949a872f220c62af6e110a56ea914fbe42fc" -"checksum phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d62594c0bb54c464f633175d502038177e90309daf2e0158be42ed5f023ce88f" -"checksum phf_generator 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "6b07ffcc532ccc85e3afc45865469bf5d9e4ef5bfcf9622e3cfe80c2d275ec03" -"checksum phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "07e24b0ca9643bdecd0632f2b3da6b1b89bbb0030e0b992afc1113b23a7bc2f2" -"checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" -"checksum plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1a6a0dc3910bc8db877ffed8e457763b317cf880df4ae19109b9f77d277cf6e0" -"checksum postgres 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "115dde90ef51af573580c035857badbece2aa5cde3de1dfb3c932969ca92a6c5" -"checksum postgres-protocol 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2487e66455bf88a1b247bf08a3ce7fe5197ac6d67228d920b0ee6a0e97fd7312" -"checksum postgres-shared 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bafecadf25b7de9a5f747e93073db444c9ddcc7b3ae37bcdf63c2508f9a17f2d" -"checksum precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" -"checksum proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1b06e2f335f48d24442b35a19df506a835fb3547bc3c06ef27340da9acf5cae7" -"checksum proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)" = "3d7b7eaaa90b4a90a932a9ea6666c95a389e424eff347f0f793979289429feee" -"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" -"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" -"checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8" -"checksum quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dd636425967c33af890042c483632d33fa7a18f19ad1d7ea72e8998c6ef8dea5" -"checksum r2d2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f9078ca6a8a5568ed142083bb2f7dc9295b69d16f867ddcc9849e51b17d8db46" -"checksum r2d2_postgres 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "78c7fe9c0c3d2c298cf262bc3ce4b89cdf0eab620fd9fe759f65b34a1a00fb93" -"checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" -"checksum rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8356f47b32624fef5b3301c1be97e5944ecdd595409cc5da11d05f211db6cfbd" -"checksum rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e464cd887e869cddcae8792a4ee31d23c7edd516700695608f5b98c67ee0131c" -"checksum rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1961a422c4d189dfb50ffa9320bf1f2a9bd54ecb92792fb9477f99a1045f3372" -"checksum rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0905b6b7079ec73b314d4c748701f6931eb79fd97c668caa3f1899b22b32c6db" -"checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" -"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9329abc99e39129fcceabd24cf5d85b4671ef7c29c50e972bc5afe32438ec384" -"checksum regex 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2069749032ea3ec200ca51e4a31df41759190a88edca0d2d86ee8bedf7073341" -"checksum regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7" -"checksum regex-syntax 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "747ba3b235651f6e2f67dfa8bcdcd073ddb7c243cb21c442fc12395dfcac212d" -"checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" -"checksum reqwest 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1d68c7bf0b1dc3860b80c6d31d05808bf54cdc1bfc70a4680893791becd083ae" -"checksum route-recognizer 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3255338088df8146ba63d60a9b8e3556f1146ce2973bc05a75181a42ce2256" -"checksum router 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9b1797ff166029cb632237bb5542696e54961b4cf75a324c6f05c9cf0584e4e" -"checksum rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "bcfe5b13211b4d78e5c2cadfebd7769197d95c639c35a50057eb4c05de811395" -"checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" -"checksum rustc-workspace-hack 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc71d2faa173b74b232dedc235e3ee1696581bb132fc116fa3626d6151a1a8fb" -"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum rustfix 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "af7c21531a91512a4a51b490be6ba1c8eff34fdda0dc5bf87dc28d86748aac56" -"checksum rusttype 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b8eb11f5b0a98c8eca2fb1483f42646d8c340e83e46ab416f8a063a0fd0eeb20" -"checksum ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7153dd96dade874ab973e098cb62fcdbb89a03682e46b144fd09550998d4a4a7" -"checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" -"checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" -"checksum same-file 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "10f7794e2fda7f594866840e95f5c5962e886e228e68b6505885811a94dd728c" -"checksum sass-rs 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90f8cf6e645aa843ffffcbdc1e8752b1f221dfa314c81895aeb229a77aea7e05" -"checksum sass-sys 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "173ac202b4585ecfb1521159491175a787584fcc346457d53a099b240c69cd41" -"checksum schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "0e1a231dc10abf6749cfa5d7767f25888d484201accbd919b66ab5413c502d56" -"checksum scheduled-thread-pool 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a2ff3fc5223829be817806c6441279c676e454cc7da608faf03b0ccc09d3889" -"checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum security-framework 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "697d3f3c23a618272ead9e1fb259c1411102b31c6af8b93f1d64cca9c3b0e8e0" -"checksum security-framework-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab01dfbe5756785b5b4d46e0289e5a18071dfa9a7c2b24213ea00b9ef9b665bf" -"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum sequence_trie 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c915714ca833b1d4d6b8f6a9d72a3ff632fe45b40a8d184ef79c81bec6327eed" -"checksum serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" -"checksum serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)" = "0e732ed5a5592c17d961555e3b552985baf98d50ce418b7b655f31f6ba7eb1b7" -"checksum serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "225de307c6302bec3898c51ca302fc94a7a1697ef0845fcee6448f33c032249c" -"checksum serde_ignored 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "190e9765dcedb56be63b6e0993a006c7e3b071a016a304736e4a315dc01fb142" -"checksum serde_json 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)" = "67f7d2e9edc3523a9c8ec8cd6ec481b3a27810aafee3e625d311febd3e656b4c" -"checksum serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)" = "43344e7ce05d0d8280c5940cabb4964bea626aa58b1ec0e8c73fa2a8512a38ce" -"checksum serde_urlencoded 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "aaed41d9fb1e2f587201b863356590c90c1157495d811430a0c0325fe8169650" -"checksum sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eb6be24e4c23a84d7184280d2722f7f2731fcdd4a9d886efbfe4413e4847ea0" -"checksum shell-escape 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "170a13e64f2a51b77a45702ba77287f5c6829375b04a69cf2222acd17d0cfab9" -"checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" -"checksum slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f9776d6b986f77b35c6cf846c11ad986ff128fe0b2b63a3628e3755e8d3102d" -"checksum slug 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39af1ce888a1253c8b9fcfa36626557650fb487c013620a743262d2769a3e9f3" -"checksum smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "153ffa32fd170e9944f7e0838edf824a754ec4c1fc64746fcc9fe1f8fa602e5d" -"checksum socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d11a52082057d87cb5caa31ad812f4504b97ab44732cd8359df2e9ff9f48e7" -"checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" -"checksum staticfile 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "31493480e073d52522a94cdf56269dd8eb05f99549effd1826b0271690608878" -"checksum stb_truetype 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "48fa7d3136d8645909de1f7c7eb5416cc43057a75ace08fc39ae736bc9da8af1" -"checksum string 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00caf261d6f90f588f8450b8e1230fa0d5be49ee6140fdfbcb55335aff350970" -"checksum string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25d70109977172b127fe834e5449e5ab1740b9ba49fa18a2020f509174f25423" -"checksum string_cache_codegen 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "35293b05cf1494e8ddd042a7df6756bf18d07f42d234f32e71dce8a7aabb0191" -"checksum string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc" -"checksum stringprep 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" -"checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" -"checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" -"checksum syn 0.13.11 (registry+https://github.com/rust-lang/crates.io-index)" = "14f9bf6292f3a61d2c716723fdb789a41bbe104168e6f496dc6497e531ea1b9b" -"checksum syn 0.15.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b036b7b35e846707c0e55c2c9441fa47867c0f87fca416921db3261b1d8c741a" -"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" -"checksum synstructure 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ec37f4fab4bafaf6b5621c1d54e6aa5d4d059a8f84929e87abfdd7f9f04c6db2" -"checksum tar 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)" = "a303ba60a099fcd2aaa646b14d2724591a96a75283e4b7ed3d1a1658909d9ae2" -"checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" -"checksum tempfile 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "55c1195ef8513f3273d55ff59fe5da6940287a0d7a98331254397f464833675b" -"checksum tendril 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9de21546595a0873061940d994bbbc5c35f024ae4fd61ec5c5b159115684f508" -"checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" -"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" -"checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" -"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" -"checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" -"checksum tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "6e93c78d23cc61aa245a8acd2c4a79c4d7fa7fb5c3ca90d5737029f043a84895" -"checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" -"checksum tokio-current-thread 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f90fcd90952f0a496d438a976afba8e5c205fb12123f813d8ab3aa1c8436638c" -"checksum tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c117b6cf86bb730aab4834f10df96e4dd586eff2c3c27d3781348da49e255bde" -"checksum tokio-fs 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b5cbe4ca6e71cb0b62a66e4e6f53a8c06a6eefe46cc5f665ad6f274c9906f135" -"checksum tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "8b8a85fffbec3c5ab1ab62324570230dcd37ee5996a7859da5caf7b9d45e3e8c" -"checksum tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4b26fd37f1125738b2170c80b551f69ff6fecb277e6e5ca885e53eec2b005018" -"checksum tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ad235e9dadd126b2d47f6736f65aa1fdcd6420e66ca63f44177bc78df89f912" -"checksum tokio-threadpool 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "bbd8a8b911301c60cbfaa2a6588fb210e5c1038375b8bdecc47aa09a94c3c05f" -"checksum tokio-timer 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "3a52f00c97fedb6d535d27f65cccb7181c8dd4c6edc3eda9ea93f6d45d05168e" -"checksum tokio-udp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "da941144b816d0dcda4db3a1ba87596e4df5e860a72b70783fe435891f80601c" -"checksum tokio-uds 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "22e3aa6d1fcc19e635418dc0a30ab5bd65d347973d6f43f1a37bf8d9d1335fc9" -"checksum toml 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "4a2ecc31b0351ea18b3fe11274b8db6e4d82bce861bbb22e6dbed40417902c65" -"checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" -"checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" -"checksum twoway 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1" -"checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" -"checksum typed-arena 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c6c06a92aef38bb4dc5b0df00d68496fc31307c5344c867bb61678c6e1671ec5" -"checksum typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "653be63c80a3296da5551e1bfd2cca35227e13cdd08c6668903ae2f4f77aa1f6" -"checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" -"checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d" -"checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" -"checksum unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d3218ea14b4edcaccfa0df0a64a3792a2c32cc706f1b336e48867f9d3147f90" -"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -"checksum unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6a0180bc61fc5a987082bfa111f4cc95c4caff7f9799f3e46df09163a937aa25" -"checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" -"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" -"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" -"checksum unicode_categories 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" -"checksum unidecode 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2adb95ee07cd579ed18131f2d9e7a17c25a4b76022935c7f2460d2bfae89fd2" -"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -"checksum unsafe-any 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f30360d7979f5e9c6e6cea48af192ea8fab4afb3cf72597154b8f08935bc9c7f" -"checksum url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2a321979c09843d272956e73700d12c4e7d3d92b2ee112b31548aef0d4efc5a6" -"checksum url_serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "74e7d099f1ee52f823d4bdd60c93c3602043c728f5db3b97bdb548467f7bddea" -"checksum urlencoded 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c28708636d6f7298a53b1cdb6af40f1ab523209a7cb83cf4d41b3ebc671d319" -"checksum utf-8 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bab35f71693630bb1953dce0f2bcd780e7cde025027124a202ac08a45ba25141" -"checksum utf8-ranges 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd70f467df6810094968e2fce0ee1bd0e87157aceb026a8c083bcf5e25b9efe4" -"checksum uuid 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dab5c5526c5caa3d106653401a267fed923e7046f35895ffcb5ca42db64942e6" -"checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" -"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" -"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" -"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -"checksum walkdir 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c66c0b9792f0a765345452775f3adbd28dde9d33f30d13e5dcc5ae17cf6f3780" -"checksum walkdir 2.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "af464bc7be7b785c7ac72e266a6b67c4c9070155606f51655a650a6686204e35" -"checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3" -"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" -"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" -"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -"checksum winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab" -"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -"checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" -"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index f5c586f9c..000000000 --- a/Cargo.toml +++ /dev/null @@ -1,56 +0,0 @@ -[package] -name = "cratesfyi" -version = "0.6.0" -authors = ["Onur Aslan "] -readme = "README.md" -license = "MIT" -repository = "https://github.com/rust-lang/docs.rs" -build = "build.rs" - -[dependencies] -log = "0.4" -rustc-serialize = "0.3" -regex = "1" -clap = "2" -crates-index-diff = "4" -git2 = "0.7" -time = "0.1" -reqwest = "0.9" -semver = "0.9" -slug = "=0.1.1" -env_logger = "0.6" -magic = "0.12" -r2d2 = "0.8" -r2d2_postgres = "0.14" -url = "1.4" -libc = "0.2" -badge = { version = "0", path = "src/web/badge" } -failure = "0.1.3" -comrak = { version = "0.3", default-features = false } -toml = "0.4" -html5ever = "0.22" -cargo = { git = "https://github.com/rust-lang/cargo.git" } - -# iron dependencies -iron = "0.5" -router = "0.5" -handlebars-iron = "0.22" -params = "0.6" -staticfile = { version = "0.4", features = [ "cache" ] } - -[dependencies.postgres] -version = "0.15" -features = [ "with-time", "with-rustc-serialize" ] - -[dev-dependencies] -tempdir = "0.3" - -[build-dependencies] -time = "0.1" -git2 = "0.7" -sass-rs = "0.2" - -[[bin]] -name = "cratesfyi" -test = false -doc = false diff --git a/README.md b/README.md deleted file mode 100644 index b4299b801..000000000 --- a/README.md +++ /dev/null @@ -1,153 +0,0 @@ -# Docs.rs - -[![Build Status](https://dev.azure.com/docsrs/docs.rs/_apis/build/status/docs.rs?branchName=master)](https://dev.azure.com/docsrs/docs.rs/_build/latest?definitionId=1) -[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/rust-lang/docs.rs/master/LICENSE) - -Docs.rs (formerly cratesfyi) is an open source project to host documentation -of crates for the Rust Programming Language. - -Docs.rs automatically builds crates' documentation released on crates.io using -the nightly release of the Rust compiler. - -The README of a crate is taken from the readme field defined in Cargo.toml. -If a crate doesn't have this field, no README will be displayed. - -### Redirections - -Docs.rs is using semver to parse URLs. You can use this feature to access -crates' documentation easily. Example of URL redirections for `clap` crate: - -| URL | Redirects to documentation of | -|------------------------------|------------------------------------------------| -| | Latest version of clap | -| | 2.* version | -| | 2.9.* version | -| | 2.9.3 version (you don't need = unlike semver) | - -The crates.fyi domain will redirect to docs.rs, supporting all of the -redirects discussed above - - -### Badges - -You can use badges to show state of your documentation to your users. -The default badge will be pointed at the latest version of a crate. -You can use `version` parameter to show status of documentation for -any version you want. - -Badge will display in blue if docs.rs is successfully hosting your crate -documentation, and red if building documentation failing. - -Example badges for `mio` crate: - -| URL | Badge | -|-------|-------| -| Latest version: | ![mio](https://docs.rs/mio/badge.svg) | -| Version 0.4.4: | ![mio](https://docs.rs/mio/badge.svg?version=0.4.4) | -| Version 0.1.0: | ![mio](https://docs.rs/mio/badge.svg?version=0.1.0) | - - -## Development - -We strongly recommend using vagrant, this will give you a virtual machine -already configured and ready to start developing on. - -### Getting started - -Make sure you have vagrant, virtualbox and a ssh client and you need -to able to download ~800MB data on the first run. - - -```sh -git clone https://github.com/rust-lang/docs.rs.git docs.rs -cd docs.rs -vagrant up # This may take a little while on the first run -``` - -You can always run `vagrant provision` to reconfigure virtual machine. -Provision will install required dependencies and nightly rust compiler -into virtual machine. It will also configure lxc-container inside -virtual machine. - -### CLI - -Make sure you are running every listed command inside `/vagrant` directory -in virtual machine. You can connect to virtual machine with `vagrant ssh` and -switch current working directory with: `cd /vagrant` inside virtual machine. - - -#### Starting web server - -This command will start web interface of docs.rs and you can access it from: -`http://localhost:3000/` - -``` -cargo run -- start-web-server -``` - - -#### `build` subcommand - -```sh -# Builds and adds it into database -# This is the main command to build and add a documentation into docs.rs. -cargo run -- build crate - - -# Adds essential files (css and fonts) into database to avoid duplication -# This command needs to be run after each rustc update -cargo run -- build add-essential-files - - -# Builds every crate and adds them into database -# (beware: this may take months to finish) -cargo run -- build world -``` - - -#### `database` subcommand - -```sh -# Initializes database. Currently, only creates tables in database. -cargo run -- database init - - -# Adds a directory into database to serve with `staticfile` crate. -cargo run -- database add-directory [PREFIX] - - -# Updates github stats for crates. -# You need to set CRATESFYI_GITHUB_USERNAME, CRATESFYI_GITHUB_ACCESSTOKEN -# environment variables in order to run this command. -# You can set this environment variables in ~/.cratesfyi.env file. -cargo run -- database update-github-fields - - -# Updates search-index. -# daemon is running this command occasionally, and this command must be -# run to update recent-version of a crate index and search index. -# If you are having any trouble with accessing right version of a crate, -# run this command. Otherwise it's not required. -cargo run -- database update-search-index - - -# Updates release activitiy chart -cargo run -- database update-release-activity -``` - -If you want to explore or edit database manually, you can connect database -with `psql` command. - - -#### `doc` subcommand - -This subcommand will only build documentation of a crate. -It is designed to run inside a secure container. - -``` -cargo run -- doc -``` - -#### Contact - -Docs.rs is run and maintaned by [Rustdoc team](https://www.rust-lang.org/governance/teams/dev-tools#Rustdoc%20team-info). You can find us in #rustdoc on [Discord](https://discord.gg/rust-lang). diff --git a/Vagrantfile b/Vagrantfile deleted file mode 100644 index f86ed9644..000000000 --- a/Vagrantfile +++ /dev/null @@ -1,153 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : - -Vagrant.configure("2") do |config| - config.vm.box = "docs.rs_v2" - config.vm.box_url = "https://docs.rs/vagrant_v2.box" - config.vm.box_download_checksum = "7c6d9ef85a55461bce361e9734baf54a6eea9affa2334480cd7613a9a6b62bc4" - config.vm.box_download_checksum_type = "sha256" - - config.ssh.username = "cratesfyi" - - config.vm.network "forwarded_port", guest: 3000, host: 3000 - - # Use 25% of available system memory and all CPU's - config.vm.provider "virtualbox" do |vb| - host = RbConfig::CONFIG['host_os'] - - if host =~ /darwin/ - cpus = `sysctl -n hw.ncpu`.to_i - mem = `sysctl -n hw.memsize`.to_i / 1024 / 1024 / 4 - elsif host =~ /linux/ - cpus = `nproc`.to_i - mem = `grep 'MemTotal' /proc/meminfo | sed -e 's/MemTotal://' -e 's/ kB//'`.to_i / 1024 / 4 - else - cpus = 2 - mem = 1024 - end - - vb.memory = mem - vb.cpus = cpus - end - - - # docs.rs vagrant image comes with only a pre-configured cratesfyi-container - # installing rest with provision - config.vm.provision "shell", inline: <<-SHELL - set -ev - - ############################################################ - # Installing docs.rs dependencies # - ############################################################ - apt-get update - apt-get install -y --no-install-recommends cmake curl cmake gcc g++ git libmagic-dev libssl-dev pkg-config - - ############################################################ - # Installing rustc into cratesfyi-container # - ############################################################ - lxc-attach -n cratesfyi-container -- apt-get update - lxc-attach -n cratesfyi-container -- apt-get install -y --no-install-recommends curl ca-certificates binutils gcc libc6-dev libmagic1 - lxc-attach -n cratesfyi-container -- su - cratesfyi -c 'curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain nightly' - - ############################################################ - # Installing extra targets into cratesfyi-container # - ############################################################ - lxc-attach -n cratesfyi-container -- su - cratesfyi -c 'rustup target add x86_64-apple-darwin' - lxc-attach -n cratesfyi-container -- su - cratesfyi -c 'rustup target add x86_64-pc-windows-msvc' - - ############################################################ - # Creating rustc links for cratesfyi user # - ############################################################ - for directory in .cargo .rustup .multirust; do - [[ -h /home/cratesfyi/$directory ]] || sudo -u cratesfyi ln -vs /var/lib/lxc/cratesfyi-container/rootfs/home/cratesfyi/$directory /home/cratesfyi/ - done - - ############################################################ - # Setting up environment variables # - ############################################################ - [[ -f /home/cratesfyi/.cratesfyi.env ]] || sudo -u cratesfyi tee /home/cratesfyi/.cratesfyi.env <<\EOF -CRATESFYI_PREFIX=/home/cratesfyi/cratesfyi-prefix -CRATESFYI_DATABASE_URL=postgresql://cratesfyi@localhost -CRATESFYI_GITHUB_USERNAME= -CRATESFYI_GITHUB_ACCESSTOKEN= -RUST_LOG=cratesfyi -CARGO_TARGET_DIR=/home/cratesfyi/docs.rs/target -EOF - - ############################################################ - # Loading environment variables # - ############################################################ - source /home/cratesfyi/.cratesfyi.env - - ############################################################ - # Preparing cratesfyi-prefix # - ############################################################ - sudo -u cratesfyi mkdir -vp /home/cratesfyi/cratesfyi-prefix/documentations \ - /home/cratesfyi/cratesfyi-prefix/public_html - - ############################################################ - # Getting external css files from docs.rs # - ############################################################ - sudo -u cratesfyi wget -qcP /home/cratesfyi/cratesfyi-prefix/public_html \ - https://docs.rs/rustdoc-20160526-1.10.0-nightly-97e3a2401.css \ - https://docs.rs/main-20160526-1.10.0-nightly-97e3a2401.css - - ############################################################ - # Cloning crates.io-index # - ############################################################ - if [ ! -d /home/cratesfyi/cratesfyi-prefix/crates.io-index ]; then - sudo -u cratesfyi git clone https://github.com/rust-lang/crates.io-index /home/cratesfyi/cratesfyi-prefix/crates.io-index - else - sudo -u cratesfyi git --git-dir=/home/cratesfyi/cratesfyi-prefix/crates.io-index/.git pull - fi - - # Create `crates-index-diff_last-seen` branch for tracking new crates - sudo -u cratesfyi git --git-dir=/home/cratesfyi/cratesfyi-prefix/crates.io-index/.git branch crates-index-diff_last-seen || true - - ############################################################ - # Building docs.rs # - ############################################################ - su - cratesfyi -c "cd /vagrant && cargo build" 2>&1 - - ############################################################ - # Copying docs.rs into container # - ############################################################ - cp -v /home/cratesfyi/docs.rs/target/debug/cratesfyi /var/lib/lxc/cratesfyi-container/rootfs/usr/local/bin - - ############################################################ - # Re-creating database # - ############################################################ - echo 'DROP DATABASE cratesfyi; CREATE DATABASE cratesfyi OWNER cratesfyi' | sudo -u postgres psql - - ############################################################ - # Initializing database scheme # - ############################################################ - su - cratesfyi -c "cd /vagrant && cargo run -- database init" - - ############################################################ - # Add essential files for downloaded nigthly # - ############################################################ - su - cratesfyi -c "cd /vagrant && cargo run -- build add-essential-files" 2>&1 - - ############################################################ - # Populating database by building some crates # - ############################################################ - su - cratesfyi -c "cd /vagrant && cargo run -- build crate rand 0.3.15" 2>&1 - su - cratesfyi -c "cd /vagrant && cargo run -- build crate log 0.3.6" 2>&1 - su - cratesfyi -c "cd /vagrant && cargo run -- build crate regex 0.1.80" 2>&1 - - ############################################################ - # Update search index and release activity # - ############################################################ - su - cratesfyi -c "cd /vagrant && cargo run -- database update-search-index" 2>&1 - su - cratesfyi -c "cd /vagrant && cargo run -- database update-release-activity" 2>&1 - - - ############################################################ - # docs.rs vagrant box is ready! # - #----------------------------------------------------------# - # You can connect to virtual machine with `vagrant ssh`. # - # docs.rs is available in `/vagrant` folder! # - ############################################################ - SHELL -end diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index f4b9ff411..000000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,101 +0,0 @@ -# Ref: https://aka.ms/yaml - -resources: - containers: - - container: debian-jessie - image: onuras/docs.rs:debian-jessie - - container: debian-stretch - image: onuras/docs.rs:debian-stretch - - -jobs: -- job: test - pool: - vmImage: 'Ubuntu 16.04' - strategy: - matrix: - jessie: - containerResource: debian-jessie - stretch: - containerResource: debian-stretch - container: $[ variables['containerResource'] ] - steps: - - script: curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain stable - displayName: 'Install rustc' - - script: | - export PATH=$PATH:$HOME/.cargo/bin - cargo build --verbose - displayName: 'Build docs.rs' - - script: | - export PATH=$PATH:$HOME/.cargo/bin - cargo test --verbose -- --test-threads=1 - displayName: 'Test docs.rs' - - -- job: release - condition: eq(variables['Build.SourceBranch'], 'refs/heads/master') - pool: - vmImage: 'Ubuntu 16.04' - strategy: - matrix: - jessie: - containerResource: debian-jessie - stretch: - containerResource: debian-stretch - container: $[ variables['containerResource'] ] - steps: - - script: curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain stable - displayName: 'Install rustc' - - script: | - export PATH=$PATH:$HOME/.cargo/bin - cargo build --verbose --release - displayName: 'Build docs.rs' - - task: CopyFiles@2 - inputs: - contents: '$(System.DefaultWorkingDirectory)/templates/**' - targetFolder: $(Build.ArtifactStagingDirectory) - displayName: 'Copy templates' - - task: CopyFiles@2 - inputs: - contents: '$(System.DefaultWorkingDirectory)/target/release/cratesfyi' - targetFolder: $(Build.ArtifactStagingDirectory) - displayName: 'Copy build' - - task: PublishBuildArtifacts@1 - inputs: - artifactName: $(containerResource) - displayName: 'Upload artifacts' - - -- job: deploy - dependsOn: - - test - - release - condition: succeeded() - pool: - vmImage: 'Ubuntu 16.04' - container: debian-stretch - steps: - - checkout: none - - task: DownloadBuildArtifacts@0 - inputs: - artifactName: debian-jessie - downloadPath: $(System.DefaultWorkingDirectory) - - task: DownloadBuildArtifacts@0 - inputs: - artifactName: debian-stretch - downloadPath: $(System.DefaultWorkingDirectory) - - task: DownloadSecureFile@1 - inputs: - secureFile: docs.rs.ssh.private.key - - script: tar czfv $(Build.BinariesDirectory)/$(Build.SourceVersion).tar.gz . - displayName: 'Pack build' - - script: | - mkdir -p ~/.ssh - chmod 700 ~/.ssh - echo "$(docs.rs.ssh.hostname)" > ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts - eval $(ssh-agent -s) - cat $DOWNLOADSECUREFILE_SECUREFILEPATH | tr -d '\r' | ssh-add - > /dev/null - scp -P $(docs.rs.ssh.port) $(Build.BinariesDirectory)/$(Build.SourceVersion).tar.gz $(docs.rs.ssh.destination):azure-deploys/ - ssh -p $(docs.rs.ssh.port) $(docs.rs.ssh.destination) azure-deploys/install-deploy.sh $(Build.SourceVersion) - displayName: 'Upload build into docs.rs and run deploy script' diff --git a/build.rs b/build.rs deleted file mode 100644 index 292f85b2f..000000000 --- a/build.rs +++ /dev/null @@ -1,51 +0,0 @@ - -extern crate time; -extern crate sass_rs; -extern crate git2; - -use std::env; -use std::path::Path; -use std::fs::File; -use std::io::Write; -use git2::Repository; - - -fn main() { - write_git_version(); - compile_sass(); -} - - -fn write_git_version() { - let git_hash = get_git_hash().unwrap_or("???????".to_owned()); - let build_date = time::strftime("%Y-%m-%d", &time::now_utc()).unwrap(); - let dest_path = Path::new(&env::var("OUT_DIR").unwrap()).join("git_version"); - let mut file = File::create(&dest_path).unwrap(); - write!(file, "({} {})", git_hash, build_date).unwrap(); -} - - -fn get_git_hash() -> Option { - let repo = match Repository::open(env::current_dir().unwrap()) { - Ok(repo) => repo, - Err(_) => return None, - }; - let head = repo.head().unwrap(); - head.target().map(|h| { - let mut h = format!("{}", h); - h.truncate(7); - h - }) -} - - -fn compile_sass() { - use sass_rs::Context; - - let mut file_context = Context::new_file(concat!(env!("CARGO_MANIFEST_DIR"), - "/templates/style.scss")).unwrap(); - let css = file_context.compile().unwrap(); - let dest_path = Path::new(&env::var("OUT_DIR").unwrap()).join("style.css"); - let mut file = File::create(&dest_path).unwrap(); - file.write_all(css.as_bytes()).unwrap(); -} diff --git a/rustfmt.toml b/rustfmt.toml deleted file mode 100644 index de740541c..000000000 --- a/rustfmt.toml +++ /dev/null @@ -1,2 +0,0 @@ - -format_strings = false diff --git a/src/bin/cratesfyi.rs b/src/bin/cratesfyi.rs deleted file mode 100644 index 8caa05848..000000000 --- a/src/bin/cratesfyi.rs +++ /dev/null @@ -1,248 +0,0 @@ - - -extern crate cratesfyi; -extern crate clap; -extern crate log; -extern crate env_logger; -extern crate time; - - -use std::env; -use std::path::PathBuf; - -use clap::{Arg, App, SubCommand}; -use cratesfyi::{DocBuilder, DocBuilderOptions, db}; -use cratesfyi::utils::build_doc; -use cratesfyi::start_web_server; -use cratesfyi::db::add_path_into_database; - - -pub fn main() { - logger_init(); - - let matches = App::new("cratesfyi") - .version(cratesfyi::BUILD_VERSION) - .about(env!("CARGO_PKG_DESCRIPTION")) - .subcommand(SubCommand::with_name("doc") - .about("Builds documentation of a crate") - .arg(Arg::with_name("CRATE_NAME") - .index(1) - .required(true) - .help("Crate name")) - .arg(Arg::with_name("CRATE_VERSION") - .index(2) - .required(false) - .help("Crate version")) - .arg(Arg::with_name("TARGET") - .index(3) - .required(false) - .help("The target platform to compile for"))) - .subcommand(SubCommand::with_name("build") - .about("Builds documentation in a chroot environment") - .arg(Arg::with_name("PREFIX") - .short("P") - .long("prefix") - .takes_value(true)) - .arg(Arg::with_name("DESTINATION") - .short("d") - .long("destination") - .help("Sets destination path") - .takes_value(true)) - .arg(Arg::with_name("CHROOT_PATH") - .short("c") - .long("chroot-path") - .help("Sets chroot path") - .takes_value(true)) - .arg(Arg::with_name("CHROOT_USER") - .short("u") - .long("chroot-user") - .help("Sets chroot user name") - .takes_value(true)) - .arg(Arg::with_name("CONTAINER_NAME") - .short("n") - .long("container-name") - .help("Sets name of the container") - .takes_value(true)) - .arg(Arg::with_name("CRATES_IO_INDEX_PATH") - .long("crates-io-index-path") - .help("Sets crates.io-index path") - .takes_value(true)) - .arg(Arg::with_name("SKIP_IF_EXISTS") - .short("s") - .long("skip") - .help("Skips building documentation if \ - documentation exists")) - .arg(Arg::with_name("SKIP_IF_LOG_EXISTS") - .long("skip-if-log-exists") - .help("Skips building documentation if build \ - log exists")) - .arg(Arg::with_name("KEEP_BUILD_DIRECTORY") - .short("-k") - .long("keep-build-directory") - .help("Keeps build directory after build.")) - .subcommand(SubCommand::with_name("world").about("Builds documentation of every \ - crate")) - .subcommand(SubCommand::with_name("crate") - .about("Builds documentation for a crate") - .arg(Arg::with_name("CRATE_NAME") - .index(1) - .required(true) - .help("Crate name")) - .arg(Arg::with_name("CRATE_VERSION") - .index(2) - .required(true) - .help("Version of crate"))) - .subcommand(SubCommand::with_name("add-essential-files") - .about("Adds essential files for rustc")) - .subcommand(SubCommand::with_name("lock").about("Locks cratesfyi daemon to stop \ - building new crates")) - .subcommand(SubCommand::with_name("unlock") - .about("Unlocks cratesfyi daemon to continue \ - building new crates")) - .subcommand(SubCommand::with_name("print-options"))) - .subcommand(SubCommand::with_name("start-web-server") - .about("Starts web server") - .arg(Arg::with_name("SOCKET_ADDR") - .index(1) - .required(false) - .help("Socket address to listen to"))) - .subcommand(SubCommand::with_name("daemon").about("Starts cratesfyi daemon")) - .subcommand(SubCommand::with_name("database") - .about("Database operations") - .subcommand(SubCommand::with_name("init").about("Initialize database. Currently \ - only creates tables in database.")) - .subcommand(SubCommand::with_name("update-github-fields") - .about("Updates github stats for crates.")) - .subcommand(SubCommand::with_name("add-directory") - .about("Adds a directory into database") - .arg(Arg::with_name("DIRECTORY") - .index(1) - .required(true) - .help("Path of file or \ - directory")) - .arg(Arg::with_name("PREFIX") - .index(2) - .help("Prefix of files in \ - database"))) - .subcommand(SubCommand::with_name("update-release-activity")) - .about("Updates montly release activity \ - chart") - .subcommand(SubCommand::with_name("update-search-index")) - .about("Updates search index")) - .get_matches(); - - - - // doc subcommand - if let Some(matches) = matches.subcommand_matches("doc") { - let name = matches.value_of("CRATE_NAME").unwrap(); - let version = matches.value_of("CRATE_VERSION"); - let target = matches.value_of("TARGET"); - if let Err(e) = build_doc(name, version, target) { - panic!("{:#?}", e); - } - } else if let Some(matches) = matches.subcommand_matches("build") { - let docbuilder_opts = { - let mut docbuilder_opts = if let Some(prefix) = matches.value_of("PREFIX") { - DocBuilderOptions::from_prefix(PathBuf::from(prefix)) - } else if let Ok(prefix) = env::var("CRATESFYI_PREFIX") { - DocBuilderOptions::from_prefix(PathBuf::from(prefix)) - } else { - DocBuilderOptions::default() - }; - - // set options - if let Some(destination) = matches.value_of("DESTINATION") { - docbuilder_opts.destination = PathBuf::from(destination); - } - - if let Some(chroot_path) = matches.value_of("CHROOT_PATH") { - docbuilder_opts.chroot_path = PathBuf::from(chroot_path); - } - - if let Some(chroot_user) = matches.value_of("CHROOT_USER") { - docbuilder_opts.chroot_user = chroot_user.to_string(); - } - - if let Some(container_name) = matches.value_of("CONTAINER_NAME") { - docbuilder_opts.container_name = container_name.to_string(); - } - - if let Some(crates_io_index_path) = matches.value_of("CRATES_IO_INDEX_PATH") { - docbuilder_opts.crates_io_index_path = PathBuf::from(crates_io_index_path); - } - - docbuilder_opts.skip_if_exists = matches.is_present("SKIP_IF_EXISTS"); - docbuilder_opts.skip_if_log_exists = matches.is_present("SKIP_IF_LOG_EXISTS"); - docbuilder_opts.keep_build_directory = matches.is_present("KEEP_BUILD_DIRECTORY"); - - docbuilder_opts.check_paths().unwrap(); - - docbuilder_opts - }; - - let mut docbuilder = DocBuilder::new(docbuilder_opts); - - if let Some(_) = matches.subcommand_matches("world") { - docbuilder.load_cache().expect("Failed to load cache"); - docbuilder.build_world().expect("Failed to build world"); - docbuilder.save_cache().expect("Failed to save cache"); - } else if let Some(matches) = matches.subcommand_matches("crate") { - docbuilder.load_cache().expect("Failed to load cache"); - docbuilder.build_package(matches.value_of("CRATE_NAME").unwrap(), - matches.value_of("CRATE_VERSION").unwrap()) - .expect("Building documentation failed"); - docbuilder.save_cache().expect("Failed to save cache"); - } else if let Some(_) = matches.subcommand_matches("add-essential-files") { - docbuilder.add_essential_files().expect("Failed to add essential files"); - } else if let Some(_) = matches.subcommand_matches("lock") { - docbuilder.lock().expect("Failed to lock"); - } else if let Some(_) = matches.subcommand_matches("unlock") { - docbuilder.unlock().expect("Failed to unlock"); - } else if let Some(_) = matches.subcommand_matches("print-options") { - println!("{:?}", docbuilder.options()); - } - - } else if let Some(matches) = matches.subcommand_matches("database") { - if let Some(_) = matches.subcommand_matches("init") { - let conn = db::connect_db().unwrap(); - db::create_tables(&conn).expect("Failed to initialize database"); - } else if let Some(_) = matches.subcommand_matches("update-github-fields") { - cratesfyi::utils::github_updater().expect("Failed to update github fields"); - } else if let Some(matches) = matches.subcommand_matches("add-directory") { - add_path_into_database(&db::connect_db().unwrap(), - matches.value_of("PREFIX").unwrap_or(""), - matches.value_of("DIRECTORY").unwrap()) - .expect("Failed to add directory into database"); - } else if let Some(_) = matches.subcommand_matches("update-release-activity") { - // FIXME: This is actually util command not database - cratesfyi::utils::update_release_activity().expect("Failed to update release activity"); - } else if let Some(_) = matches.subcommand_matches("update-search-index") { - let conn = db::connect_db().unwrap(); - db::update_search_index(&conn).expect("Failed to update search index"); - } - } else if let Some(matches) = matches.subcommand_matches("start-web-server") { - start_web_server(Some(matches.value_of("SOCKET_ADDR").unwrap_or("0.0.0.0:3000"))); - } else if let Some(_) = matches.subcommand_matches("daemon") { - cratesfyi::utils::start_daemon(); - } else { - println!("{}", matches.usage()); - } -} - - - -fn logger_init() { - use std::io::Write; - - let mut builder = env_logger::Builder::new(); - builder.format(|buf, record| { - writeln!(buf, "{} [{}] {}: {}", - time::now().strftime("%Y/%m/%d %H:%M:%S").unwrap(), - record.level(), - record.target(), - record.args()) - }); - builder.parse(&env::var("RUST_LOG").unwrap_or("cratesfyi=info".to_owned())); - builder.init(); -} diff --git a/src/db/add_package.rs b/src/db/add_package.rs deleted file mode 100644 index 53483caa3..000000000 --- a/src/db/add_package.rs +++ /dev/null @@ -1,456 +0,0 @@ - -use ChrootBuilderResult; -use Metadata; -use utils::source_path; -use regex::Regex; - -use std::io::prelude::*; -use std::io::BufReader; -use std::path::{Path, PathBuf}; -use std::fs; - -use cargo::core::{Package, TargetKind}; -use rustc_serialize::json::{Json, ToJson}; -use slug::slugify; -use reqwest::Client; -use reqwest::header::ACCEPT; -use semver; -use postgres::Connection; -use time; -use error::Result; -use failure::err_msg; - -/// Adds a package into database. -/// -/// Package must be built first. -pub fn add_package_into_database(conn: &Connection, - pkg: &Package, - res: &ChrootBuilderResult, - files: Option, - doc_targets: Vec) - -> Result { - debug!("Adding package into database"); - let crate_id = try!(initialize_package_in_database(&conn, &pkg)); - let dependencies = convert_dependencies(&pkg); - let rustdoc = get_rustdoc(&pkg).unwrap_or(None); - let readme = get_readme(&pkg).unwrap_or(None); - let (release_time, yanked, downloads) = try!(get_release_time_yanked_downloads(&pkg)); - let is_library = match pkg.targets()[0].kind() { - &TargetKind::Lib(_) => true, - _ => false, - }; - let metadata = Metadata::from_package(pkg)?; - - let release_id: i32 = { - let rows = try!(conn.query("SELECT id FROM releases WHERE crate_id = $1 AND version = $2", - &[&crate_id, &format!("{}", pkg.manifest().version())])); - - if rows.len() == 0 { - let rows = try!(conn.query("INSERT INTO releases ( - crate_id, version, release_time, - dependencies, target_name, yanked, build_status, - rustdoc_status, test_status, license, repository_url, - homepage_url, description, description_long, readme, - authors, keywords, have_examples, downloads, files, - doc_targets, is_library, doc_rustc_version, - documentation_url, default_target - ) - VALUES ( $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, - $11, $12, $13, $14, $15, $16, $17, $18, $19, - $20, $21, $22, $23, $24, $25 - ) - RETURNING id", - &[&crate_id, - &format!("{}", pkg.manifest().version()), - &release_time, - &dependencies.to_json(), - &pkg.targets()[0].name().replace("-", "_"), - &yanked, - &res.build_success, - &res.have_doc, - &false, // TODO: Add test status somehow - &pkg.manifest().metadata().license, - &pkg.manifest().metadata().repository, - &pkg.manifest().metadata().homepage, - &pkg.manifest().metadata().description, - &rustdoc, - &readme, - &pkg.manifest().metadata().authors.to_json(), - &pkg.manifest().metadata().keywords.to_json(), - &res.have_examples, - &downloads, - &files, - &doc_targets.to_json(), - &is_library, - &res.rustc_version, - &pkg.manifest().metadata().documentation, - &metadata.default_target])); - // return id - rows.get(0).get(0) - - } else { - try!(conn.query("UPDATE releases - SET release_time = $3, - dependencies = $4, - target_name = $5, - yanked = $6, - build_status = $7, - rustdoc_status = $8, - test_status = $9, - license = $10, - repository_url = $11, - homepage_url = $12, - description = $13, - description_long = $14, - readme = $15, - authors = $16, - keywords = $17, - have_examples = $18, - downloads = $19, - files = $20, - doc_targets = $21, - is_library = $22, - doc_rustc_version = $23, - documentation_url = $24, - default_target = $25 - WHERE crate_id = $1 AND version = $2", - &[&crate_id, - &format!("{}", pkg.manifest().version()), - &release_time, - &dependencies.to_json(), - &pkg.targets()[0].name().replace("-", "_"), - &yanked, - &res.build_success, - &res.have_doc, - &false, // TODO: Add test status somehow - &pkg.manifest().metadata().license, - &pkg.manifest().metadata().repository, - &pkg.manifest().metadata().homepage, - &pkg.manifest().metadata().description, - &rustdoc, - &readme, - &pkg.manifest().metadata().authors.to_json(), - &pkg.manifest().metadata().keywords.to_json(), - &res.have_examples, - &downloads, - &files, - &doc_targets.to_json(), - &is_library, - &res.rustc_version, - &pkg.manifest().metadata().documentation, - &metadata.default_target])); - rows.get(0).get(0) - } - }; - - - try!(add_keywords_into_database(&conn, &pkg, &release_id)); - try!(add_authors_into_database(&conn, &pkg, &release_id)); - try!(add_owners_into_database(&conn, &pkg, &crate_id)); - - - // Update versions - { - let mut versions: Json = try!(conn.query("SELECT versions FROM crates WHERE id = $1", - &[&crate_id])) - .get(0) - .get(0); - if let Some(versions_array) = versions.as_array_mut() { - let mut found = false; - for version in versions_array.clone() { - if &semver::Version::parse(version.as_string().unwrap()).unwrap() == - pkg.manifest().version() { - found = true; - } - } - if !found { - versions_array.push(format!("{}", &pkg.manifest().version()).to_json()); - } - } - let _ = conn.query("UPDATE crates SET versions = $1 WHERE id = $2", - &[&versions, &crate_id]); - } - - Ok(release_id) -} - - -/// Adds a build into database -pub fn add_build_into_database(conn: &Connection, - release_id: &i32, - res: &ChrootBuilderResult) - -> Result { - debug!("Adding build into database"); - let rows = try!(conn.query("INSERT INTO builds (rid, rustc_version, - cratesfyi_version, - build_status, output) - VALUES ($1, $2, $3, $4, $5) - RETURNING id", - &[release_id, - &res.rustc_version, - &res.cratesfyi_version, - &res.build_success, - &res.output])); - Ok(rows.get(0).get(0)) -} - - -fn initialize_package_in_database(conn: &Connection, pkg: &Package) -> Result { - let mut rows = try!(conn.query("SELECT id FROM crates WHERE name = $1", - &[&pkg.manifest().name().as_str()])); - // insert crate into database if it is not exists - if rows.len() == 0 { - rows = try!(conn.query("INSERT INTO crates (name) VALUES ($1) RETURNING id", - &[&pkg.manifest().name().as_str()])); - } - Ok(rows.get(0).get(0)) -} - - - -/// Convert dependencies into Vec<(String, String)> -fn convert_dependencies(pkg: &Package) -> Vec<(String, String)> { - let mut dependencies: Vec<(String, String)> = Vec::new(); - for dependency in pkg.manifest().dependencies() { - let name = dependency.package_name().to_string(); - let version = format!("{}", dependency.version_req()); - dependencies.push((name, version)); - } - dependencies -} - - -/// Reads readme if there is any read defined in Cargo.toml of a Package -fn get_readme(pkg: &Package) -> Result> { - let readme_path = PathBuf::from(try!(source_path(&pkg).ok_or_else(|| err_msg("File not found")))) - .join(pkg.manifest().metadata().readme.clone().unwrap_or("README.md".to_owned())); - - if !readme_path.exists() { - return Ok(None); - } - - let mut reader = try!(fs::File::open(readme_path).map(|f| BufReader::new(f))); - let mut readme = String::new(); - try!(reader.read_to_string(&mut readme)); - Ok(Some(readme)) -} - - -fn get_rustdoc(pkg: &Package) -> Result> { - if let Some(src_path) = pkg.manifest().targets()[0].src_path().path() { - if src_path.is_absolute() { - read_rust_doc(src_path) - } else { - let mut path = PathBuf::from(try!(source_path(&pkg).ok_or_else(|| err_msg("File not found")))); - path.push(src_path); - read_rust_doc(path.as_path()) - } - } else { - // FIXME: should we care about metabuild targets? - Ok(None) - } -} - - -/// Reads rustdoc from library -fn read_rust_doc(file_path: &Path) -> Result> { - let reader = try!(fs::File::open(file_path).map(|f| BufReader::new(f))); - let mut rustdoc = String::new(); - - for line in reader.lines() { - let line = try!(line); - if line.starts_with("//!") { - // some lines may or may not have a space between the `//!` and the start of the text - let line = line.trim_start_matches("//!").trim_start(); - if !line.is_empty() { - rustdoc.push_str(line); - } - rustdoc.push('\n'); - } - } - - if rustdoc.is_empty() { - Ok(None) - } else if rustdoc.len() > 51200 { - Ok(Some(format!("(Library doc comment ignored due to being too long. ({} > 51200))", rustdoc.len()))) - } else { - Ok(Some(rustdoc)) - } -} - - - -/// Get release_time, yanked and downloads from crates.io -fn get_release_time_yanked_downloads - (pkg: &Package) - -> Result<(Option, Option, Option)> { - let url = format!("https://crates.io/api/v1/crates/{}/versions", - pkg.manifest().name()); - // FIXME: There is probably better way to do this - // and so many unwraps... - let client = Client::new(); - let mut res = try!(client.get(&url[..]) - .header(ACCEPT, "application/json") - .send()); - let mut body = String::new(); - res.read_to_string(&mut body).unwrap(); - let json = Json::from_str(&body[..]).unwrap(); - let versions = try!(json.as_object() - .and_then(|o| o.get("versions")) - .and_then(|v| v.as_array()) - .ok_or_else(|| err_msg("Not a JSON object"))); - - let (mut release_time, mut yanked, mut downloads) = (None, None, None); - - for version in versions { - let version = try!(version.as_object().ok_or_else(|| err_msg("Not a JSON object"))); - let version_num = try!(version.get("num") - .and_then(|v| v.as_string()) - .ok_or_else(|| err_msg("Not a JSON object"))); - - if &semver::Version::parse(version_num).unwrap() == pkg.manifest().version() { - let release_time_raw = try!(version.get("created_at") - .and_then(|c| c.as_string()) - .ok_or_else(|| err_msg("Not a JSON object"))); - release_time = Some(time::strptime(release_time_raw, "%Y-%m-%dT%H:%M:%S") - .unwrap() - .to_timespec()); - - yanked = Some(try!(version.get("yanked") - .and_then(|c| c.as_boolean()) - .ok_or_else(|| err_msg("Not a JSON object")))); - - downloads = Some(try!(version.get("downloads") - .and_then(|c| c.as_i64()) - .ok_or_else(|| err_msg("Not a JSON object"))) as i32); - - break; - } - } - - Ok((release_time, yanked, downloads)) -} - - -/// Adds keywords into database -fn add_keywords_into_database(conn: &Connection, pkg: &Package, release_id: &i32) -> Result<()> { - for keyword in &pkg.manifest().metadata().keywords { - let slug = slugify(&keyword); - let keyword_id: i32 = { - let rows = try!(conn.query("SELECT id FROM keywords WHERE slug = $1", &[&slug])); - if rows.len() > 0 { - rows.get(0).get(0) - } else { - try!(conn.query("INSERT INTO keywords (name, slug) VALUES ($1, $2) RETURNING id", - &[&keyword, &slug])) - .get(0) - .get(0) - } - }; - // add releationship - let _ = conn.query("INSERT INTO keyword_rels (rid, kid) VALUES ($1, $2)", - &[release_id, &keyword_id]); - } - - Ok(()) -} - - - -/// Adds authors into database -fn add_authors_into_database(conn: &Connection, pkg: &Package, release_id: &i32) -> Result<()> { - - let author_capture_re = Regex::new("^([^><]+)<*(.*?)>*$").unwrap(); - for author in &pkg.manifest().metadata().authors { - if let Some(author_captures) = author_capture_re.captures(&author[..]) { - let author = author_captures.get(1).map(|m| m.as_str()).unwrap_or("").trim(); - let email = author_captures.get(2).map(|m| m.as_str()).unwrap_or("").trim(); - let slug = slugify(&author); - - let author_id: i32 = { - let rows = try!(conn.query("SELECT id FROM authors WHERE slug = $1", &[&slug])); - if rows.len() > 0 { - rows.get(0).get(0) - } else { - try!(conn.query("INSERT INTO authors (name, email, slug) VALUES ($1, $2, $3) - RETURNING id", - &[&author, &email, &slug])) - .get(0) - .get(0) - } - }; - - // add relationship - let _ = conn.query("INSERT INTO author_rels (rid, aid) VALUES ($1, $2)", - &[release_id, &author_id]); - } - } - - Ok(()) -} - - - -/// Adds owners into database -fn add_owners_into_database(conn: &Connection, pkg: &Package, crate_id: &i32) -> Result<()> { - // owners available in: https://crates.io/api/v1/crates/rand/owners - let owners_url = format!("https://crates.io/api/v1/crates/{}/owners", - &pkg.manifest().name()); - let client = Client::new(); - let mut res = try!(client.get(&owners_url[..]) - .header(ACCEPT, "application/json") - .send()); - // FIXME: There is probably better way to do this - // and so many unwraps... - let mut body = String::new(); - res.read_to_string(&mut body).unwrap(); - let json = try!(Json::from_str(&body[..])); - - if let Some(owners) = json.as_object() - .and_then(|j| j.get("users")) - .and_then(|j| j.as_array()) { - for owner in owners { - // FIXME: I know there is a better way to do this - let avatar = owner.as_object() - .and_then(|o| o.get("avatar")) - .and_then(|o| o.as_string()) - .unwrap_or(""); - let email = owner.as_object() - .and_then(|o| o.get("email")) - .and_then(|o| o.as_string()) - .unwrap_or(""); - let login = owner.as_object() - .and_then(|o| o.get("login")) - .and_then(|o| o.as_string()) - .unwrap_or(""); - let name = owner.as_object() - .and_then(|o| o.get("name")) - .and_then(|o| o.as_string()) - .unwrap_or(""); - - if login.is_empty() { - continue; - } - - let owner_id: i32 = { - let rows = try!(conn.query("SELECT id FROM owners WHERE login = $1", &[&login])); - if rows.len() > 0 { - rows.get(0).get(0) - } else { - try!(conn.query("INSERT INTO owners (login, avatar, name, email) - VALUES ($1, $2, $3, $4) - RETURNING id", - &[&login, &avatar, &name, &email])) - .get(0) - .get(0) - } - }; - - // add relationship - let _ = conn.query("INSERT INTO owner_rels (cid, oid) VALUES ($1, $2)", - &[crate_id, &owner_id]); - } - - } - Ok(()) -} diff --git a/src/db/file.rs b/src/db/file.rs deleted file mode 100644 index d22a2c38d..000000000 --- a/src/db/file.rs +++ /dev/null @@ -1,177 +0,0 @@ -//! Simple module to store files in database. -//! -//! cratesfyi is generating more than 5 million files, they are small and mostly html files. -//! They are using so many inodes and it is better to store them in database instead of -//! filesystem. This module is adding files into database and retrieving them. - - -use std::path::Path; -use postgres::Connection; -use rustc_serialize::json::{Json, ToJson}; -use std::fs::File; -use std::io::Read; -use error::Result; -use failure::err_msg; - - -fn file_path(prefix: &str, name: &str) -> String { - match prefix.is_empty() { - true => name.to_owned(), - false => format!("{}/{}", prefix, name), - } -} - - -fn get_file_list_from_dir>(path: P, - prefix: &str, - files: &mut Vec) - -> Result<()> { - let path = path.as_ref(); - - for file in try!(path.read_dir()) { - let file = try!(file); - - if try!(file.file_type()).is_file() { - file.file_name().to_str().map(|name| files.push(file_path(prefix, name))); - } else if try!(file.file_type()).is_dir() { - file.file_name() - .to_str() - .map(|name| get_file_list_from_dir(file.path(), &file_path(prefix, name), files)); - } - } - - Ok(()) -} - - -pub fn get_file_list>(path: P) -> Result> { - let path = path.as_ref(); - let mut files: Vec = Vec::new(); - - if !path.exists() { - return Err(err_msg("File not found")); - } else if path.is_file() { - path.file_name() - .and_then(|name| name.to_str()) - .map(|name| files.push(format!("{}", name))); - } else if path.is_dir() { - try!(get_file_list_from_dir(path, "", &mut files)); - } - - Ok(files) -} - - -/// Adds files into database and returns list of files with their mime type in Json -pub fn add_path_into_database>(conn: &Connection, - prefix: &str, - path: P) - -> Result { - use magic::{Cookie, flags}; - let cookie = try!(Cookie::open(flags::MIME_TYPE)); - try!(cookie.load::<&str>(&[])); - - let trans = try!(conn.transaction()); - - let mut file_list_with_mimes: Vec<(String, String)> = Vec::new(); - - for file_path_str in try!(get_file_list(&path)) { - let (path, content, mime) = { - let path = Path::new(path.as_ref()).join(&file_path_str); - // Some files have insufficient permissions (like .lock file created by cargo in - // documentation directory). We are skipping this files. - let mut file = match File::open(path) { - Ok(f) => f, - Err(_) => continue, - }; - let mut content: Vec = Vec::new(); - try!(file.read_to_end(&mut content)); - let mime = { - let mime = try!(cookie.buffer(&content)); - // css's are causing some problem in browsers - // magic will return text/plain for css file types - // convert them to text/css - // do the same for javascript files - if mime == "text/plain" { - if file_path_str.ends_with(".css") { - "text/css".to_owned() - } else if file_path_str.ends_with(".js") { - "application/javascript".to_owned() - } else { - mime.to_owned() - } - } else { - mime.to_owned() - } - }; - - file_list_with_mimes.push((mime.clone(), file_path_str.clone())); - - (file_path(prefix, &file_path_str), content, mime) - }; - - // check if file already exists in database - let rows = try!(conn.query("SELECT COUNT(*) FROM files WHERE path = $1", &[&path])); - - if rows.get(0).get::(0) == 0 { - try!(trans.query("INSERT INTO files (path, mime, content) VALUES ($1, $2, $3)", - &[&path, &mime, &content])); - } else { - try!(trans.query("UPDATE files SET mime = $2, content = $3, date_updated = NOW() \ - WHERE path = $1", - &[&path, &mime, &content])); - } - } - - try!(trans.commit()); - - file_list_to_json(file_list_with_mimes) -} - - - -fn file_list_to_json(file_list: Vec<(String, String)>) -> Result { - - let mut file_list_json: Vec = Vec::new(); - - for file in file_list { - let mut v: Vec = Vec::new(); - v.push(file.0.clone()); - v.push(file.1.clone()); - file_list_json.push(v.to_json()); - } - - Ok(file_list_json.to_json()) -} - - - -#[cfg(test)] -mod test { - extern crate env_logger; - use std::env; - use super::{get_file_list, add_path_into_database}; - use super::super::connect_db; - - #[test] - fn test_get_file_list() { - let _ = env_logger::try_init(); - - let files = get_file_list(env::current_dir().unwrap()); - assert!(files.is_ok()); - assert!(files.unwrap().len() > 0); - - let files = get_file_list(env::current_dir().unwrap().join("Cargo.toml")).unwrap(); - assert_eq!(files[0], "Cargo.toml"); - } - - #[test] - #[ignore] - fn test_add_path_into_database() { - let _ = env_logger::try_init(); - - let conn = connect_db().unwrap(); - let res = add_path_into_database(&conn, "example", env::current_dir().unwrap().join("src")); - assert!(res.is_ok()); - } -} diff --git a/src/db/mod.rs b/src/db/mod.rs deleted file mode 100644 index c725814db..000000000 --- a/src/db/mod.rs +++ /dev/null @@ -1,215 +0,0 @@ -//! Database operations - -pub use self::add_package::add_package_into_database; -pub use self::add_package::add_build_into_database; -pub use self::file::add_path_into_database; - -use postgres::{Connection, TlsMode}; -use postgres::error::Error; -use std::env; -use r2d2; -use r2d2_postgres; - -mod add_package; -mod file; - - -/// Connects to database -pub fn connect_db() -> Result { - // FIXME: unwrap might not be the best here - let db_url = env::var("CRATESFYI_DATABASE_URL") - .expect("CRATESFYI_DATABASE_URL environment variable is not exists"); - Connection::connect(&db_url[..], TlsMode::None) -} - - -pub fn create_pool() -> r2d2::Pool { - let db_url = env::var("CRATESFYI_DATABASE_URL") - .expect("CRATESFYI_DATABASE_URL environment variable is not exists"); - let manager = r2d2_postgres::PostgresConnectionManager::new(&db_url[..], - r2d2_postgres::TlsMode::None) - .expect("Failed to create PostgresConnectionManager"); - r2d2::Pool::builder().build(manager).expect("Failed to create r2d2 pool") -} - - -/// Updates content column in crates table. -/// -/// This column will be used for searches and always contains `tsvector` of: -/// -/// * crate name (rank A-weight) -/// * latest release description (rank B-weight) -/// * latest release keywords (rank B-weight) -/// * latest release readme (rank C-weight) -/// * latest release root rustdoc (rank C-weight) -pub fn update_search_index(conn: &Connection) -> Result { - conn.execute(" - WITH doc as ( - SELECT DISTINCT ON(releases.crate_id) - releases.id, - releases.crate_id, - setweight(to_tsvector(crates.name), 'A') || - setweight(to_tsvector(coalesce(releases.description, '')), 'B') || - setweight(to_tsvector(coalesce(( - SELECT string_agg(value, ' ') - FROM json_array_elements_text(releases.keywords)), '')), 'B') - as content - FROM releases - INNER JOIN crates ON crates.id = releases.crate_id - ORDER BY releases.crate_id, releases.release_time DESC - ) - UPDATE crates - SET latest_version_id = doc.id, - content = doc.content - FROM doc - WHERE crates.id = doc.crate_id AND - (crates.latest_version_id = 0 OR crates.latest_version_id != doc.id);", - &[]) -} - - -/// Creates database tables -pub fn create_tables(conn: &Connection) -> Result<(), Error> { - let queries = ["CREATE TABLE crates ( - id SERIAL PRIMARY KEY, - name VARCHAR(255) UNIQUE NOT NULL, - latest_version_id INT DEFAULT 0, - versions JSON DEFAULT '[]', - downloads_total INT DEFAULT 0, - github_description VARCHAR(1024), - github_stars INT DEFAULT 0, - github_forks INT DEFAULT 0, - github_issues INT DEFAULT 0, - github_last_commit TIMESTAMP, - github_last_update TIMESTAMP, - content tsvector - )", - "CREATE TABLE releases ( - id SERIAL PRIMARY KEY, - crate_id INT NOT NULL REFERENCES crates(id), - version VARCHAR(100), - release_time TIMESTAMP, - dependencies JSON, - target_name VARCHAR(255), - yanked BOOL DEFAULT FALSE, - is_library BOOL DEFAULT TRUE, - build_status BOOL DEFAULT FALSE, - rustdoc_status BOOL DEFAULT FALSE, - test_status BOOL DEFAULT FALSE, - license VARCHAR(100), - repository_url VARCHAR(255), - homepage_url VARCHAR(255), - documentation_url VARCHAR(255), - description VARCHAR(1024), - description_long VARCHAR(51200), - readme VARCHAR(51200), - authors JSON, - keywords JSON, - have_examples BOOL DEFAULT FALSE, - downloads INT DEFAULT 0, - files JSON, - doc_targets JSON DEFAULT '[]', - doc_rustc_version VARCHAR(100) NOT NULL, - default_target VARCHAR(100), - UNIQUE (crate_id, version) - )", - "CREATE TABLE authors ( - id SERIAL PRIMARY KEY, - name VARCHAR(255), - email VARCHAR(255), - slug VARCHAR(255) UNIQUE NOT NULL - )", - "CREATE TABLE author_rels ( - rid INT REFERENCES releases(id), - aid INT REFERENCES authors(id), - UNIQUE(rid, aid) - )", - "CREATE TABLE keywords ( - id SERIAL PRIMARY KEY, - name VARCHAR(255), - slug VARCHAR(255) NOT NULL UNIQUE - )", - "CREATE TABLE keyword_rels ( - rid INT REFERENCES releases(id), - kid INT REFERENCES keywords(id), - UNIQUE(rid, kid) - )", - "CREATE TABLE owners ( - id SERIAL PRIMARY KEY, - login VARCHAR(255) NOT NULL UNIQUE, - avatar VARCHAR(255), - name VARCHAR(255), - email VARCHAR(255) - )", - "CREATE TABLE owner_rels ( - cid INT REFERENCES releases(id), - oid INT REFERENCES owners(id), - UNIQUE(cid, oid) - )", - "CREATE TABLE builds ( - id SERIAL, - rid INT NOT NULL REFERENCES releases(id), - rustc_version VARCHAR(100) NOT NULL, - cratesfyi_version VARCHAR(100) NOT NULL, - build_status BOOL NOT NULL, - build_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - output TEXT - )", - "CREATE TABLE queue ( - id SERIAL, - name VARCHAR(255), - version VARCHAR(100), - attempt INT DEFAULT 0, - date_added TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - UNIQUE(name, version) - )", - "CREATE TABLE files ( - path VARCHAR(4096) NOT NULL PRIMARY KEY, - mime VARCHAR(100) NOT NULL, - date_added TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - date_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - content BYTEA - )", - "CREATE INDEX ON releases (release_time DESC)", - "CREATE INDEX content_idx ON crates USING gin(content)", - "CREATE TABLE config ( - name VARCHAR(100) NOT NULL PRIMARY KEY, - value JSON NOT NULL - )", - "INSERT INTO config VALUES ('database_version', '1'::json)"]; - - for query in queries.into_iter() { - try!(conn.execute(query, &[])); - } - - Ok(()) -} - - - -#[cfg(test)] -mod test { - extern crate env_logger; - use super::*; - - #[test] - #[ignore] - fn test_connect_db() { - let conn = connect_db(); - assert!(conn.is_ok()); - } - - - #[test] - #[ignore] - fn test_create_tables() { - let _ = env_logger::try_init(); - let conn = connect_db(); - assert!(conn.is_ok()); - - // FIXME: As expected this test always fails if database is already created - let res = create_tables(&conn.unwrap()); - info!("RES: {:#?}", res); - assert!(res.is_ok()); - } -} diff --git a/src/docbuilder/chroot_builder.rs b/src/docbuilder/chroot_builder.rs deleted file mode 100644 index 1c07b158a..000000000 --- a/src/docbuilder/chroot_builder.rs +++ /dev/null @@ -1,505 +0,0 @@ - -use super::DocBuilder; -use super::crates::crates_from_path; -use super::metadata::Metadata; -use utils::{get_package, source_path, copy_doc_dir, - update_sources, parse_rustc_version, command_result}; -use db::{connect_db, add_package_into_database, add_build_into_database, add_path_into_database}; -use cargo::core::Package; -use cargo::util::CargoResultExt; -use std::process::Command; -use std::path::PathBuf; -use std::fs::remove_dir_all; -use postgres::Connection; -use rustc_serialize::json::{Json, ToJson}; -use error::Result; - - -/// List of targets supported by docs.rs -const TARGETS: [&'static str; 6] = [ - "i686-apple-darwin", - "i686-pc-windows-msvc", - "i686-unknown-linux-gnu", - "x86_64-apple-darwin", - "x86_64-pc-windows-msvc", - "x86_64-unknown-linux-gnu" -]; - - - -#[derive(Debug)] -pub struct ChrootBuilderResult { - pub output: String, - pub build_success: bool, - pub have_doc: bool, - pub have_examples: bool, - pub rustc_version: String, - pub cratesfyi_version: String, -} - - -impl DocBuilder { - /// Builds every package documentation in chroot environment - pub fn build_world(&mut self) -> Result<()> { - try!(update_sources()); - - let mut count = 0; - - crates(self.options.crates_io_index_path.clone(), |name, version| { - match self.build_package(name, version) { - Ok(status) => { - count += 1; - if status && count % 10 == 0 { - let _ = self.save_cache(); - } - } - Err(err) => warn!("Failed to build package {}-{}: {}", name, version, err), - } - self.cache.insert(format!("{}-{}", name, version)); - }) - } - - - /// Builds package documentation in chroot environment and adds into cratesfyi database - pub fn build_package(&mut self, name: &str, version: &str) -> Result { - // Skip crates according to options - if (self.options.skip_if_log_exists && - self.cache.contains(&format!("{}-{}", name, version)[..])) || - (self.options.skip_if_exists && - self.db_cache.contains(&format!("{}-{}", name, version)[..])) { - return Ok(false); - } - - info!("Building package {}-{}", name, version); - - // Start with clean documentation directory - try!(self.remove_build_dir()); - - // Database connection - let conn = try!(connect_db()); - - // get_package (and cargo) is using semver, add '=' in front of version. - let pkg = try!(get_package(name, Some(&format!("={}", version)[..]))); - let metadata = Metadata::from_package(&pkg)?; - let res = self.build_package_in_chroot(&pkg, metadata.default_target.clone()); - - // copy sources and documentation - let file_list = try!(self.add_sources_into_database(&conn, &pkg)); - let successfully_targets = if res.have_doc { - try!(self.copy_documentation(&pkg, - &res.rustc_version, - metadata.default_target.as_ref().map(String::as_str), - true)); - let successfully_targets = self.build_package_for_all_targets(&pkg); - for target in &successfully_targets { - try!(self.copy_documentation(&pkg, &res.rustc_version, Some(target), false)); - } - try!(self.add_documentation_into_database(&conn, &pkg)); - successfully_targets - } else { - Vec::new() - }; - - let release_id = try!(add_package_into_database(&conn, - &pkg, - &res, - Some(file_list), - successfully_targets)); - try!(add_build_into_database(&conn, &release_id, &res)); - - // remove documentation, source and build directory after we are done - try!(self.clean(&pkg)); - - // add package into build cache - self.cache.insert(format!("{}-{}", name, version)); - - Ok(res.build_success) - } - - - /// Builds documentation of a package with cratesfyi in chroot environment - fn build_package_in_chroot(&self, package: &Package, default_target: Option) -> ChrootBuilderResult { - debug!("Building package in chroot"); - let (rustc_version, cratesfyi_version) = self.get_versions(); - let cmd = format!("cratesfyi doc {} ={} {}", - package.manifest().name(), - package.manifest().version(), - default_target.as_ref().unwrap_or(&"".to_string())); - match self.chroot_command(cmd) { - Ok(o) => { - ChrootBuilderResult { - output: o, - build_success: true, - have_doc: self.have_documentation(&package, default_target), - have_examples: self.have_examples(&package), - rustc_version: rustc_version, - cratesfyi_version: cratesfyi_version, - } - } - Err(e) => { - ChrootBuilderResult { - output: e.to_string(), - build_success: false, - have_doc: false, - have_examples: self.have_examples(&package), - rustc_version: rustc_version, - cratesfyi_version: cratesfyi_version, - } - } - } - } - - - - /// Builds documentation of crate for every target and returns Vec of successfully targets - fn build_package_for_all_targets(&self, package: &Package) -> Vec { - let mut successfuly_targets = Vec::new(); - - for target in TARGETS.iter() { - debug!("Building {} for {}", canonical_name(&package), target); - let cmd = format!("cratesfyi doc {} ={} {}", - package.manifest().name(), - package.manifest().version(), - target); - if let Ok(_) = self.chroot_command(cmd) { - // Cargo is not giving any error and not generating documentation of some crates - // when we use a target compile options. Check documentation exists before - // adding target to successfully_targets. - // FIXME: Need to figure out why some docs are not generated with target option - let target_doc_path = PathBuf::from(&self.options.chroot_path) - .join("home") - .join(&self.options.chroot_user) - .join("cratesfyi") - .join(&target) - .join("doc"); - if target_doc_path.exists() { - successfuly_targets.push(target.to_string()); - } - } - } - successfuly_targets - } - - - /// Copies documentation to destination directory - fn copy_documentation(&self, - package: &Package, - rustc_version: &str, - target: Option<&str>, - is_default_target: bool) - -> Result<()> { - let mut crate_doc_path = PathBuf::from(&self.options.chroot_path) - .join("home") - .join(&self.options.chroot_user) - .join("cratesfyi"); - - // docs are available in cratesfyi/$TARGET when target is being used - if let Some(target) = target { - crate_doc_path.push(target); - } - - let mut destination = PathBuf::from(&self.options.destination) - .join(format!("{}/{}", - package.manifest().name(), - package.manifest().version())); - - // only add target name to destination directory when we are copying a non-default target. - // this is allowing us to host documents in the root of the crate documentation directory. - // for example winapi will be available in docs.rs/winapi/$version/winapi/ for it's - // default target: x86_64-pc-windows-msvc. But since it will be built under - // cratesfyi/x86_64-pc-windows-msvc we still need target in this function. - if !is_default_target { - if let Some(target) = target { - destination.push(target); - } - } - - copy_doc_dir(crate_doc_path, - destination, - parse_rustc_version(rustc_version)?.trim()) - } - - - /// Removes build directory of a package in chroot - fn remove_build_dir(&self) -> Result<()> { - let crate_doc_path = PathBuf::from(&self.options.chroot_path) - .join("home") - .join(&self.options.chroot_user) - .join("cratesfyi") - .join("doc"); - let _ = remove_dir_all(crate_doc_path); - for target in TARGETS.iter() { - let crate_doc_path = PathBuf::from(&self.options.chroot_path) - .join("home") - .join(&self.options.chroot_user) - .join("cratesfyi") - .join(target) - .join("doc"); - let _ = remove_dir_all(crate_doc_path); - } - Ok(()) - } - - - /// Remove documentation, build directory and sources directory of a package - fn clean(&self, package: &Package) -> Result<()> { - debug!("Cleaning package"); - use std::fs::remove_dir_all; - let documentation_path = PathBuf::from(&self.options.destination) - .join(package.manifest().name().as_str()); - let source_path = source_path(&package).unwrap(); - // Some crates don't have documentation, so we don't care if removing_dir_all fails - let _ = self.remove_build_dir(); - let _ = remove_dir_all(documentation_path); - let _ = remove_dir_all(source_path); - Ok(()) - } - - - /// Runs a command in a chroot environment - fn chroot_command>(&self, cmd: T) -> Result { - command_result(Command::new("sudo") - .arg("lxc-attach") - .arg("-n") - .arg(&self.options.container_name) - .arg("--") - .arg("su") - .arg("-") - .arg(&self.options.chroot_user) - .arg("-c") - .arg(cmd.as_ref()) - .output() - .unwrap()) - } - - - /// Checks a package build directory to determine if package have docs - /// - /// This function is checking first target in targets to see if documentation exists for a - /// crate. Package must be successfully built in chroot environment first. - fn have_documentation(&self, package: &Package, default_target: Option) -> bool { - let mut crate_doc_path = PathBuf::from(&self.options.chroot_path) - .join("home") - .join(&self.options.chroot_user) - .join("cratesfyi"); - - if let Some(default_doc_path) = default_target { - crate_doc_path.push(default_doc_path); - } - - crate_doc_path.push("doc"); - crate_doc_path.push(package.targets()[0].name().replace("-", "_").to_string()); - crate_doc_path.exists() - } - - - /// Checks if package have examples - fn have_examples(&self, package: &Package) -> bool { - let path = source_path(&package).unwrap().join("examples"); - path.exists() && path.is_dir() - } - - - /// Gets rustc and cratesfyi version from chroot environment - pub fn get_versions(&self) -> (String, String) { - // It is safe to use expect here - // chroot environment must always have rustc and cratesfyi installed - (String::from(self.chroot_command("rustc --version") - .expect("Failed to get rustc version") - .trim()), - String::from(self.chroot_command("cratesfyi --version") - .expect("Failed to get cratesfyi version") - .trim())) - } - - - /// Adds sources into database - fn add_sources_into_database(&self, conn: &Connection, package: &Package) -> Result { - debug!("Adding sources into database"); - let prefix = format!("sources/{}/{}", - package.manifest().name(), - package.manifest().version()); - add_path_into_database(conn, &prefix, source_path(&package).unwrap()) - } - - - /// Adds documentations into database - fn add_documentation_into_database(&self, - conn: &Connection, - package: &Package) - -> Result { - debug!("Adding documentation into database"); - let prefix = format!("rustdoc/{}/{}", - package.manifest().name(), - package.manifest().version()); - let crate_doc_path = PathBuf::from(&self.options.destination).join(format!("{}/{}", - package.manifest().name(), - package.manifest().version())); - add_path_into_database(conn, &prefix, crate_doc_path) - } - - - /// This function will build an empty crate and will add essential documentation files. - /// - /// It is required to run after every rustc update. cratesfyi is not keeping this files - /// for every crate to avoid duplications. - /// - /// List of the files: - /// - /// * rustdoc.css (with rustc version) - /// * main.css (with rustc version) - /// * main.js (with rustc version) - /// * jquery.js (with rustc version) - /// * playpen.js (with rustc version) - /// * normalize.css - /// * FiraSans-Medium.woff - /// * FiraSans-Regular.woff - /// * Heuristica-Italic.woff - /// * SourceCodePro-Regular.woff - /// * SourceCodePro-Semibold.woff - /// * SourceSerifPro-Bold.woff - /// * SourceSerifPro-Regular.woff - pub fn add_essential_files(&self) -> Result<()> { - use std::fs::{copy, create_dir_all}; - - // acme-client-0.0.0 is an empty library crate and it will always build - let pkg = try!(get_package("acme-client", Some("=0.0.0"))); - let res = self.build_package_in_chroot(&pkg, None); - let rustc_version = parse_rustc_version(&res.rustc_version)?; - - if !res.build_success { - return Err(format_err!("Failed to build empty crate for: {}", res.rustc_version)); - } - - info!("Copying essential files for: {}", res.rustc_version); - - let files = (// files require rustc version subfix - ["brush.svg", - "wheel.svg", - "down-arrow.svg", - "dark.css", - "light.css", - "main.js", - "normalize.css", - "rustdoc.css", - "settings.css", - "storage.js", - "theme.js", - "source-script.js", - "noscript.css", - "rust-logo.png"], - // favicon.ico is not needed because we set our own - // files doesn't require rustc version subfix - ["FiraSans-Medium.woff", - "FiraSans-Regular.woff", - "SourceCodePro-Regular.woff", - "SourceCodePro-Semibold.woff", - "SourceSerifPro-Bold.ttf.woff", - "SourceSerifPro-Regular.ttf.woff", - "SourceSerifPro-It.ttf.woff"]); - - let source = PathBuf::from(&self.options.chroot_path) - .join("home") - .join(&self.options.chroot_user) - .join("cratesfyi") - .join("doc"); - - // use copy_documentation destination directory so self.clean can remove it when - // we are done - let destination = PathBuf::from(&self.options.destination) - .join(format!("{}/{}", pkg.manifest().name(), pkg.manifest().version())); - try!(create_dir_all(&destination)); - - for file in files.0.iter() { - let spl: Vec<&str> = file.split('.').collect(); - let file_name = format!("{}-{}.{}", spl[0], rustc_version, spl[1]); - let source_path = source.join(&file_name); - let destination_path = destination.join(&file_name); - try!(copy(&source_path, &destination_path) - .chain_err(|| format!("couldn't copy '{}' to '{}'", source_path.display(), destination_path.display()))); - } - - for file in files.1.iter() { - let source_path = source.join(file); - let destination_path = destination.join(file); - try!(copy(&source_path, &destination_path) - .chain_err(|| format!("couldn't copy '{}' to '{}'", source_path.display(), destination_path.display()))); - } - - let conn = try!(connect_db()); - try!(add_path_into_database(&conn, "", destination)); - - try!(self.clean(&pkg)); - - let (vers, _) = self.get_versions(); - - try!(conn.query("INSERT INTO config (name, value) VALUES ('rustc_version', $1)", - &[&vers.to_json()]) - .or_else(|_| { - conn.query("UPDATE config SET value = $1 WHERE name = 'rustc_version'", - &[&vers.to_json()]) - })); - - Ok(()) - } -} - - -/// Returns canonical name of a package. -/// -/// It's just package-version. All directory structure used in cratesfyi is -/// following this naming scheme. -fn canonical_name(package: &Package) -> String { - format!("{}-{}", - package.manifest().name(), - package.manifest().version()) -} - - -/// Runs `func` with the all crates from crates-io.index repository path. -/// -/// First argument of func is the name of crate and -/// second argument is the version of crate. Func will be run for every crate. -fn crates(path: PathBuf, mut func: F) -> Result<()> - where F: FnMut(&str, &str) -> () -{ - crates_from_path(&path, &mut func) -} - - -#[cfg(test)] -mod test { - extern crate env_logger; - use std::path::PathBuf; - use {DocBuilder, DocBuilderOptions}; - - #[test] - #[ignore] - fn test_build_world() { - let _ = env_logger::try_init(); - let options = DocBuilderOptions::from_prefix(PathBuf::from("../cratesfyi-prefix")); - let mut docbuilder = DocBuilder::new(options); - // This test is building WHOLE WORLD and may take forever - assert!(docbuilder.build_world().is_ok()); - } - - #[test] - #[ignore] - fn test_build_package() { - let _ = env_logger::try_init(); - let options = DocBuilderOptions::from_prefix(PathBuf::from("../cratesfyi-prefix")); - let mut docbuilder = DocBuilder::new(options); - let res = docbuilder.build_package("rand", "0.3.14"); - assert!(res.is_ok()); - } - - #[test] - #[ignore] - fn test_add_essential_files() { - let _ = env_logger::try_init(); - let options = DocBuilderOptions::from_prefix(PathBuf::from("../cratesfyi-prefix")); - let docbuilder = DocBuilder::new(options); - - docbuilder.add_essential_files().unwrap(); - } -} diff --git a/src/docbuilder/crates.rs b/src/docbuilder/crates.rs deleted file mode 100644 index b84e7b19d..000000000 --- a/src/docbuilder/crates.rs +++ /dev/null @@ -1,85 +0,0 @@ - -use std::io::prelude::*; -use std::io::BufReader; -use std::fs; -use std::path::PathBuf; -use rustc_serialize::json::Json; -use error::Result; -use failure::err_msg; - -fn crates_from_file(path: &PathBuf, func: &mut F) -> Result<()> - where F: FnMut(&str, &str) -> () -{ - - let reader = try!(fs::File::open(path).map(|f| BufReader::new(f))); - - let mut name = String::new(); - let mut versions = Vec::new(); - - for line in reader.lines() { - // some crates have invalid UTF-8 (nanny-sys-0.0.7) - // skip them - let line = match line { - Ok(l) => l, - Err(_) => continue, - }; - let data = match Json::from_str(line.trim()) { - Ok(d) => d, - Err(_) => continue, - }; - - let obj = try!(data.as_object().ok_or_else(|| err_msg("Not a JSON object"))); - let crate_name = try!(obj.get("name") - .and_then(|n| n.as_string()) - .ok_or_else(|| err_msg("`name` not found in JSON object"))); - let vers = try!(obj.get("vers") - .and_then(|n| n.as_string()) - .ok_or_else(|| err_msg("`vers` not found in JSON object"))); - - // Skip yanked crates - if obj.get("yanked").and_then(|n| n.as_boolean()).unwrap_or(false) { - continue; - } - - name.clear(); - name.push_str(crate_name); - versions.push(format!("{}", vers)); - } - - if !name.is_empty() { - versions.reverse(); - for version in versions { - func(&name[..], &version[..]); - } - } - - Ok(()) -} - - - -pub fn crates_from_path(path: &PathBuf, func: &mut F) -> Result<()> - where F: FnMut(&str, &str) -> () -{ - - if !path.is_dir() { - return Err(err_msg("Not a directory")); - } - - for file in try!(path.read_dir()) { - let file = try!(file); - let path = file.path(); - // skip files under .git and config.json - if path.to_str().unwrap().contains(".git") || path.file_name().unwrap() == "config.json" { - continue; - } - - if path.is_dir() { - try!(crates_from_path(&path, func)); - } else { - try!(crates_from_file(&path, func)); - } - } - - Ok(()) -} diff --git a/src/docbuilder/metadata.rs b/src/docbuilder/metadata.rs deleted file mode 100644 index e99e10cb4..000000000 --- a/src/docbuilder/metadata.rs +++ /dev/null @@ -1,186 +0,0 @@ - -use std::path::Path; -use cargo::core::Package; -use toml::Value; -use error::Result; -use failure::err_msg; - -/// Metadata for custom builds -/// -/// You can customize docs.rs builds by defining `[package.metadata.docs.rs]` table in your -/// crates' `Cargo.toml`. -/// -/// An example metadata: -/// -/// ```text -/// [package] -/// name = "test" -/// -/// [package.metadata.docs.rs] -/// features = [ "feature1", "feature2" ] -/// all-features = true -/// no-default-features = true -/// default-target = "x86_64-unknown-linux-gnu" -/// rustc-args = [ "--example-rustc-arg" ] -/// rustdoc-args = [ "--example-rustdoc-arg" ] -/// dependencies = [ "example-system-dependency" ] -/// ``` -/// -/// You can define one or more fields in your `Cargo.toml`. -pub struct Metadata { - /// List of features docs.rs will build. - /// - /// By default, docs.rs will only build default features. - pub features: Option>, - - /// Set `all-features` to true if you want docs.rs to build all features for your crate - pub all_features: bool, - - /// Docs.rs will always build default features. - /// - /// Set `no-default-fatures` to `false` if you want to build only certain features. - pub no_default_features: bool, - - /// Docs.rs is running on `x86_64-unknown-linux-gnu` target system and default documentation - /// is always built on this target. You can change default target by setting this. - pub default_target: Option, - - /// List of command line arguments for `rustc`. - pub rustc_args: Option>, - - /// List of command line arguments for `rustdoc`. - pub rustdoc_args: Option>, - - /// System dependencies. - /// - /// Docs.rs is running on a Debian jessie. - pub dependencies: Option>, -} - - - -impl Metadata { - pub fn from_package(pkg: &Package) -> Result { - let src_path = pkg.manifest_path().parent().ok_or_else(|| err_msg("Source path not available"))?; - for c in ["Cargo.toml.orig", "Cargo.toml"].iter() { - let manifest_path = src_path.clone().join(c); - if manifest_path.exists() { - return Ok(Metadata::from_manifest(manifest_path)); - } - } - Err(err_msg("Manifest not found")) - } - - pub fn from_manifest>(path: P) -> Metadata { - use std::fs::File; - use std::io::Read; - let mut f = match File::open(path) { - Ok(f) => f, - Err(_) => return Metadata::default(), - }; - let mut s = String::new(); - if let Err(_) = f.read_to_string(&mut s) { - return Metadata::default(); - } - Metadata::from_str(&s) - } - - - // This is similar to Default trait but it's private - fn default() -> Metadata { - Metadata { - features: None, - all_features: false, - no_default_features: false, - default_target: None, - rustc_args: None, - rustdoc_args: None, - dependencies: None, - } - } - - - fn from_str(manifest: &str) -> Metadata { - let mut metadata = Metadata::default(); - - let manifest = match manifest.parse::() { - Ok(m) => m, - Err(_) => return metadata, - }; - - if let Some(table) = manifest.get("package").and_then(|p| p.as_table()) - .and_then(|p| p.get("metadata")).and_then(|p| p.as_table()) - .and_then(|p| p.get("docs")).and_then(|p| p.as_table()) - .and_then(|p| p.get("rs")).and_then(|p| p.as_table()) { - metadata.features = table.get("features").and_then(|f| f.as_array()) - .and_then(|f| f.iter().map(|v| v.as_str().map(|v| v.to_owned())).collect()); - metadata.no_default_features = table.get("no-default-features") - .and_then(|v| v.as_bool()).unwrap_or(metadata.no_default_features); - metadata.all_features = table.get("all-features") - .and_then(|v| v.as_bool()).unwrap_or(metadata.all_features); - metadata.default_target = table.get("default-target") - .and_then(|v| v.as_str()).map(|v| v.to_owned()); - metadata.rustc_args = table.get("rustc-args").and_then(|f| f.as_array()) - .and_then(|f| f.iter().map(|v| v.as_str().map(|v| v.to_owned())).collect()); - metadata.rustdoc_args = table.get("rustdoc-args").and_then(|f| f.as_array()) - .and_then(|f| f.iter().map(|v| v.as_str().map(|v| v.to_owned())).collect()); - metadata.dependencies = table.get("dependencies").and_then(|f| f.as_array()) - .and_then(|f| f.iter().map(|v| v.as_str().map(|v| v.to_owned())).collect()); - } - - metadata - } -} - - - -#[cfg(test)] -mod test { - extern crate env_logger; - use super::Metadata; - - #[test] - fn test_cratesfyi_metadata() { - let _ = env_logger::try_init(); - let manifest = r#" - [package] - name = "test" - - [package.metadata.docs.rs] - features = [ "feature1", "feature2" ] - all-features = true - no-default-features = true - default-target = "x86_64-unknown-linux-gnu" - rustc-args = [ "--example-rustc-arg" ] - rustdoc-args = [ "--example-rustdoc-arg" ] - dependencies = [ "example-system-dependency" ] - "#; - - let metadata = Metadata::from_str(manifest); - - assert!(metadata.features.is_some()); - assert!(metadata.all_features == true); - assert!(metadata.no_default_features == true); - assert!(metadata.default_target.is_some()); - assert!(metadata.rustdoc_args.is_some()); - - let features = metadata.features.unwrap(); - assert_eq!(features.len(), 2); - assert_eq!(features[0], "feature1".to_owned()); - assert_eq!(features[1], "feature2".to_owned()); - - assert_eq!(metadata.default_target.unwrap(), "x86_64-unknown-linux-gnu".to_owned()); - - let rustc_args = metadata.rustc_args.unwrap(); - assert_eq!(rustc_args.len(), 1); - assert_eq!(rustc_args[0], "--example-rustc-arg".to_owned()); - - let rustdoc_args = metadata.rustdoc_args.unwrap(); - assert_eq!(rustdoc_args.len(), 1); - assert_eq!(rustdoc_args[0], "--example-rustdoc-arg".to_owned()); - - let dependencies = metadata.dependencies.unwrap(); - assert_eq!(dependencies.len(), 1); - assert_eq!(dependencies[0], "example-system-dependency".to_owned()); - } -} diff --git a/src/docbuilder/mod.rs b/src/docbuilder/mod.rs deleted file mode 100644 index 3fe748abd..000000000 --- a/src/docbuilder/mod.rs +++ /dev/null @@ -1,117 +0,0 @@ - -pub mod options; -pub mod metadata; -mod chroot_builder; -mod crates; -mod queue; - -pub use self::chroot_builder::ChrootBuilderResult; - - -use std::fs; -use std::io::prelude::*; -use std::io::BufReader; -use std::path::PathBuf; -use std::collections::BTreeSet; -use DocBuilderOptions; -use error::Result; - - -/// chroot based documentation builder -pub struct DocBuilder { - options: DocBuilderOptions, - cache: BTreeSet, - db_cache: BTreeSet, -} - - -impl DocBuilder { - pub fn new(options: DocBuilderOptions) -> DocBuilder { - DocBuilder { - options: options, - cache: BTreeSet::new(), - db_cache: BTreeSet::new(), - } - } - - - /// Loads build cache - pub fn load_cache(&mut self) -> Result<()> { - debug!("Loading cache"); - let path = PathBuf::from(&self.options.prefix).join("cache"); - let reader = fs::File::open(path).map(|f| BufReader::new(f)); - - if reader.is_err() { - return Ok(()); - } - - for line in reader.unwrap().lines() { - self.cache.insert(try!(line)); - } - - try!(self.load_database_cache()); - - Ok(()) - } - - - fn load_database_cache(&mut self) -> Result<()> { - debug!("Loading database cache"); - use db::connect_db; - let conn = try!(connect_db()); - - for row in &conn.query("SELECT name, version FROM crates, releases \ - WHERE crates.id = releases.crate_id", - &[]) - .unwrap() { - let name: String = row.get(0); - let version: String = row.get(1); - self.db_cache.insert(format!("{}-{}", name, version)); - } - - Ok(()) - } - - - /// Saves build cache - pub fn save_cache(&self) -> Result<()> { - debug!("Saving cache"); - let path = PathBuf::from(&self.options.prefix).join("cache"); - let mut file = try!(fs::OpenOptions::new() - .write(true) - .create(true) - .open(path)); - for krate in &self.cache { - try!(writeln!(file, "{}", krate)); - } - Ok(()) - } - - - fn lock_path(&self) -> PathBuf { - self.options.prefix.join("cratesfyi.lock") - } - - /// Creates a lock file. Daemon will check this lock file and stop operating if its exists. - pub fn lock(&self) -> Result<()> { - let path = self.lock_path(); - if !path.exists() { - try!(fs::OpenOptions::new().write(true).create(true).open(path)); - } - Ok(()) - } - - /// Removes lock file. - pub fn unlock(&self) -> Result<()> { - let path = self.lock_path(); - if path.exists() { - try!(fs::remove_file(path)); - } - Ok(()) - } - - /// Returns a reference of options - pub fn options(&self) -> &DocBuilderOptions { - &self.options - } -} diff --git a/src/docbuilder/options.rs b/src/docbuilder/options.rs deleted file mode 100644 index 7cb6d8af0..000000000 --- a/src/docbuilder/options.rs +++ /dev/null @@ -1,113 +0,0 @@ - - -use std::{env, fmt}; -use std::path::PathBuf; -use error::Result; - -#[derive(Clone)] -pub struct DocBuilderOptions { - pub keep_build_directory: bool, - pub prefix: PathBuf, - pub destination: PathBuf, - pub chroot_path: PathBuf, - pub chroot_user: String, - pub container_name: String, - pub crates_io_index_path: PathBuf, - pub skip_if_exists: bool, - pub skip_if_log_exists: bool, - pub skip_oldest_versions: bool, - pub build_only_latest_version: bool, - pub debug: bool, -} - - - -impl Default for DocBuilderOptions { - fn default() -> DocBuilderOptions { - - let cwd = env::current_dir().unwrap(); - - let (prefix, destination, chroot_path, crates_io_index_path) = - generate_paths(cwd); - - DocBuilderOptions { - prefix: prefix, - destination: destination, - chroot_path: chroot_path, - crates_io_index_path: crates_io_index_path, - - chroot_user: "cratesfyi".to_string(), - container_name: "cratesfyi-container".to_string(), - - keep_build_directory: false, - skip_if_exists: false, - skip_if_log_exists: false, - skip_oldest_versions: false, - build_only_latest_version: false, - debug: false, - } - } -} - - -impl fmt::Debug for DocBuilderOptions { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, - "DocBuilderOptions {{ destination: {:?}, chroot_path: {:?}, \ - crates_io_index_path: {:?}, \ - container_name: {:?}, chroot_user: {:?}, \ - keep_build_directory: {:?}, skip_if_exists: {:?}, \ - skip_if_log_exists: {:?}, debug: {:?} }}", - self.destination, - self.chroot_path, - self.crates_io_index_path, - self.container_name, - self.chroot_user, - self.keep_build_directory, - self.skip_if_exists, - self.skip_if_log_exists, - self.debug) - } -} - - -impl DocBuilderOptions { - /// Creates new DocBuilderOptions from prefix - pub fn from_prefix(prefix: PathBuf) -> DocBuilderOptions { - let (prefix, destination, chroot_path, crates_io_index_path) = - generate_paths(prefix); - DocBuilderOptions { - prefix: prefix, - destination: destination, - chroot_path: chroot_path, - crates_io_index_path: crates_io_index_path, - - ..Default::default() - } - } - - - pub fn check_paths(&self) -> Result<()> { - if !self.destination.exists() { - bail!("destination path '{}' does not exist", self.destination.display()); - } - if !self.chroot_path.exists() { - bail!("chroot path '{}' does not exist", self.chroot_path.display()); - } - if !self.crates_io_index_path.exists() { - bail!("crates.io-index path '{}' does not exist", self.crates_io_index_path.display()); - } - Ok(()) - } -} - - - -fn generate_paths(prefix: PathBuf) -> (PathBuf, PathBuf, PathBuf, PathBuf) { - - let destination = PathBuf::from(&prefix).join("documentations"); - let chroot_path = PathBuf::from(&prefix).join("cratesfyi-container/rootfs"); - let crates_io_index_path = PathBuf::from(&prefix).join("crates.io-index"); - - (prefix, destination, chroot_path, crates_io_index_path) -} diff --git a/src/docbuilder/queue.rs b/src/docbuilder/queue.rs deleted file mode 100644 index 23fdc7757..000000000 --- a/src/docbuilder/queue.rs +++ /dev/null @@ -1,100 +0,0 @@ -//! Updates crates.io index and builds new packages - - -use super::DocBuilder; -use db::connect_db; -use error::Result; -use crates_index_diff::{ChangeKind, Index}; - - -impl DocBuilder { - /// Updates crates.io-index repository and adds new crates into build queue. - /// Returns size of queue - pub fn get_new_crates(&mut self) -> Result { - let conn = try!(connect_db()); - let index = try!(Index::from_path_or_cloned(&self.options.crates_io_index_path)); - let mut changes = try!(index.fetch_changes()); - - // I belive this will fix ordering of queue if we get more than one crate from changes - changes.reverse(); - - for krate in changes.iter().filter(|k| k.kind != ChangeKind::Yanked) { - conn.execute("INSERT INTO queue (name, version) VALUES ($1, $2)", - &[&krate.name, &krate.version]) - .ok(); - debug!("{}-{} added into build queue", krate.name, krate.version); - } - - let queue_count = conn.query("SELECT COUNT(*) FROM queue WHERE attempt < 5", &[]) - .unwrap() - .get(0) - .get(0); - - Ok(queue_count) - } - - - /// Builds packages from queue - pub fn build_packages_queue(&mut self) -> Result { - let conn = try!(connect_db()); - let mut build_count = 0; - - for row in &try!(conn.query("SELECT id, name, version - FROM queue - WHERE attempt < 5 - ORDER BY id ASC", - &[])) { - let id: i32 = row.get(0); - let name: String = row.get(1); - let version: String = row.get(2); - - match self.build_package(&name[..], &version[..]) { - Ok(_) => { - build_count += 1; - let _ = conn.execute("DELETE FROM queue WHERE id = $1", &[&id]); - } - Err(e) => { - // Increase attempt count - let _ = conn.execute("UPDATE queue SET attempt = attempt + 1 WHERE id = $1", - &[&id]); - error!("Failed to build package {}-{} from queue: {}", - name, - version, - e) - } - } - } - - Ok(build_count) - } -} - -#[cfg(test)] -mod test { - extern crate env_logger; - use std::path::PathBuf; - use {DocBuilder, DocBuilderOptions}; - - #[test] - #[ignore] - fn test_get_new_crates() { - let _ = env_logger::try_init(); - let options = DocBuilderOptions::from_prefix(PathBuf::from("../cratesfyi-prefix")); - let mut docbuilder = DocBuilder::new(options); - let res = docbuilder.get_new_crates(); - if res.is_err() { - error!("{:?}", res); - } - assert!(res.is_ok()); - } - - - #[test] - #[ignore] - fn test_build_packages_queue() { - let _ = env_logger::try_init(); - let options = DocBuilderOptions::from_prefix(PathBuf::from("../cratesfyi-prefix")); - let mut docbuilder = DocBuilder::new(options); - assert!(docbuilder.build_packages_queue().is_ok()); - } -} diff --git a/src/error.rs b/src/error.rs deleted file mode 100644 index 3f200eff0..000000000 --- a/src/error.rs +++ /dev/null @@ -1,7 +0,0 @@ -//! Errors used in cratesfyi - -use std::result::Result as StdResult; - -pub use failure::{Error, ResultExt}; - -pub type Result = StdResult; diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index 17bc0af96..000000000 --- a/src/lib.rs +++ /dev/null @@ -1,51 +0,0 @@ -//! [Docs.rs](https://docs.rs) (formerly cratesfyi) is an open source project to host -//! documentation of crates for the Rust Programming Language. - -#[macro_use] -extern crate log; -#[macro_use] -extern crate failure; -extern crate cargo; -extern crate regex; -extern crate rustc_serialize; -extern crate postgres; -extern crate reqwest; -extern crate time; -extern crate semver; -extern crate slug; -extern crate magic; -extern crate iron; -extern crate router; -extern crate staticfile; -extern crate handlebars_iron; -extern crate comrak; -extern crate r2d2; -extern crate r2d2_postgres; -extern crate url; -extern crate params; -extern crate libc; -extern crate badge; -extern crate crates_index_diff; -extern crate git2; -extern crate toml; -extern crate html5ever; - -pub use self::docbuilder::DocBuilder; -pub use self::docbuilder::ChrootBuilderResult; -pub use self::docbuilder::options::DocBuilderOptions; -pub use self::docbuilder::metadata::Metadata; -pub use self::web::start_web_server; - -pub mod error; -pub mod db; -pub mod utils; -mod docbuilder; -mod web; - - -/// Version string generated at build time contains last git -/// commit hash and build date -pub const BUILD_VERSION: &'static str = concat!(env!("CARGO_PKG_VERSION"), - " ", - include_str!(concat!(env!("OUT_DIR"), - "/git_version"))); diff --git a/src/utils/build_doc.rs b/src/utils/build_doc.rs deleted file mode 100644 index a6e6e3cb1..000000000 --- a/src/utils/build_doc.rs +++ /dev/null @@ -1,240 +0,0 @@ -//! Crate documentation builder -//! -//! This module is extremely similar to cargo install operation, except it's building -//! documentation of a crate and not installing anything. - -use std::path::{Path, PathBuf}; -use std::env; -use std::sync::Arc; - -use cargo::core::{self, SourceId, Dependency, Source, Package, Workspace}; -use cargo::core::compiler::{DefaultExecutor, CompileMode, MessageFormat, BuildConfig, Executor}; -use cargo::core::package::PackageSet; -use cargo::core::registry::PackageRegistry; -use cargo::core::resolver; -use cargo::core::source::SourceMap; -use cargo::util::{CargoResult, Config, internal, Filesystem}; -use cargo::sources::SourceConfigMap; -use cargo::ops::{self, Packages}; - -use utils::{get_current_versions, parse_rustc_version}; -use error::Result; - -use Metadata; - - -/// Builds documentation of a crate and version. -/// -/// Crate will be built into current working directory/crate-version. -/// -/// It will build latest version, if no version is given. -// idea is to make cargo to download -// and build a crate and its documentation -// instead of doing it manually like in the previous version of cratesfyi -pub fn build_doc(name: &str, vers: Option<&str>, target: Option<&str>) -> Result { - core::enable_nightly_features(); - let config = try!(Config::default()); - let source_id = try!(SourceId::crates_io(&config)); - - let source_cfg_map = try!(SourceConfigMap::new(&config)); - let mut source = try!(source_cfg_map.load(source_id)); - - // update crates.io-index registry - try!(source.update()); - - let dep = try!(Dependency::parse_no_deprecated(name, vers, source_id)); - let deps = try!(source.query_vec(&dep)); - let pkgid = try!(deps.iter().map(|p| p.package_id()).max() - // FIXME: This is probably not a rusty way to handle options and results - // or maybe it is who knows... - .ok_or(internal("no package id available"))); - - let mut source_map = SourceMap::new(); - source_map.insert(source); - - let pkg_set = try!(PackageSet::new(&[pkgid.clone()], source_map, &config)); - - let pkg = try!(pkg_set.get_one(pkgid)).clone(); - - let current_dir = try!(env::current_dir()); - let target_dir = PathBuf::from(current_dir).join("cratesfyi"); - - let metadata = Metadata::from_package(&pkg).map_err(|e| internal(e.to_string()))?; - - // This is only way to pass rustc_args to cargo. - // CompileOptions::target_rustc_args is used only for the current crate, - // and since docs.rs never runs rustc on the current crate, we assume rustc_args - // will be used for the dependencies. That is why we are creating RUSTFLAGS environment - // variable instead of using target_rustc_args. - if let Some(rustc_args) = metadata.rustc_args { - env::set_var("RUSTFLAGS", rustc_args.join(" ")); - } - - // since https://github.com/rust-lang/rust/pull/48511 we can pass --resource-suffix to - // add correct version numbers to css and javascript files - let mut rustdoc_args: Vec = - vec!["-Z".to_string(), "unstable-options".to_string(), - "--resource-suffix".to_string(), - format!("-{}", parse_rustc_version(get_current_versions()?.0)?), - "--static-root-path".to_string(), "/".to_string(), - "--disable-per-crate-search".to_string()]; - - // since https://github.com/rust-lang/rust/pull/51384, we can pass --extern-html-root-url to - // force rustdoc to link to other docs.rs docs for dependencies - let source = try!(source_cfg_map.load(source_id)); - for (name, dep) in try!(resolve_deps(&pkg, &config, source)) { - rustdoc_args.push("--extern-html-root-url".to_string()); - rustdoc_args.push(format!("{}=https://docs.rs/{}/{}", - name.replace("-", "_"), dep.name(), dep.version())); - } - - if let Some(package_rustdoc_args) = metadata.rustdoc_args { - rustdoc_args.append(&mut package_rustdoc_args.iter().map(|s| s.to_owned()).collect()); - } - - let mut build_config = try!(BuildConfig::new(&config, - None, - &target.map(|t| t.to_string()), - CompileMode::Doc { deps: false })); - build_config.release = false; - build_config.message_format = MessageFormat::Human; - - let opts = ops::CompileOptions { - config: &config, - build_config, - features: metadata.features.unwrap_or(Vec::new()), - all_features: metadata.all_features, - no_default_features: metadata.no_default_features, - spec: Packages::Packages(Vec::new()), - filter: ops::CompileFilter::new(true, - Vec::new(), false, - Vec::new(), false, - Vec::new(), false, - Vec::new(), false, - false), - target_rustc_args: None, - target_rustdoc_args: Some(rustdoc_args), - local_rustdoc_args: None, - export_dir: None, - }; - - let ws = try!(Workspace::ephemeral(pkg, &config, Some(Filesystem::new(target_dir)), false)); - let exec: Arc = Arc::new(DefaultExecutor); - let source = try!(source_cfg_map.load(source_id)); - try!(ops::compile_ws(&ws, Some(source), &opts, &exec)); - - Ok(try!(ws.current()).clone()) -} - -fn resolve_deps<'cfg>(pkg: &Package, config: &'cfg Config, src: Box) - -> CargoResult> -{ - let mut registry = try!(PackageRegistry::new(config)); - registry.add_preloaded(src); - registry.lock_patches(); - - let resolver = try!(resolver::resolve( - &[(pkg.summary().clone(), resolver::Method::Everything)], - pkg.manifest().replace(), - &mut registry, - &Default::default(), - None, - false, - )); - let dep_ids = resolver.deps(pkg.package_id()).map(|p| p.0).collect::>(); - let pkg_set = try!(registry.get(&dep_ids)); - let deps = try!(pkg_set.get_many(dep_ids)); - - let mut ret = Vec::new(); - for dep in deps { - if let Some(d) = pkg.dependencies().iter().find(|d| d.package_name() == dep.name()) { - ret.push((d.name_in_toml().to_string(), dep.clone())); - } - } - - Ok(ret) -} - -/// Downloads a crate and returns Cargo Package. -pub fn get_package(name: &str, vers: Option<&str>) -> CargoResult { - core::enable_nightly_features(); - debug!("Getting package with cargo"); - let config = try!(Config::default()); - let source_id = try!(SourceId::crates_io(&config)); - - let source_map = try!(SourceConfigMap::new(&config)); - let mut source = try!(source_map.load(source_id)); - - try!(source.update()); - - let dep = try!(Dependency::parse_no_deprecated(name, vers, source_id)); - let deps = try!(source.query_vec(&dep)); - let pkgid = try!(deps.iter().map(|p| p.package_id()).max() - // FIXME: This is probably not a rusty way to handle options and results - // or maybe it is who knows... - .ok_or(internal("no package id available"))); - - let mut source_map = SourceMap::new(); - source_map.insert(source); - - let pkg_set = try!(PackageSet::new(&[pkgid.clone()], source_map, &config)); - - let pkg = try!(pkg_set.get_one(pkgid)).clone(); - - Ok(pkg) -} - - -/// Updates central crates-io.index repository -pub fn update_sources() -> CargoResult<()> { - let config = try!(Config::default()); - let source_id = try!(SourceId::crates_io(&config)); - - let source_map = try!(SourceConfigMap::new(&config)); - let mut source = try!(source_map.load(source_id)); - - source.update() -} - - -/// Gets source path of a downloaded package. -pub fn source_path(pkg: &Package) -> Option<&Path> { - // parent of the manifest file is where source codes are stored - pkg.manifest_path().parent() -} - - - - -#[cfg(test)] -mod test { - use std::path::Path; - use super::*; - - #[test] - fn test_get_package() { - let pkg = get_package("rand", None); - assert!(pkg.is_ok()); - - let pkg = pkg.unwrap(); - - let manifest = pkg.manifest(); - assert_eq!(manifest.name().as_str(), "rand"); - } - - - #[test] - fn test_source_path() { - let pkg = get_package("rand", None).unwrap(); - let source_path = source_path(&pkg).unwrap(); - assert!(source_path.is_dir()); - - let cargo_toml_path = Path::new(source_path).join("Cargo.toml"); - assert!(cargo_toml_path.exists()); - assert!(cargo_toml_path.is_file()); - - let src_path = Path::new(source_path).join("src"); - assert!(src_path.exists()); - assert!(src_path.is_dir()); - } -} diff --git a/src/utils/copy.rs b/src/utils/copy.rs deleted file mode 100644 index bc73c8dd1..000000000 --- a/src/utils/copy.rs +++ /dev/null @@ -1,124 +0,0 @@ - -// FIXME: There is so many PathBuf's in this module -// Conver them to Path - -use std::path::{Path, PathBuf}; -use std::fs; -use error::Result; - -use regex::Regex; - - -/// Copies files from source directory to destination directory. -pub fn copy_dir>(source: P, destination: P) -> Result<()> { - copy_files_and_handle_html(source.as_ref().to_path_buf(), - destination.as_ref().to_path_buf(), - false, - "") -} - - -/// Copies documentation from a crate's target directory to destination. -/// -/// Target directory must have doc directory. -/// -/// This function is designed to avoid file duplications. It is using rustc version string -/// to rename common files (css files, jquery.js, playpen.js, main.js etc.) in a standard rustdoc. -pub fn copy_doc_dir>(target: P, - destination: P, - rustc_version: &str) - -> Result<()> { - let source = PathBuf::from(target.as_ref()).join("doc"); - copy_files_and_handle_html(source, - destination.as_ref().to_path_buf(), - true, - rustc_version) -} - - -fn copy_files_and_handle_html(source: PathBuf, - destination: PathBuf, - handle_html: bool, - rustc_version: &str) - -> Result<()> { - - // FIXME: handle_html is useless since we started using --resource-suffix - // argument with rustdoc - - // Make sure destination directory is exists - if !destination.exists() { - try!(fs::create_dir_all(&destination)); - } - - // Avoid copying common files - let dup_regex = Regex::new( - r"(\.lock|\.txt|\.woff|\.svg|\.css|main-.*\.css|main-.*\.js|normalize-.*\.js|rustdoc-.*\.css|storage-.*\.js|theme-.*\.js)$") - .unwrap(); - - for file in try!(source.read_dir()) { - - let file = try!(file); - let mut destination_full_path = PathBuf::from(&destination); - destination_full_path.push(file.file_name()); - - let metadata = try!(file.metadata()); - - if metadata.is_dir() { - try!(fs::create_dir_all(&destination_full_path)); - try!(copy_files_and_handle_html(file.path(), - destination_full_path, - handle_html, - &rustc_version)) - } else if handle_html && dup_regex.is_match(&file.file_name().into_string().unwrap()[..]) { - continue; - } else { - try!(fs::copy(&file.path(), &destination_full_path)); - } - - } - Ok(()) -} - - - -#[cfg(test)] -mod test { - extern crate env_logger; - extern crate tempdir; - use std::fs; - use std::path::Path; - use super::*; - - #[test] - #[ignore] - fn test_copy_dir() { - let destination = tempdir::TempDir::new("cratesfyi").unwrap(); - - // lets try to copy a src directory to tempdir - let res = copy_dir(Path::new("src"), destination.path()); - // remove temp dir - fs::remove_dir_all(destination.path()).unwrap(); - - assert!(res.is_ok()); - } - - - #[test] - #[ignore] - fn test_copy_doc_dir() { - // lets build documentation of rand crate - use utils::build_doc; - let pkg = build_doc("rand", None, None).unwrap(); - - let pkg_dir = format!("rand-{}", pkg.manifest().version()); - let target = Path::new(&pkg_dir); - let destination = tempdir::TempDir::new("cratesfyi").unwrap(); - let res = copy_doc_dir(target, destination.path(), "UNKNOWN"); - - // remove build and temp dir - fs::remove_dir_all(target).unwrap(); - fs::remove_dir_all(destination.path()).unwrap(); - - assert!(res.is_ok()); - } -} diff --git a/src/utils/daemon.rs b/src/utils/daemon.rs deleted file mode 100644 index 0b1e25c45..000000000 --- a/src/utils/daemon.rs +++ /dev/null @@ -1,174 +0,0 @@ -//! Simple daemon -//! -//! This daemon will start web server, track new packages and build them - - -use std::{env, thread}; -use std::process::exit; -use std::fs::File; -use std::io::Write; -use std::time::Duration; -use std::path::PathBuf; -use libc::fork; -use time; -use DocBuilderOptions; -use DocBuilder; -use utils::{update_sources, update_release_activity, github_updater, pubsubhubbub}; -use db::{connect_db, update_search_index}; - - - -pub fn start_daemon() { - // first check required environment variables - for v in ["CRATESFYI_PREFIX", - "CRATESFYI_PREFIX", - "CRATESFYI_GITHUB_USERNAME", - "CRATESFYI_GITHUB_ACCESSTOKEN"] - .iter() { - env::var(v).expect("Environment variable not found"); - } - - let dbopts = opts(); - - // check paths once - dbopts.check_paths().unwrap(); - - // fork the process - let pid = unsafe { fork() }; - if pid > 0 { - let mut file = File::create(dbopts.prefix.join("cratesfyi.pid")) - .expect("Failed to create pid file"); - writeln!(&mut file, "{}", pid).expect("Failed to write pid"); - - info!("cratesfyi {} daemon started on: {}", ::BUILD_VERSION, pid); - exit(0); - } - - - // check new crates every minute - thread::spawn(move || { - loop { - thread::sleep(Duration::from_secs(60)); - - let mut opts = opts(); - opts.skip_if_exists = true; - - // check lock file - if opts.prefix.join("cratesfyi.lock").exists() { - warn!("Lock file exits, skipping building new crates"); - continue; - } - - let mut doc_builder = DocBuilder::new(opts); - - debug!("Checking new crates"); - let queue_count = match doc_builder.get_new_crates() { - Ok(size) => size, - Err(e) => { - error!("Failed to get new crates: {}", e); - continue; - } - }; - - // Only build crates if there is any - if queue_count == 0 { - debug!("Queue is empty, going back to sleep"); - continue; - } - - info!("Building {} crates from queue", queue_count); - - // update index - if let Err(e) = update_sources() { - error!("Failed to update sources: {}", e); - continue; - } - - if let Err(e) = doc_builder.load_cache() { - error!("Failed to load cache: {}", e); - continue; - } - - - // Run build_packages_queue in it's own thread to catch panics - // This only panicked twice in the last 6 months but its just a better - // idea to do this. - let res = thread::spawn(move || { - match doc_builder.build_packages_queue() { - Err(e) => error!("Failed build new crates: {}", e), - Ok(n) => { - if n > 0 { - match pubsubhubbub::ping_hubs() { - Err(e) => error!("Failed to ping hub: {}", e), - Ok(n) => debug!("Succesfully pinged {} hubs", n) - } - } - } - } - - if let Err(e) = doc_builder.save_cache() { - error!("Failed to save cache: {}", e); - } - - debug!("Finished building new crates, going back to sleep"); - }) - .join(); - - if let Err(e) = res { - error!("GRAVE ERROR Building new crates panicked: {:?}", e); - } - } - }); - - - // update release activity everyday at 23:55 - thread::spawn(move || { - loop { - thread::sleep(Duration::from_secs(60)); - let now = time::now(); - if now.tm_hour == 23 && now.tm_min == 55 { - info!("Updating release activity"); - if let Err(e) = update_release_activity() { - error!("Failed to update release activity: {}", e); - } - } - } - }); - - - // update search index every 3 hours - thread::spawn(move || { - loop { - thread::sleep(Duration::from_secs(60 * 60 * 3)); - let conn = connect_db().expect("Failed to connect database"); - if let Err(e) = update_search_index(&conn) { - error!("Failed to update search index: {}", e); - } - } - }); - - - // update github stats every 6 hours - thread::spawn(move || { - loop { - thread::sleep(Duration::from_secs(60 * 60 * 6)); - if let Err(e) = github_updater() { - error!("Failed to update github fields: {}", e); - } - } - }); - - // TODO: update ssl certificate every 3 months - - // at least start web server - info!("Starting web server"); - ::start_web_server(None); -} - - - -fn opts() -> DocBuilderOptions { - let prefix = PathBuf::from(env::var("CRATESFYI_PREFIX") - .expect("CRATESFYI_PREFIX environment variable not found")); - DocBuilderOptions::from_prefix(prefix) -} diff --git a/src/utils/github_updater.rs b/src/utils/github_updater.rs deleted file mode 100644 index 9d45d2dc1..000000000 --- a/src/utils/github_updater.rs +++ /dev/null @@ -1,185 +0,0 @@ - -use ::db::connect_db; -use regex::Regex; -use time; -use error::Result; -use failure::err_msg; - - -/// Fields we need use in cratesfyi -#[derive(Debug)] -struct GitHubFields { - pub description: String, - pub stars: i64, - pub forks: i64, - pub issues: i64, - pub last_commit: time::Timespec, -} - - -/// Updates github fields in crates table -pub fn github_updater() -> Result<()> { - let conn = try!(connect_db()); - - // TODO: This query assumes repository field in Cargo.toml is - // always the same across all versions of a crate - for row in &try!(conn.query("SELECT DISTINCT ON (crates.name) - crates.name, - crates.id, - releases.repository_url - FROM crates - INNER JOIN releases ON releases.crate_id = crates.id - WHERE releases.repository_url ~ '^https*://github.com' AND - (crates.github_last_update < NOW() - INTERVAL '1 day' OR - crates.github_last_update IS NULL) - ORDER BY crates.name, releases.release_time DESC", - &[])) { - let crate_name: String = row.get(0); - let crate_id: i32 = row.get(1); - let repository_url: String = row.get(2); - - if let Err(err) = get_github_path(&repository_url[..]) - .ok_or_else(|| err_msg("Failed to get github path")) - .and_then(|path| get_github_fields(&path[..])) - .and_then(|fields| { - conn.execute("UPDATE crates - SET github_description = $1, - github_stars = $2, github_forks = $3, - github_issues = $4, github_last_commit = $5, - github_last_update = NOW() WHERE id = $6", - &[&fields.description, - &(fields.stars as i32), - &(fields.forks as i32), - &(fields.issues as i32), - &(fields.last_commit), - &crate_id]) - .or_else(|e| Err(e.into())) - }) { - debug!("Failed to update github fields of: {} {}", crate_name, err); - } - - // sleep for rate limits - use std::thread; - use std::time::Duration; - thread::sleep(Duration::from_secs(2)); - } - - Ok(()) -} - - -fn get_github_fields(path: &str) -> Result { - use rustc_serialize::json::Json; - - let body = { - use std::io::Read; - use reqwest::{Client, StatusCode}; - use reqwest::header::USER_AGENT; - use std::env; - - let client = Client::new(); - let mut body = String::new(); - - let mut resp = try!(client.get(&format!("https://api.github.com/repos/{}", path)[..]) - .header(USER_AGENT, format!("cratesfyi/{}", env!("CARGO_PKG_VERSION"))) - .basic_auth( - env::var("CRATESFYI_GITHUB_USERNAME") - .ok() - .and_then(|u| Some(u.to_string())) - .unwrap_or("".to_string()), - env::var("CRATESFYI_GITHUB_ACCESSTOKEN").ok(), - ) - .send()); - - if resp.status() != StatusCode::OK { - return Err(err_msg("Failed to get github data")); - } - - try!(resp.read_to_string(&mut body)); - body - }; - - let json = try!(Json::from_str(&body[..])); - let obj = json.as_object().unwrap(); - - Ok(GitHubFields { - description: obj.get("description").and_then(|d| d.as_string()).unwrap_or("").to_string(), - stars: obj.get("stargazers_count").and_then(|d| d.as_i64()).unwrap_or(0), - forks: obj.get("forks_count").and_then(|d| d.as_i64()).unwrap_or(0), - issues: obj.get("open_issues").and_then(|d| d.as_i64()).unwrap_or(0), - last_commit: time::strptime(obj.get("pushed_at") - .and_then(|d| d.as_string()) - .unwrap_or(""), - "%Y-%m-%dT%H:%M:%S") - .unwrap_or(time::now()) - .to_timespec(), - }) -} - - - -fn get_github_path(url: &str) -> Option { - let re = Regex::new(r"https?://github\.com/([\w\._-]+)/([\w\._-]+)").unwrap(); - match re.captures(url) { - Some(cap) => { - let username = cap.get(1).unwrap().as_str(); - let reponame = cap.get(2).unwrap().as_str(); - Some(format!("{}/{}", - username, - if reponame.ends_with(".git") { - reponame.split(".git").nth(0).unwrap() - } else { - reponame - })) - } - None => None, - } -} - - - -#[cfg(test)] -mod test { - extern crate env_logger; - use super::{get_github_path, get_github_fields, github_updater}; - - #[test] - fn test_get_github_path() { - assert_eq!(get_github_path("https://github.com/onur/cratesfyi"), - Some("onur/cratesfyi".to_string())); - assert_eq!(get_github_path("http://github.com/onur/cratesfyi"), - Some("onur/cratesfyi".to_string())); - assert_eq!(get_github_path("https://github.com/onur/cratesfyi.git"), - Some("onur/cratesfyi".to_string())); - assert_eq!(get_github_path("https://github.com/onur23cmD_M_R_L_/crates_fy-i"), - Some("onur23cmD_M_R_L_/crates_fy-i".to_string())); - assert_eq!(get_github_path("https://github.com/docopt/docopt.rs"), - Some("docopt/docopt.rs".to_string())); - } - - - #[test] - #[ignore] - fn test_get_github_fields() { - let _ = env_logger::try_init(); - let fields = get_github_fields("onur/cratesfyi"); - assert!(fields.is_ok()); - - let fields = fields.unwrap(); - assert!(fields.description != "".to_string()); - assert!(fields.stars >= 0); - assert!(fields.forks >= 0); - assert!(fields.issues >= 0); - - use time; - assert!(fields.last_commit <= time::now().to_timespec()); - } - - - #[test] - #[ignore] - fn test_github_updater() { - let _ = env_logger::try_init(); - assert!(github_updater().is_ok()); - } -} diff --git a/src/utils/html.rs b/src/utils/html.rs deleted file mode 100644 index a7fe2b41a..000000000 --- a/src/utils/html.rs +++ /dev/null @@ -1,74 +0,0 @@ -use error::Result; -use failure::err_msg; - -use html5ever::serialize::{serialize, SerializeOpts}; -use html5ever::rcdom::{RcDom, NodeData, Handle}; -use html5ever::driver::{parse_document, ParseOpts}; -use html5ever::tendril::TendrilSink; - -/// Extracts the contents of the `` and `` tags from an HTML document, as well as the -/// classes on the `` tag, if any. -pub fn extract_head_and_body(html: &str) -> Result<(String, String, String)> { - let parser = parse_document(RcDom::default(), ParseOpts::default()); - let dom = parser.one(html); - - let (head, body) = extract_from_rcdom(&dom)?; - let class = extract_class(&body); - - Ok((stringify(head), stringify(body), class)) -} - -fn extract_from_rcdom(dom: &RcDom) -> Result<(Handle, Handle)> { - let mut worklist = vec![dom.document.clone()]; - let (mut head, mut body) = (None, None); - - while let Some(handle) = worklist.pop() { - match handle.data { - NodeData::Element { ref name, .. } => match name.local.as_ref() { - "head" => { - if head.is_some() { - return Err(err_msg("duplicate tag")); - } else { - head = Some(handle.clone()); - } - } - "body" => { - if body.is_some() { - return Err(err_msg("duplicate tag")); - } else { - body = Some(handle.clone()); - } - } - _ => {} // do nothing - } - _ => {} // do nothing - } - - worklist.extend(handle.children.borrow().iter().cloned()); - } - - let head = head.ok_or_else(|| err_msg("couldn't find tag in rustdoc output"))?; - let body = body.ok_or_else(|| err_msg("couldn't find tag in rustdoc output"))?; - Ok((head, body)) -} - -fn stringify(node: Handle) -> String { - let mut vec = Vec::new(); - serialize(&mut vec, &node, SerializeOpts::default()) - .expect("serializing into buffer failed"); - - String::from_utf8(vec).expect("html5ever returned non-utf8 data") -} - -fn extract_class(node: &Handle) -> String { - match node.data { - NodeData::Element { ref attrs, .. } => { - let attrs = attrs.borrow(); - - attrs.iter() - .find(|a| &a.name.local == "class") - .map_or(String::new(), |a| a.value.to_string()) - } - _ => String::new() - } -} diff --git a/src/utils/mod.rs b/src/utils/mod.rs deleted file mode 100644 index c0db8296c..000000000 --- a/src/utils/mod.rs +++ /dev/null @@ -1,19 +0,0 @@ -//! Various utilities for cratesfyi - - -pub use self::build_doc::{build_doc, get_package, source_path, update_sources}; -pub use self::copy::{copy_dir, copy_doc_dir}; -pub use self::github_updater::github_updater; -pub use self::release_activity_updater::update_release_activity; -pub use self::daemon::start_daemon; -pub use self::rustc_version::{parse_rustc_version, get_current_versions, command_result}; -pub use self::html::extract_head_and_body; - -mod github_updater; -mod build_doc; -mod copy; -mod release_activity_updater; -mod daemon; -mod pubsubhubbub; -mod rustc_version; -mod html; diff --git a/src/utils/pubsubhubbub.rs b/src/utils/pubsubhubbub.rs deleted file mode 100644 index 6437dbcec..000000000 --- a/src/utils/pubsubhubbub.rs +++ /dev/null @@ -1,22 +0,0 @@ -use std::collections::HashMap; - -use reqwest::*; - -fn ping_hub(url: &str) -> Result { - let mut params = HashMap::new(); - params.insert("hub.mode", "publish"); - params.insert("hub.url", "https://docs.rs/releases/feed"); - let client = Client::new(); - client.post(url).form(¶ms).send() -} - -/// Ping the two predefined hubs. Return either the number of successfully -/// pinged hubs, or the first error. -pub fn ping_hubs() -> Result { - vec!["https://pubsubhubbub.appspot.com", - "https://pubsubhubbub.superfeedr.com"] - .into_iter() - .map(ping_hub) - .collect::>>() - .map(|v| v.len()) -} diff --git a/src/utils/release_activity_updater.rs b/src/utils/release_activity_updater.rs deleted file mode 100644 index cc9861f1c..000000000 --- a/src/utils/release_activity_updater.rs +++ /dev/null @@ -1,78 +0,0 @@ - -use db::connect_db; -use time::{now, Duration}; -use std::collections::BTreeMap; -use rustc_serialize::json::ToJson; -use error::Result; - - -pub fn update_release_activity() -> Result<()> { - - let conn = try!(connect_db()); - let mut dates = Vec::new(); - let mut crate_counts = Vec::new(); - let mut failure_counts = Vec::new(); - - for day in 0..30 { - let rows = try!(conn.query(&format!("SELECT COUNT(*) - FROM releases - WHERE release_time < NOW() - INTERVAL '{} day' AND - release_time > NOW() - INTERVAL '{} day'", - day, - day + 1), - &[])); - let failures_count_rows = try!(conn.query( - &format!("SELECT COUNT(*) - FROM releases - WHERE is_library = TRUE AND - build_status = FALSE AND - release_time < NOW() - INTERVAL '{} day' AND - release_time > NOW() - INTERVAL '{} day'", - day, - day + 1), - &[])); - let release_count: i64 = rows.get(0).get(0); - let failure_count: i64 = failures_count_rows.get(0).get(0); - let now = now(); - let date = now - Duration::days(day); - dates.push(format!("{}", date.strftime("%d %b").unwrap())); - // unwrap is fine here, ~~~~~~~~~~~~^ our date format is always valid - crate_counts.push(release_count); - failure_counts.push(failure_count); - } - - dates.reverse(); - crate_counts.reverse(); - failure_counts.reverse(); - - let map = { - let mut map = BTreeMap::new(); - map.insert("dates".to_owned(), dates.to_json()); - map.insert("counts".to_owned(), crate_counts.to_json()); - map.insert("failures".to_owned(), failure_counts.to_json()); - map.to_json() - }; - - try!(conn.query("INSERT INTO config (name, value) VALUES ('release_activity', $1)", - &[&map]) - .or_else(|_| { - conn.query("UPDATE config SET value = $1 WHERE name = 'release_activity'", - &[&map]) - })); - - Ok(()) -} - - -#[cfg(test)] -mod test { - extern crate env_logger; - use super::update_release_activity; - - #[test] - #[ignore] - fn test_update_release_activity() { - let _ = env_logger::try_init(); - assert!(update_release_activity().is_ok()); - } -} diff --git a/src/utils/rustc_version.rs b/src/utils/rustc_version.rs deleted file mode 100644 index b7fea0a04..000000000 --- a/src/utils/rustc_version.rs +++ /dev/null @@ -1,47 +0,0 @@ - -use std::process::{Command, Output}; -use regex::Regex; -use error::Result; -use failure::err_msg; - -/// Parses rustc commit hash from rustc version string -pub fn parse_rustc_version>(version: S) -> Result { - let version_regex = Regex::new(r" ([\w.-]+) \((\w+) (\d+)-(\d+)-(\d+)\)")?; - let captures = version_regex.captures(version.as_ref()) - .ok_or_else(|| err_msg("Failed to parse rustc version"))?; - - Ok(format!("{}{}{}-{}-{}", - captures.get(3).unwrap().as_str(), - captures.get(4).unwrap().as_str(), - captures.get(5).unwrap().as_str(), - captures.get(1).unwrap().as_str(), - captures.get(2).unwrap().as_str())) -} - - -/// Returns current version of rustc and cratesfyi -pub fn get_current_versions() -> Result<(String, String)> { - let rustc_version = command_result(Command::new("rustc").arg("--version").output()?)?; - let cratesfyi_version = command_result(Command::new("rustc").arg("--version").output()?)?; - - Ok((rustc_version, cratesfyi_version)) -} - - -pub fn command_result(output: Output) -> Result { - let mut command_out = String::from_utf8_lossy(&output.stdout).into_owned(); - command_out.push_str(&String::from_utf8_lossy(&output.stderr).into_owned()[..]); - match output.status.success() { - true => Ok(command_out), - false => Err(err_msg(command_out)), - } -} - - -#[test] -fn test_parse_rustc_version() { - assert_eq!(parse_rustc_version("rustc 1.10.0-nightly (57ef01513 2016-05-23)").unwrap(), - "20160523-1.10.0-nightly-57ef01513"); - assert_eq!(parse_rustc_version("cratesfyi 0.2.0 (ba9ae23 2016-05-26)").unwrap(), - "20160526-0.2.0-ba9ae23"); -} diff --git a/src/web/badge/Cargo.toml b/src/web/badge/Cargo.toml deleted file mode 100644 index 19d04e203..000000000 --- a/src/web/badge/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "badge" -version = "0.2.0" -description = "Simple badge generator" -authors = ["Onur Aslan "] -license-file = "LICENSE" -repository = "https://github.com/rust-lang/docs.rs" -documentation = "https://docs.rs/badge" - -[lib] -path = "badge.rs" - -[dependencies] -base64 = "0.9.0" -rusttype = "0.7" diff --git a/src/web/badge/DejaVuSans.ttf b/src/web/badge/DejaVuSans.ttf deleted file mode 100644 index de12789bbe65f29b80ed54e2488b959d67066434..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 756072 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%0A>xQGSOkX(6& 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∓cmjc5@UE}Tor@yy{lp2khOpLEMlT8p8`!DS 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

ns{BBcwG^8b)*P7IH*gw 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

pvaa z34Ve7rsf;LQ{N}&<>3?!vJnKk$(8J8GrQT?G-O>YlOMQMyH&r{xYcu8hE5ksrSi|q zSig7IG0ifx=^k+WicB|&pNqhB_^FpW4jtOL-JF~HZ5lCr*Y%~JTr#AfZI0Jt>^*o; z>#=O~?5heo3_o|sgkBfz$m{gV6MYvB9^9rwowP3J$pjPi(aQIcWKS~mq?`hyoAtF) zq!eJr3^#;iVeE@80yi>Y_Aa~ka&xV$KdR-qrGp2Twmf&-@#8RO5J#K{AN6eXX3>o< zDVQ;%eP{1yAnlSj0hv^3`BsqiCuzIQR5 z(uAb2`HQb##IN^Y`+3ujbQ)b*6ZgftFJ`<``|`rLYXV=58*e`w-<0pz@LF2w@4wHm z9)6=S2G7;8;@K6)`?})GR!>3 z^EbJn@%76;Jh5VWz0mUX3&%XLw6I;B@NLS&wJ*5gfd|I4Lw0Zg_RP$KmftZ>%x}VjIQo~>TwIa~JLJ2eu{T^Eqo*|ioyNw(jQ&D3IBIc#qDjZWP zF)y)2bU}^91ieFT_FI$_s=TDDj#M<$`m$p>P8W7eCuucx>k(?2_`MDo`6+zqSh_Z$ z_P~*W^qE7Roj1ljb(#6=nAsD1ck34TY|O;XXtwy)_38_!FMf3TqqQwRkA@c6tZ~6J zWzFY|Hc!d8(Q}%wys3Ba^ta#cT>E-j>2F#j{laN0K74F?y8Q9mozEY%^~z!J=*4a} z+~QPOqV1ci=oy-JOmR3*$1mrAMNbURQ4M3UtlVTb1|{>o%)yi6caDC9_)MKS{!ux4 zOnLT|q+>q4alFmHtzm30d4%ix{l#P2$)4{ILXH1>z1^eL0#Y-XH!WX3dh~bK7R-XC zv2#}cm+)-7}J68~*u zLY$#Ruh#iy%sBJ=m47WeTZi?igZym0dg>T0ht=jsLlA$xd9vQwvV;Ef_wZ5Q<>c~uT~dc^HltZ4X^jA_sYzQQ`|F_`I=DA zi11=x_^5X_=m+uAP}GrG`1Mr>YpcxH%|54;Dat#_lv8GZ&-vyq^RYj=8DGl%a)mkE z?DR)H;}tnlUQ|6TOx`gq!rCfq0N;End{4M__?}bp1#^eIK#n$c|54BEWDdvgEx%@b z`A2v2adQXJQpJGq9>3|Gf~Wd44yGekak$EGY80RW|w`hJh|#g{C{Pi+)K|ZR^U0@U1=vjKX9OM)TqJ(2h956 zH_Qy@P0I*Z=tBk#cygsV{p(N7=_{TbIB?*A6)WZZPrjD(S3WsF4tah5fuB#BpPS$Q zbn@V9hYr1V;K!e3Et&D-&j(&}=b;WX0Q&6z2>;mjh^-x2yliOv?cdMEW_5x3SZMV3 zq0#DNo{9g#%xoSP8vP?t_)&#@TUj>$iF~E_=-10}Yk5;2Zf*My7M!_wc>bw4U!l9Gm*74H6H zs10d7tDQNvU{iNm)umT8%}nziS(JnW2g}`RD^*T0?@E&Qo1+>=Q&;|eQV#k~zG^dI zUi+Q7_GGyKnLHrBR^Nte6JmM>H20W(EL$EhTefs5|7$}{gMa0=y~|jt+OifXg6T>sj2UeEy`_-#E@49A8>+lWU+K;!3uTg2A-X874D$D8{)Qk3xoS>AtqUXVuCr?w$ z26K%i*kW%7`#hax2W&A+9sS%fGOjPq{?1-D4ITdH6QddQ8)_zlNOn+PEzDVW9@-Qw& zxvBUaU*=14s|GuqcveH=k`4n|t@}LO+|Ac_*o>-=%NFLb@NsJCIr;q`zjx8mJtgLm z+ZubpnPdG79Pxu}V($O&j_d96R1cbugkC}0uU~LZ-#6qr2ft7Y$g&}R`_wbHnuE;O z+nC8#E36z7syJ6p^$XI|==v4x60M~&yD-nF8;oH!R-($aRFE?B@E-G>LkGVkeq&n! z8=6tMvhAk6VLtNwA+YyG@dJm#HK3R$ppJjP2|jbUw!@V1%bc<^LATZLq;RwTbZMzZ-IG{d})FCn|wNlRGr-%!>I?&Z}#mn z?z_huYG$`Wb(8tW0=Z+1+_Av?Lq*%9hG>l$s2{=1vc+FV>L;7V)PD~;&5o9aa1=zw zN6(qdWZ`oaPLDzb+33^f<@M&W)gfE2vzC4Cqc!GZ@cbiO&*nr~{n;8>C`UgRR+ibi zwvrFDN~=Gk(FqKZVDcHYiH$~wL#uPkzoyltYd&0)>QeV9vkIoKS)XtDpnubwrT3b2 z!n{}>mf6x@TR!7-HMcY#xzIdpwvpRp!NsR{apkGx2Qz<`T+U0O#bG^0FsSZzu<{&? zl}(p7fcAzMLr=Szn#LVm*TyJxLM5-9r10Qwgd9IM+^o&pPsdLqCiiVLfI%a!nQ0~_K?q7k`Z7y zU;u>yU)KQM^9or{eHHoq(vls?p8W9b7+??4!Ed$=2aME&oQ(ME0FP7o;5`fe3lV<= z;_vqC77J|{3EAJrawpkW0p!n1WkKcO29(43fE6eU6WBoc_?>c~vWS6AvJT$qPVKs1Ipkvl*MA;j{v7w{&qRgvm3a4zZAWxEZjh4!DUSt z`R1~(ijjA&3pHS_qbPIEKh+Vcui*91Fx6+OD>Y)&bv-%qrDqWEePSBq`~~uP1hQ6v zf5Q7Oz+d2f1LUw2_yE;StrY3sf;x&eg6|)4J3(Eg`bzDE!&rC$y{iIo=zRz9EYR&G z6e>rm(^auCTfE`;aeITDt77kcVzRdl@{cx1?ZC#fqwmx%(Ke9xYB9B0YByCe*BdH7 zszZMPQ+ww&M|F(aoZarZ?VYqj)V%>xG4~!FvfD)9GUG`MQ#=X%nT*pw( zb0C8$+CQNeABD^hM`m%E&J!DZs;M+6M8K{FH_JM~)E#4@d=xS0AhwDXg=59qmYQ5dT-C7l0kH4)uuoOzH!-Yoo<1rw`R1sMOuY-^HEUKrv6dK+H4R zi+TFx=wC@s-Oq6+={|(ri#`g#?VR)w0PQA0*({z`{t&mS%|##eD{-09S?t!IMx8_- z?10_^w6ZwPi_{08ZA{XShzIqH#YFXT^!EgqcqQGWUIIS5iMfDVwWD|@fGlti>v010 z1<1~BZ+2fUv>(CW0q9D|*zVJzTTq8cegvqC09uPIa08duO7MmJ>Z<|gBTs|PpY*{< zGXegGLD!DstuH2dZv)f?|Er)2KNTH~&VU23L!LsOyCD5caUOvV3s9&0bP-e3bHx-n zCi1P4ET*6h_g03B-dL+_Na2(Ukpp>^z_u%aJ+Kb25wKU8g0KX?SO7Z#*8&nC4Hv-v zdl&DpGvs98)s^qCncxRo>ShL;9{h0BACuS(U?2WX6e7-Rcz+c5d*HsnTL34O`H=|l z59(O(K1fVgLdeIx7BA{g;@zr%u*BCfEgNE@52u#e4g%?{8xgCBs-Eb55?Zx*i0f-a63xKt0 z2Kq+N(*aWfl-@Dma{%K2S%AI(C%sYlj`W>08M}BUzAF|X{4^m>e~0I>z{z-Di#R_5 zW40#*8sQe;1#1kPPbdGNL;Q!n2Hpoud{CaSGEO)|vT}fE@X{_Y(jq>HCOt>6doDzD zCdNXzx&1yBb?|_8kJxQ|3H{X?{SxXH0qfazsMA7jadZG-)Q!jCM|I~t{cj>jHmUx5 z_DaV_VvI82a<~+7{}j&%i!gUnd6CSiAMx%IgS>b*5Jq2z zFd^{viOAxFT`7*BPg}rakRMQ1TT#~Sk=F$%SLEN*LG+?N zOGn)%(2fDu7k%;jRNG0HbD01;veQ7H`-t~I3*$ch7KGU@mU;%DuUd$3&xmfu74V~U z3Q;~}f4_}>$R6jQY}!!z^o{!@YutH?`|?hrucs|&bVL~9gZQDki1ef7-dr@$M~DWV zzad{H`bZzzNe|J^cQNvhdzI{ZG~U}0vUnJMN;+gVP+V<%fU&YFa-Dhx`3Lm@c(<|V zBy3gKgdW(%s9TeK6UA-bJn^uTE|oX+``+`osgk6fMCY2i1b#-c<{JFECm| z_T!N54ABTO$l>;ixyZOE(er9=e-g)!h2WnpKClL znsZ&cMC?XidcdOrKMgz(axhRI??L-<_@sJ5Wo6q<4yHOo<>t9Pa@x2R`UrK0%Fm5S zA9(H-srnI-=wPbnQC_J%A48k$fOa-aw03whs4ilR=FsxgMH%GMyaN0jd(Xy>oyxil zbpz!xh3bfdqiH#EvF%|;4?8$op0@sQ-l^_$9Yb58Iz(;8jU67Ha-lXu^;Wmb$B|PM z&k*;cJSTbM#QmODs3(UI{*+jwPk<~oi#6V2ah~T{(VFaX&r7I>WT#(@{Ir2C*Z`eK z<0$A`$Z8O^FW*ox$n!JmdsEQ)C+fikVu9y#aVznUwl>Kb=aC+v`rv&E;k${xT;6># zwkm+EZv$>*%{>?%F$^%2#wbQB_+^S6{QL>t@lC&5?9h6M9i9>Rk(6(wm&Y>OMK7bF zcoyFajVy5kbm>O@9q|D63ko9x`5^*91dk!ITWGFQ-6K{)7jH(Jy-__8Swq;kNX(`->{%dY zYv+o42ovbd#c~JK#bO2n;!r%_UNM_tEik|{Ml2@K_Mx2vl!8dPw~v?&9Wowzda?dC zzMVpOej2k5;zpmK--ln0eb3@k+$l)b~BgPrms zOl4S28Bke_1H5g^pUQ#e(w+Hrnq#jD@4}B@In_Z8V{WyO`!Kc(*hbj}-2fZGcoN@= z#BM-W*sf%|>{i~uoYY$Q?MENl!?Gn{gLKtD2Cc5>mtM#C8Q;iH10C{XXbnv70Mx1D zfD2J4Rsmx?A+EOG3ClvrFJB%4Zx#8m5W)|sgr1==fDGv0B2|d#&==Fyb&(_5by!3A z9(_llD28o=@ma+z0QTdBpx-JofFDJ^?$#TMQ4GUGE$};vp+pSf{1&2b7$n1Fts?DWggk96@|E^b##&>nw5|M4>0uG65?W*hG!Ouop)yvgOB zK8W)h>eR2c|97Y}2hrF0#T@ugK-$v~e>UbVZa2bsE=Sl9!U)LzkmzFU27R<0eKu@@ zy?EY*INylNwIIr>3E*k;Z}$MxdtHDO&5W_Y^es&c_09!u%`n@z6xfbu47dC+W*my| ze&bQRBR+?rxJ{5&Yw+>_f2a33S~Dw-x@H#`gkVD zw()k%!K8_W6fXJ=-@T=aupcLN;k_&eC~uf!+S3n23gL?=Tcemlgq@qc-`(~&L! zHu6*r^A%B`cL!{LjKvNZIgt17z!{K*gB^bdJN}jUq*@DUpbQBcZ=>$MjeJ@Vu;0lq z>d#}{i^Wv$?MMsZ98AxcuU)7<0eZmhIP}eauaTCwt3`|P-%)=l4F|8rJAJn?(dW8% z1ZiSU#s&250Q;jI9x(8GVa8zK761o3{tkBhEAdHn2=X%w0IY9BowC8xSoDg4i$V7^ z{HkDICip%idewxX!x!or%8lmhD}mk}V1MY)14eh00oC0_00%q%4tD%2v6TnX9iO1> z3`Cn6h<0NEJu|rEM>2Ed*UOO|=b!Y(?dV(F@Rqntw_qypR8JxDn_%gLs2*_ifrH-@ z1EB{9EPY_NZ>odFQz)mWkWUNfIr^^6#&^hw^5Gp(GoT-E)8Y936tU0&41yLCIPdx+ zcwfTx)v5O}b(HH`Hu9b=8reY4(RawkPr8TJY%z|TtnP%Y2{7MGeEQLb;}b0i2(ggB zc~=id%GDoXt8B!tJ5P?3``Sm!{l8T4YiIj~5N;>J%|^JMk@A4o6>cK@ax23bdZgUw z55JWF#Mh@{A3`GRsRUq}(|Jh*cny4m=*IIZG{$>RG*Q0;9%zj>RLnH<`tE9>7&IS6 z^Ff#+MEF^#16cE6Xh-X^>`&iv#Y32H%4MMWkB1TOON{-NV60ac^GZmY*EeWQqXTS( z)#62-7np;16n7i!3XIRyTd;=ojnLI8VwU17zQa%v_ z$WKmyO@{RY*fLYpo`C-1V&zwa17<*6j4iX&u401v3Tz|_H(2DT9mVZf7fDsq5N;si zd@Hhv7OkIfSa+B{u)pju7=v%8ywO?|)^BoQZ{JURP?}D<%-^-5fjklUmib27O1ij2 zMnJ!oxP+fSi43N9`Kh>CRZ%A3i+Q^Qao**;Omgx7dcBlBSldB9VDAh^UA|cP0%7uz zckrovFFL9-v0g*o{?HYn`w7=Udax)Alj+Ur2`tf``u=Ub7dD7NRuqI(-?9}ean zYI@gUC&8Bd(>)Iw=BgF!rHQWXk{(SKrKBrpKElFS3(#=UFK$Y9{E=t;q9pHq@Bp9U zd2;M$sEVoIRW9THS5+>Hg!!HJhLAt@iO^gz<~z1m#d^p}zb5R=mDPkvCsUnpu#Po* zwQ}!+vj@V#gAlgby$@CWX%5?2DhCkuDQ{e z{Sydhz0;ghme8W>qS(_z(n0o zN1@StY;~Y-z;}RWJK`M@2G%4zo*NMl_26t^Yy^G$%B2_cz1}Utz#4?dI~KpTISuiP zg{Ev4j{)viHb-6n`~%NA@Daf4fPLsMJc^05Q!y`}igmoj_{GdaLR0@KJSy=^{aZC) z+>CS&Agx!BF7Z1X>Fq&yT8BFe7(EfL0({m1kF8O^X>&M*Jt`c(yX3Z+})U4j(n*znJf8 z`L}u3|A94GtPit}5OO}RBQxgx0$ZYafV`Y%VO#Oxi+YPV@umy7c z7vOWi`*vOW0?%JzE%Fz%aaDZ-b_dp=5q2hE3B{>eA5hP%wLPbv(0UQAEAIhd-5NU3 zgLv2rA>Jcgos2wpBP`arJ=Xzao!h`Vw6!Kq`Ls6fI#^kWJ`a9!Fy_3{dEQk>%)g35 zfNK6|KAiwz3qb?>LKy_;YqYl&^R~{O55~NIg7#22AVePGCu+t?)bsGni}8uRGHn=v8s z41ppdtC3z;@Nq&8HW#Yae&Y?E5m-|{fw@(HdYbb{dv)Kpp)2;t)~EP*@2Wl`?x(yn z%}uhCwgLBf^%Lh9o8%Y*n!m^1wL+#7RCfk>6T8vltxeKtpZ-(tgN`q`&*paB$ zS*VbMQ6Fd@@Cd*>KoQwLz>WQ_G5&i9_RzQDe4`iUQ`6B$pq>HF0i@#l+rX^>JpjW1 zK?D1XfS&@S0>%OSfQw*LrU1IS0Phu-)4MlETtuM5ru2ry9z84aF5bI%7h=qTwLbXY z>{%}Mc)k&rVCxVpak7SeKSUq=U4{0BHYZmCPqDH6E*s+A z1>80fMzjRfvg18v$0JN_m%dYcmp?z#x7+M64yJI;0Yd?6UHF6@t`%^9z(;_IfFpqA z0HOs@b;PmxrgWq4^nGe&ILymiX%n{NMsYR#(l@yZfV^W}n1P=ut{vWy6{k<(-SQi6 zhwBLc;dt(CVR~lBk9}vF(-989;VBK`-<4KXezE7!`reV-57slZEa(c@*96Az;xTTmB9F=(upc2cQ6TuWJ;xiZWw0 zV3VweHocwz@zGDq4bb&tfP;kf4{4pg60l!pig7vSbg&n(>NC9)KyTenprnZ>3A^}u z-}QVP&nxI1Yd>#S@uzQp232VtH?|-S0DaV3fH(dEjXz7{1JH;9=CK|mP`6+|_$F~? z`WDX=-l0qRa)aYv6F!9SZg|@_7f(0C^{UcOY<`c#yz({}19%tHe9z73xy(#&(>I3rI#)+o>Zrgo*iXhdYja zjF$p#fv$f5yh9IFg8Gd--?r6WbFeW@Ib}?PK5;Pes@207N{HWxM|Bs@lI;@n9jvvG z>(MTo`#Onb1cA$Kyhu#Lvou0D<=)tL=bPnk z2xX-quvdq%`&m3oynx4!p8Jp%(#3e#fQ}fVr$**b{-K8+{wtti&e#H_Hg2`p5BYVm zpr&{7cfL`0C%%LK-S0%h4Gx|ETX9wS5TA0IEfZjRcJt1%`ZxUDacg=en$9D7{L5s=t2)^cyiI061Z_>oJ!J zpnC5H3?vN#$FJ&pP5w27lug!bi^9yyRpE9fYpFGfO!Pk61=xy zztx_4Vg`YJt(bu`A2WQviA8>i{gW+4DPSvscA90nY*G+Xj5Q0QdmlGdy1j*aEl$ z(6$=?zLvkd2;a8hxd8YJ;0u8%p8YP~SNGw(Z9S5woQ7{Z@V;3o6KmCvF$WtGYmJ6t zF8uLbEc+9nFfMt?bFuGrX>|}A&K;-fGx5p1jzgS%c#hWwp{}&V-i(%nWi#McfKk_^ zZh`m?eguUWkFNImu;+cNSm7H3`#F#7XBm&a?JeNDfPKKTY&Z=}V~;@qzp;yLlozZr zltX|w5MX>hO)ryw2lPO=!ET_ic&9NN`4hgxex`RC7tKW)F9Np!YyotzaRD%m1KI(9 z2dn}Utsem)z{FUP0}v(-(9QNIJCgXObOzebR{;~W0g!)N`7q~A%Ok_z6-^a0Bl@< zgKK)G?^Dn|1lmo@nn9gg^EZn3|N8f{<^6xcxBu76??21`|AaEGIgij8g#hRvy7NN{ zeJb`R6MT$k0KT0uhXDIA>c@7nJ!b&_&JOq=wdS;(xvjI~$jjAy$6O-r=&))3AHdH1 z)$#v=v^OJf4MEqz9q|ls=1HUeuJ8D^0p(;tZ{Xf%j0N1bKiT>;J~$GwIA2?QOC5R2VpKPy1D9{*|8f zPcRp6h#sC7_&%AjSZm;OxVnA5oz{-AH*6%G1E;-Nn6J2-X>G?o_gAprYcBRlzm0uZ zFNzyHm*A{FCN{DDa-+6K{2k{)$9kT`_g`>+eGm4N-+=ofUJ+xB$>Q&x$#{Mq@Dgm8 zQ3&@0?r5O>*Lx8jVYE`f4m|GwU%$b|8HVSr7|*|ev;0qEjpTB???w1m#B|WO6Z`qc z;ymAUy(QKT>SB!mpijZx{b^V$N)!3oOy0j}?cuiOo9Eyh*HR;bIXB1#d0a}^iK|?X zcMbc|NsisISFV%w9cwg8d7p=lb*3kIPe@OX&UOX!`kCZ53gfKd)TqN6MZ zEfZ%p9sX#o1pC#IZdY2@&`#UsLTS=`ct7|pv@xB}$GtjKpJ7ALy-CrzF0 z+7aM@|!zT=sO9(BAV3nqJx)s$jeXctCp<^UDBw zCO-}15(1>lcd{sSzYFFiopZ3>^KmvKUv$HH;>pGi%ptsu^`w_^{&bcY?dc=Ndl%q* zVh5aSya{WHLFf#mO>NeAA3VG$Cizcboiqn+!Yeu(7h-K?I@*wZMpefdRMHVu??m`_ z-j!2g41+HAC^lgK<3i;))}{AhPb|REMIHm`Kacw->@%6X=M?v2_##+K{8ZfGD*^r& zFzzDu92a+ZUWM%MapASrdvqv&l5z~#S(D8I0=dS>Csb&N27b>g@ z+O??r)dAXzJ_mQ9_$~145N!ycQ`#7xqkb+IYXIwf_XB2#b#Yz9Iyx&#yJ?iCu$QD3 z*8h)-b=c2P;OUNf(GqJOI2USQZ?!Q6eo~Aez0K!C*WgYiIwwkiGpP=oaW?gR?EUDD zH3FPVRaS{1n)_TT&ZMfjh)?HHowKOboI_P`Zk6crc~+cP)xF?_&X9hHwWiM4!!r(h z%KtaN^O?xrVzzn&bJ=m$SyQj;UAND!YCmCbdUFEnEbCu=r?Z_}JL}AAwHW6&wQ<%N zPQs{%vkBCbayd1@-_;rPB7H0XS_>z&V8V;)D_2YHpD&e6GRdT(RB zS8X2#ox@%$#yjn$YCWPe!C04Etl*r7@-*ntS?z&hk#-55OVEDo`svgkN3Kr2bn2l~ zE)I@{UmR%-UR!I6BVPi4iM_As;5i+55bz+XGgbe*?L`CZzbMqoaPIal;5UH_El}se zJ{H(B)fwxnJ+SUw2maTJ{ef}tiw7VaeS>b@Z~TOB8^luW1F;|H^q1mZuR^^x;>^JF zG}z|TK^t~A?!wtm0NRC=F3}}S;b0%o8pi)<+xNdR|N3{>=XMY-P6PY42N=J6|!@{%^Y56*5i7eNpK+OKshQI~4dq0PV570B{fFPWvaF z^ZaMOFBdwQ^e*XE_uUcnPWp^>1aund9@aO|F{CF+my!M=ok)6%bPM^j4tLRW?wz3U zoDSksJdT5NZu(&8t~V{L;$1rc-3VJm`xqGSp4xaO{RtbwLwb`i{OB72#V3E#sd_&0 zG7|d>pS7^}4cPDS!Ix9@x#!;iu_@yVa!QaFx}u>Nnw{{J7q zmg6c3TPYle!mABb}}&T8w|$*zh%Q~z<@CB+z5RI z=qHw9WQN-Y9dO>=_NRMH;!d)eKA`!n&{F6RS zKH!34JQFy6x8eC7KvnGck^dYQ+=DznDqG^rF6OuR9vj?c0yj-}Tz9_Qabuq8-ka8-N#K%$`x)h2{%5wH@uGZ)=cni{Je=XAG4dIJ zIzaWn4el{fP0umoBG(uxX8hwC`?%X!P0#MO=YFQUlMKue5V*(h?lHFe*&U{)=a@F( z8dJsiyTMkB3%j_V5tK{W-N~u!X7?4QxtHC2?0!N# z%N*iab_TU3A_)H`A_?J}i2Cd{L0U~j4nH?%H<#V^>~@S?hp%~&8E`vC7Q^krKE3$s z#q9QG_Y%mhi5S4ogV?=_-64=w6EPIBY66)|fqN5&oXzRZVRtUO^Vprw?m~|HAiGQ0 zUCQo5>^{uy6U@nT{JfgoHSDfs_jz_VvAdbwE$nV(x0KzT%+GFiU*UB3vb&Gn{T${1 zy9e2Qo!vw1zQOLB?7qeBVRnzOdyL)p*gekfhwPqU_ak;cVfQm~Wdgg2>;~E8GLp&s zoWgDs%CF4k=Nx`+%FpLfxyX(rVcCiO^C(9saSFeH!>~*w%S5hYpY`mPaTw-Go@Ae& z**(SnzYrbY45IIwN%VcQ`1vk=F5>6e{QLuj_noBhe$)INE-p?KO#-+#6~DwowJTdt z?aCHZyRyZ3?B+#w@$PEQXR+^R0pyJ)q!k5bs$?%9mp0`2eQQz z9E(aSTTmHg3o4y#LFJMyNY2@U-uhU_+G_dMba zQU!02C%GiaY?fiR{D7ZHZrP9$LP9>|7P0#Sh4-86M#v2a$O@ z8yOFG03^^%T*=P`?0*f1na%DTcIUD?kKOs~u3&d1yQ|oJiruH#eTLoDOl=LjYuSCC z-A$b0W_Gu*yOrHicK^X)cCh;ryDzi5lWFc|_Z4>cu)CMtSJ~ai?rZEG<5=&pdz{@5 z**(GTkDT9M$d!qdu1sP#h23=aufuLVcB$4ilT_=PNvd_tB-OfRlFGUn^ftNYu-k&@ z%U0~RVfS2i+p*h$-8|wDZJg3w&o0%^X0nXkAKB*@3WIhEmrJ=>K$r{A+jYd(=BSyE z!ljzooa zOWA#h-G|wIjMH7l?s9e?XZH!_VFlA)$?ht4pJMlEcAsH)HFLFw-L>pK&+aC6H?zBi z-L34F{x8zrKd!Q>jQ@T1+4~TVj4}=?0xBvhDmplWi8Du~BEzH+jZsuAEJ{kI&?w26 zBF+!7P-$dlP*G4(Q5i*LW-w8ioW1s0XPrU%ymUzVg7ih{OFFy#(oyyBRq0!PEw3PB<>dQ4bk0_Zf7LyU z(cX{xui84sc?!*eb&T*n^xT8*qJ`M6<=2@%%dazkmS1Q7EWgg4mkvo^kiIDO-}~##fA6m|e+FFVoZ_D^qr~|#N`A>k zKQ1%cb?C}R?{Y85-5foNGHtywZM`yWy)tdR zGHt!)ul2eDuh%MlcrASOufrSkT5K@?wb)?(Yq7!n*J1*Hgox>RJM*ZvXIlNx`(HxbW!mE4^ z*S#Ci^LV|^A-8?YkXjWJm`Fv15 zACmS+AC^8MeN_6mqC6q(lkS!dNcTwhO7}?zrO!);q%TNcl)j{X?w5|LC$CE1@@u&! zaPH)}f4tG}A)`kLqsK9$H)S8^YH$kLEDcK|(x^0sp34XqqigtlaV{f#JnG-6p3Akm z1@-R`&b8u$>|C*n4)XU?tVCMMYjLh!uH!8SU+4G=*;E`n!12{Ot|ar%C3}7U{$1#~ zjJEGNER9H`(wOu%MSO5&4K@$SLywLhmOdhVRQj0WK7Mc-%O`Z)r{mqyfrAT_?@{?) z9q*G4N}oUY9<@X2=L38d#?$xUUlY#b>g20`O*l{Y-skDwn>8-^-zDvkJ}A!* zNqeLZOCOOwDt%n~gtSk(TRI@!Bi$?ACmobNuig$xUy!~ieM$Y_FMZ3mBzrk8M(JJK zsCW8C^6*HGk7blLGBRywG3T<8G4V_MG10U0Rd$|zThj%G2QEe&b65`6>TUPLDhUo3_=r&@7bOi|M3J@Y=eV_gn zAVkLc>fgDAI3r*EJGT&d>#Kj~7UDCbuMaBLL((4U!_r5jk4hg`^e3c!(%sSl=^p7` z=|1V8^m+AmNcw{GMX7&37UDChuW$L5G{%l#a_*!-N~uWtD2_-h3hGjD#vF2?7PwpsVd zo5_cL9Q&WwHZ$7$(Mlcrcd(nyzk}Uu{vGUQ^Y36cn|}wp+59`$&F0?;Y$i8+_3s2W zlN-MJ_W+x953pJH0Go9Wuvzy2o4E(@qYO!3kiIB=Nv-xv{riE2W991_=8i3l)f9RW*|^0%qvH}Ce^$qr zNXw-Debg34!?!Hgv41zUg(wG5e{8qdW2${z`h>Jkx?Aes1#Mvjd=LC9Y3N?*KIx$J zfb>_=Ut0+_Z|V3?ep}rIZQENrhds2(mv^K>40>P zbgy)ubWrNAl3io|I@mRw%YLg=CRg&VpW^sfUcpNBp;CRQq=&EDR@Peix8=DG`0D59 zR;>|jwKH{mE@!t@_hwtUH}h*l_}R+(s(4l5 z+Hy^mhPXOyQ?ItESKHL9ZCt5*pJ8c48kNSRes8yFhTWzamfbii@n_g=THV^lx%i&_ zbJ?bIVb_n2{d3u-bJ@mO&@0a3c<$2t&kN0ZUoRzb6>MQ_ciNt zU$Z{vLbTKKC{2b6+##=J&^6-EB61b+_64)!k(CQmHH#xtbA^^U+ee{>2Ia}if*(0Uiy~w4^ls`nzho{tTo1FR)HwdN@Fu?LH_X( zQh!CanROn{Q7gL5ypH~{|1M~D{1x41t>`vuMYq}US9F_sm3^Ce+5F2_t<5$c;;+Xx zv+78zL;TMp&8*{LsrA@qt;aTVWpJ%o>#}psl_z24NmzLjcKkdED^J48ld$q6tUL)TPr}NRu<|6V zJP9jL!pf7dMA;HiwnUUI5oJq6*%DE6maBFdJCvL&Kyi6~nl%9e<-C8BJJC|e@RmWZ+?qHKvMTO!Jq zh_WT3Y>6maBFdJCvL&Kyi6~nl%9e<-C8BJJC|e@RmWZ+?qHKvMTO!Jqh_WT3Y>6ma zBFdJCvL&Kyi6~nl%9e<-C8BJJC|e@RmWZ+?qHKvMTO!Jqh_WT3Y>6scqRN)2vL&i) zVZDG?A*yVNDqEt;mZ-9YSCMRqDqEt;mZ-8Ns%(ks+7eZ^M3pU3WlL1q5>>WDl`T6scqRN)2vL&i)i7H#7%9g0IC8}(RDqGl7rZMraEm37lRM`?$wnUXJQDsY1*%DQ@ zM3pU3WlL1q5>>WDl`T>WDl`TuYUlqakx zF&Z)DNlbYXQ=Y_>C)_=dCo$zoOnDMhp2UuYUlqWIe zNlbYXQ=Y_>Co$zoOnDMhp2UuYUlqWIeNlbYXQ=Y_> zCo$zoOnDMhp2U8cV_w#1YzF=b0k*%DK>#FQ;DWlK!i5>vLslr1fMzT0grl=N5&pI_RH zf3K80xs6xQSO3%QZM+I7aZ#-dZ|AOl%C?g;zWQtO+hxC9_S?BX_sjk7Ot))ge!EuY zw`*m7JKlWzxM~y95nnk+%8BBu|DEY}dXCb=*HQmF)9v)I*xI!s-A;z@=GgxP+OGbv z=R?Q-HwEqLRl9oCuKu*EKke#IyZY0v{v34ld4#nD`SUVJJr(*3?teuLrQ?b~;Lad#N zwNtTnD%MWL+NoGO6>Fzr?NqFtinUX*b}H6R#oDP@yA*4eV(n6_U5dpn8Di~HtX+!5 z=RcMBujwwu+ND^#6l<4a?NY2=inU9zb}7~_#p+P34#nzFtPaIuFAhFC6stqAIuxrz z=hdND9g5YVSRIPhp;#S?)uC7&iq)Z5_i9D=UajbM>bO(K_v!dP9pA6x`*qyK)pE6U zX$`GQYiM2c?K(>Q&#+xwCw=wT(7LpS*2OyKK92o0H2wlQt3CV;bUq<=k@+{E{wjJG zJ@?gLL+hgFzWQru{1qa3^ViV2xZ?Thuc38u#q-r)L+jESS{G~Venfu_t;_s1v@Y}4 z(7McDL+dhs4XumSbzl88v@Y}4(7McDL+fI7-B*7Nt;_s1v@Y}4(7IS1@_XyAp>^>M zk+1$5S{K*AHq>83>(Uxpm*cOYbuqS-Xl%Q*hStq1c!PEG3huLRYNxDQWBvfI?>t3s%^sk9w>_@4wI`%~(%sT$ucz8vqv_2WwTc{du6j%HhX2WS2q5xv{P)KZ1%}!pKSKY zW}j^MD`waX%4SeDgR&Wv&7f>vBA2G@C9TZ7#3}v@)|_Hv46>UpD(? zvtKs*WfRv79#^cm-Y;>@;Bn31an0cT3kP_PYX*;N2Iq4)V-nX49_QV39mf~R#{XOp z*9;!l3?A1E9@h*W*9;!l3?A1E9@h*Wr&s%E<$sEdYX*;N29Ik7k81{xYwnI~?v88j zj%)6YYwnKoKK1+HuQS9ocgHn%$2E7yHFw7~cgHn%$2E7yHFw7~cgHn%$2E7y@!|Kx zUuTGG?v88jj%(JAYu1iy){bk|j%&V-+v|$%e{zg#){bk|j%(JAYu1iy){bkwj%&V- zYrc+azK(0Yj%&V-Yrc+azK(0Yj%&V-Yrc+azK(0Yj%&V-Yrc+irD7a3U&l3H$2DKa zHDAXyU&l3H$2DKaHDAXyU&l3H$H}pP#Wi0ilp6`h;m~@xiO;L7*TGFC^z`+CGVyY<;I9|V??zO9!NTq=IWVFe7*P(4=+z(5t3RSwe?+hTh+h2>z4{}1^+)vTkLcAO(d#~< z*L_5<`zWs(zj)O=GOBrGl#!$a|ETWRUzN?PvUycDugd0C*}N*7aov@T>#l4Z`!*Yw z{kZJMbyqg7yRvcJmGRf2@jtG+vT?lm_WoV{xcPVWq->o$#t1Gc1Ddx>|`I*$DvTua)) zwWJ+fOZ548O8gyMOWMJ;q<77d-Y-ksB~DT9@8DYE-Qj!icW^E7?(o&$!L`J@!&iR? z*AnjzU;Q0iOT0UL^>=VBnZJW;$^0E$OXlz3S~7nJ*OK`=xR&&OST}794 z6p(X7aTH@;J_txLRwWR!C(hjaA$KS!VJmF`z}yE#iM+GfwG?pWj__lekzpxR4DtYQ1(-y?59H6Pld9d3S~bP z%6=-8{ZuHs7f^ODpzK~i*}Z_Wp9*C^70P}pl>JmF`>9a&Q=#mqLfKD+vY!flN&RF$ z702wSLfKD+vj4$3iuWex&UpIA?5A>$(&!z<=yA;GO*uz1dfQOGl}1?;K>1c0M$4p^N%>Zq66Q5@i3Sbl}7ni8s%GQly9X`zLiG# zRvP77X_RlJQNEQ%`Boa`TWOSUrBS|>M)_9SIoeqzJzC1Q($3NTx6;nhd=@z1WGE{# zloc7uiVS5%hO#0M-(MzHhO#09T78On+bWkrUvB12h`p{&SIR%9qE zGL#h=%8CqSMTW8>Ls^lbtjOT~)kZ)4tjJJSWGE{#loc7uiVS5%hO#0!h!IyNL3w5z4m#C~LjWiLyCSHYdvFMA@7un-gWjubp_moWl65 zM%iJAvigCt!w@}}xTp9#3{iF%qU$qr|?QGI{E%ulaueSH97u1y45KAwNUnJq5f!ZWVG8*)|yb(no#y@ zp{zBbtTmymHKD9Ep{zBb{&@QP=zR6ZbEC#{qsDWizt%(vYfUI?O(<(kC~Hk9YfUKo zwNTcYP}Z7I)|yb(no!o7P}Z7I)|yb(no!o7P}Z7I)|yb(no!o7P}Z7I)|yb(no!o7 zP}Z7I)|yb(no#y@IU9NZQqDV<62^^D(zsp7SWP(>Qtqo?exd)4UiCgB_BzUM2~mDa zi1J%PlzrkTza>Q3PlEDWLX^1@<+p?=za>QZEg{Np2~l=-q5PH*<+p@rM9OaoIgUwL zSLT=%UzD|2lvPrc^-GlB5~BQ;5aqXoD8D5{`7I&JZwb+t6ouVl9P`V;RqvB6^pLC8 zYW9ug99%?CUfJ*Oz2>|QvO~r{K23VMO3u*nnbNbQ>!jR^V!1)b1v)-Q$D26!gMRLz z>@YzuTWLctU%3I@qT{PnezlaHX_PmsCt+zs8kNSREeE$@bDJ!=Q{|XDRg^nblsi?F zJ5{t>eRx3nj7pwW!~sR$Bi$?ACmocsOO3YdQbR|juS&<|XIjTgI_6gus}6F7!iFZDcPXo z0v(^DV}8Lw`FRKV)`T2$(M>83spR67DM~I=2|EBe-Xgtf~%6l2*y^Qi+MtLuzU5eYSC=W;(dCH%avTu;%JyL!6(e%H0>rJd5%UMR|v!o`g$lo?Uf!SJzAO}&6M(64{SF2{bBs~t#$ob z24$8(nPpI}dnmIE$}EF2%b?6MD6?pGg$}EF2%b?6MD6|(4~dOa-sZ^3+0zwD8J-F`6U-ho}=VB$}hRrW-_*nmBTN&P=3jUYQ&g>_OIpc3(eBF zWpUrQk7M4~C_8&muAiuXMp^#OUerIMEPrP&>Yq`Tzq1!*XD`amUX-1^=x!y+r zqP#;<-k~V(Q1p34VP`ML?CeF^*^6?`M7d_7?Cf2eMbG!Iy>#vME0b%>(5Kg4hCa0R zai2FDwSU&tyIai=tFD2pyMy9{5t8E(9X4AMju*RjXu5h zD}K5CU;h>J@c*Qje-a=K=FD8my;`%R3H}w6T+@4d81n?T;)pJE{O?%#Ln^WwUf_ z)BDYisel2XEQ5HN_|Kd)%bGAd7Te>Jp~dX@aA zSz-36I$oA`z{f>7z+;I4j~C{h38)>fNE&u z&opL1DKr2vze=31&Y4~B0d?17dp-5nfzc=9H27KI50xrrR$7IK*z$P~a&M-dSB?pjzhyC)TLVZ!WQ{B#oIK4RX#U~B+@X|o6V%^n;! zdngYm>?r`AKg{F9qh^mJLpD(N2)2*-Wz&HFNAdqC{vR!Z3aEn?=mqQ^o##&$rb9lI z0rkD@&<6>a0{Ze;3UE%3g`ga&p%Jis4BN-BeGJ>juzeiAPYl7V8CBMY|GrA7hgRqT z>iZ^O&TMxYI$;3DU9|z2)@$)D8^(UUcjlXyB z{m!V_Oat(IX5Q@26)_#QFd>ol9~H~UMu*I!A z3A2A<_fOis&-3>?%sw!{_rK}Oe{x`eKPOrOoXaBZ|4aFQiSge)v;Q^n;VcBDK>czW zl=1J*B?G<>5_biA?#~=+H^(W2ggN~6EyvA;ZgaRNbNFi+POu25OR9nib3RrLJWtMn zM&RFdI)t)AI$;{-`7p?z9bc6W_*zA~Riow{nh%5Kq!a_bQ;3y9+tnPerv5Pe9aawb zI;;u0f%u2bm~*%X+0Y78K#Ww%Qt_W!3Jrk2HQ20afdzApz}MO|z!&#@&e}O{ISZi* zh-gO7{?D1k~y z0R7BNfkx;6&LxZIS=eP&Kt0gkEc|EDJ`1168c=>L?T?)`=Q!+-D}-{0zyOQ^w#S!3 z9Z-He{*TAU@x;i^gBs|8L6|e=1pJ`%ZK_pioA4*qiJTTT_U0PRku&B^#axgTcDIR(F>jK>;igdrF==hOly0pfD6 z?3~(ePHr+}K{1p=HTdNTSTN@_{GV0;)SpJ1(^`Q3oi+%g=A51m_&l9Hon8m6&re#5=nPDxl7s^~2_Dz<$G&IRzY_(`L@cIj@h??%W0#HK&li z71EDFY|g{)Mtp3f&l?BK*+ku@1#?0zFl)~F_2yha`wNM2;ezp*;9On^lzpDE&(p5F#GEY#sgMo%&~45Y#NgiF zxgrlj=3L41E9qxNI^+WFEAU@YXU}67`>(e`r#Uz9Sc`4# zusK@|+F;(CZ#2L-Oq=t~TquMR!2X-GtBXK8%$ai|zHcP%P5ICV9Dl0-=u>^8Ip0o! z9H9I=*nX$UoSS)mGd4FDLpfBN(?I+Ne14a@?}mW#@76-XoLh)_3%E`?ZA3vBer>P2v|3lg~cbgOTfY{vUI^hIWau?#M+pp?vlIKBEih}&t|oIj zh;w%e@cbTP-NW;HIFEbA0AKeuz_2-;9+X16IrnjVA2#>V=6)XUPngq{3dHQfXLqGJ z4^+T{IS;l%Cky~SAIb&F9-1_#hraYs_i!4N0p*Y2`;m5-Hs{ei2tf_Bz#z<<(@Q^l ziPu{I#ObBJw*lIq7wB&<{(G@~EE&=v7m5J;$LgR324Myk%z2!+k7ofsA1{S!XaxH5 zcpoHS3b1`51#$pC+>bj?Ou(EueGTU9#?Nlr?#BMfG~oD2+C4?we)`Z)`=_yghS<;6 znlnJzz?eCEINn3Ny{XV`&OXZb^_eqR0L4%aw0n-n=V<%WY-oZ-bDk&0^ULN8r9c+s zK?vGl%A6NC*B1+6+MJhKVF>2T8K&JZ$NRD0kFWic=ETdO5ys4Une%&@_6houD1|6#`zfQZ?2hEwN0{px|zuqW> z0dsy+1QBRA=eHHmZO&vFbi$}PZ>9mqZxZ)+^yPQ>`F%Z1!@N0Dluh-+qB(CRLoVRs z5A@*=1u$jKA1V7|DbSAlZs(6P=1dcR8o$#C;9UMhfB)106R>Q~+bKZV+myYH&D+F# zhq8Byp$;g2hq9S`!0ylGFmBGf)V(`w&U^Ihy#|;!XST|mzhr~|i2uJ<0ycjuVA(Pi z%3#2pzgGjX|IusCKk+lq`OJ@*^REh+H0OPMeL&m~`e78N%~?nV>K7Kx`8VzUJ!{T? z@cW-~!0tcTd{_p=`w$-=&YQD{-^FYw1nd^+|6&9>fqpC!^S}7`Zz*)cAkeS>rNIQu znX`oNCHk<8-7^{QoqdcH52TOo92WhiX4igrzCg^~K1)OSVg1=IreUJ6j}QSbTBCoK>x2Og7(panSoST1w}agx)Z5b%*aZh=E+$7hScA@dgC zb46fPHc-E+0_p%Ct7yAw5U^i0Yk@-z(jgy8pb8qG4SHb|reV74cM*5Zgm6TZ*?yW19peCLm!O63@lsVaL(uOJSYZiQt_XP|5W^^4#GIh zT40SqI^;tMR6zp}V+}FZ5M#}>1&%0!3ZU)?>eiM)9pH0qHw?l!V7qqF0%@s`4f#OZ zv@)my>W}2{NM6q)8TTXU?~w}@I10Z<(f;TxsD^%^JiP!SK)Yiaf%DABg(jeX8FLoM z#3mCzSw(=4V{-t1$Ie^exH@25j<11X3uI%H-3s*agm$3)iP)YvWPy|LdlEiRqFoMl zIXxCQxf1ZrXNkZm70?7z7U1(k;M6w2Pi{6;0rt7ro`#>(BG7Mv)5|PyMjB9_N8B^% z>zT6_I4fa+b+pgVf@uq!-D83E)fU*00`#Gv*aGL!?i}ns-eQ4sOJUdoh4?s+-81!~iQy4ooVY~?(*PFUa@rGU*h)1VFJEl`&Y zw5^*2p5JId+Z%~>Bk^w>fH4c)6axI*gzZh#-9+6@)ZOIQ&A_q+zJ=d!$AZJTKOL)!k3wm%F(In+V~I$;3t@k4z4 zaM=RQ^)L$4uxNpBD&#^Vw8NYQA|6x%wvkq#ZG^VbG{}Qupgu}{l=^5748a7@K1Tak z78F1!R0H*~1q<9t`&(&$Ya_J77|g)31zJ)d2SQK|wGe?$7yxWrux-Kiwlv6tVyJ|A zXa&ygN1V@(N+1DK7WgssKc@c2a~5dzAPd@|53p&)rggyrx2Hf3grFRHV8#M>@S5F$ z?>l&Y2V-_8V|HgXGy;C^oV7rkK|16EvD>Pk0otG!hG7!sE%1|M$c92FgBD0wU_0%% z(|$Y8w|4`5x{E&Dl>@}Oi&%Hj=ew}Ii$32)eLMB-)VI^;_Hw9&2z0^#jKK^nTVO{i zj9Xx*2bDnmPU?4+0R7!H4T~1&NQGP|f(obu`qV+6ItBqB9kUj=+kigboe%i9d&mO! zq(L5Fe-HNe5cgin?xpNr%I>A?UVPk(k9+aaiH}ZvbmF5EADvau0Bz6QQrp5ys*w0~~g z0zWMP`tW=))We_!hEkysmM!oC> zJK*Ql9GJGiuPFaj2jFMi1AL9+=hwy1XMxuuFl&L=%OGKaiCPQ1VbErQ-{e3EG+N-d z>45zteVfGJB>j9d1?r$5mM!o*Y=4K3-_2Rz_oaaEDQu=%fWAyESb)#Hfw!^%KW`O7 z1q{F_Oj+O$l~4bVTR0jBZo4&nW1M?Pmhq`yLd#4A+EigmOnQEY) zGn24rfj_rd;9bh!#rM0|yvI4dS7(7)9%p+2o4=I7pauS#5BU2lZU097-+2DFM&S7z zeV*%waagdx-_xNGi1+t)px=K_0Db;D_5UE|KXQOR{-Yd-|BncC!T^lH3@lsVpJ|W> z#ZU?L&$ zf(71BfgA`yIn+V~I$;3DV8#L;c#s7JPzu%12<^}Z37CQf3oN8S4uqf_Y9RuhFaTpP z1IrfpcN!ExDO5uvv_l^xUg7=syDHrLW14~n4@>Y){S zUg z7=syDHrGpoJSc`rsE1bQfgzZHIdg*^WI+LxLNzo(JM=*UreML`q!h@3GH8V!z*iE! zlIG0)mS=t5P5riUEJC@V5%PRm5FI+*QOql(>fymo*}nH6r&=>{ugmStD{; zBXSSLA8SPJp~OugZVGlO#7(Jz2z0^#;4ftcuv?AY>O3IsYW%TA?IPH8esy^g#lqV8Ps@ zQXmIHP!6>afle5JF_?j6bC1UMXl#!zfMTHj=mg;F=mm4rsZXaq9bf6?z-yG=1o%qt z18mc$f!FgGUe9BAJ&!2@#{U>{41LVwLfMC@SA}x>t=2Swi(!F;5VZMu+6|W z1KSMzW-OYUiESpfnZ-aKGO^9XHWS;-UKoZ+m^U{o8M1-?W|cw>G(a14n|mzh^Z%Pd ze3U>v_&&#gb2<*+$1zsNRRQC3+ypF|dpvzUzTezz>RIn|vpdW^Aqy&jzMX)N6Q<2Q zu>eZ{-#Ka0+?-i+Pv%@t&IWv*jIWdHp&bUzJtY_D!zuLb6l_ne24bB`+uTCnd2S2z zz?`|K(Vx?ZeH!JbHA08Er+W~BTEN%ooWtq#^Yle?&qxFOoPpgLedgvF(Eq$jz&4MV zXQn_2P=Dr>xo4&Se}LF$5qI5?x%r%HKF9f!=AKR8*VBjf_+L+-*SA8#+zs?&Lp@Nx zfqrbjeuH05n+P-rRFMpzr78K@pTg4KzX< z^qBi`>OW4Kb1R_3+(P0MM$A1g8Hl@a$lOh|*)#?-=AMtu`P1fJP-yOj33H38VA0%9 z(1%a(_(|$Nl?#3h6{Y(?kz9iM$iwj}G+|Oe3 zS^D}}`ubUHF2S~R(%jGGLIm))nYv4J%q{bPvdavL&HenGx#jKVZYhC5bFZi{_sTkR zEAV+$mbq8chpXw|HTb`V$I2QQf@O2B<@nkLXfgK-)PJELhGE>?FOHg9)oSi_X+Z2R z;rGjhP;G8?FVOxg-R6EZAMkfQajwV5_4DS|)SLUYWZ?PN`hc>p)7P&L0R6oo2g+c= z+}en_TY0{<5)$TqgU4^s<{M*x?Kjh)0Lq~r+F<}DV8PtFG$?>_sE2l-eccdDz=F9q zra%@HKshu*JM;i{H%8#*?0WoMRRXX2gbIc!QAiW!lb#kP~MmYrGRZ?A559Mjrwi%=6;{L z?-Tb2`20a7^umIV9azV>6G<#iwi^^d6AYVs7tinF`CUA}3m@%;&<3;S z?!f;J{O?GZyE7H&!_F2MGj|uyca=dKa84cg@8~u6?qsM3%I=};o>mw)_uf2nJE`l; z0nVXw)ZF{hO?jm%Ap>p8y6E*CQhOX@bj|wEZ1rzsGh8e^aC8zD1lrw43`!?5DArrf!<&)A;;TKG5eswZR}TK5rXP{&p2m z{`R=J?{FUPltG{IF$-ujGjHyn8=w~^%zYP|cZ;Fl-1o8ooA>-<>Sl>MTLkq$pICQs z|H3)`1)qNzF!!%%Py*Ed6@P!@`QIv_118O#^Pm8D&KivScl`am)!cuiLW{Zoq))7! zxc?l6MRVu#pdA*>WevprS2y72eeB<_hCy>bp!|bra~Fua&=1Sz{+r`}69&v(%7qrd-!k>f)PF?%NBB9I1`W_>E}y&I zl`_C~h5oF}z_NLk1@+Jl126##<~fu*#ZU{>In)J`&2v4-g;Jo-ZG}GbJj(g}>v_E} zZC;T2Amyv7Vcfh!@pWi9@chtvhyXrQ45&+Kgbu)VHE~ww0RC1}zMAsYLxA7a%jO-H z1!X|2!zeq9vcn62z8pRbQ|6`SL#26ZJV=8kSTOGh+OEa!$TsuRv(4i(gqJyF-f1UVaB|(DL=aqC_fuNXOEk=-UG_k z<6}Kzuzu3K4cKiU-i9U^fLZejh{gS`R}g_-m@w}ggFGmQMxgv0%0HeA1yBX;FbwqT z+-xX?2Izw+^9qSoNPF&gy~06QH19loo>vK-Kp!^}XJZkxz?gZPa-jlvzKJ%QX3YyF zLk?6!6VNt9U5NgK=FK}l1!#AEG1NdC3;=yNpZW`^zkvD+sK1~J8leNQxqv=gFlXL{ z#JG?c7t)stE1?0}q1U`3o`0&&yyA4o18j;ZE5@c6o8m#3Ht*9O5a-jx`E)JNk5Bi( zqV#$UN(y1vyo*cByM)-65c`rcpxq@MK;JIGXQ@E}P*>Uj#48;Fe1492 zpUZ|)r~&Fe*AG*$Xx?UgZY~0RZf*g5ZXO5XUz!E@yp%R&*p=bCjChyf_wrWrK2N_s z-)CMqG0H1p(7Y{a&hjH_E(uZBy zfG_Shy}J|U-BSUx=J8#q*GbGy?Cmqg+=iFTj_<8`l2kXpxs0aqk z>%mVCj}Mob_ecna%zKo+KAsAF<~=cL-foVc%rWmN{Py>o_jEqs`gLr5^*W zK%6~1-;1BUZ7^)!K70+1oA+EQ&QQ&0-z7CPMJ5JX5O!9^LiP~nK#jA-W!y0 z-{if)xxFz1%jW%tvft!EG2r93JpXNnd6Tq#lm7p%%DmraL63P;CFZ?_zdsh5_b1xE zGh`n3JKjtY(Du)%FmK+wljglQY~C!kf5|uRulW93Hqd6S4hGHpJLUf8nfV`gBE0sHn^JShlQZqf`=zVDYROU_0r&)G8nhu5grsl z1h8L=pSA54Olz>6qiL6pZB{N9S&;cSm`AL$@+_E7{W*&kJU8Eh=QUYyW3dG{ z;dj%t1<$Xx-~}@lETZfaJr?}ryal;#2a887_-Xp{Y5ZK|K@CKp8-`%nf}bgYD&X8o z=ts$%1uy12KAR4$7QCd-f?SJ(pEICOpX2%GW-Yim6+%!AZNRx~p0VJilwV5urNk&B zW?7R3FUzyw<+ZS2!SWOfZlUgqGz(T#S@5bk3tq!xWq}2+Ewtbl$}IRr?5p6qVher= ze_zI5b-4w<60zV{@%hyO3tr!7!J1?s?$?O%wM7elecXaKbXc&q5?X<}+8GOO#mCkn z7=r~1ej^L&AOUk0{3g%8SqilMyOx9HcmsIM=B z4w$##w;N&Eg5PPe;LR0)-FH(hcuNRIE%?1$pzeFb{~m1{^8i1rO#~a;q0fTbIL~dg z{eBiqS?~vw7Hp!;4+|~WOnGw$P!=wLI-pH>(Sng;Acmk_g#JWRAR9tJ+h`-S0d1n# zM&~RTONKls1L|Yc$Ec4{AEW+O>Tjj~R_br1{#N4OIt0@eY)OH9sDu`vyk#6{cN^_) zqup&KPz(6Ijr!Z@`)$h>{1N^7Q7P0xCyWB+KTd}bR6#5B!;}SE@z+XuE9I?}w+_Ob z1#idxcKqDl1Vcdl+bO>T`#bW0_;=I-@$aDi4&vXjY{5H;e<$tkB>tV9K>Rx?Z^K_( z2#C|x3dC=lvfxkf_Y=y0LitZ9{|WJ#%Yy7V3U0>_>np+SLxBJ7%ND!~|94S-7yj?+ z1pMDcc{}Cpl(#oPA7H;D1&W{%x?v0!Ex0oeDxejHf%dy{p%OTsUD$OPgaCgXLog0= z7Gzx}csK3YR}{Rv7O=mY`n!pD_p$}=$%ay(fA@3({kw-&+a9@5SyhgAm~Fu_2hY;NvM!2({1w z*gb*W6WBdb1D!B#!9MKzil7k&VcCMa@xQwg@V}dOPtxwm5a9pGA(*$|Q+a@&r}|*l zg8e-2uLJ6zP6n=+c?KKqQ-T8(7Ti+^5g3ML3+~N_YG?(@_AXd(Um8@xfCX8H z3O-k2!Jp#)r{#eE=kf7;j|GRyfWEvy`xh20_+pC%U&8LCehUuMW;kKN{iQH&!FWEj zK{pJ-qy=A21L|L<{mYHe4t+p7)}(?7j(^qwqZS-V2g-il0m~K~tpJ`MsDwES{-O~k zE%-_ZdMr4W48_m{v>BsMWAyQt)c-O96Bc}x*stRISNQl9b>j`d82s9U8ldjAEU1H7 z3%-us1nu9T>^6b4ZxxW|Bwxw#~)gt4`}npd?4N* z>CZGi|AhV9xxjh9jqkT-Eci|i5dWPHpszC=&){=r&Vql&-=8UeHyLVR6y`1XUOG_z z9_?qV0AI7cFk!*JG{K|=|5^n2`CBd|EI5|}^+5Z-*8=wcpzI$l7W`)#Q1{OX3(j*q z9|7$CRR}#6WL+xw{(uEPpzecmAod4y7F^(*78py`rh@;j2IBrF3)+D8AC>}fK3udQ z_lv>BaSQ&J$Nv%cf7CDGXPJI3Q~yyJa4sL!0q5{hn*|RxT5!dH zSp$?G*$bmE3GF89*g(9ecI%t7z7=&?{wWM@| zbjXJisDcJ)gI*YhNtm~!W0D~o3ZV>Ypb0vlA4Xvs7A+|w6>^~nDxeNppc@8Z9A+&k z(;yx4p#-X+0otG!hG7zX+eJ&tDuOb=E-M1<&;yKn)*SFU9Ge1JkOv_sg-WP}Mreh3 zOFGUV6|x~8s6USS_5Kw zT#j=qpuv((H>d*2PhYmAGeSU4ox$@nh?kcJl;u@JD^Qm=Wl3jxkO%lYv+nvZUaoUp*SXGmpE>t40P(D`8Sr}-39VTL zq=GSE71%{+Eu^WH0ARNke6I!lwd25kLhHaEtn1M_7YMCe3DgJk2(4EHpszl3+^m9y z;3T09;B$j*gx-<_))Lw<0YFDX=xE5#p{Eh_G{XHxBf$zn8`lQw32l-?Xj2#P&m)B1 znhZ`8+6=au9V7I%hF}SRj^-I)JXj7c5*iEHSlEu82u>2(0Fxtul(Af$)TTdf2p%Q@ogw2E|LT4g$CQb%O)5ZlcU>JbiHhTg5YYQE1 zp|36E+hzdVZ;Lc-p|>q$+8zOC3B`IEO)3K#f+PUlN$@8LJ}0dLy8!GYL1#M|#1Ps6 zX;W~&bA3X)o+Pvz(sqO1?$FbH8=*bQ0o?Ctg2~`Gp}pe3c|vz8P z@L8A)puY(I72&fu13(9!aa1fj&bes&z1Lz)?1Tw%#Fbk{#djWKggU<0Ls05&MJamrF0pkgspn?!UUM3_1 z_&i|@Kt3iQ9~1V2=fLaf_qbNZwl^B z!M!QaGZnr~O$M+z6*i~B=2Y06x(gfu=Lmg31tHK7K=y$wFb2#6Yr%eSoX}}5z5jq|Ar^D{_Szr~|1__g(fVvU(TR35-Ko^k0zu)PR+7limKc?_H<^a&GG0!;yApU45@!9sA3&{f_31t$qz4cn{d0qA?O3_$uPk@m^8;4GnQ zCW7Svw${oZ4itfdgg(_5tN_OeU6%lsfFp!H4Y{XdKt6zu^_9SKaGKB!wE=8wfNvXC z0myH_^^N5Lu5UydJloQZ(7SOjfbLByKsr3*(oN$5(rrSz%>+~d$zT|O{mlo!c|x~9 zAD)Bh7U{t(u5xNsLcEZL^*w_ghJ6C{%05*12 z0!aWicEQFj*w_Ud&z1wt0c<=w3v2_hu^Tpa!^Upd*gX-f1+cM41~C9O_Q1v-*w_Ob zd&`4WgzkgBeYm#|x}FPxUH~%Boh9^n$UHxc(EViq^zDZoJg?Ii<`McL0jXdip)WND z#|S-u^8@DyeK`xj#w(C})dYyit4qL1LJ!sk(EVCpfX~+_68Z-6`bIvXcs8epkmgOK zc{2g502c{8oCKx;=s3I<>;ebDad3{%w+L`S2-F76K{DtI^1&D|4J-j`!7gwR90%tJ zJwkvBLZCKi4w6A%kPpUyXi$2J&ODu#l545$FW}EG@d4!1xgvoJ)(P4zKBErjGtLrbohHn!M3@h`-~eG)G$-szLRh(rgk95+ zuxr;77Rn;5!g0cGSV-87;HD#lRZAtThD%s&nXo#039E;+4ayMK5ciw(C9E0J#6o8* z?!`h^i(!PdtWQ`R?8fI1)(UnLAe&eY93rd@NP@n0lL_mPKv>77-~wUzoeoPyn$D{T z>k6IteK+d~y}f1;*83n~w)}Y}pvXux892K2O+k=zRqGAH_9{ zmuv-eJ`VYnsf0a|LD(wzu^K+CK13MCF}4OWYc3GB7QQ|;jIebo*iYEgxVOGGVOV2j z8$;kEVVmI3X85uhHnwyF(DBSF!nQ6aY}+=%w$CDL$3nt(;{GliKZ`V27iD{qe(yQL z_Tl`w+BCvm2XBBks}Ob=ejGkc*jr}_Lm$K5zDU?n zTsw;N$8i2GY@i=t?;j%U_zJ>4NG1&JjeQ9FCwdWf66dFIehRW5Z6@sF$%LI=Lf9w6 z2>TTG&Qt*x2s^u%u+PBf=L!1)e2ME{H6-k76PzRL{6WIL0pG#i1?c%6pFcp)k7o(H zxR$V=W)b%DETWRWL=~10RSFSRZcbFC4A@3gx{#>qNunBAM753()j3X7zZ_A^bR%ln z6+|tE>sMC+NkqK{*RNSmRIKT!*T#VTM7^#EK<@ekz(1iYWAJCqTUGk8>@f>kOjtod0;Kr4~~NiM6C>al_6KT zIp_xR!9=hEK(6v>qTZweq`e99RT2PfSAo7N$bXg1;1D=R)T$<^0^&el0RO8ZT~*|} z>OpXpsMVmWS|tE`)p~(pU>ZO^tDOWFiCR4wWC7Tyj`Y>n0;I2gj;Jw6ACm*1J7zLi z2%taaI8kdf1V~#0X=~tK4d|;$KsitwB!IpEHfv4;E5I&rfvB~RwpKn-YeT;F5~9|D ze4TkjtqXf~alJ0C)jbH{U%e!-9GoL+{ia|dz`dKHw?P$ffT*|N^OiB-2vHj%eWNm9 zEm0er0OyS%(*!b2CWF&NZJGtn67^QxyA?K?%_8b;Aut}CBWm+haDk|?u-hU5tRia5 za$qD;<5aMasPR<*&f{UTRSbY^>q-Fk65_ylq9)?F4FNgeAW_@GZjuQgn}qxAk^p4d zyI>-?NYoC1?APX@<`+Oa+u4{)5)6wD%OC+O@{1dbCm6}mbjA6+2VWgAhuCIHyN zdX3r*db-7cWB~bY^8jSJAzgPFAYJ!W;51Qtq=Fm(TRot&2jqGj0%wWZ6S6%k0od;e zxt`F~a~4<+4uF&3B2jyl2axI23qYpVWB^^gwt+(cx_U!bZ^-qo50XFz7zt*9RbVeT zNz^`&>r)9d1*sqhj0X$BdT;=6xr;=-eFahbqI~+|USHhni+g=>uP^SUl>spz4)g*= zU@}+^wt++7EK&Q(pggD#l0XI+31)#+U@tfZ&J#7=1eHJ>fL!``upI0KC&5LcW|RRj zU>i|0*Mt24*ZWrj(BFR|K;7woj;I4%fHKK0Pt<|XF(`|uISq+ASOxqO=Yydm7v-Ld z`*{nAnveAPYl(UX(%i9xs0FZBu%D=fDAU5zL@gRa)MD5wK19?Z-M|H+4#l-$ur&kPMwk$+1An3NMu$ix^G5C^?pJ{pXTnnUobPmK-ajoY<=5 zn36K$;F4pNR1~L{92=yuxVPlky0NizUCFUcvKnK@bJz!$lx;G%Jn$wZnV_?ZDo{V!N;fRqudsjxHzwg$q}T=>ZSNQ0;Up2axW9*A^Z zNHH{|BYj#}8}}`QW1gcB{LaPCe8}`ePO>2vg2#EVo)*5R6Vfs-e|SOmfUKfWmGr8i zy0vT93-ucwYLQ)3SX7XiHaI4fn44ZR6q}P1O5sw4p_I(R%z`1A88!9aC2hcyrlt)U zJTNbJK&VAp*1t#?mpL%4OK~VYD=l|GW??9;ATyMm8_F;4my?|y%E%j>mYoaFF3)18 za0Ux;Ig+?jS}smnATxPn5DxP4@bj-E`71JA!sT0t81XXVHK!)(&CP^#$t)<$&dUwe ztyvFem#X@We-ZaC6$p|3VQsv|g;3`rH7=T+{&~5GZ4n|)!nL*trPdgKX|)#0D^k)! zP>MB?HV>Z#D9OyQz5>*sOkB^!&mtr(D#~wMt5ybLG^Ds@VP0`TdS?H;f&rN|b2D+f z)g>N8>qxY9{Ju5tmcwg0uSxyzGY6@Mq9yT~dU?+NZvEq$T0`$}*uV$=~Lqw0#vrrnG(itK8^lzkihXNF7LnwM(P+`~F48 z-?;nx|G4$v>-^96S%1{~h0vSuevRij8>OL#k9hBx7OsW7*C;?^3!yyvl-YwSea;9e4QXpyQM0peXFcM}(P#p2pyjS95EsqQ@@5^%(jdSU!9O(mj2^NQA$n{4{hadB}M9W%7 zZlWVtA#Cycf0Pe?J(AB_@TUN0ymTUCctm$L&bj5wOF!Da|2Wst$VKW~q@G1`$o=A8 zMrvJYj)sQg!F#M|zW=p_NK4~2koW4mw(=bEHW01hyr%G+>k1NTi439q}q! ze*GcE^UM3`XbJJ0^P0%ZBvQi)F|zR1nHsjlW7ZEcd^S^B2BjqxjVbr%_dP)_QgXe# zmhlLbMl0G@N+ZVGL9~uvnvUm=&tJIbI(*@NTw2#6(co9O{(oJbJfA#mr0fTWKO^Ut zw)H&>;y<^}W6s-hv`6E<^Y+HuXQYpdc*=WM zKFUYSytE!i;=pHcyq!nlTnsJzOvgE|DZDLkPx%~`_eas%Jpgj0<7&iGv=8OEi+IB2 zBaw}2i{_Ev`SUzQOPh}qJO`yUjOR22fBvcmm)rSmJbvGf3d3!Imp8Y-b8u-1^Hva< z9dOThv_s*axj5tfN;J+PNJXyjyhdtdqyZhrTz>J*RhOn)GPkM zcvulBBax3rH=066pB)`-D_&B|BI8REtnvC69bb5zii}B-R+fuiAkq$^?QIC`WM7iA zsJ%=wEL_q&N4&i9@h>uZ@m9}AnP@+AX}L#yj$YA!H{L`dz{e~;j`I;NQt!FPyw+S^ z_oMZMmlK!#qrRJ$37@a=y3Bj-sQ-TyRsE94U0Q~Jx2^KNH76XqNKT@yE!vX!%pua| z_*^?Ou3SF;Mp|e(=0<6#Ej*@?u{Bbw^l;hnc}G;^f1;=QZEG#fRphyox6a6T*#Fo1 zmO$d+Q!CPew8v<`$G;9ZOC?<~*G>uFOT@Jh=5Z;w(*@7Qakv_XD-|KZ@9_H-!>zF^ zj#Ehj|ONl;S2YCLI@Q=rq$FWn`LOiav!?lRsh*tje#&g2`=F#D0&&!ni zmxwcNp#|+4`Lqw0Y)9lgQX&z3 z{0aHeT<~)08ZL>_@`#iG_mI~MZZR6O($eQPxzAC5cx~pjELskwQQ_^6*D>xjuLb;! zTi|Vk*D+p7{9d$uavQwvMEZcv;j~e$Jl*B-4MCE(qo`ao-JkUxkr+j7UtWT|w(?j; zJdE@tJPr}Pk-8LV3BT==BE5V(#x*`d=9i3Xg-9Ej=|-RXBIA7N+$J*iTsrUM(TI*S zm(BztPY10r8u6#V%y87Aa-~-zPfL+8tMuuO>x_=czkfdFbu_ZN$mL3By`{5{$m}ul zOvJ~;i2r;>#OLRcIUt|wMP?;@oaWE65$_7Zv;N2vY4m9&vUb8H_^1@kMIn6TV?XyI zVkEXI zUPNTM%m|!EpH(hh|A~5ES_YA|nctQ{G%vr8zkXT#`OL5oH7N2dl^u>SpHJ3=M?7cT z)5vpK#4<)`CN(5&?9w_~ zMl8-EYh2OT^0>Ez)a9$%|BY3re|pXO|I&I;WNnL=*`@QcXbs~f9C?D^CHGIR2XVW< zUk{4ZhX3Ar5ceXoI`v0$@zQ?c(wTgExDH2G5V#CqmxxB}_igRc)x>CB{(V2e$3@q@0747@%3e{Wq$zifp4-&F;@4=Y9X5uPgCU;h$euDs6AkRU$t2SHzt7 zkAGuaG3+a!l|*~tXu8Prd1NN>e{FRsGUJKNup+Bcoe=R$f144>Ph`gQpIu$zt8o7+ zy8J0B8o~eDt4uoTD<6x0JDd6MuQKtm{Qv4Ila43OOIMjnpLPG6t4w-$t>n*EnRv_K zt1kcfRVKd9##iM2$|@6oGXKx4GVwKtSgb#_BW>VMbWJZ7>k|LHwIlvq`1_T`|E;wn z{da3eq5rkDBR)3%@!C;zt)_HMD6-!3pIAHMHMMlz?9bPZc>Ce?=#SR3|FdgH(bfHb zJ)-=6#V7jv&VOgchuev+NbukD{!=SH{OO19O8R>%K73V&_x}IW6(1dQf#{B(e-+7p zYK5lgcQdQz=yjqyPxSDr3_rs*>sH|nT70V--zWF${!{=&w# znxWP?!}GHWL)nA#^9qVGGeZ3f@&<=u3o?goLeXqK9PI3W!Z=F`=ToP+IQrP(HTVVV7NAzane}%ti>( zLh0D2s6(E9W^z^*J`4Hy^cbFllc3fCA;5bBiIzi24JU$JV~lY-3rg1n64^vtlDjBMz|i{I?Xebo|l`E%>!20Sl3gbF0EhQ zkj!unA{$4;4*XgPa`TE%4A|Al-QuMZb}Ui@BKJatS!p>rdcVw)sKE_v|HP$B@|l;5 zdQlJ>oQDSYN7)V)4bRW)p9VuUBTikO$H8gC(I}BTBfEb#uV`sGMW}i>fYP*#jBw7w zF%IuMO)G%U#W`sOIuBPyW?}Y#+;F%DMA|A6@fwnmc+FdqYQYt4av(6R}G#nb662tOeifs zAI&SRUk<8&UP+e&%{=USwB5i?T2Uw~tq`%#%>6a`VU;jfTDvns#km;4@w(=ei`jBH&5q{jSK$uN);{Euqkv{ z*bbeU)1Nz)5FcvQp?zwoQ-@ZmU1L+?Ly4V2$tfMWB*w+Zg(}8&!g@`EwO#eq|R}P?OTUh zAYJJCut-gK2_2#MEaOWPN^yJvF*4lk523M9oog~ ztvYmW9~YaN*r9!>MLe<++aiev4!$7@Et6ss+r@<9V%x>G=GloF;bM{Ol!im+30lXu zk57qBiV1Z}j&GUB4-m)1l=znL8i7OX5eZy{rj{MrcZ%=W85bZIH4&qCO^6TY0~v_L z|1HCwg|put+2wjtJER~WC9ZT$>=YjpicLxE#7m@AN(Z>h%deTl!k zjQF+R*A7VW)Fn}ji;qo$LR6CWTozHfq$Z(u#Scr*%tu=*j5h8_*BI_bBYh_ZCbY>& zCx9B=Iu{K$axHv_VF@iOJiJAEw_p2#@IHR@^1SN}cOU2;F%m_(-i#rc=m86PZ=YA7 z=kd;DXf_5?KCEDNk{22CLWOBLFosmTPYFw*uT0B9vXV{_jr_8HSdR{d`32cXGPEGO z2%SkNtr$aOLH3A}VVKW_*9_@;c*e!OEey4cz60^^Po4hiD-Zw7 zJP5O`XkW$y)<5ih+FzRo>80}^gyC<^gLFPNl=kA`LW>Ns>EXDCXC2(JUrQ|%o+e&a zCt~#f$y_P&mI&rbdZ{1bn*P5uR|-!U{)2NRJP@S8+`ZLSn9x01QirEe@ocpYPy7u=kneW0sQx; zOM1mi-3>oCR{V#jOnPqKuiebwo-*nG=#)t>nKFe(-M=?w(tkT;3jLialm3TOrqI7L zWzth)yR>W5fzR|}6aLohNH3i%{!eB{ddUO~)7AgM>`1?Kb`+ig{oAu6Ju=7q&Ftv% zdG^0KJL1#*%NokB6CeKE`NtEV$du-n}pZNT`3h*ZrA3ePAbE%VmWkORFeZ8`I zc=1H9i4QDK@i$%n-aCV}!s~W}uy$7qM0Q{g!-^MwBQGD2yo05DJ2;YA4|MD)U7p`vhuP)WE^s4UzhR1vBQ)r9Kg2lAE>Bh(OT z3blmVLLH&5P*12Y+$=N@ZV?&^jfBSJLvliBA~Y3l6`BdR3C)FAp@q;=h!f(4Rzhnb zK}aNP$x}ibp{1j96z&p638RHEnVXQDt7%xl^?h)=4CJOfn_Y0GR$-)$2s_=j?O_(ms z5M~OqgxSIzVXiPwm@h049uyV|4+)Ee#ljL{sjy6VSXeGRB0MTQCae%17gh>S2&;tE z!jr-pVXg3#uugbdSTAf4HVT`B&B7Mp8DXoiP1r8%5OxZ?glC1_!X9C-uuphScwX2q zydbToAq&eh_{XE($*h zKMTKzL=;3(ltfunL@F{-6*W;84bc=W(H0%i6+O`x1F?*V??4c*6w8TMiC2r)h~>p= z#p}fD#gJG*tSH_fRuXR%D~mUYRm7@dHL8d4iY>&JVw@N+wh~*531XtyMr?o#)oy1hJ zv)D!KDs~gQi#^1iVlT0`*hjow>?@{;{ls)JL(CNWivz?gFP2y&8i};MVRoo_S7k7v|#a-gF z;%;#dIZBR^cgb<`HhEv%EAA7Y6Q39Ni!X>TiZ6)=#Fxca#8<_G;%nmT;v3>2@lElt z_?CD?d|P}+JSrX&-xc2z-xrUIABZ1{C&ZKDDe)umWAU{3iTJ5_Mm#HiCVnn{A)XVz z6u%O`7SD^{h~J9ei5JB0#UI2U#f#!k;?LqQ5|IQ+lq5-(6p2bqQYB5&B||bLOR^!pxXL8>U-AXSoXlqyR%NmZn(QZ=c% z6eHD;YD%@F+EN{#Y!!tmQtJ)FSU|d zO9@h<)JAG6B}wh1_EHBaS?VaINS&lqsk78Y>MC`Ux=THzo>DKVx70_vUFu5~OKDO+ zDP78tGNt~~04Yn#mIg|Lq#S9mlq=;)`O+OyfmA3JNyX9-@}M+S8YT^wMo4!`Bc;2f zQPOB>jC8j&RvIUbmnKN}NcTz;rTe7&rAg9cX^J#edO(^cO_yd!Go@M5Y-x@(SDGiy zmljA5N(-fjq(#zVX^FH{S|&X#EtejV9+e)GR!EOaE2Sr-RnltdNokF=R(eWWCp|5# zmo`WnrA^XiX^ZrXv{l+BZI^aPJEdLHv(j#9kF;0XCp{-UFYT9JkY1Etk`72OORq?; zN(ZIaq}Qc4q(jo1(qZW>>4@~U^p12?Iwrj3&fCw(b>C4DWOm%fp{mA;cMNZ(68NIyy!rJtmqrC($s3$iFn_(On- zOl2mkvL@@YA)B%#+p;6O_)~no9LQzlE9A2Bm2x@xD*0;p8o9iDt$dw)y&RG&$Q9)q zu7*FE7bDk@Ys$6c+HxKIQM!6^efeg&fqaYHP;MkQmYc{;t>pwcQEnr*m6PzN&f3czCe5X88zDph@kCw;Ccgthtaq@V1f_#sBuRKw{PrhHCBu|#7$W!G9;hXko=~6Sbj@BBEK!aBOjHI$?wYV$?wa@#}U(4s^Z{%;~@8k>e_wo<&kMc$N zC;4aj7lkN-A}W$1D~duDrl^Xh=!&73ilx|!qqvHv_)4IZQLa$RDpxAyl&h4hm1~sp z%C*XM%JoV}si0I;Zcr*IH!78to0KX_Ri&CzU5Qa@C^eN@N^PZ%Qdg;`)K_j+8Ys6Y z4V6YpW2K4GRJm1Yrrf49S7MbGN=qe9iC0=Ft(62NQE8*JRg#o;N_(Y)lB{%8Qj|_g zs?u5MqI6ZdDczMGN>8Pi(p%}H+^+Oh(v*Hmx{{$}D*crKN|utX3{(awIm%!qSIJZI zl{=IIrBEqSij^VCP-U1hTp6LnlfFPq0CffDYKP1%3NihGGAGsJg6*G9#R%5iJsY*aQWo0TofGs;$Fo3dTmq3l$4DbFgq zl|9N{WuNk#^1QNNc|mzmc}Y2-ysW&Uys8{jUQ=FI-cSxHZz_kCx0EBw+sZr2QRSHO zuJWGpzH(goK>1KPp`27sDIX~xE2ouDluwm2%30+z<#Xi=<(%@R@|E(na$fmH`BwQ( zxuATn{Gj}(TvUEiepY^=gbGxo5|yb!DP>fp8r7*mO=?k_I@F~e^=UxM&?{(JdL=DK zucBAeYiN0TExnFjPeZf(iTQ z19}T>NE^|{v7!XZL~R!r7dVn8b{-4E83bS&_vpXwxvn59c@oL&}7ueIkKRuw(aCfQok|~| z)97?MgU+P0=xjQN&ZYC{e7b->NEgzF=pwq9E}={5GWsxGP9LF<(#Plu`Z!%lpP;Mg zYWgHyL)X%$=sNl|T~9aAjdT;;Ot;Wy=vKOoZl^owPP&UeOLx;fbT8dUpQF#y{qzO; zB7KP-pfA%`=&SS~eT}|O-=K%+oAfY!iyonG(|71mdW^nH-=pu-)7=y#450g>;_he z-N-7ln^+ZAl~rTaSq!VeYO-3aHmk$xvU;pOyO}j$x3Gq+5o^qvu%_%*){Nc8nzLBe zg0*CEES|Mutyuy~WNlbmmc-hz_N)U-W*u1y>%>x7XV!&vW!+eJ)`RtAy;yJ7huzNl zvNYC@rLzo{$@;SaEQ@8cfou@VVS`yN%VYWM4pzVlSrIE{L)cI@j16Za*qv-7yNiut zquCgCHyg{wvGHsIyNBJ&CbIk3{cIAO%%-rZ>;X27O=mOMOg4+nW^>qFHjm9`3)q8f zA$y1|VvE@lwv;Vn53}X$5%ws1jICggvz6=#wu-H0PqH;^EqjWsV^6d7Yy;cKHnGiY z3wwrbW!um)HUJGJA!+$_}#E*z4>Kc8I;n z4zst|5%xBFhaF|d*t_gK_C7n#K42fR6YL~A#Xe#mv(xMo_9;8V&a%(g=j;o1j(y3# zVqdfK>>Kti`;J{;-?JaskL)7*iT%ueQSl{Vs;Ek;tSTy1nX0Oqs;h=-s+MZ2j_RtO z>Z^fTM!iBUt6r&=Q?F95R3P$b@1he_0;<6&1wVn7PX<;NNub(QJbo_s?F5f)aGie+CpuKFBgngTdA$p z1T|4@qqbF()OKonwFABou%nuyc2ZN-&T1F6E56vTyV^tTsrFKPt9{hl)xK()+D}ba zGt^AAzdAt8QnS^8>L4`-Um=&P=BfGW9cqDEs1~Wk>JW9PI!qm|j!^GZN2+(Jqtwyr z81-&-tU68|uTD_!QSVhJs`sh)tCQ5p>J)XV`hYr3ovzMMXR5Q*+3Fm1t~yVhuP#s@ zR2Qlbsf*Ob>JoLSx=ejoU9LW&KB_*Zu23IWSE^5_tJKx%lj<6Et@@O@PJLQkuWnE` zs+-i!>K64Gb*s8f-LCFXcdEP8XVu;69(Av}Pkl~(Ufr+0puVWSq#jUTR$ozHRS&AK zsjsVVsE5=y)x+vr>JjyA^&R!7dQ5#+eNTN~J+6MBeyE;MPpYTXkJOLV)9NScr|KE? ztooVyx%!2APW@8-O8r_ruYRL`tA3|mP`_7yP=8b}sz0eetG{SO6EsniG+9$LsxeK~ zG)>nG&D1Q-)*Q{%Jk8evt&DbsR#v-GE2mwhU9DZCmDjG-uG6m9LRtl_qIQE;NxM<2 ztlgwl(W+|IwCY-nRzs_))zWHfb+o!#J*~cWv(`YnMQf-v(i&?`w5HmvS~Kl7t+^Jf zwa{8>aaz3AN^7kpXo*@It*w@%wbR;b9kgVvqn4s|(o(g~S{JRW)=lfK_0W21y|mt1 zAMJLnua>6u)6%sJEmP~S4bZZ*Y;B-6NXyX%Yq?sUmapBR6=;Q8kyfk?(S~ZnwBgza z?M`i^c9%9v8?BAe?$*X?)q(WYt-Xw$Um+6--`HcOkW z&C%v+^R)Te0_{O6j+9TSd+GE-Z?Qw0T_Jp=dTdh5*t4NPAN|ti7cj(caeH(T-}zw0E`lwD+~++6UT)+6nEXc1rt5 z`&c`zeWHD;ozc!}pJ|_KUufsFFSW0UxY`L$9gV(rfE=^tyUIy}o|4-ax-aZ>TrY8|zK< zruwaVGyOKbxgM*x&|B(pI(`eUx7HK%M7@pPR!`E~>FxCnda~Y8PtiN+sd{I3W8aty1~`JxkBl2kL|L9DT5!tLN$Y`W|u8+{~)JN)f>7(?~`WXFgeXKrCAFof)@6qqoC+hd<_v@4N$@&z1s{VjJ zO`opM&}Zti^x66xeXc%FpRX^_AJiA>59y2a#rhI`slH5qSYNI`qCcuXrmxT+*H`LK z=&SVA`jh$^eXahKzD|EyU$1Y_H|m@8&H5Jo8GWn1P2aBX(0A&)^k?>@}_?>&XVP&$xz+CA-PJMtS2}<2v$$alH{TDi{@w8;nZEjYehTCi0w7#i(jj zGpZXgMh&B;QH$&#JB`{#9iy&M&!}(QY&0-#F&dI>MkAxK(ZpzK+-fv4ZZn!2u|^A{ zr4eVu8?B7iMuL%Ov@zNmNk%)Pz0tu)HaZ$9MkgcH=xlT`x*FY#?nV!zr_sykZS*m2 zH~JcBMn5Cn$S^XE{>A_!%g8nc8iR}+W3Z8HtuG0Yflj4*JZvmC9x)y@9y3-Lj~gqECyZ6bYU4>`jj`5v z%2;PSZLBvo7#odE#%5!S@r<$6*k)`ub{IR2UB1;}?^d zf+?DkDVvH(O=ha5X6mM4nx{VE z$gE&iG;c5~nKzo1&6~_BW>vGAS>22=YnV07T4rstj#<~NXVy1wHXE3?m<`QFW@EF7 z+0?w%Y-ZkOHaBC<7G_H`&Wtx(nXSzPGtq2gwl$N?c4m9CgPCl0G*iq@W~$lQ>|%B` zyP4h19%fIom)YCwW8QA|HPg&~X1bYSW}5xY0cMt&Z4NXCnK|ZQGuO;B^UXWV0<+L8 zGKa=2Y_m zbDBBboMFy1XPL9jIp$n*o;lxKU_MCZnG4N_%td5{x!7D{E;W~#51Y%)N6bgb0`oC^ z+w2$S3iEMurTK)p%3N(eNggrRm}||a$P9Cx`Lwy-++c1rH<_EwE#@=kR&$%Voh&qW zm^;l~=CkH*bC0>#+-E*#K5y*S+b>A)MA!uX_jsomT6g* zZ8?@}d6sVlRvGIGtE_dURnEG~y4t$NDsNqDU1wcyg{%rzMe7Eul69k1*}BQ9VpX-O zS=Fr=tAR5HHdRBewW~+g9i`CF-WHq*$SWT^4t!CD3R&y)XYGJjs;;eY9 zmDSoxuoA5{R$D8{YG<{#I#|h8M=QnZWTjf2tu9tqtDDu`>S6V?dRe`#KGyA4Un|Y( zXQf*iR;Jb88enBv+15a7kdn>}Q zHQE|u-EEDv##!U73D!Nj`U>wc2{pT4SxXp0d_iPh0D) z4c10$leO8}Vm)JRwYFK?tsT}*YnSz`wcFZb?X~t<&son~`>hwO7p<491J=vdE7q&l zLF+Z^b?Xi5koBf@*m}!4V!ds>V;!}QS?^l!S?^oNtq-gZtrONs>y-78^|5u@`o#Lw zI%A!+KC?czzOc?&Us_*TUt8y`Z>(>v@2m^f_tp>AkJd%&C+lbH7n|6EE!vVT+lozX zW~;Vl>$YK=wq@J4W4pFz`*vWLv9GYp+E?1;?5pgn?Q87v_O*SBxB8`!tl4edsDW4npn)V|ejX5VHv zw`1)Vc1t_Xj<;Lct?dLm(Qae6wUg|2c6+;noosisQ|wN5s@>V{Vt2K>+1>3Pc2B#P z-P`VC-){G{)9ikBx}9NX+WqYTc9xxO53~o_Ird;X*Uq!^?K|uOyU;GOi|rxyPwIJ>H&R-(%lvPqgo|@3$w}lkF+?RQmyYnmyf~Vb8Q@ z*|Y6A_FQ|OJ>OnnKWHzsAF>zOi|r-$QhS;Gu)UmYu^+J?wI8!r*pJ&Q?I-M2_G_HKKRz1QAnKW9I0@3&vD zU$kGc57;l;uh_5J2kqDF*X=j#L-w2YVf!uni2b(xj(yZVX1{B{XTNVBw?D8yv`^S4 z?Njzg_Q&>V`xE<9`;2|o{>=W|{=z?jU(n4>zHqdSIUI+kNQj^jF><2!*<#<{{N>s;xSbFOl(cCK;CJJ&kb zIoCTOr-D<_xxuOA+~`zxZgQ$PRh?>1btlHD;nZ|$IklZSPF<&-Q{TDSY2e)AG;|s{ zjh!Y=Q|DHvnRA=d+=+EsI4zwxC*Eo0w007lM5m3@)=6^OIqjVePO{U{NpU(ksZM97 zi__KV=5%*@I6a+SPH(4=bGy^mNpt!+=}v}|>GXF7I9X1%Gte32udChs=UeAH=YsRS z^MmuFbJ6+9`Puo!C9dF#uH?$D;!>Bns;jxWYq+Lsxwh-LuIstJ8@OfME8Mc~m2Nrr zD)(yl8n?WAt$Uq&y&G~XxE0+S+)D0^Ze{l-w~AZUt>#vDW84~UO}Ca?+pXi)b?dqH z-J9J8?k#RZw~^b}ZQ?d{Z*`lwx4F&TSht1S(v5TD-BxaEH^EJG+qiArB)6U0-tFKf zyB*yWx09Rdc6PhCUEOYOcejVz)9vNx1XEtX1JMde|LbJJ4YUsyVc$1Zg+RM zJKbIGv+izpkGt31=RW5?@9uYBa9?y^au2vKyRW#fx(D6Y+}GVV+(Yi0?qT;W_lWzp z`;L3mJ?6gazURL09(O-*KXgyHC*4!-NAAb&Y4;QNQ}>K}*8R-=-2K8m=YHva<$mp+ zcfWDJb-!~jxZk@!xIelV-Jjf_-CsQ737+Ulp6n?e^_Zu6nx}h)XL^=rdyeONp67dk zSH`=-E9+h9mGiFhuJ*3+%6r#(*Ll}_A+Lg0(YwK`UUe_VtKrr3 zYI(K2I$m9`o>$+y*=yk4;x+Udd5yg$UQ_Q@ubFq7*W8QsT6itJI4|C7<+b(_yhN{! z*Vaq&+Ij804qmd?(M$0*jU$dU!p(US4mnk9WJ**Gu#IdFft;m+AHQ z26$Oswl~ll6i?`M3Ga{aC++-_nos zUZ|L_+9;Oes{lz-_!5q_xAhvxBGql zG{2vp?q~R!et&;}pXF!!1N}jMjz8GX_4E9E{|>*vFZ7H2Vt(Kh_`TkM}3|_xShv6aD-A`~6A&WPgf3)qlXB=1=!$_%r=k{%n7aKi8k< z&-WMj5BdxJhx|qUVt@W8p@gMac^H=zf`z!q?{8j#H|4Dz1zt(@sU*|vV zulG0j8~siGW`B$SjK9_2=5P0R_&fbw{%Zr}?;rO+@IUlV_$U2S{zv}D{%QXc z|5N{rf7buZ|J?t=Kj(kxf8~GepZCAW3Cai82G<4G2ce)sP%*e6 zs1)27R1R(mssvSoYC-iNCa4kA3~B|ngE~Ropk7cvxH)JL+!8bl8U>AmCPCBS)}UE% zThKg+4O#>(gSa3*Xce>$5`x5_P0%(-3fcwjgAPG*&@o5}It8gg=b%f_HRu*}4|)VW zgI+=Jpigjn&^Jg6`UUAhMvxiw4+aETL3S`O7!>3LgM-{4FUSw>2nvG2peQH~h6F={ zVZrcVL~v&?GPo-k6^stX1a}8xgK@$5U_x+DaBna%xG%Urm=sJ7rUX-i2ZCwA^k7CX zGnf_34(0@NgL%RHU_tO;urPQiSQIP{mIOP2^5Bu+(crOQMeumAGI%0b6|4@P z4Aul|gQv(Y@@%j!csf`gYzQ_6n}W^3mf)FSYp^ZY9_$Eq2D^f1gWbWNU~jN5crJK8 z*dM$QycoO`90*Ks%o#1G2EO<9~FL*yV9()jd z7@P=B2B(6Lf{%mK!6(6|!I|J}@LBMA@I`Pg_%iq^_&PWrd=q>dd>32@z7Ku~ehe-K zKLtPkKh?d3pWW8A{+&cVc5IIwsNkebF4rBgrWlAk1FM_S*RQSukOZ$6)RYwe?>XM^-SYwbN+=NkWUk8qE4k8&M% zlRI!XyIb6&-L396ce^{~?r?Xy$GFG3$GOM5*Kl3ebA2~(hwcgPHQj5u*LJVtUe~>z zdwur??hV}=xi@xqxi@id>fX$~xqA!umhP?GTf4j6+qlzi=tgerCT{9xZtfQDjC))6 zcJA%nJGggr@8q87mhQ+MyOmqJjeC-NvU`eqs(YGyx_f8$4EId;F7933v)r@YbKG;? zySeANcX#jM-qXF8dvEuA_df1@-TS$-?jCoqJLk^37r6V}{qBN$fA>On(LLZEbPu_Q z-3Pc!?y|e$uDTbw7rU3Zm%0yhALKsRz07@x`%w2`?!(Y zC%8{^pX5H-eTw^3_i66a-DkMZbf4uu+r8X)kiFZ*c7Njj)cu+JbN3hSFWq0czjlA) z{?`4S`+N5f?jPMhxqo*5;{MhBoBMb7AMQWhf4Nt>|91b^{Xci&{>MAQJJLJKbG%L7 zz}xI?@s9SkdfUA1-juh)+vy$S9qS$E9q(Pkb3M=Vy}%oKCwSNNuH{|ZyN-8V?|R<# zy&HHp^ls$c*xTjZ#Jj0?GwGrhZbclFNl&i2mn&h_r* zo#)-%yN7pA?_S=$z4N{Mc=z@0=goS1yuIF>H}75G?eq3~3*P;`3%y0}fOpV43bbG_$z&-Y&7z0iA+_hRoQ-b=lgc`x@~ z;l0v(mG^4zHQsBz*Lkn^-r&8_dz1HO?=9Y2y|;O9_uk>X(|ecqZtp$bd%gF0@At0o zKHz=O`;hlx?<3wvy^nbx_del$()*P6U*3OvpY}fEeb)P&_j&IN-WRyovW8{|Ns`|0v(_H~9m9 zv%keZ+TZGL^SAp`{tkbqe~f>uf1H23e+}RDJ>T~Of9Rj!U(>&qe{KId{&oH9`PcVv z;NQ@{k$+=+kXR`g8uge}TWx-|sK@_xCUK7ySeNLI03{*nfb( zbe}ex+ z|4IIn{ipa(^`GWH-G7GvO#fN_v;E8c=lIX{pXWc{e}Vr(|3&_b{g?PJ^x7;Q!J8lmBP`FaBTszxjXn|Kb1B|CfKI|8M_){r~eP{(piaf+K^Y0w>rM41&$U zmf+}MYp^ZY9!v#0f}O!J!Lh+{!STU00yppiKL~4XzhlKe$0~ z!{A22je}jmO@f;SHw$ha+#;N0MD!Fj>m zgL?$`4DJ=&J2*eMPjKJhe!*<8C)gXz1@plL!M@Zb@_BZEf;j}9IaJT`b-@c7^f!4rcg z1y2s15I1uqU>61+5cS@81U6~QZm zR|T&QUK6}FcwO-N;0?hWgEs|l4&D;HHF#U__TU}CJA-!x?+)G*yf=7X@c!V6-~+)2 zgAWBC4n7imH27HX@!%7|CxcG~{}udq@af<)!DoZd1)mST5PUKCQt;*AE5TQTuLWNZ zz7hOS@Xg>`!MB6&1m6w57koeXLGZ)iN5PMSp9DV*eir;Z_(kx`;8($~gWm+d4SpB= zKKMiM$KX%FpM$>ye+~W?{5|+b@Xz31!IiZUuQ|Nd@Y=)c46i%9-thXv z8w_taywUK+!(GFh3~xHT+3@DWTMTbGyw&j5!`;K%45x?TFdD|gWS9=KVLmK|GsD{s zZ#TUC@D9T}4(~KPaaayV!||{h*289a((vTrDZ^8TrwvaZ-g$V&@XX;|hIbvFH9UKG z&hXsf-G=84?>@Z8@Seka4evcXe|VqaeTVlO&Td`4U}e9Ofy^J=QXZJyyL9N_mRTz| zmwWW)+5G0&uGmr@+NT$>F5EI}<@WL3g(bbgdBNiRCENFI9B&)z{npvNN`kSnZSVTw z=4$V(F1>lqib^=MD_d#+mARt@-dr2td{=C%*T21Oe*JJuO*7`L++5og=euJ2NgEB> zzHj4r+ezye*tT!|aOxzb95^s*jh))pGq#_+@!jqFH;y-*yk~Z4(|-N4`IMD~#ku*- z%CVqg%PI6^fu5XVJz21!JB2ncSb5YbryjL%|Lv!4TzC8ZH;$)H>osKR!mAkjl&a+5 zqTYaA*t_}k*}cjGvU#y9rcUplx7af_pKb%R*cF>jSMN71>YvSL*!K_G_s{5kW$Iwh z*nEb4|DX-?MrB~-#uU5NaaPE@cI3KLG|L!=q-=`g`eQV3P zO#P~r+t1r*;r5Gr$M@(RU%GL;`JUF-2X@7_d#>NR+a9=nI9Sv#-7RlfJ-9F(7Sog= zWkeZMCX^{Rt&wxJz?hLpy;Ld=D=_ut#8zz#f4;qTeINd(3!`!5@P^27e6x82mB#WAMk| zkHH^k7M5YS3%YYtU=ZYtU=ZYtU=Z8_*lj8_*lj8_*ki-_ZMp-Z$Vk zGs*-ZCb5TncKvWmS$9=iX6L(d`?iEkHC+>kHC+>kHC+?kHL?@kHL?@kHL?#qs8V*1h#yC>u^j1Vj2+BfS3lvG$5t{ zF%5`mKtcl&8j#R{ga#xuAfW*X1CTHP3HS;43HS;43HS;43HS;4DflV)DflV)DflV) zDflV)DflV)DflV)DflV)DflV)8Tc9a8Tc9a8Tc9a8Tc9a8Tc9a8Tc9a8Tc9a8Tc9a zIrusFIrusFIrusFIrusFIrusFIrusFIrusFIrusFxB*cCegS>~egS>~egS>~egS>~ zegS>~egS>~egS>~K5jsS8xYNak2?_I4n(*E5$-^QI}qUxM7RSH?m&b)5aA9)xC0UH zKr{n>$@rJ_AD1A)C5UhdB3yz9mmtC=h;RuaT!ILfAi^bxa0wz@f~chbCHN!oaSI~c zf(W-D!Yzn!3nJWt2)7`@Er@UnBHV%qw;;kTh;R!c+=2+VAi^z(a0?>bf(W-D!Yzn! z3nJWr2sa?Y4Tx|9BHVxoHz2|dh;RcU+<*u-Ai@oZa04RTfCx7r!VQRU10rNSLe?W> zJwnzaWIaOGBV;|QxqoZ!-YL^MW3V?;DYL}NrWMnvN%nvzI$Sw=TH zg_6c7X^fJ_C~1t6#wclwlEx@$jFQGEX^fJ_C~1t6#wclwlEx@$jFQGEX&l>)5XTGx zLK-8aF+v(6q%lGoBcw4x8Y84JLK-8aF+v(6q%lGoBcw4x8Y84JLK-8aF+v(6q%lGo zBcw4x8Y84J0vaQrF#;MRlrcgXBakt|7$b}^!WbirF~S%lj4{F(BUmwl6(d+Nf)yiJ zF@hB%STTYXBTz8{6(dkF0u|@=VCB%kL(4nn7L)>WS!qmLYg@T^Sm}q_!>zN*EjPb7 zzc4#hA6{NiNZVB(T`PTQ_xUMWRqBqW&OETtE;E>MZtvu6XC9c}XD1!Epwq8{HR!N5 zjpkQo2Pe&H*~gx4DG_*^?x~L);SJ8&ucJ*Z;NUc+oSfBC%Yi*}vq#-|^{6vekGlJU z7CgEZ9Ceok=dAsQ24^qqJ22~fq{8mn>{KWc_lM_8;1;^rHu6!$DU#E9x8g&SCXyul`qa21;kQ zZ+5D^>{_#qxmq))xTeh(A9lvJ?#tbwH3Kn;tLe>MbHk(0wJw{8$B0Q>C7aZSaC7(l zwa<9oi6>*?$(VRDCZ3FmCu8Et7~zQ#o*3bY5uO;~i4mR{;fWER7~zQ#o*3bY5uTWc zGA5#o5uz9&iV>oih%zRkjEN{?BFY${iis#=BFdPEGA5#oi74X+(r*x*#vHe}F~==# z%yEkwb6n!a9G8R`GMTnU(Mu4$1kp@_Y!n3A#h9x91{Y^1U*d9!-T*wK^GGO#{_*$(8mOQOwh*!eN52D z1bs{h91{Y^gupQ&a7+js69UJCz%e0kOb8qk0>^~FF(GhF2pki1I6;RKbT~nW6LdI1 zhZA%-L5C9p$ArK!L6;MBIYE~bbU7h#Ob8qk0>^~FF(GhF2pkgv$ArK!A#h9x91{Y^ zgupQ&a7+js69UJCz%e0kOb8qk0>^~FF(GhF2pkgv$ArK!A#h9x91{Y^gupQ&a7+js z69UJCz%e0kOb8qk0>^~FF(GhF2pkgv$ArK!A#h9x91{Y^gupQ&a7+js69UJCz%e0k zOb8qk0>^~FF(GhF2pkgv$ArK!A#h9x91{Y^gupQ&a7+js69UJCz%e0kOb8qk0>^~F zF(GhF2pkgv$ArK!VLdrvJvkweOb8?s0?C9xG9i#m2qY5%$pr0B2qY5%$%H^MLHiQ| z$%H^MA&^W6Bop*MLH`rcr}ApGx#)v4>Nc! zgU>Q}EQ7}~cr1g*GI%T_j>(8)GUAwwI3^>G$%tbz;+Tv$CL@l?h+{J1m<)c*;KvMp z%;3iie$3#<41Ubu#|(bV;KvN!%iz5X-pk;<4BpG&y$s&V;Jpmq%iz5X-pk;<4BpG& zy$s&V;Jpmq%iz5X-pk;<4BpG&y^OddgYPopiwr)?;Ij-q%iyyNKFi><3_i=?vkX4V z;Ij-q%iyyNKFi><3_i=?vkczK;H3;+%HX98UdrI53|`9Mr3_xm;H3;+%HX98UdrI5 z3|`9MrHnWsgP$_^DI-qEh!Zm6gp4>LBTmSO6Efn2j5r}9PRNK8GU9}cI3XiW$cPg% z;)IMiAtO%6h!Zm6gp4>LBTmSO6Efn2j5r}9PRNK8GU9}cI3XiW$cPg%;)IMiAtO%6 zh!Zm6gp4>LBTmTR@eCf%;PDI|&*1S49?#(M3?9$m@eCf%;PDI|&*1S49?#(M3?9$m z=?tFE@cT3T{0u)o!@tkq@eH2M;J*z1%izBZ{>#?*4?j1<&&}|2GyL2PKQ~8La&#p} zS8{YECvM4!TXNc;)Bc?H=fo{JaZ65ra{7}Kx8(FICvM5*vS|8sOI zN2hXhDo3YsbSg)ua&#(3r*d>EN2hXhDo3YsbSg)ua&#(3r*d>EN2hY)lbrY@CqBuE zPjcduoO#Qcx14#)nYWyI%bB;FdCJ%3iFl;OkFDX48vdx^jT)Y);fWf4sNsW}=ey?l zu6e#|p6{CHy5_mAd9G`o>ze1f=DDtUu4|s>n&-LZd9HbmYo6bl=e6c}t$9vsp3|D= zwB|Xjc}{Dd)0*eB<~gl-PHUdin&-6UIjwn4Yo5=V=d)tB6b#Im3 zy0^-1-CJe1?j26sJgEfV=1DgAHczs_w|SBczRiFRuEi0u8E12uaQmv&A*XN|INRVP5;fmkxl>2zX{pjP)YyM zS@t(n4?a4}{)X!5KRV0)hU&pbXW8FSJ^e>#+207+-%trYI?Mis>cK~6+22q-_~$B%on?PR_28qc>}Q1RXQ*Vp(N*>{RL^)@Tp*kAHa|%=c;+X`X1vW$lFfKqToAIK zp_2Zh)9h!cp8lfK>}RN+{-V?DXQ&>0bejDP)ze>en*EHB{S1}hqtonXs2+TDn*9vb zgO5(LpP_p2(P#ECR8POrXZA5d_Ayj)pQF$0W2m0z41H!FL-mY1`piCt>UqxA^x5_? zR1d!GV}$HusI-2wk0IOUoqY`1hR;5RZ0k4s5Fz^zDy{wOL&&yqV;@4c-8bw*$hP*g z4*K~zY(&pp%Ps5 zn0*b^({J>ceGS!vYwLTmji1@qkZt!3`x>&rMVHyv2-(+A$$Zes%*6ZDk*iIDvXm5dvD%Kn7vxlho`6unH*%M`s#(aRLQOwr5K z*7?E|y-d-|6unH*%M`s#i6>KZE=A{3;>i@9OVPQMcrr!jQgkjQo=nlX6rD?nCsTAT zMdwoDN%j#!_6 zm2LM8>#(wor&x!TZ9K&~tZbWq)?sBEPq7Xw+vcBj*pPKtm9(4rVI5ZW;4?q0!>XQf zz@K3qR`uZH&#(>~R<O3f`~a`wG6V;QI=`ui*O%zOUf> z3cj!4`-(WMg6}K%z9J5*;QNX=tRfDpY+om=;Qb2TuZY7cc)x=8E8?(<=c$7CD|o*m z4y)k(ig>Jo_bYh6A|9)3Uni`H$13>0g8wV{zk>fO;<5_H_bYh6 zA|9*Y{R-Z%;Qfkttb+F|c)ubZtKj_#-mi$qDtNzw-z)gNB0j2!iz@iI;yJ5`8!F<4 zinyU7Zm8hX3O=pi(+WPV;L{2|t>DuNKCR%>3O=pi(+WPV;L{2|t>DuNKCM`vtB4ya z;)aU#xr(@;jJ3ps^P5~-m2lP8s4hmts35{;jJ3ps^P5~-m2lP8s4h$Uu*o=8Xl|R zu^Jw$;jtPXtKqR49;@N88Xl|hUu*cRhR%&uaLrhR%&uaLrhR%&uaLrhR%&uaLrhR%&uaLrW}T^q*J^mJhSzF%t%lcXc&&!lYIv=N z*J^mJhSzF%t%lcXc&%ogsb-z2W}T^KovCJ>sb-z2#-FP3r)vDE8o#*4pQ`bvYIw7T zH*40JYW(6F9X6!ACD@^rA*D*l*K$;G-ApyQv<0 z^n!i2kbO6m=C85uCfoc{_T6NIk6y6vrh4-iYxIKsH`SZp#{QdZ@X-tQ<3jf1RD#dC z6Z>(hH-DaeIoakHvp**reAb=VpHn^ftUJ}LJJqZ^v0oRmU#Aj$_J`Q7Q$6_X53ygT zdgh<~p_+B4nsq1k?{uE|%QfpxHTy#~`$IMBPBrUJHTy#~>rOT6PBr^OHS10_>rOTM zLpAG8HTy#~>rXZNLpAG9HS13``$KgTZoY>-h?jPSJ#Fj`)vP|%tUlH34%Mta)vP|% z><-neJ~gO&gSt1UdxN?+sC$FDH>i7qx;LnMgSt1UdxN?+sC$FDH>i7qx;LnMgSt1U zdxN?+sC$FDH>i1onm4FUH>h`mdN-(dgL*fpcY}I2sCR>UH>h`m zdN-(dgL*fpcY}I2sCR>UH>h`mdN-(dgL*fpcY}I2sCR>UH>h`mdN-(dgL*fpcSAJN zpxzDY-JsqL>fNB;4eH&X)(vXipwfE5p z4Qkw=!VT)%puP?2+n~M;>f4~c4eHyVz76WzpuP?2+n~M;>f4~c4eHyVz76WzpuP?2 z+n~M;>f4~c4eHyVz76WzpuP?2+n~M;>f4~c4eHz2U!#Q$yE+Z4APuWf4XYpxQBQ-~ zHtgy&sBMGVHmrg)sBMGVHmp)LsBMGVHmGfb+BT?dgW5K%f;6mxG^lOEDoBIcHmGgG zDoBIcHmGewbk?A@4Qkt{gSs|EYYpn!pso$OIt}XDpso$-+Muote|^!gtJ9#a4eHvUrVYC|4Qkq; zrVVP^pr#Ef+MuEhD%zl;4Jz88q75qAprQ>b+MuEhD%zl;4Jz88q75qAprQ>b+MuEh zD%!AX)39sPpqmYP*`SvVdfA|t4SLzE=_R{04ZAgs?baw^QI{q|Ww)xQvhz|@c3z^& z&P!9-c_}J8FHL3VC8_MZ6qTKqq_SIGQ`vcmDmyPpW#^@+?7TFU-Kt(RZ91wl+;+jj zzSX7qIb~OBT?ADD8D=|H56;amDJhXY-m|#l0jqjXz0Hfbv^+n@xm+%acPc}ok|Zcc z-~6n;v~%U+Lp{^ZHjz|zCK_)dDVxTdNXn-1CX%vgyosc;I)$4LEF5f804^(U#X;I) z(x^{qze%HPhRmc<_Gs(;C42Q2xcX%6GBMOA;FuUHYZQ}YVknzQGBK15l7+CcK{8R4 z&E%LU%4Tv*6lF6x7Q)JAG)*Lxt%{q&L{c_4hl!+Y@J%FTgKr_MZ163Fl?}dyu(H9o z5LPz$CZfuc1-^->Z17D)WixLkj3}u67TQth*1)hncZ066zQ8xG{jwMaQoe`-diGXkmoBxtxr{a~ zE-cMr08wU}56>^_EUM|5$)2uMZkkgn#ZC3<(jm^^-Y~(_8QdEtc*=}M-%Rji(>D`5 z*#Mi+$)+zRbh5d=35qhSaXk|d*^Gq=g>1&!1VI_sY;HpcG=xAy2sDI1LkKj4Ktl*L zgg`?GRDX}y^;>^$NNMfU-``pi8ZwUQ{QMGk`c}00$SD^b40uC)oi9(A~RN8|T zT9hI?QF@N~!zL&pL>xlIAw(QnjH0vcu?j6lkA{5b6X{A-2oE_18dirQ-Oei zwQEa#xmA~#U)Z;QW&hO5e&w>Y=4q@aFMh;z!rURu9a>lug%;MR1Ro|3Ve$|r4`K2U zCJ$lq5GD^{@(?BuVe$|rC%J1B!sH=L9>U}yOdi7IVKK9Hc4_I*#f$S7tZeCyRu6CM z%B6M=?8CW37az2vJ(^TIT0K0+QwAxAka7qqhmdjzDTk192q}jasYIbgDk_;mi&Ub} zA{CX~wHB$!W(X}(kQl4LXXV@JfWA*TkZj5!< z-5={`wYSK+(cUFC{I+%&g@{#%ScMktsGi5nq8-^x4KQTGXQw=CP

)0-q5W;SO6J9)Alb}|tscr| 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 diff --git a/src/web/badge/LICENSE b/src/web/badge/LICENSE deleted file mode 100644 index 347257a4f..000000000 --- a/src/web/badge/LICENSE +++ /dev/null @@ -1,70 +0,0 @@ -Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: badge -Source: https://github.com/rust-lang/docs.rs - -Files: * -Copyright: Copyright (c) 2016 Onur Aslan -License: Expat - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - . - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - . - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - -Files: DejaVuSans.ttf -Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. - Bitstream Vera is a trademark of Bitstream, Inc. - DejaVu changes are in public domain. -License: bitstream-vera - Permission is hereby granted, free of charge, to any person obtaining a copy - of the fonts accompanying this license ("Fonts") and associated - documentation files (the "Font Software"), to reproduce and distribute the - Font Software, including without limitation the rights to use, copy, merge, - publish, distribute, and/or sell copies of the Font Software, and to permit - persons to whom the Font Software is furnished to do so, subject to the - following conditions: - . - The above copyright and trademark notices and this permission notice shall - be included in all copies of one or more of the Font Software typefaces. - . - The Font Software may be modified, altered, or added to, and in particular - the designs of glyphs or characters in the Fonts may be modified and - additional glyphs or characters may be added to the Fonts, only if the fonts - are renamed to names not containing either the words "Bitstream" or the word - "Vera". - . - This License becomes null and void to the extent applicable to Fonts or Font - Software that has been modified and is distributed under the "Bitstream - Vera" names. - . - The Font Software may be sold as part of a larger software package but no - copy of one or more of the Font Software typefaces may be sold by itself. - . - THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, - TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME - FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING - ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF - THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE - FONT SOFTWARE. - . - Except as contained in this notice, the names of Gnome, the Gnome - Foundation, and Bitstream Inc., shall not be used in advertising or - otherwise to promote the sale, use or other dealings in this Font Software - without prior written authorization from the Gnome Foundation or Bitstream - Inc., respectively. For further information, contact: fonts at gnome dot - org. diff --git a/src/web/badge/badge.rs b/src/web/badge/badge.rs deleted file mode 100644 index 7e639ab2c..000000000 --- a/src/web/badge/badge.rs +++ /dev/null @@ -1,171 +0,0 @@ -//! Simple badge generator - -extern crate base64; -extern crate rusttype; - - -use base64::display::Base64Display; -use rusttype::{Font, FontCollection, Scale, point, Point, PositionedGlyph}; - - -const FONT_DATA: &'static [u8] = include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), - "/DejaVuSans.ttf")); -const FONT_SIZE: f32 = 11.; - - -pub struct BadgeOptions { - /// Subject will be displayed on the left side of badge - pub subject: String, - /// Status will be displayed on the right side of badge - pub status: String, - /// HTML color of badge - pub color: String, -} - - -impl Default for BadgeOptions { - fn default() -> BadgeOptions { - BadgeOptions { - subject: "build".to_owned(), - status: "passing".to_owned(), - color: "#4c1".to_owned(), - } - } -} - - -pub struct Badge { - options: BadgeOptions, - font: Font<'static>, - scale: Scale, - offset: Point, -} - - -impl Badge { - pub fn new(options: BadgeOptions) -> Result { - let collection = FontCollection::from_bytes(FONT_DATA).expect("Failed to parse FONT_DATA"); - // this should never fail in practice - let font = try!(collection.into_font().map_err(|_| "Failed to load font data".to_owned())); - let scale = Scale { - x: FONT_SIZE, - y: FONT_SIZE, - }; - let v_metrics = font.v_metrics(scale); - let offset = point(0.0, v_metrics.ascent); - Ok(Badge { - options: options, - font: font, - scale: scale, - offset: offset, - }) - } - - - pub fn to_svg_data_uri(&self) -> String { - format!("data:image/svg+xml;base64,{}", - Base64Display::standard(self.to_svg().as_bytes())) - } - - - pub fn to_svg(&self) -> String { - let left_width = self.calculate_width(&self.options.subject) + 6; - let right_width = self.calculate_width(&self.options.status) + 6; - - let svg = format!(r###" - - - - - - - - - - - - - - - - - {} - {} - {} - {} - -"###, - left_width + right_width, - left_width + right_width, - left_width, - left_width, - right_width, - self.options.color, - left_width + right_width, - (left_width) / 2, - self.options.subject, - (left_width) / 2, - self.options.subject, - left_width + (right_width / 2), - self.options.status, - left_width + (right_width / 2), - self.options.status); - - svg - } - - - fn calculate_width(&self, text: &str) -> u32 { - let glyphs: Vec = - self.font.layout(text, self.scale, self.offset).collect(); - let width: u32 = glyphs.iter() - .rev() - .filter_map(|g| { - g.pixel_bounding_box() - .map(|b| b.min.x as f32 + g.unpositioned().h_metrics().advance_width) - }) - .next() - .unwrap_or(0.0) - .ceil() as u32; - width + ((text.len() as u32 - 1) * 2) - } -} - - - -#[cfg(test)] -mod tests { - use super::*; - - fn options() -> BadgeOptions { - BadgeOptions::default() - } - - - #[test] - fn test_new() { - assert!(Badge::new(options()).is_ok()); - } - - #[test] - fn test_calculate_width() { - let badge = Badge::new(options()).unwrap(); - assert_eq!(badge.calculate_width("build"), 31); - assert_eq!(badge.calculate_width("passing"), 48); - } - - #[test] - #[ignore] - fn test_to_svg() { - use std::fs::File; - use std::io::Write; - let mut file = File::create("test.svg").unwrap(); - let options = BadgeOptions { - subject: "build".to_owned(), - status: "passing".to_owned(), - ..BadgeOptions::default() - }; - let badge = Badge::new(options).unwrap(); - file.write_all(badge.to_svg().as_bytes()).unwrap(); - } -} diff --git a/src/web/builds.rs b/src/web/builds.rs deleted file mode 100644 index a0eb05530..000000000 --- a/src/web/builds.rs +++ /dev/null @@ -1,140 +0,0 @@ - - -use std::collections::BTreeMap; -use super::MetaData; -use super::pool::Pool; -use super::duration_to_str; -use super::page::Page; -use iron::prelude::*; -use time; -use router::Router; -use rustc_serialize::json::{Json, ToJson}; - - - -#[derive(Clone)] -struct Build { - id: i32, - rustc_version: String, - cratesfyi_version: String, - build_status: bool, - build_time: time::Timespec, - output: Option, -} - - -struct BuildsPage { - metadata: Option, - builds: Vec, - build_details: Option, -} - - -impl ToJson for Build { - fn to_json(&self) -> Json { - let mut m: BTreeMap = BTreeMap::new(); - m.insert("id".to_owned(), self.id.to_json()); - m.insert("rustc_version".to_owned(), self.rustc_version.to_json()); - m.insert("cratesfyi_version".to_owned(), - self.cratesfyi_version.to_json()); - m.insert("build_status".to_owned(), self.build_status.to_json()); - m.insert("build_time".to_owned(), - format!("{}", time::at(self.build_time).rfc3339()).to_json()); - m.insert("build_time_relative".to_owned(), - duration_to_str(self.build_time).to_json()); - m.insert("output".to_owned(), self.output.to_json()); - m.to_json() - } -} - - -impl ToJson for BuildsPage { - fn to_json(&self) -> Json { - let mut m: BTreeMap = BTreeMap::new(); - m.insert("metadata".to_owned(), self.metadata.to_json()); - m.insert("builds".to_owned(), self.builds.to_json()); - m.insert("build_details".to_owned(), self.build_details.to_json()); - m.to_json() - } -} - - -pub fn build_list_handler(req: &mut Request) -> IronResult { - - let router = extension!(req, Router); - let name = cexpect!(router.find("name")); - let version = cexpect!(router.find("version")); - let req_build_id: i32 = router.find("id").unwrap_or("0").parse().unwrap_or(0); - - let conn = extension!(req, Pool); - - let mut build_list: Vec = Vec::new(); - let mut build_details = None; - - // FIXME: getting builds.output may cause performance issues when release have tons of builds - for row in &ctry!(conn.query("SELECT crates.name, - releases.version, - releases.description, - releases.rustdoc_status, - releases.target_name, - builds.id, - builds.rustc_version, - builds.cratesfyi_version, - builds.build_status, - builds.build_time, - builds.output - FROM builds - INNER JOIN releases ON releases.id = builds.rid - INNER JOIN crates ON releases.crate_id = crates.id - WHERE crates.name = $1 AND releases.version = $2 - ORDER BY id DESC", - &[&name, &version])) { - - let id: i32 = row.get(5); - - let build = Build { - id: id, - rustc_version: row.get(6), - cratesfyi_version: row.get(7), - build_status: row.get(8), - build_time: row.get(9), - output: row.get(10), - }; - - if id == req_build_id { - build_details = Some(build.clone()); - } - - build_list.push(build); - } - - if req.url.path().join("/").ends_with(".json") { - use iron::status; - use iron::headers::{Expires, HttpDate, CacheControl, CacheDirective, ContentType, - AccessControlAllowOrigin}; - - // Remove build output from build list for json output - for build in build_list.as_mut_slice() { - build.output = None; - } - - let mut resp = Response::with((status::Ok, build_list.to_json().to_string())); - resp.headers.set(ContentType("application/json".parse().unwrap())); - resp.headers.set(Expires(HttpDate(time::now()))); - resp.headers.set(CacheControl(vec![CacheDirective::NoCache, - CacheDirective::NoStore, - CacheDirective::MustRevalidate])); - resp.headers.set(AccessControlAllowOrigin::Any); - Ok(resp) - } else { - let builds_page = BuildsPage { - metadata: MetaData::from_crate(&conn, &name, &version), - builds: build_list, - build_details: build_details, - }; - Page::new(builds_page) - .set_true("show_package_navigation") - .set_true("package_navigation_builds_tab") - .to_resp("builds") - } -} diff --git a/src/web/crate_details.rs b/src/web/crate_details.rs deleted file mode 100644 index 9c7b6aeb1..000000000 --- a/src/web/crate_details.rs +++ /dev/null @@ -1,242 +0,0 @@ - - - -use super::pool::Pool; -use super::{MetaData, duration_to_str, match_version, render_markdown}; -use super::error::Nope; -use super::page::Page; -use iron::prelude::*; -use iron::status; -use std::collections::BTreeMap; -use time; -use rustc_serialize::json::{Json, ToJson}; -use router::Router; -use postgres::Connection; -use semver; - - -// TODO: Add target name and versions - - -#[derive(Debug)] -pub struct CrateDetails { - name: String, - version: String, - description: Option, - authors: Vec<(String, String)>, - owners: Vec<(String, String)>, - authors_json: Option, - dependencies: Option, - readme: Option, - rustdoc: Option, // this is description_long in database - release_time: time::Timespec, - build_status: bool, - rustdoc_status: bool, - repository_url: Option, - homepage_url: Option, - keywords: Option, - have_examples: bool, // need to check this manually - target_name: Option, - pub versions: Vec, - github: bool, // is crate hosted in github - github_stars: Option, - github_forks: Option, - github_issues: Option, - metadata: MetaData, - is_library: bool, - doc_targets: Option, - license: Option, - documentation_url: Option, -} - - -impl ToJson for CrateDetails { - fn to_json(&self) -> Json { - let mut m: BTreeMap = BTreeMap::new(); - m.insert("name".to_string(), self.name.to_json()); - m.insert("version".to_string(), self.version.to_json()); - m.insert("description".to_string(), self.description.to_json()); - m.insert("authors".to_string(), self.authors.to_json()); - m.insert("owners".to_string(), self.owners.to_json()); - m.insert("authors_json".to_string(), self.authors_json.to_json()); - m.insert("dependencies".to_string(), self.dependencies.to_json()); - if let Some(ref readme) = self.readme { - m.insert("readme".to_string(), render_markdown(&readme).to_json()); - } - if let Some(ref rustdoc) = self.rustdoc { - m.insert("rustdoc".to_string(), render_markdown(&rustdoc).to_json()); - } - m.insert("release_time".to_string(), - duration_to_str(self.release_time).to_json()); - m.insert("build_status".to_string(), self.build_status.to_json()); - m.insert("rustdoc_status".to_string(), self.rustdoc_status.to_json()); - m.insert("repository_url".to_string(), self.repository_url.to_json()); - m.insert("homepage_url".to_string(), self.homepage_url.to_json()); - m.insert("keywords".to_string(), self.keywords.to_json()); - m.insert("have_examples".to_string(), self.have_examples.to_json()); - m.insert("target_name".to_string(), self.target_name.to_json()); - m.insert("versions".to_string(), self.versions.to_json()); - m.insert("github".to_string(), self.github.to_json()); - m.insert("github_stars".to_string(), self.github_stars.to_json()); - m.insert("github_forks".to_string(), self.github_forks.to_json()); - m.insert("github_issues".to_string(), self.github_issues.to_json()); - m.insert("metadata".to_string(), self.metadata.to_json()); - m.insert("is_library".to_string(), self.is_library.to_json()); - m.insert("doc_targets".to_string(), self.doc_targets.to_json()); - m.insert("license".to_string(), self.license.to_json()); - m.insert("documentation_url".to_string(), self.documentation_url.to_json()); - m.to_json() - } -} - - -impl CrateDetails { - pub fn new(conn: &Connection, name: &str, version: &str) -> Option { - - // get all stuff, I love you rustfmt - let query = "SELECT crates.id, - releases.id, - crates.name, - releases.version, - releases.description, - releases.authors, - releases.dependencies, - releases.readme, - releases.description_long, - releases.release_time, - releases.build_status, - releases.rustdoc_status, - releases.repository_url, - releases.homepage_url, - releases.keywords, - releases.have_examples, - releases.target_name, - crates.versions, - crates.github_stars, - crates.github_forks, - crates.github_issues, - releases.is_library, - releases.doc_targets, - releases.license, - releases.documentation_url - FROM releases - INNER JOIN crates ON releases.crate_id = crates.id - WHERE crates.name = $1 AND releases.version = $2;"; - - let rows = conn.query(query, &[&name, &version]).unwrap(); - - if rows.len() == 0 { - return None; - } - - let crate_id: i32 = rows.get(0).get(0); - let release_id: i32 = rows.get(0).get(1); - - // sort versions with semver - let versions = { - let mut versions: Vec = Vec::new(); - let versions_from_db: Json = rows.get(0).get(17); - - versions_from_db.as_array().map(|vers| { - for version in vers { - version.as_string().map(|version| { - if let Ok(sem_ver) = semver::Version::parse(&version) { - versions.push(sem_ver); - }; - }); - } - }); - - versions.sort(); - versions.reverse(); - versions.iter().map(|semver| format!("{}", semver)).collect() - }; - - let metadata = MetaData { - name: rows.get(0).get(2), - version: rows.get(0).get(3), - description: rows.get(0).get(4), - rustdoc_status: rows.get(0).get(11), - target_name: rows.get(0).get(16), - }; - - let mut crate_details = CrateDetails { - name: rows.get(0).get(2), - version: rows.get(0).get(3), - description: rows.get(0).get(4), - authors: Vec::new(), - owners: Vec::new(), - authors_json: rows.get(0).get(5), - dependencies: rows.get(0).get(6), - readme: rows.get(0).get(7), - rustdoc: rows.get(0).get(8), - release_time: rows.get(0).get(9), - build_status: rows.get(0).get(10), - rustdoc_status: rows.get(0).get(11), - repository_url: rows.get(0).get(12), - homepage_url: rows.get(0).get(13), - keywords: rows.get(0).get(14), - have_examples: rows.get(0).get(15), - target_name: rows.get(0).get(16), - versions: versions, - github: false, - github_stars: rows.get(0).get(18), - github_forks: rows.get(0).get(19), - github_issues: rows.get(0).get(20), - metadata: metadata, - is_library: rows.get(0).get(21), - doc_targets: rows.get(0).get(22), - license: rows.get(0).get(23), - documentation_url: rows.get(0).get(24), - }; - - if let Some(repository_url) = crate_details.repository_url.clone() { - crate_details.github = repository_url.starts_with("http://github.com") || - repository_url.starts_with("https://github.com"); - } - - // get authors - for row in &conn.query("SELECT name, slug - FROM authors - INNER JOIN author_rels ON author_rels.aid = authors.id - WHERE rid = $1", - &[&release_id]) - .unwrap() { - crate_details.authors.push((row.get(0), row.get(1))); - } - - // get owners - for row in &conn.query("SELECT login, avatar - FROM owners - INNER JOIN owner_rels ON owner_rels.oid = owners.id - WHERE cid = $1", - &[&crate_id]) - .unwrap() { - crate_details.owners.push((row.get(0), row.get(1))); - } - - Some(crate_details) - } -} - - - -pub fn crate_details_handler(req: &mut Request) -> IronResult { - let router = extension!(req, Router); - // this handler must always called with a crate name - let name = cexpect!(router.find("name")); - let req_version = router.find("version"); - - let conn = extension!(req, Pool); - - match_version(&conn, &name, req_version) - .and_then(|version| CrateDetails::new(&conn, &name, &version)) - .ok_or(IronError::new(Nope::CrateNotFound, status::NotFound)) - .and_then(|details| { - Page::new(details) - .set_true("show_package_navigation") - .set_true("javascript_highlightjs") - .set_true("package_navigation_crate_tab") - .to_resp("crate_details") - }) -} diff --git a/src/web/error.rs b/src/web/error.rs deleted file mode 100644 index f7ed1857b..000000000 --- a/src/web/error.rs +++ /dev/null @@ -1,68 +0,0 @@ -use std::error::Error; -use iron::prelude::*; -use iron::Handler; -use iron::status; -use web::page::Page; -use std::fmt; - -#[derive(Debug, Copy, Clone)] -pub enum Nope { - ResourceNotFound, - CrateNotFound, - NoResults, -} - -impl fmt::Display for Nope { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.write_str(self.description()) - } -} - -impl Error for Nope { - fn description(&self) -> &str { - match *self { - Nope::ResourceNotFound => "Requested resource not found", - Nope::CrateNotFound => "Requested crate not found", - Nope::NoResults => "Search yielded no results", - } - } -} - -impl Handler for Nope { - fn handle(&self, req: &mut Request) -> IronResult { - match *self { - Nope::ResourceNotFound => { - // user tried to navigate to a resource (doc page/file) that doesn't exist - Page::new("no such resource".to_owned()) - .set_status(status::NotFound) - .title("The requested resource does not exist") - .to_resp("error") - } - Nope::CrateNotFound => { - // user tried to navigate to a crate that doesn't exist - Page::new("no such crate".to_owned()) - .set_status(status::NotFound) - .title("The requested crate does not exist") - .to_resp("error") - } - Nope::NoResults => { - use params::{Params, Value}; - let params = req.get::().unwrap(); - if let Some(&Value::String(ref query)) = params.find(&["query"]) { - // this used to be a search - Page::new(Vec::::new()) - .set_status(status::NotFound) - .set("search_query", &query) - .title(&format!("No crates found matching '{}'", query)) - .to_resp("releases") - } else { - // user did a search with no search terms - Page::new(Vec::::new()) - .set_status(status::NotFound) - .title("No results given for empty search query") - .to_resp("releases") - } - } - } - } -} diff --git a/src/web/file.rs b/src/web/file.rs deleted file mode 100644 index 8cdbbca31..000000000 --- a/src/web/file.rs +++ /dev/null @@ -1,80 +0,0 @@ -//! Database based file handler - -use super::pool::Pool; -use time; -use postgres::Connection; -use iron::{Handler, Request, IronResult, Response, IronError}; -use iron::status; - - -pub struct File { - pub path: String, - pub mime: String, - pub date_added: time::Timespec, - pub date_updated: time::Timespec, - pub content: Vec, -} - - -impl File { - /// Gets file from database - pub fn from_path(conn: &Connection, path: &str) -> Option { - - let rows = conn.query("SELECT path, mime, date_added, date_updated, content - FROM files - WHERE path = $1", - &[&path]) - .unwrap(); - - if rows.len() == 0 { - None - } else { - let row = rows.get(0); - Some(File { - path: row.get(0), - mime: row.get(1), - date_added: row.get(2), - date_updated: row.get(3), - content: row.get(4), - }) - } - } - - - /// Consumes File and creates a iron response - pub fn serve(self) -> Response { - use iron::headers::{CacheControl, LastModified, CacheDirective, HttpDate, ContentType}; - - let mut response = Response::with((status::Ok, self.content)); - let cache = vec![CacheDirective::Public, - CacheDirective::MaxAge(super::STATIC_FILE_CACHE_DURATION as u32)]; - response.headers.set(ContentType(self.mime.parse().unwrap())); - response.headers.set(CacheControl(cache)); - response.headers.set(LastModified(HttpDate(time::at(self.date_updated)))); - response - } - - - /// Checks if mime type of file is "application/x-empty" - pub fn is_empty(&self) -> bool { - self.mime == "application/x-empty" - } -} - - -/// Database based file handler for iron -/// -/// This is similar to staticfile crate, but its using getting files from database. -pub struct DatabaseFileHandler; - -impl Handler for DatabaseFileHandler { - fn handle(&self, req: &mut Request) -> IronResult { - let path = req.url.path().join("/"); - let conn = extension!(req, Pool); - if let Some(file) = File::from_path(&conn, &path) { - Ok(file.serve()) - } else { - Err(IronError::new(super::error::Nope::CrateNotFound, status::NotFound)) - } - } -} diff --git a/src/web/mod.rs b/src/web/mod.rs deleted file mode 100644 index 8de4021c3..000000000 --- a/src/web/mod.rs +++ /dev/null @@ -1,541 +0,0 @@ -//! Web interface of cratesfyi - - -pub mod page; - -/// ctry! (cratesfyitry) is extremely similar to try! and itry! -/// except it returns an error page response instead of plain Err. -macro_rules! ctry { - ($result:expr) => (match $result { - Ok(v) => v, - Err(e) => { - return super::page::Page::new(format!("{:?}", e)).title("An error has occured") - .set_status(::iron::status::BadRequest).to_resp("resp"); - } - }) -} - -/// cexpect will check an option and if it's not Some -/// it will return an error page response -macro_rules! cexpect { - ($option:expr) => (match $option { - Some(v) => v, - None => { - return super::page::Page::new("Resource not found".to_owned()) - .title("An error has occured") - .set_status(::iron::status::BadRequest).to_resp("resp"); - } - }) -} - -/// Gets an extension from Request -macro_rules! extension { - ($req:expr, $ext:ty) => ( - cexpect!($req.extensions.get::<$ext>()) - ) -} - -mod rustdoc; -mod releases; -mod crate_details; -mod source; -mod pool; -mod file; -mod builds; -mod error; -mod sitemap; - -use std::{env, fmt}; -use std::error::Error; -use std::time::Duration; -use std::path::PathBuf; -use iron::prelude::*; -use iron::{self, Handler, status}; -use iron::headers::{CacheControl, CacheDirective, ContentType}; -use router::{Router, NoRoute}; -use staticfile::Static; -use handlebars_iron::{HandlebarsEngine, DirectorySource}; -use time; -use postgres::Connection; -use semver::{Version, VersionReq}; -use rustc_serialize::json::{Json, ToJson}; -use std::collections::BTreeMap; - -/// Duration of static files for staticfile and DatabaseFileHandler (in seconds) -const STATIC_FILE_CACHE_DURATION: u64 = 60 * 60 * 24 * 30 * 12; // 12 months -const STYLE_CSS: &'static str = include_str!(concat!(env!("OUT_DIR"), "/style.css")); -const OPENSEARCH_XML: &'static [u8] = include_bytes!("opensearch.xml"); - - -struct CratesfyiHandler { - shared_resource_handler: Box, - router_handler: Box, - database_file_handler: Box, - static_handler: Box, -} - - -impl CratesfyiHandler { - fn chain(base: H) -> Chain { - // TODO: Use DocBuilderOptions for paths - let mut hbse = HandlebarsEngine::new(); - hbse.add(Box::new(DirectorySource::new("./templates", ".hbs"))); - - // load templates - if let Err(e) = hbse.reload() { - panic!("Failed to load handlebar templates: {}", e.description()); - } - - let mut chain = Chain::new(base); - chain.link_before(pool::Pool::new()); - chain.link_after(hbse); - chain - } - - pub fn new() -> CratesfyiHandler { - let mut router = Router::new(); - router.get("/", releases::home_page, "index"); - router.get("/style.css", style_css_handler, "style_css"); - router.get("/about", sitemap::about_handler, "about"); - router.get("/robots.txt", sitemap::robots_txt_handler, "robots_txt"); - router.get("/sitemap.xml", sitemap::sitemap_handler, "sitemap_xml"); - router.get("/opensearch.xml", opensearch_xml_handler, "opensearch_xml"); - router.get("/releases", releases::recent_releases_handler, "releases"); - router.get("/releases/feed", - releases::releases_feed_handler, - "releases_feed"); - router.get("/releases/recent/:page", - releases::recent_releases_handler, - "releases_recent_page"); - router.get("/releases/stars", releases::releases_by_stars_handler, "releases_stars"); - router.get("/releases/stars/:page", - releases::releases_by_stars_handler, - "releases_stars_page"); - router.get("/releases/recent-failures", releases::releases_recent_failures_handler, "releases_recent_failures"); - router.get("/releases/recent-failures/:page", - releases::releases_recent_failures_handler, - "releases_recent_failures_page"); - router.get("/releases/failures", releases::releases_failures_by_stars_handler, "releases_failures_by_stars"); - router.get("/releases/failures/:page", - releases::releases_failures_by_stars_handler, - "releases_failures_by_starts_page"); - router.get("/releases/:author", - releases::author_handler, - "releases_author"); - router.get("/releases/:author/:page", - releases::author_handler, - "releases_author_page"); - router.get("/releases/activity", - releases::activity_handler, - "releases_activity"); - router.get("/releases/search", - releases::search_handler, - "releases_search"); - router.get("/releases/queue", - releases::build_queue_handler, - "releases_queue"); - router.get("/crate/:name", - crate_details::crate_details_handler, - "crate_name"); - router.get("/crate/:name/", - crate_details::crate_details_handler, - "crate_name_"); - router.get("/crate/:name/:version", - crate_details::crate_details_handler, - "crate_name_version"); - router.get("/crate/:name/:version/", - crate_details::crate_details_handler, - "crate_name_version_"); - router.get("/crate/:name/:version/builds", - builds::build_list_handler, - "crate_name_version_builds"); - router.get("/crate/:name/:version/builds.json", - builds::build_list_handler, - "crate_name_version_builds_json"); - router.get("/crate/:name/:version/builds/:id", - builds::build_list_handler, - "crate_name_version_builds_id"); - router.get("/crate/:name/:version/source/", - source::source_browser_handler, - "crate_name_version_source"); - router.get("/crate/:name/:version/source/*", - source::source_browser_handler, - "crate_name_version_source_"); - router.get("/:crate", rustdoc::rustdoc_redirector_handler, "crate"); - router.get("/:crate/", rustdoc::rustdoc_redirector_handler, "crate_"); - router.get("/:crate/badge.svg", rustdoc::badge_handler, "crate_badge"); - router.get("/:crate/:version", - rustdoc::rustdoc_redirector_handler, - "crate_version"); - router.get("/:crate/:version/", - rustdoc::rustdoc_redirector_handler, - "crate_version_"); - router.get("/:crate/:version/search-index.js", - rustdoc::rustdoc_html_server_handler, - "crate_version_search_index_js"); - router.get("/:crate/:version/settings.html", - rustdoc::rustdoc_html_server_handler, - "crate_version_settings_html"); - router.get("/:crate/:version/all.html", - rustdoc::rustdoc_html_server_handler, - "crate_version_all_html"); - router.get("/:crate/:version/aliases.js", - rustdoc::rustdoc_html_server_handler, - "crate_version_aliases_js"); - router.get("/:crate/:version/source-files.js", - rustdoc::rustdoc_html_server_handler, - "crate_version_source_files_js"); - router.get("/:crate/:version/:target", - rustdoc::rustdoc_redirector_handler, - "crate_version_target"); - router.get("/:crate/:version/:target/", - rustdoc::rustdoc_html_server_handler, - "crate_version_target_"); - router.get("/:crate/:version/:target/*.html", - rustdoc::rustdoc_html_server_handler, - "crate_version_target_html"); - - let shared_resources = Self::chain(rustdoc::SharedResourceHandler); - let router_chain = Self::chain(router); - let prefix = PathBuf::from(env::var("CRATESFYI_PREFIX").unwrap()).join("public_html"); - let static_handler = Static::new(prefix) - .cache(Duration::from_secs(STATIC_FILE_CACHE_DURATION)); - - CratesfyiHandler { - shared_resource_handler: Box::new(shared_resources), - router_handler: Box::new(router_chain), - database_file_handler: Box::new(file::DatabaseFileHandler), - static_handler: Box::new(static_handler), - } - } -} - - -impl Handler for CratesfyiHandler { - fn handle(&self, req: &mut Request) -> IronResult { - // try serving shared rustdoc resources first, then router, then db/static file handler - // return 404 if none of them return Ok - self.shared_resource_handler - .handle(req) - .or_else(|e| { - self.router_handler.handle(req).or(Err(e)) - }) - .or_else(|e| { - // if router fails try to serve files from database first - self.database_file_handler.handle(req).or(Err(e)) - }) - .or_else(|e| { - // and then try static handler. if all of them fails, return 404 - self.static_handler.handle(req).or(Err(e)) - }) - .or_else(|e| { - debug!("{}", e.description()); - let err = if let Some(err) = e.error.downcast::() { - *err - } else if e.error.downcast::().is_some() { - error::Nope::ResourceNotFound - } else { - panic!("all cratesfyi errors should be of type Nope"); - }; - - match err { - error::Nope::ResourceNotFound => { - // print the path of the URL that triggered a 404 error - struct DebugPath<'a>(&'a iron::Url); - impl<'a> fmt::Display for DebugPath<'a> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - for path_elem in self.0.path() { - write!(f, "/{}", path_elem)?; - } - - if let Some(query) = self.0.query() { - write!(f, "?{}", query)?; - } - - if let Some(hash) = self.0.fragment() { - write!(f, "#{}", hash)?; - } - - Ok(()) - } - } - - debug!("Path: {}", DebugPath(&req.url)); - } - _ => {} - } - - Self::chain(err).handle(req) - }) - } -} - - - -fn match_version(conn: &Connection, name: &str, version: Option<&str>) -> Option { - - // version is an Option<&str> from router::Router::get - // need to decode first - use url::percent_encoding::percent_decode; - let req_version = version.and_then(|v| { - match percent_decode(v.as_bytes()).decode_utf8() { - Ok(p) => Some(p.into_owned()), - Err(_) => None, - } - }) - .map(|v| if v == "newest" || v == "latest" { "*".to_owned() } else { v }) - .unwrap_or("*".to_string()); - - let versions = { - let mut versions = Vec::new(); - let rows = conn.query("SELECT versions FROM crates WHERE name = $1", &[&name]).unwrap(); - if rows.len() == 0 { - return None; - } - let versions_json: Json = rows.get(0).get(0); - for version in versions_json.as_array().unwrap() { - let version: String = version.as_string().unwrap().to_owned(); - versions.push(version); - } - - versions - }; - - // first check for exact match - // we can't expect users to use semver in query - for version in &versions { - if version == &req_version { - return Some(version.clone()); - } - } - - // Now try to match with semver - let req_sem_ver = match VersionReq::parse(&req_version) { - Ok(v) => v, - Err(_) => return None, - }; - - // we need to sort versions first - let versions_sem = { - let mut versions_sem: Vec = Vec::new(); - - for version in &versions { - // in theory a crate must always have a semver compatible version - // but check result just in case - let version = match Version::parse(&version) { - Ok(v) => v, - Err(_) => return None, - }; - versions_sem.push(version); - } - - versions_sem.sort(); - versions_sem.reverse(); - versions_sem - }; - - // semver is acting weird for '*' (any) range if a crate only have pre-release versions - // return first version if requested version is '*' - if req_version == "*" && !versions_sem.is_empty() { - return Some(format!("{}", versions_sem[0])); - } - - for version in &versions_sem { - if req_sem_ver.matches(&version) { - return Some(format!("{}", version)); - } - } - - None -} - - - - - -/// Wrapper around the Markdown parser and renderer to render markdown -fn render_markdown(text: &str) -> String { - use comrak::{markdown_to_html, ComrakOptions}; - - let options = { - let mut options = ComrakOptions::default(); - options.ext_superscript = true; - options.ext_table = true; - options.ext_autolink = true; - options.ext_tasklist = true; - options.ext_strikethrough = true; - options - }; - - markdown_to_html(text, &options) -} - - - -/// Returns latest version if required version is not the latest -/// req_version must be an exact version -fn latest_version(versions_json: &Vec, req_version: &str) -> Option { - let req_version = match Version::parse(req_version) { - Ok(v) => v, - Err(_) => return None, - }; - let versions = { - let mut versions: Vec = Vec::new(); - for version in versions_json { - let version = match Version::parse(&version) { - Ok(v) => v, - Err(_) => return None, - }; - versions.push(version); - } - - versions.sort(); - versions.reverse(); - versions - }; - - if req_version != versions[0] { - for i in 1..versions.len() { - if req_version == versions[i] { - return Some(format!("{}", versions[0])) - } - } - } - None -} - - - -/// Starts cratesfyi web server -pub fn start_web_server(sock_addr: Option<&str>) { - let cratesfyi = CratesfyiHandler::new(); - Iron::new(cratesfyi).http(sock_addr.unwrap_or("localhost:3000")).unwrap(); -} - - - -/// Converts Timespec to nice readable relative time string -fn duration_to_str(ts: time::Timespec) -> String { - - let tm = time::at(ts); - let delta = time::now() - tm; - - if delta.num_days() > 5 { - format!("{}", tm.strftime("%b %d, %Y").unwrap()) - } else if delta.num_days() > 1 { - format!("{} days ago", delta.num_days()) - } else if delta.num_days() == 1 { - "one day ago".to_string() - } else if delta.num_hours() > 1 { - format!("{} hours ago", delta.num_hours()) - } else if delta.num_hours() == 1 { - "an hour ago".to_string() - } else if delta.num_minutes() > 1 { - format!("{} minutes ago", delta.num_minutes()) - } else if delta.num_minutes() == 1 { - "one minute ago".to_string() - } else if delta.num_seconds() > 0 { - format!("{} seconds ago", delta.num_seconds()) - } else { - "just now".to_string() - } - -} - - - -fn style_css_handler(_: &mut Request) -> IronResult { - let mut response = Response::with((status::Ok, STYLE_CSS)); - let cache = vec![CacheDirective::Public, - CacheDirective::MaxAge(STATIC_FILE_CACHE_DURATION as u32)]; - response.headers.set(ContentType("text/css".parse().unwrap())); - response.headers.set(CacheControl(cache)); - Ok(response) -} - - -fn opensearch_xml_handler(_: &mut Request) -> IronResult { - let mut response = Response::with((status::Ok, OPENSEARCH_XML)); - let cache = vec![CacheDirective::Public, - CacheDirective::MaxAge(STATIC_FILE_CACHE_DURATION as u32)]; - response.headers.set(ContentType("application/opensearchdescription+xml".parse().unwrap())); - response.headers.set(CacheControl(cache)); - Ok(response) -} - -/// MetaData used in header -#[derive(Debug)] -pub struct MetaData { - pub name: String, - pub version: String, - pub description: Option, - pub target_name: Option, - pub rustdoc_status: bool, -} - - -impl MetaData { - pub fn from_crate(conn: &Connection, name: &str, version: &str) -> Option { - for row in &conn.query("SELECT crates.name, - releases.version, - releases.description, - releases.target_name, - releases.rustdoc_status - FROM releases - INNER JOIN crates ON crates.id = releases.crate_id - WHERE crates.name = $1 AND releases.version = $2", - &[&name, &version]) - .unwrap() { - - return Some(MetaData { - name: row.get(0), - version: row.get(1), - description: row.get(2), - target_name: row.get(3), - rustdoc_status: row.get(4), - }); - } - - None - } -} - - -impl ToJson for MetaData { - fn to_json(&self) -> Json { - let mut m: BTreeMap = BTreeMap::new(); - m.insert("name".to_owned(), self.name.to_json()); - m.insert("version".to_owned(), self.version.to_json()); - m.insert("description".to_owned(), self.description.to_json()); - m.insert("target_name".to_owned(), self.target_name.to_json()); - m.insert("rustdoc_status".to_owned(), self.rustdoc_status.to_json()); - m.to_json() - } -} - - -#[cfg(test)] -mod test { - extern crate env_logger; - use super::*; - - #[test] - #[ignore] - fn test_start_web_server() { - // FIXME: This test is doing nothing - let _ = env_logger::try_init(); - start_web_server(None); - } - - #[test] - fn test_latest_version() { - let versions = vec!["1.0.0".to_string(), - "1.1.0".to_string(), - "0.9.0".to_string(), - "0.9.1".to_string()]; - assert_eq!(latest_version(&versions, "1.1.0"), None); - assert_eq!(latest_version(&versions, "1.0.0"), Some("1.1.0".to_owned())); - assert_eq!(latest_version(&versions, "0.9.0"), Some("1.1.0".to_owned())); - assert_eq!(latest_version(&versions, "invalidversion"), None); - } -} diff --git a/src/web/opensearch.xml b/src/web/opensearch.xml deleted file mode 100644 index e12da194d..000000000 --- a/src/web/opensearch.xml +++ /dev/null @@ -1,6 +0,0 @@ - - Docs.rs - Search for crate documentation on docs.rs - https://docs.rs/favicon.ico - - diff --git a/src/web/page.rs b/src/web/page.rs deleted file mode 100644 index 6ccdb263c..000000000 --- a/src/web/page.rs +++ /dev/null @@ -1,101 +0,0 @@ -//! Generic page struct - -use std::collections::BTreeMap; -use rustc_serialize::json::{Json, ToJson}; -use iron::{IronResult, Set, status}; -use iron::response::Response; -use handlebars_iron::Template; - - -pub struct Page { - title: Option, - content: T, - status: status::Status, - varss: BTreeMap, - varsb: BTreeMap, - varsi: BTreeMap, -} - - -impl Page { - pub fn new(content: T) -> Page { - Page { - title: None, - content: content, - status: status::Ok, - varss: BTreeMap::new(), - varsb: BTreeMap::new(), - varsi: BTreeMap::new(), - } - } - - /// Sets a string variable - pub fn set(mut self, var: &str, val: &str) -> Page { - &self.varss.insert(var.to_owned(), val.to_owned()); - self - } - - - /// Sets a boolean variable - pub fn set_bool(mut self, var: &str, val: bool) -> Page { - &self.varsb.insert(var.to_owned(), val); - self - } - - - /// Sets a boolean variable to true - pub fn set_true(mut self, var: &str) -> Page { - &self.varsb.insert(var.to_owned(), true); - self - } - - - /// Sets an integer variable - pub fn set_int(mut self, var: &str, val: i64) -> Page { - &self.varsi.insert(var.to_owned(), val); - self - } - - - /// Sets title of page - pub fn title(mut self, title: &str) -> Page { - self.title = Some(title.to_owned()); - self - } - - - /// Sets status code for response - pub fn set_status(mut self, s: status::Status) -> Page { - self.status = s; - self - } - - - pub fn to_resp(self, template: &str) -> IronResult { - let mut resp = Response::new(); - let status = self.status; - let temp = Template::new(template, self); - resp.set_mut(temp).set_mut(status); - Ok(resp) - } -} - - -impl ToJson for Page { - fn to_json(&self) -> Json { - let mut tree = BTreeMap::new(); - - if let Some(ref title) = self.title { - tree.insert("title".to_owned(), title.to_json()); - } - - tree.insert("content".to_owned(), self.content.to_json()); - tree.insert("cratesfyi_version".to_owned(), ::BUILD_VERSION.to_json()); - tree.insert("cratesfyi_version_safe".to_owned(), - ::BUILD_VERSION.replace(" ", "-").replace("(", "").replace(")", "").to_json()); - tree.insert("varss".to_owned(), self.varss.to_json()); - tree.insert("varsb".to_owned(), self.varsb.to_json()); - tree.insert("varsi".to_owned(), self.varsi.to_json()); - Json::Object(tree) - } -} diff --git a/src/web/pool.rs b/src/web/pool.rs deleted file mode 100644 index cbd5c2b3b..000000000 --- a/src/web/pool.rs +++ /dev/null @@ -1,29 +0,0 @@ - - -use iron::prelude::*; -use iron::{BeforeMiddleware, typemap}; -use r2d2; -use r2d2_postgres; -use db::create_pool; - - -pub struct Pool { - pool: r2d2::Pool, -} - -impl typemap::Key for Pool { - type Value = r2d2::PooledConnection; -} - -impl Pool { - pub fn new() -> Pool { - Pool { pool: create_pool() } - } -} - -impl BeforeMiddleware for Pool { - fn before(&self, req: &mut Request) -> IronResult<()> { - req.extensions.insert::(self.pool.get().unwrap()); - Ok(()) - } -} diff --git a/src/web/releases.rs b/src/web/releases.rs deleted file mode 100644 index 1605e19c5..000000000 --- a/src/web/releases.rs +++ /dev/null @@ -1,581 +0,0 @@ -//! Releases web handlers - - -use super::{duration_to_str, match_version}; -use super::error::Nope; -use super::page::Page; -use super::pool::Pool; -use iron::prelude::*; -use iron::status; -use router::Router; -use rustc_serialize::json::{Json, ToJson}; -use std::collections::BTreeMap; -use time; -use postgres::Connection; - - -/// Number of release in home page -const RELEASES_IN_HOME: i64 = 15; -/// Releases in /releases page -const RELEASES_IN_RELEASES: i64 = 30; -/// Releases in recent releases feed -const RELEASES_IN_FEED: i64 = 150; - - -pub struct Release { - name: String, - version: String, - description: Option, - target_name: Option, - rustdoc_status: bool, - release_time: time::Timespec, - stars: i32, -} - - -impl Default for Release { - fn default() -> Release { - Release { - name: String::new(), - version: String::new(), - description: None, - target_name: None, - rustdoc_status: false, - release_time: time::get_time(), - stars: 0, - } - } -} - - -impl ToJson for Release { - fn to_json(&self) -> Json { - let mut m: BTreeMap = BTreeMap::new(); - m.insert("name".to_string(), self.name.to_json()); - m.insert("version".to_string(), self.version.to_json()); - m.insert("description".to_string(), self.description.to_json()); - m.insert("target_name".to_string(), self.target_name.to_json()); - m.insert("rustdoc_status".to_string(), self.rustdoc_status.to_json()); - m.insert("release_time".to_string(), - duration_to_str(self.release_time).to_json()); - m.insert("release_time_rfc3339".to_string(), - format!("{}", time::at(self.release_time).rfc3339()).to_json()); - m.insert("stars".to_string(), self.stars.to_json()); - m.to_json() - } -} - - -enum Order { - ReleaseTime, // this is default order - GithubStars, - RecentFailures, - FailuresByGithubStars, -} - - -fn get_releases(conn: &Connection, page: i64, limit: i64, order: Order) -> Vec { - - let offset = (page - 1) * limit; - - // TODO: This function changed so much during development and current version have code - // repeats for queries. There is definitely room for improvements. - let query = match order { - Order::ReleaseTime => { - "SELECT crates.name, - releases.version, - releases.description, - releases.target_name, - releases.release_time, - releases.rustdoc_status, - crates.github_stars - FROM crates - INNER JOIN releases ON crates.id = releases.crate_id - ORDER BY releases.release_time DESC - LIMIT $1 OFFSET $2" - } - Order::GithubStars => { - "SELECT crates.name, - releases.version, - releases.description, - releases.target_name, - releases.release_time, - releases.rustdoc_status, - crates.github_stars - FROM crates - INNER JOIN releases ON releases.id = crates.latest_version_id - ORDER BY crates.github_stars DESC - LIMIT $1 OFFSET $2" - } - Order::RecentFailures => { - "SELECT crates.name, - releases.version, - releases.description, - releases.target_name, - releases.release_time, - releases.rustdoc_status, - crates.github_stars - FROM crates - INNER JOIN releases ON crates.id = releases.crate_id - WHERE releases.build_status = FALSE AND releases.is_library = TRUE - ORDER BY releases.release_time DESC - LIMIT $1 OFFSET $2" - } - Order::FailuresByGithubStars => { - "SELECT crates.name, - releases.version, - releases.description, - releases.target_name, - releases.release_time, - releases.rustdoc_status, - crates.github_stars - FROM crates - INNER JOIN releases ON releases.id = crates.latest_version_id - WHERE releases.build_status = FALSE AND releases.is_library = TRUE - ORDER BY crates.github_stars DESC - LIMIT $1 OFFSET $2" - } - }; - - let mut packages = Vec::new(); - for row in &conn.query(&query, &[&limit, &offset]).unwrap() { - let package = Release { - name: row.get(0), - version: row.get(1), - description: row.get(2), - target_name: row.get(3), - release_time: row.get(4), - rustdoc_status: row.get(5), - stars: row.get(6), - }; - - packages.push(package); - } - - packages -} - - - -fn get_releases_by_author(conn: &Connection, - page: i64, - limit: i64, - author: &str) - -> (String, Vec) { - - let offset = (page - 1) * limit; - - let query = "SELECT crates.name, - releases.version, - releases.description, - releases.target_name, - releases.release_time, - releases.rustdoc_status, - crates.github_stars, - authors.name - FROM crates - INNER JOIN releases ON releases.id = crates.latest_version_id - INNER JOIN author_rels ON releases.id = author_rels.rid - INNER JOIN authors ON authors.id = author_rels.aid - WHERE authors.slug = $1 - ORDER BY crates.github_stars DESC - LIMIT $2 OFFSET $3"; - - let mut author_name = String::new(); - let mut packages = Vec::new(); - for row in &conn.query(&query, &[&author, &limit, &offset]).unwrap() { - let package = Release { - name: row.get(0), - version: row.get(1), - description: row.get(2), - target_name: row.get(3), - release_time: row.get(4), - rustdoc_status: row.get(5), - stars: row.get(6), - }; - - author_name = row.get(7); - packages.push(package); - } - - (author_name, packages) -} - - - -fn get_releases_by_owner(conn: &Connection, - page: i64, - limit: i64, - author: &str) - -> (String, Vec) { - - let offset = (page - 1) * limit; - - let query = "SELECT crates.name, - releases.version, - releases.description, - releases.target_name, - releases.release_time, - releases.rustdoc_status, - crates.github_stars, - owners.name, - owners.login - FROM crates - INNER JOIN releases ON releases.id = crates.latest_version_id - INNER JOIN owner_rels ON owner_rels.cid = crates.id - INNER JOIN owners ON owners.id = owner_rels.oid - WHERE owners.login = $1 - ORDER BY crates.github_stars DESC - LIMIT $2 OFFSET $3"; - - let mut author_name = String::new(); - let mut packages = Vec::new(); - for row in &conn.query(&query, &[&author, &limit, &offset]).unwrap() { - let package = Release { - name: row.get(0), - version: row.get(1), - description: row.get(2), - target_name: row.get(3), - release_time: row.get(4), - rustdoc_status: row.get(5), - stars: row.get(6), - }; - - author_name = if !row.get::(7).is_empty() { - row.get(7) - } else { - row.get(8) - }; - packages.push(package); - } - - (author_name, packages) -} - - - -fn get_search_results(conn: &Connection, - query: &str, - page: i64, - limit: i64) - -> Option<(i64, Vec)> { - - let offset = (page - 1) * limit; - let mut packages = Vec::new(); - - let rows = match conn.query("SELECT crates.name, - releases.version, - releases.description, - releases.target_name, - releases.release_time, - releases.rustdoc_status, - ts_rank_cd(crates.content, to_tsquery($1)) AS rank - FROM crates - INNER JOIN releases ON crates.latest_version_id = releases.id - WHERE crates.name LIKE concat('%', $1, '%') - OR crates.content @@ to_tsquery($1) - ORDER BY crates.name = $1 DESC, - crates.name LIKE concat('%', $1, '%') DESC, - rank DESC - LIMIT $2 OFFSET $3", - &[&query, &limit, &offset]) { - Ok(r) => r, - Err(_) => return None, - }; - - for row in &rows { - let package = Release { - name: row.get(0), - version: row.get(1), - description: row.get(2), - target_name: row.get(3), - release_time: row.get(4), - rustdoc_status: row.get(5), - ..Release::default() - }; - - packages.push(package); - } - - if !packages.is_empty() { - // get count of total results - let rows = conn.query("SELECT COUNT(*) FROM crates WHERE content @@ to_tsquery($1)", - &[&query]) - .unwrap(); - - Some((rows.get(0).get(0), packages)) - } else { - None - } -} - - - -pub fn home_page(req: &mut Request) -> IronResult { - let conn = extension!(req, Pool); - let packages = get_releases(conn, 1, RELEASES_IN_HOME, Order::ReleaseTime); - Page::new(packages) - .set_true("show_search_form") - .set_true("hide_package_navigation") - .to_resp("releases") -} - - -pub fn releases_feed_handler(req: &mut Request) -> IronResult { - let conn = extension!(req, Pool); - let packages = get_releases(conn, 1, RELEASES_IN_FEED, Order::ReleaseTime); - let mut resp = ctry!(Page::new(packages).to_resp("releases_feed")); - resp.headers.set(::iron::headers::ContentType("application/atom+xml".parse().unwrap())); - Ok(resp) -} - - -pub fn releases_handler(packages: Vec, - page_number: i64, - release_type: &str, - tab: &str, - title: &str) -> IronResult { - if packages.is_empty() { - return Err(IronError::new(Nope::CrateNotFound, status::NotFound)); - } - - // Show next and previous page buttons - // This is a temporary solution to avoid expensive COUNT(*) - let (show_next_page, show_previous_page) = (packages.len() == RELEASES_IN_RELEASES as usize, - page_number != 1); - - Page::new(packages) - .title("Releases") - .set("description", title) - .set("release_type", release_type) - .set_true("show_releases_navigation") - .set_true(tab) - .set_bool("show_next_page_button", show_next_page) - .set_int("next_page", page_number + 1) - .set_bool("show_previous_page_button", show_previous_page) - .set_int("previous_page", page_number - 1) - .to_resp("releases") -} - - -// Following functions caused a code repeat due to design of our /releases/ URL routes -pub fn recent_releases_handler(req: &mut Request) -> IronResult { - let page_number: i64 = extension!(req, Router).find("page").unwrap_or("1").parse().unwrap_or(1); - let conn = extension!(req, Pool); - let packages = get_releases(conn, page_number, RELEASES_IN_RELEASES, Order::ReleaseTime); - releases_handler(packages, page_number, "recent", "releases_navigation_recent_tab", "Recently uploaded crates") -} - - -pub fn releases_by_stars_handler(req: &mut Request) -> IronResult { - let page_number: i64 = extension!(req, Router).find("page").unwrap_or("1").parse().unwrap_or(1); - let conn = extension!(req, Pool); - let packages = get_releases(conn, page_number, RELEASES_IN_RELEASES, Order::GithubStars); - releases_handler(packages, page_number, "stars", "releases_navigation_stars_tab", "Crates with most stars") -} - - -pub fn releases_recent_failures_handler(req: &mut Request) -> IronResult { - let page_number: i64 = extension!(req, Router).find("page").unwrap_or("1").parse().unwrap_or(1); - let conn = extension!(req, Pool); - let packages = get_releases(conn, page_number, RELEASES_IN_RELEASES, Order::RecentFailures); - releases_handler(packages, page_number, "recent-failures", "releases_navigation_recent_failures_tab", "Recent crates failed to build") -} - - -pub fn releases_failures_by_stars_handler(req: &mut Request) -> IronResult { - let page_number: i64 = extension!(req, Router).find("page").unwrap_or("1").parse().unwrap_or(1); - let conn = extension!(req, Pool); - let packages = get_releases(conn, page_number, RELEASES_IN_RELEASES, Order::FailuresByGithubStars); - releases_handler(packages, page_number, "failures", "releases_navigation_failures_by_stars_tab", "Crates with most stars failed to build") -} - - -pub fn author_handler(req: &mut Request) -> IronResult { - let router = extension!(req, Router); - // page number of releases - let page_number: i64 = router.find("page").unwrap_or("1").parse().unwrap_or(1); - - let conn = extension!(req, Pool); - let author = ctry!(router.find("author") - .ok_or(IronError::new(Nope::CrateNotFound, status::NotFound))); - - let (author_name, packages) = if author.starts_with("@") { - let mut author = author.clone().split("@"); - get_releases_by_owner(conn, - page_number, - RELEASES_IN_RELEASES, - cexpect!(author.nth(1))) - } else { - get_releases_by_author(conn, page_number, RELEASES_IN_RELEASES, author) - }; - - if packages.is_empty() { - return Err(IronError::new(Nope::CrateNotFound, status::NotFound)); - } - - // Show next and previous page buttons - // This is a temporary solution to avoid expensive COUNT(*) - let (show_next_page, show_previous_page) = (packages.len() == RELEASES_IN_RELEASES as usize, - page_number != 1); - Page::new(packages) - .title("Releases") - .set("description", &format!("Crates from {}", author_name)) - .set("author", &author_name) - .set("release_type", author) - .set_true("show_releases_navigation") - .set_true("show_stars") - .set_bool("show_next_page_button", show_next_page) - .set_int("next_page", page_number + 1) - .set_bool("show_previous_page_button", show_previous_page) - .set_int("previous_page", page_number - 1) - .to_resp("releases") -} - - -pub fn search_handler(req: &mut Request) -> IronResult { - use params::{Params, Value}; - - let params = ctry!(req.get::()); - let query = params.find(&["query"]); - - let conn = extension!(req, Pool); - if let Some(&Value::String(ref query)) = query { - - // check if I am feeling lucky button pressed and redirect user to crate page - // if there is a match - // TODO: Redirecting to latest doc might be more useful - if params.find(&["i-am-feeling-lucky"]).is_some() { - - use iron::Url; - use iron::modifiers::Redirect; - - // redirect to a random crate if query is empty - if query.is_empty() { - let rows = ctry!(conn.query("SELECT crates.name, - releases.version, - releases.target_name - FROM crates - INNER JOIN releases - ON crates.latest_version_id = releases.id - WHERE github_stars >= 100 AND rustdoc_status = true - OFFSET FLOOR(RANDOM() * 280) LIMIT 1", - &[])); - // ~~~~~~^ - // FIXME: This is a fast query but using a constant - // There are currently 280 crates with docs and 100+ - // starts. This should be fine for a while. - let name: String = rows.get(0).get(0); - let version: String = rows.get(0).get(1); - let target_name: String = rows.get(0).get(2); - let url = ctry!(Url::parse(&format!("{}://{}:{}/{}/{}/{}", - req.url.scheme(), - req.url.host(), - req.url.port(), - name, - version, - target_name))); - - let mut resp = Response::with((status::Found, Redirect(url))); - use iron::headers::{Expires, HttpDate}; - use time; - resp.headers.set(Expires(HttpDate(time::now()))); - return Ok(resp); - } - - - if let Some(version) = match_version(&conn, &query, None) { - // FIXME: This is a super dirty way to check if crate have rustdocs generated. - // match_version should handle this instead of this code block. - // This block is introduced to fix #163 - let rustdoc_status = { - let rows = ctry!(conn.query("SELECT rustdoc_status - FROM releases - INNER JOIN crates - ON crates.id = releases.crate_id - WHERE crates.name = $1 AND releases.version = $2", - &[query, &version])); - if rows.is_empty() { - false - } else { - rows.get(0).get(0) - } - }; - let url = if rustdoc_status { - ctry!(Url::parse(&format!("{}://{}:{}/{}/{}", - req.url.scheme(), - req.url.host(), - req.url.port(), - query, - version)[..])) - } else { - ctry!(Url::parse(&format!("{}://{}:{}/crate/{}/{}", - req.url.scheme(), - req.url.host(), - req.url.port(), - query, - version)[..])) - }; - let mut resp = Response::with((status::Found, Redirect(url))); - - use iron::headers::{Expires, HttpDate}; - use time; - resp.headers.set(Expires(HttpDate(time::now()))); - return Ok(resp); - } - } - - - let search_query = query.replace(" ", " & "); - get_search_results(&conn, &search_query, 1, RELEASES_IN_RELEASES) - .ok_or(IronError::new(Nope::NoResults, status::NotFound)) - .and_then(|(_, results)| { - // FIXME: There is no pagination - Page::new(results) - .set("search_query", &query) - .title(&format!("Search results for '{}'", query)) - .to_resp("releases") - }) - } else { - Err(IronError::new(Nope::NoResults, status::NotFound)) - } -} - - -pub fn activity_handler(req: &mut Request) -> IronResult { - let conn = extension!(req, Pool); - let release_activity_data: Json = - ctry!(conn.query("SELECT value FROM config WHERE name = 'release_activity'", - &[])) - .get(0) - .get(0); - Page::new(release_activity_data) - .title("Releases") - .set("description", "Monthly release activity") - .set_true("show_releases_navigation") - .set_true("releases_navigation_activity_tab") - .set_true("javascript_highchartjs") - .to_resp("releases_activity") -} - - -pub fn build_queue_handler(req: &mut Request) -> IronResult { - let conn = extension!(req, Pool); - let mut crates: Vec<(String, String)> = Vec::new(); - for krate in &conn.query("SELECT name, version - FROM queue - WHERE attempt < 5 - ORDER BY id ASC", - &[]) - .unwrap() { - crates.push((krate.get(0), krate.get(1))); - } - let is_empty = crates.is_empty(); - Page::new(crates) - .title("Build queue") - .set("description", "List of crates scheduled to build") - .set_bool("queue_empty", is_empty) - .set_true("show_releases_navigation") - .set_true("releases_queue_tab") - .to_resp("releases_queue") -} diff --git a/src/web/rustdoc.rs b/src/web/rustdoc.rs deleted file mode 100644 index 033e0c80d..000000000 --- a/src/web/rustdoc.rs +++ /dev/null @@ -1,273 +0,0 @@ -//! rustdoc handler - - -use super::pool::Pool; -use super::file::File; -use super::latest_version; -use super::crate_details::CrateDetails; -use iron::prelude::*; -use iron::{status, Url}; -use iron::modifiers::Redirect; -use router::Router; -use super::match_version; -use super::error::Nope; -use super::page::Page; -use rustc_serialize::json::{Json, ToJson}; -use std::collections::BTreeMap; -use iron::headers::{Expires, HttpDate, CacheControl, CacheDirective}; -use time; -use iron::Handler; -use utils; - - -#[derive(Debug)] -struct RustdocPage { - pub head: String, - pub body: String, - pub body_class: String, - pub name: String, - pub full: String, - pub version: String, - pub description: Option, - pub crate_details: Option, -} - - -impl Default for RustdocPage { - fn default() -> RustdocPage { - RustdocPage { - head: String::new(), - body: String::new(), - body_class: String::new(), - name: String::new(), - full: String::new(), - version: String::new(), - description: None, - crate_details: None, - } - } -} - - -impl ToJson for RustdocPage { - fn to_json(&self) -> Json { - let mut m: BTreeMap = BTreeMap::new(); - m.insert("rustdoc_head".to_string(), self.head.to_json()); - m.insert("rustdoc_body".to_string(), self.body.to_json()); - m.insert("rustdoc_body_class".to_string(), self.body_class.to_json()); - m.insert("rustdoc_full".to_string(), self.full.to_json()); - m.insert("rustdoc_status".to_string(), true.to_json()); - m.insert("name".to_string(), self.name.to_json()); - m.insert("version".to_string(), self.version.to_json()); - m.insert("description".to_string(), self.description.to_json()); - m.insert("crate_details".to_string(), self.crate_details.to_json()); - m.to_json() - } -} - - - -pub fn rustdoc_redirector_handler(req: &mut Request) -> IronResult { - - fn redirect_to_doc(req: &Request, - name: &str, - vers: &str, - target_name: &str) - -> IronResult { - let url = ctry!(Url::parse(&format!("{}://{}:{}/{}/{}/{}/", - req.url.scheme(), - req.url.host(), - req.url.port(), - name, - vers, - target_name)[..])); - let mut resp = Response::with((status::Found, Redirect(url))); - resp.headers.set(Expires(HttpDate(time::now()))); - - Ok(resp) - } - - let router = extension!(req, Router); - // this handler should never called without crate pattern - let crate_name = cexpect!(router.find("crate")); - let req_version = router.find("version"); - - let conn = extension!(req, Pool); - - let version = match match_version(&conn, &crate_name, req_version) { - Some(v) => v, - None => return Err(IronError::new(Nope::CrateNotFound, status::NotFound)), - }; - - // get target name - // FIXME: This is a bit inefficient but allowing us to use less code in general - let target_name: String = - ctry!(conn.query("SELECT target_name - FROM releases - INNER JOIN crates ON crates.id = releases.crate_id - WHERE crates.name = $1 AND releases.version = $2", - &[&crate_name, &version])) - .get(0) - .get(0); - - redirect_to_doc(req, &crate_name, &version, &target_name) -} - - -/// Serves documentation generated by rustdoc. -/// -/// This includes all HTML files for an individual crate, as well as the `search-index.js`, which is -/// also crate-specific. -pub fn rustdoc_html_server_handler(req: &mut Request) -> IronResult { - - let router = extension!(req, Router); - let name = router.find("crate").unwrap_or("").to_string(); - let version = router.find("version"); - let conn = extension!(req, Pool); - let version = try!(match_version(&conn, &name, version) - .ok_or(IronError::new(Nope::ResourceNotFound, status::NotFound))); - let mut req_path = req.url.path(); - - // remove name and version from path - for _ in 0..2 { - req_path.remove(0); - } - - // docs have "rustdoc" prefix in database - req_path.insert(0, "rustdoc"); - - // add crate name and version - req_path.insert(1, &name); - req_path.insert(2, &version); - - let path = { - let mut path = req_path.join("/"); - if path.ends_with("/") { - path.push_str("index.html"); - req_path.push("index.html"); - } - path - }; - - let file = match File::from_path(&conn, &path) { - Some(f) => f, - None => return Err(IronError::new(Nope::ResourceNotFound, status::NotFound)), - }; - - // serve file directly if it's not html - if !path.ends_with(".html") { - return Ok(file.serve()); - } - - let mut content = RustdocPage::default(); - - let file_content = ctry!(String::from_utf8(file.content)); - - let (head, body, mut body_class) = ctry!(utils::extract_head_and_body(&file_content)); - content.head = head; - content.body = body; - - if body_class.is_empty() { - body_class = "rustdoc container-rustdoc".to_string(); - } else { - // rustdoc adds its own "rustdoc" class to the body - body_class.push_str(" container-rustdoc"); - } - content.body_class = body_class; - - content.full = file_content; - let crate_details = cexpect!(CrateDetails::new(&conn, &name, &version)); - let latest_version = latest_version(&crate_details.versions, &version); - - content.crate_details = Some(crate_details); - - Page::new(content) - .set_true("show_package_navigation") - .set_true("package_navigation_documentation_tab") - .set_true("package_navigation_show_platforms_tab") - .set_bool("is_latest_version", latest_version.is_none()) - .set("latest_version", &latest_version.unwrap_or(String::new())) - .to_resp("rustdoc") -} - - - -pub fn badge_handler(req: &mut Request) -> IronResult { - use iron::headers::ContentType; - use params::{Params, Value}; - use badge::{Badge, BadgeOptions}; - - let version = { - let params = ctry!(req.get_ref::()); - match params.find(&["version"]) { - Some(&Value::String(ref version)) => version.clone(), - _ => "*".to_owned(), - } - }; - - let name = cexpect!(extension!(req, Router).find("crate")); - let conn = extension!(req, Pool); - - let options = match match_version(&conn, &name, Some(&version)) { - Some(version) => { - let rows = ctry!(conn.query("SELECT rustdoc_status - FROM releases - INNER JOIN crates ON crates.id = releases.crate_id - WHERE crates.name = $1 AND releases.version = $2", - &[&name, &version])); - if rows.len() > 0 && rows.get(0).get(0) { - BadgeOptions { - subject: "docs".to_owned(), - status: version, - color: "#4d76ae".to_owned(), - } - } else { - BadgeOptions { - subject: "docs".to_owned(), - status: version, - color: "#e05d44".to_owned(), - } - } - } - None => { - BadgeOptions { - subject: "docs".to_owned(), - status: "no builds".to_owned(), - color: "#e05d44".to_owned(), - } - } - }; - - let mut resp = Response::with((status::Ok, ctry!(Badge::new(options)).to_svg())); - resp.headers.set(ContentType("image/svg+xml".parse().unwrap())); - resp.headers.set(Expires(HttpDate(time::now()))); - resp.headers.set(CacheControl(vec![CacheDirective::NoCache, - CacheDirective::NoStore, - CacheDirective::MustRevalidate])); - Ok(resp) -} - -/// Serves shared web resources used by rustdoc-generated documentation. -/// -/// This includes common `css` and `js` files that only change when the compiler is updated, but are -/// otherwise the same for all crates documented with that compiler. Those have a custom handler to -/// deduplicate them and save space. -pub struct SharedResourceHandler; - -impl Handler for SharedResourceHandler { - fn handle(&self, req: &mut Request) -> IronResult { - let path = req.url.path(); - let filename = path.last().unwrap(); // unwrap is fine: vector is non-empty - let suffix = filename.split('.').last().unwrap(); // unwrap is fine: split always works - if ["js", "css", "woff", "svg"].contains(&suffix) { - let conn = extension!(req, Pool); - - if let Some(file) = File::from_path(conn, filename) { - return Ok(file.serve()); - } - } - - // Just always return a 404 here - the main handler will then try the other handlers - Err(IronError::new(Nope::ResourceNotFound, status::NotFound)) - } -} diff --git a/src/web/sitemap.rs b/src/web/sitemap.rs deleted file mode 100644 index 4bab4fadc..000000000 --- a/src/web/sitemap.rs +++ /dev/null @@ -1,49 +0,0 @@ -use std::collections::BTreeMap; -use iron::prelude::*; -use iron::headers::ContentType; -use rustc_serialize::json::Json; -use super::page::Page; -use super::pool::Pool; -use time; - -pub fn sitemap_handler(req: &mut Request) -> IronResult { - let conn = extension!(req, Pool); - let mut releases: Vec<(String, String)> = Vec::new(); - for row in &conn.query("SELECT DISTINCT ON (crates.name) - crates.name, - releases.release_time - FROM crates - INNER JOIN releases ON releases.crate_id = crates.id - WHERE rustdoc_status = true", - &[]) - .unwrap() { - releases.push((row.get(0), format!("{}", time::at(row.get(1)).rfc3339()))); - } - let mut resp = ctry!(Page::new(releases).to_resp("sitemap")); - resp.headers.set(ContentType("application/xml".parse().unwrap())); - Ok(resp) -} - - -pub fn robots_txt_handler(_: &mut Request) -> IronResult { - let mut resp = Response::with("Sitemap: https://docs.rs/sitemap.xml"); - resp.headers.set(ContentType("text/plain".parse().unwrap())); - Ok(resp) -} - -pub fn about_handler(req: &mut Request) -> IronResult { - let mut content = BTreeMap::new(); - - let conn = extension!(req, Pool); - let res = ctry!(conn.query("SELECT value FROM config WHERE name = 'rustc_version'", &[])); - - if let Some(row) = res.iter().next() { - if let Some(Ok::(res)) = row.get_opt(0) { - if let Some(vers) = res.as_string() { - content.insert("rustc_version".to_string(), vers.to_string()); - } - } - } - - Page::new(content).title("About Docs.rs").to_resp("about") -} diff --git a/src/web/source.rs b/src/web/source.rs deleted file mode 100644 index ea8679610..000000000 --- a/src/web/source.rs +++ /dev/null @@ -1,251 +0,0 @@ -//! Source code browser - - -use std::collections::BTreeMap; -use std::cmp::Ordering; -use super::MetaData; -use super::page::Page; -use super::pool::Pool; -use super::file::File as DbFile; -use iron::prelude::*; -use router::Router; -use rustc_serialize::json::{Json, ToJson}; -use postgres::Connection; - - -#[derive(PartialEq, PartialOrd)] -enum FileType { - Dir, - Text, - Binary, - RustSource, -} - - -#[derive(PartialEq, PartialOrd)] -struct File { - name: String, - file_type: FileType, -} - - -struct FileList { - metadata: MetaData, - files: Vec, -} - - -impl ToJson for FileList { - fn to_json(&self) -> Json { - let mut m: BTreeMap = BTreeMap::new(); - - m.insert("metadata".to_string(), self.metadata.to_json()); - - let mut file_vec: Vec = Vec::new(); - - for file in &self.files { - let mut file_m: BTreeMap = BTreeMap::new(); - file_m.insert("name".to_string(), file.name.to_json()); - - file_m.insert(match file.file_type { - FileType::Dir => "file_type_dir".to_string(), - FileType::Text => "file_type_text".to_string(), - FileType::Binary => "file_type_binary".to_string(), - FileType::RustSource => "file_type_rust_source".to_string(), - }, - true.to_json()); - - file_vec.push(file_m.to_json()); - } - - m.insert("files".to_string(), file_vec.to_json()); - m.to_json() - } -} - - -impl FileList { - /// Gets FileList from a request path - /// - /// All paths stored in database have this format: - /// - /// ```text - /// [ - /// ["text/plain",".gitignore"], - /// ["text/x-c","src/reseeding.rs"], - /// ["text/x-c","src/lib.rs"], - /// ["text/x-c","README.md"], - /// ... - /// ] - /// ``` - /// - /// This function is only returning FileList for requested directory. If is empty, - /// it will return list of files (and dirs) for root directory. req_path must be a - /// directory or empty for root directory. - pub fn from_path(conn: &Connection, - name: &str, - version: &str, - req_path: &str) - -> Option { - - let rows = conn.query("SELECT crates.name, - releases.version, - releases.description, - releases.target_name, - releases.rustdoc_status, - releases.files - FROM releases - LEFT OUTER JOIN crates ON crates.id = releases.crate_id - WHERE crates.name = $1 AND releases.version = $2", - &[&name, &version]) - .unwrap(); - - if rows.len() == 0 { - return None; - } - - let files: Json = rows.get(0).get(5); - - let mut file_list: Vec = Vec::new(); - - files.as_array().map(|files| { - for file in files { - file.as_array().map(|file| { - let mime = file[0].as_string().unwrap(); - let path = file[1].as_string().unwrap(); - - // skip .cargo-ok generated by cargo - if path == ".cargo-ok" { - return; - } - - // look only files for req_path - if path.starts_with(&req_path) { - // remove req_path from path to reach files in this directory - let path = path.replace(&req_path, ""); - let path_splited: Vec<&str> = path.split("/").collect(); - - // if path have '/' it is a directory - let ftype = if path_splited.len() > 1 { - FileType::Dir - } else if mime.starts_with("text") && - path_splited[0].ends_with(".rs") { - FileType::RustSource - } else if mime.starts_with("text") { - FileType::Text - } else { - FileType::Binary - }; - - let file = File { - name: path_splited[0].to_owned(), - file_type: ftype, - }; - - // avoid adding duplicates, a directory may occur more than once - if !file_list.contains(&file) { - file_list.push(file); - } - } - }); - } - }); - - if file_list.is_empty() { - return None; - } - - file_list.sort_by(|a, b| { - // directories must be listed first - if a.file_type == FileType::Dir && b.file_type != FileType::Dir { - Ordering::Less - } else if a.file_type != FileType::Dir && b.file_type == FileType::Dir { - Ordering::Greater - } else { - a.name.to_lowercase().cmp(&b.name.to_lowercase()) - } - }); - - Some(FileList { - metadata: MetaData { - name: rows.get(0).get(0), - version: rows.get(0).get(1), - description: rows.get(0).get(2), - target_name: rows.get(0).get(3), - rustdoc_status: rows.get(0).get(4), - }, - files: file_list, - }) - } -} - - -pub fn source_browser_handler(req: &mut Request) -> IronResult { - let router = extension!(req, Router); - let name = cexpect!(router.find("name")); - let version = cexpect!(router.find("version")); - - // get path (req_path) for FileList::from_path and actual path for super::file::File::from_path - let (req_path, file_path) = { - let mut req_path = req.url.path(); - // remove first elements from path which is /crate/:name/:version/source - for _ in 0..4 { - req_path.remove(0); - } - let file_path = format!("sources/{}/{}/{}", name, version, req_path.join("/")); - - // FileList::from_path is only working for directories - // remove file name if it's not a directory - req_path.last_mut().map(|last| { - if !last.is_empty() { - *last = ""; - } - }); - - // remove crate name and version from req_path - let path = req_path.join("/").replace(&format!("{}/{}/", name, version), ""); - - (path, file_path) - }; - - - let conn = extension!(req, Pool); - - // try to get actual file first - // skip if request is a directory - let file = if !file_path.ends_with("/") { - DbFile::from_path(&conn, &file_path) - } else { - None - }; - - - let (content, is_rust_source) = if let Some(file) = file { - // serve the file with DatabaseFileHandler if file isn't text and not empty - if !file.mime.starts_with("text") && !file.is_empty() { - return Ok(file.serve()); - } else if file.mime.starts_with("text") && !file.is_empty() { - (String::from_utf8(file.content).ok(), file.path.ends_with(".rs")) - } else { - (None, false) - } - } else { - (None, false) - }; - - let list = FileList::from_path(&conn, &name, &version, &req_path); - - let page = Page::new(list) - .set_bool("show_parent_link", !req_path.is_empty()) - .set_true("javascript_highlightjs") - .set_true("show_package_navigation") - .set_true("package_source_tab"); - - if let Some(content) = content { - page.set("file_content", &content) - .set_bool("file_content_rust_source", is_rust_source) - .to_resp("source") - } else { - page.to_resp("source") - } -} diff --git a/templates/about.hbs b/templates/about.hbs deleted file mode 100644 index df740b6df..000000000 --- a/templates/about.hbs +++ /dev/null @@ -1,130 +0,0 @@ -{{> header}} - -

-

- Docs.rs (formerly cratesfyi) is an open source project to host - documentation of crates for the Rust Programming Language. -

- -

- Docs.rs automatically builds crates' documentation released on - crates.io - using the nightly release of the Rust compiler. - {{#if content.rustc_version}} - The current version of the Rust compiler in use is {{content.rustc_version}}. - If you need a newer version of this compiler, check the - issues page - and file a new issue if you don't see an existing request. - {{/if}} -

- -

- The source code of Docs.rs is available on - GitHub. If - you ever encounter an issue, don't hesitate to report it! (And - thanks in advance!) -

- -

- The README of a crate is taken from the readme field defined in - Cargo.toml. If a crate doesn't have this field, - no README will be displayed. -

- -

Redirections

- -

- Docs.rs is using semver to parse URLs. You can use this feature to access - crates' documentation easily. Example of URL redirections for - clap crate: -

- - - - - - - - - - - - - - - - - - - - - - - - - - -
URLRedirects to documentation of
docs.rs/clapLatest version of clap
docs.rs/clap/~22.* version
docs.rs/clap/~2.92.9.* version
docs.rs/clap/2.9.32.9.3 version (you don't need = unlike semver)
- -

Badges

-

- You can use badges to show state of your documentation to your users. - The default badge will be pointed at the latest version of a crate. - You can use version parameter to show status of documentation for - any version you want. -

-

- Badge will display in blue if docs.rs is successfully hosting your crate - documentation, and red if building documentation failing. -

-

Example badges for mio crate:

- - - - - - - - - - - - - - - - - - - - - -
URLBadge
Latest version: https://docs.rs/mio/badge.svgmio
Version 0.4.4: https://docs.rs/mio/badge.svg?version=0.4.4mio
Version 0.1.0: https://docs.rs/mio/badge.svg?version=0.1.0mio
- -

Metadata for custom builds

- -

You can customize docs.rs builds by defining [package.metadata.docs.rs] table in your crates' `Cargo.toml`.

- -

An example metadata:

- -
[package]
-name = "test"
-
-[package.metadata.docs.rs]
-features = [ "feature1", "feature2" ]
-all-features = true
-no-default-features = true
-default-target = "x86_64-unknown-linux-gnu"
-rustc-args = [ "--example-rustc-arg" ]
-rustdoc-args = [ "--example-rustdoc-arg" ]
-dependencies = [ "example-system-dependency" ]
- -

Version

-

Currently running Docs.rs version is: {{cratesfyi_version}} - -

Contact

-

Docs.rs is run and maintaned by Rustdoc team. You can find us in #rustdoc on Discord.

- -
- -{{> footer}} diff --git a/templates/builds.hbs b/templates/builds.hbs deleted file mode 100644 index c32fac506..000000000 --- a/templates/builds.hbs +++ /dev/null @@ -1,43 +0,0 @@ -{{> header}} - -{{#with content}} -
-
- - {{#if build_details}} -
- Build #{{build_details.id}} {{build_details.build_time}} -
-
-$ rustc --version
-{{build_details.rustc_version}}
-$ cratesfyi --version
-{{build_details.cratesfyi_version}}
-$ cratesfyi ...
-{{build_details.output}}
-    
- {{/if}} - -
- Builds -
- - -
-
-{{/with}} - -{{> footer}} diff --git a/templates/crate_details.hbs b/templates/crate_details.hbs deleted file mode 100644 index c6f8058f3..000000000 --- a/templates/crate_details.hbs +++ /dev/null @@ -1,78 +0,0 @@ -{{> header}} - - -{{#with content}} -
-
-
-
- -
-
-
- {{#unless is_library}} -
{{name}}-{{version}} is not a library.
- {{else}} - {{#unless build_status}} -
docs.rs failed to build {{name}}-{{version}}
Please check build logs and if you believe this is docs.rs' fault, report into this issue report.
- {{else}} - {{#unless rustdoc_status}} -
{{name}}-{{version}} doesn't have any documentation.
- {{/unless}} - {{/unless}} - {{/unless}} - {{#if readme}} - {{{readme}}} - {{else}} - {{{rustdoc}}} - {{/if}} -
-
- -
-{{/with}} - - -{{> footer}} diff --git a/templates/error.hbs b/templates/error.hbs deleted file mode 100644 index bf2fd7d93..000000000 --- a/templates/error.hbs +++ /dev/null @@ -1,2 +0,0 @@ -{{> header}} -{{> footer}} diff --git a/templates/footer.hbs b/templates/footer.hbs deleted file mode 100644 index aca7519a0..000000000 --- a/templates/footer.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{#if varsb.javascript_highlightjs}}{{/if}} - - diff --git a/templates/header.hbs b/templates/header.hbs deleted file mode 100644 index eea0c851d..000000000 --- a/templates/header.hbs +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - {{#if varsb.javascript_highlightjs}} - - - - {{/if}} - {{#if varsb.javascript_highchartjs}} - - {{/if}} - {{#if title}}{{title}} - {{/if}}{{#if content.metadata.name}}{{content.metadata.name}} {{content.metadata.version}} - {{/if}}Docs.rs - - - - {{> navigation}} diff --git a/templates/navigation.hbs b/templates/navigation.hbs deleted file mode 100644 index baddbe883..000000000 --- a/templates/navigation.hbs +++ /dev/null @@ -1,82 +0,0 @@ - - - {{#unless varsb.hide_package_navigation}} -
-
-

{{#if title}}{{title}}{{else}}{{content.metadata.name}} {{content.metadata.version}}{{/if}}

-
{{#if content.metadata.description }}{{content.metadata.description}}{{else}}{{varss.description}}{{/if}}
- - {{#if ../varsb.show_package_navigation}} -
- {{#if ../varsb.package_navigation_show_platforms_tab}} - - {{/if}} - {{#with content.metadata}} - - {{/with}} -
- {{/if}} - - {{#if varsb.show_releases_navigation}} -
- -
- {{/if}} -
-
- {{/unless}} diff --git a/templates/navigation_rustdoc.hbs b/templates/navigation_rustdoc.hbs deleted file mode 100644 index 329d65269..000000000 --- a/templates/navigation_rustdoc.hbs +++ /dev/null @@ -1,102 +0,0 @@ - diff --git a/templates/releases.hbs b/templates/releases.hbs deleted file mode 100644 index be5b371ba..000000000 --- a/templates/releases.hbs +++ /dev/null @@ -1,66 +0,0 @@ -{{> header}} - -{{#if varsb.show_search_form}} -
-

Docs.rs

- -
-
-
- - -
-
- -
-{{/if}} - -
-
- {{#if varsb.show_search_form}} - - {{/if}} - - - {{#unless varsb.show_search_form}} - - {{/unless}} -
-
- -{{> footer}} diff --git a/templates/releases_activity.hbs b/templates/releases_activity.hbs deleted file mode 100644 index c82617b1a..000000000 --- a/templates/releases_activity.hbs +++ /dev/null @@ -1,41 +0,0 @@ -{{> header}} -{{#with content}} - -
-
-
- - -{{/with}} -{{> footer}} diff --git a/templates/releases_feed.hbs b/templates/releases_feed.hbs deleted file mode 100644 index f3666fc7b..000000000 --- a/templates/releases_feed.hbs +++ /dev/null @@ -1,21 +0,0 @@ - - -Docs.rs -Recent Rust crates - - - - -urn:docs-rs:{{cratesfyi_version_safe}} -{{content[0].release_time_rfc3339}} -{{#each content}} - -{{name}}-{{version}} - -urn:docs-rs:{{name}}:{{version}} -{{release_time_rfc3339}} -{{#if description}}{{description}}{{else}}-{{/if}} -docs.rs - -{{/each}} - diff --git a/templates/releases_queue.hbs b/templates/releases_queue.hbs deleted file mode 100644 index 9ed6f10c9..000000000 --- a/templates/releases_queue.hbs +++ /dev/null @@ -1,22 +0,0 @@ -{{> header}} - -
-
- -
- {{#if varsb.queue_empty}} - There is nothing in queue - {{else}} - Queue - {{/if}} -
- -
    - {{#each content}} -
  1. {{this.[0]}}-{{this.[1]}}
  2. - {{/each}} -
-
-
- -{{> footer}} diff --git a/templates/rustdoc.hbs b/templates/rustdoc.hbs deleted file mode 100644 index 600825d46..000000000 --- a/templates/rustdoc.hbs +++ /dev/null @@ -1,17 +0,0 @@ - - - - {{{content.rustdoc_head}}} - - - - - - - -{{> navigation_rustdoc}} -
- {{{content.rustdoc_body}}} -
- - diff --git a/templates/sitemap.hbs b/templates/sitemap.hbs deleted file mode 100644 index a4d131285..000000000 --- a/templates/sitemap.hbs +++ /dev/null @@ -1,9 +0,0 @@ - - - {{#each content}} - - https://docs.rs/{{this.[0]}} - {{this.[1]}} - - {{/each}} - diff --git a/templates/source.hbs b/templates/source.hbs deleted file mode 100644 index 8ab5a72ad..000000000 --- a/templates/source.hbs +++ /dev/null @@ -1,38 +0,0 @@ -{{> header}} - - -{{#with content}} -
-
- - {{#if ../varss.file_content}} -
-
{{ ../varss.file_content }}
-
- {{/if}} -
-
-{{/with}} - -{{> footer}} diff --git a/templates/style.scss b/templates/style.scss deleted file mode 100644 index c0eb87222..000000000 --- a/templates/style.scss +++ /dev/null @@ -1,728 +0,0 @@ - -// FONTS -$font-family-sans: "Fira Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; -$font-family-serif: "Source Serif Pro",Georgia,Times,"Times New Roman",serif; -$font-family-mono: "Source Code Pro", Menlo, Monaco, Consolas, "DejaVu Sans Mono", Inconsolata, monospace; - - -// COLORS - Guess what? -$color-standard: #000; // pure black -$color-url: #4d76ae; // blue -$color-macro: #068000; // green -$color-struct: #df3600; // red -$color-enum: #5e9766; // light green -$color-type: #e57300; // orange -$color-keyword: #8959A8; // purple -$color-string: #718C00; // greenish -$color-macro-in-code: #3E999F; // blueish -$color-lifetime-incode: #B76514; // orangish -$color-comment-in-code: #8E908C; // light gray -$color-background-code: #F5F5F5; // lighter gray -$color-border: #ddd; // gray - - - -// pure compatible media queries -$media-sm: "screen and (min-width: 35.5em)"; -$media-md: "screen and (min-width: 48em)"; -$media-lg: "screen and (min-width: 64em)"; -$media-xl: "screen and (min-width: 80em)"; -// usage: -// @media #{$media-sm} { ... } - - -html, button, input, select, textarea, -.pure-g [class *= "pure-u"] { - font-family: $font-family-sans; - color: $color-standard; -} - -.pure-button-normal { - background-color: #fff; - box-sizing: border-box !important; - border: 1px solid $color-border; -} - -.description { - font-family: $font-family-serif; -} - -// rustdoc overrides -div.rustdoc { - font-family: $font-family-serif; - padding: 10px 15px 20px 15px; - - .sidebar { - padding-top: 32px; - .block > ul > li { - margin-right: -10px; - } - } - - // this is actual fix for docs.rs navigation and rustdoc sidebar - position: absolute; - left: 0; - right: 0; - top: 32px; -} - -body { - padding: 0; - margin: 0; -} - - -// this is a super nasty override for help dialog in rustdocs -// see #52 for details -body.blur > :not(#help) { - filter: none; - -webkit-filter: none; -} - -body.blur > div.nav-container > *, -body.blur > div.cratesfyi-package-container > *, -body.blur > div.rustdoc > :not(#help) { - filter: blur(8px); - -webkit-filter: blur(8px); - opacity: .7; -} - - -// rustdocs have 200px sidebar and -// max-width 960px main pane -// BUT I really want to make the website centered - -body { - text-align: center; - font: 16px/1.4 $font-family-sans; -} - -pre { - overflow: auto; - white-space: pre; -} - -div.container { - max-width: 1160px; - margin: 0 auto; - text-align: left; -} - -div.container-rustdoc { - max-width: 1200px; - text-align: left; -} - -div.nav-container { - height: 32px; - border-bottom: 1px solid $color-border; - background-color: #fff; - - li { - border-left: 1px solid $color-border; - } - - .pure-menu-has-children>.pure-menu-link:after { - font-size: 0.8em; - } - - a { - font-size: 0.8em; - font-weight: 400; - } - - .pure-menu-link:hover { - color: $color-standard; - background-color: inherit; - } - - form.landing-search-form-nav { - input.search-input-nav { - float: right; - max-width: 200px; - border: none; - margin: 0 1em 0 0; - font-size: 0.8em; - text-align: right; - box-shadow: none; - height: 31px; - display: none; - @media #{$media-sm} { - display: block; - } - } - input.search-input-nav:focus { - outline: unset; - } - } - - .pure-menu-children { - border: 1px solid $color-border; - border-radius: 0 0 2px 2px; - margin-left: -1px; - li { - border-left: none; - } - } - - // used for latest version warning - .warn { - color: $color-type; - } - - .warn:hover { - color: darken($color-type, 10%); - } - - div.rustdoc-navigation { - span.title { - display: none; - @media #{$media-sm} { - display: inline; - } - } - - div.package-details-menu { - width: 350px; - - p.description { - font-family: $font-family-sans; - font-size: 0.8em; - color: #777; // color from pure - padding: .5em 1em; - margin: 0; - } - - ul.pure-menu-list { - width: 100%; - } - - div.right-border { - border-right: 1px solid $color-border; - } - - a.pure-menu-link { - word-wrap: normal; - white-space: normal; - } - - div.sub-menu { - max-height: 150px; - overflow-y: auto; - - ul.pure-menu-list { - border-top: none; - } - - li.pure-menu-item:last-child { - border-bottom: none; - } - } - } - } -} - -div.nav-container-rustdoc { - position: absolute; - left: 0; - right: 0; - top: 0; - z-index: 999; -} - -div.landing { - text-align: center; - padding-top: 30px; - padding-bottom: 60px; - - h1.brand { - font-size: 3em; - margin-bottom: 10px; - } - - form.landing-search-form { - max-width: 500px; - margin: 0 auto; - padding: .4em 1em; - - div.buttons { - margin-top: 30px; - } - } - -} - - - -div.recent-releases-container { - text-align: left; - margin-bottom: 50px; - - ul, li { - list-style-type: none; - margin: 0; - padding: 0; - } - - ol.queue-list li { - list-style-type: decimal; - margin-left: 20px; - a { - color: $color-url; - } - } - - strong { - font-weight: 500; - } - - pre { - font-size: 0.8rem; - white-space: pre-wrap; - } - - .release { - display: block; - border-bottom: 1px solid $color-border; - padding: .4em 1em; - - @media #{$media-lg} { - padding: .4em 0; - margin: 0 1em; - } - } - - .release:hover { - background-color: $color-background-code; - } - - li:last-child .release { - border-bottom: none; - } - - .name { - color: $color-url; - font-weight: 500; - white-space: nowrap; - @media #{$media-sm} { - text-overflow: ellipsis; - overflow: hidden; - } - } - - .name:hover { - overflow: visible; - white-space: normal; - } - - .build { - font-weight: 500; - i.fa-check { - color: $color-macro; - } - i.fa-close { - color: $color-struct; - - } - } - - .description { - font-family: $font-family-serif; - font-weight: normal; - @media #{$media-sm} { - font-size: 1em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - } - - .description:hover { - @media #{$media-sm} { - overflow: visible; - white-space: normal; - } - } - - .date { - font-weight: normal; - @media #{$media-sm} { - text-align: right; - } - } - - div.pagination { - text-align: center; - margin: 1em; - - .pure-button { - margin: 0; - } - } -} - - -div.package-container { - background-color: $color-url; - color: $color-background-code;; - - h1 { - margin: 0; - padding: 20px 0 0 16px; - } - p { - margin: 0; - padding: 0 0 20px 16px; - } - - .pure-menu { - - .pure-menu-link { - background-color: #fff; - border-top: 1px solid $color-border; - border-left: 1px solid $color-border; - border-right: 1px solid $color-border; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom: 2px solid $color-border; - padding: .4em 1em; - } - - .pure-menu-active { - border-bottom: 2px solid #fff; - color: $color-standard; - } - - .pure-menu-link:hover { - color: $color-standard; - } - } -} - - -div.package-sheet-container { - margin-top: 10px; - margin-bottom: 20px; - - .pure-menu-link { - border-radius: 4px; - padding: .2em .8em; - font-weight: 400; - } - - .build-success { - color: $color-macro; - } - - .build-fail { - color: $color-struct; - } -} - -div.package-page-container { - div.package-menu { - padding: 0 10px; - margin-bottom: 50px; - - li.pure-menu-heading { - font-size: 1.3em; - color: #000; - font-weight: 500; - text-align: center; - border-bottom: 1px solid lighten($color-border, 5%); - text-transform: none; - padding-bottom: 6px; - margin: 20px 5px 15px 5px; - } - - li.pure-menu-heading:first-child { - margin-top: 0; - } - - li i.fa { - display: inline-block; - width: 20px; - } - - a.pure-menu-link { - font-size: 14px; - color: $color-standard; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - padding: 7px 8px; - } - - a.pure-menu-link:hover { - background-color: $color-background-code; - } - - div.sub-menu { - max-height: 135px; - overflow-y: auto; - - ul.pure-menu-list { - border-top: none; - } - - li.pure-menu-item:last-child { - border-bottom: none; - } - } - - img.owner { - max-width: 32px; - max-height: 32px; - border-radius: 2px; - } - } - - div.package-details { - padding: 0 1em; - - font-family: $font-family-serif; - - a { - color: $color-url; - } - - a:hover { - text-decoration: underline; - } - - h1, h2, h3, h4, h5, h6 { - font-family: $font-family-sans; - } - - h1:first-child, - h2:first-child, - h3:first-child, - h4:first-child, - h5:first-child, - h6:first-child { - margin-top: 0; - } - - table { - // most of this stuff is taken from pure tables.css - border-collapse: collapse; - border-spacing: 0; - empty-cells: show; - border: 1px solid #cbcbcb; - margin-bottom: 15px; - - td, th { - border-left: 1px solid #cbcbcb; - border-width: 0 0 0 1px; - font-size: inherit; - margin: 0; - overflow: visible; - padding: 0.5em 1em; - } - - th { - font-family: $font-family-sans; - font-weight: 500; - } - - td { - border-bottom: 1px solid #cbcbcb; - } - - tbody > tr:last-child > td { - border-bottom-width: 0; - } - - thead { - background-color: #e0e0e0; - color: #000; - text-align: left; - vertical-align: bottom; - } - - } - } - - pre { - background-color: inherit; - padding: 0; - - code { - white-space: pre; - } - } -} - - - -div.cratesfyi-package-container { - text-align: left; - background-color: $color-background-code; - border-bottom: 1px solid $color-border; - margin-bottom: 20px; - - h1 { - margin: 0; - padding: 15px 0 0 14px; - } - div.description { - font-family: $font-family-serif; - margin: 0; - padding: 0 0 15px 14px; - - @media #{$media-sm} { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - } - div.description-in-rustdoc { - padding: 10px 0 10px 14px; - } - - .pure-menu { - margin-bottom: -1px; - padding-left: 14px; - - .pure-menu-link { - color: #666; - font-size: 14px; - padding: .4em 1em .3em 1em; - - .title { - display: none; - @media #{$media-sm} { - display: inline; - } - } - } - - .pure-menu-active { - color: $color-standard; - - background-color: #fff; - border-top: 1px solid $color-border; - border-left: 1px solid $color-border; - border-right: 1px solid $color-border; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom: 2px solid #fff; - } - - .pure-menu-active:hover { - background-color: #fff !important; - } - - .pure-menu-link:hover { - color: #000; - background-color: inherit; - } - } - - ul.platforms-menu { - float: right; - display: none; - ul.pure-menu-children { - left: auto; - right: 0; - border: 1px solid $color-border; - border-radius: 2px; - } - - .pure-menu-has-children>.pure-menu-link:after { - font-size: 14px; - } - - @media #{$media-sm} { - display: inline-block; - } - } -} - -div.cratesfyi-package-container-rustdoc { - margin-bottom: 10px; -} - - -div.warning { - font-family: $font-family-sans; - border-radius: 4px; - background-color: lighten($color-type, 45%); - padding: .4em 1em; - text-align: center; - margin-bottom: 10px; - a { - color: $color-url; - text-decoration: underline; - } -} - - -div.search-page-search-form { - padding: .4em 1em; - text-align: center; - - input.search-input { - display: inline-block; - max-width: 300px; - padding: .4em 1em; - } -} - -.menu-item-divided { - border-bottom: 1px solid $color-border; -} - -.rust-navigation-item { - background: url(/rust-logo.png) no-repeat; - background-position: 15px 45%; - background-size: 12px; - padding-left: 35px; -} - - -footer { - margin-top: 60px; - margin-bottom: 10px; - text-align: center; - ul { - list-style-type: none; - li { - list-style-type: none; - margin-bottom: 10px; - - a { - font-weight: 500; - color: $color-url; - } - } - li.hosting { - font-size: .8em; - } - } -} - - -.about { - font-family: $font-family-serif; - padding: .4em 1em; - a { - color: $color-url; - } - a:hover { - text-decoration: underline; - } - table { - margin-bottom: 10px; - } - thead tr th { - font-family: $font-family-sans; - font-weight: 500; - } - strong { - font-weight: bold; - } - pre code { - background-color: inherit; - } -}

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