diff options
author | Quentin Dufour <quentin@deuxfleurs.fr> | 2021-10-04 18:27:57 +0200 |
---|---|---|
committer | Quentin Dufour <quentin@deuxfleurs.fr> | 2021-10-19 16:56:07 +0200 |
commit | dc017a0cab40cb2f33a01b420bb1b04038abb875 (patch) | |
tree | 239b6a9245b842a4daaceead93b71d8ddbeab498 | |
parent | 1acf7e4c66aab0a0b5bcce8eb2965b35d587dd2a (diff) | |
download | garage-feature/static.tar.gz garage-feature/static.zip |
Build Garage with Nixfeature/static
-rw-r--r-- | .drone.yml | 636 | ||||
-rw-r--r-- | Cargo.nix | 2496 | ||||
-rw-r--r-- | Dockerfile | 9 | ||||
-rw-r--r-- | Makefile | 7 | ||||
-rw-r--r-- | default.nix | 75 | ||||
-rw-r--r-- | doc/book/src/SUMMARY.md | 3 | ||||
-rw-r--r-- | doc/book/src/development/devenv.md | 150 | ||||
-rw-r--r-- | doc/book/src/development/miscellaneous_notes.md | 134 | ||||
-rw-r--r-- | doc/book/src/development/release_process.md | 184 | ||||
-rw-r--r-- | doc/book/src/development/scripts.md | 113 | ||||
-rwxr-xr-x | make_docker.sh | 20 | ||||
-rw-r--r-- | nix/build_index.nix | 146 | ||||
-rw-r--r-- | nix/common.nix | 27 | ||||
-rw-r--r-- | nix/kaniko.nix | 23 | ||||
-rw-r--r-- | nix/nix.conf | 7 | ||||
-rw-r--r-- | script/builder_image/Dockerfile | 7 | ||||
-rw-r--r-- | script/builder_image/Makefile | 8 | ||||
-rwxr-xr-x | script/dev-bucket.sh | 3 | ||||
-rwxr-xr-x | script/dev-cluster.sh | 9 | ||||
-rwxr-xr-x | script/dev-configure.sh | 9 | ||||
-rwxr-xr-x | script/test-smoke.sh | 4 | ||||
-rw-r--r-- | shell.nix | 69 | ||||
-rw-r--r-- | src/garage/admin_rpc.rs | 4 |
23 files changed, 4007 insertions, 136 deletions
@@ -6,103 +6,122 @@ workspace: base: /drone/garage volumes: -- name: cargo_home +- name: nix_store + host: + path: /var/lib/drone/nix +- name: nix_config temp: {} +environment: + HOME: /drone/garage + steps: - - name: restore-cache - image: meltwater/drone-cache:dev + - name: setup nix + image: nixpkgs/nix:nixos-21.05 volumes: - - name: cargo_home - path: /drone/cargo - environment: - AWS_ACCESS_KEY_ID: - from_secret: cache_aws_access_key_id - AWS_SECRET_ACCESS_KEY: - from_secret: cache_aws_secret_access_key - pull: true - settings: - restore: true - archive_format: "gzip" - bucket: drone-cache - cache_key: '{{ .Repo.Name }}_{{ checksum "Cargo.lock" }}_{{ arch }}_{{ os }}_gzip' - region: garage - mount: - - '/drone/cargo' - - 'target' - path_style: true - endpoint: https://garage.deuxfleurs.fr - when: - branch: - - nonexistent_skip_this_step + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + commands: + - cp nix/nix.conf /etc/nix/nix.conf + - nix-build --no-build-output --no-out-link shell.nix --arg release false -A inputDerivation - name: code quality - image: superboum/garage_builder_amd64:4 + image: nixpkgs/nix:nixos-21.05 volumes: - - name: cargo_home - path: /drone/cargo - environment: - CARGO_HOME: /drone/cargo + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix commands: - - cargo fmt -- --check - - cargo clippy -- --deny warnings + - nix-shell --arg release false --run "cargo fmt -- --check" + - nix-shell --arg release false --run "cargo clippy -- --allow clippy::needless_borrow --allow clippy::needless-return --deny warnings" - name: build - image: superboum/garage_builder_amd64:4 + image: nixpkgs/nix:nixos-21.05 volumes: - - name: cargo_home - path: /drone/cargo - environment: - CARGO_HOME: /drone/cargo + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix commands: - - pwd - - cargo build + - nix-build --no-build-output --argstr target x86_64-unknown-linux-musl --arg release false --argstr git_version $DRONE_COMMIT - - name: cargo-test - image: superboum/garage_builder_amd64:4 + - name: unit tests + image: nixpkgs/nix:nixos-21.05 volumes: - - name: cargo_home - path: /drone/cargo - environment: - CARGO_HOME: /drone/cargo + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix commands: - - cargo test + - | + nix-build \ + --no-build-output \ + --argstr target x86_64-unknown-linux-musl \ + --argstr compileMode test + - ./result*/bin/garage_api* + - ./result*/bin/garage_model* + - ./result*/bin/garage_rpc* + - ./result*/bin/garage_table* + - ./result*/bin/garage_util* + - ./result*/bin/garage_web* + - ./result*/bin/garage* - - name: rebuild-cache - image: meltwater/drone-cache:dev + - name: smoke-test + image: nixpkgs/nix:nixos-21.05 volumes: - - name: cargo_home - path: /drone/cargo + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + commands: + - nix-build --no-build-output --argstr target x86_64-unknown-linux-musl --arg release false --argstr git_version $DRONE_COMMIT + - nix-shell --arg release false --run ./script/test-smoke.sh || (cat /tmp/garage.log; false) + + - name: update cache + image: nixpkgs/nix:nixos-21.05 environment: AWS_ACCESS_KEY_ID: from_secret: cache_aws_access_key_id AWS_SECRET_ACCESS_KEY: from_secret: cache_aws_secret_access_key - pull: true - settings: - rebuild: true - archive_format: "gzip" - bucket: drone-cache - cache_key: '{{ .Repo.Name }}_{{ checksum "Cargo.lock" }}_{{ arch }}_{{ os }}_gzip' - region: garage - mount: - - '/drone/cargo' - - 'target' - path_style: true - endpoint: https://garage.deuxfleurs.fr - when: - branch: - - nonexistent_skip_this_step - - - name: smoke-test - image: superboum/garage_builder_amd64:4 + NIX_PRIV_KEY: + from_secret: nix_priv_key volumes: - - name: cargo_home - path: /drone/cargo - environment: - CARGO_HOME: /drone/cargo + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix commands: - - ./script/test-smoke.sh || (cat /tmp/garage.log; false) + - (umask 377 && echo $NIX_PRIV_KEY > /etc/nix/signing-key.sec) + - | + nix copy --to 's3://nix?endpoint=garage.deuxfleurs.fr®ion=garage&secret-key=/etc/nix/signing-key.sec' \ + $(nix-store -qR --include-outputs \ + $(nix-build --no-out-link shell.nix --arg release false -A inputDerivation)) + - | + nix copy --to 's3://nix?endpoint=garage.deuxfleurs.fr®ion=garage&secret-key=/etc/nix/signing-key.sec' \ + $(nix-store -qR --include-outputs \ + $(nix-instantiate --argstr target x86_64-unknown-linux-musl --argstr compileMode test)) + - | + nix copy --to 's3://nix?endpoint=garage.deuxfleurs.fr®ion=garage&secret-key=/etc/nix/signing-key.sec' \ + $(nix-store -qR --include-outputs \ + $(nix-instantiate --argstr target x86_64-unknown-linux-musl --arg release false)) + when: + event: + - cron + +trigger: + event: + - custom + - push + - pull_request + - tag + - cron + +node: + nix: 1 --- kind: pipeline @@ -137,8 +156,477 @@ steps: repo: - Deuxfleurs/garage +trigger: + event: + - custom + - push + - pull_request + +node: + nix: 1 + +--- +kind: pipeline +type: docker +name: release-linux-x86_64 + +volumes: +- name: nix_store + host: + path: /var/lib/drone/nix +- name: nix_config + temp: {} + +environment: + TARGET: x86_64-unknown-linux-musl + +steps: + - name: setup nix + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + commands: + - cp nix/nix.conf /etc/nix/nix.conf + - nix-build --no-build-output --no-out-link shell.nix -A inputDerivation + + - name: build + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + commands: + - nix-build --no-build-output --argstr target $TARGET --arg release true --argstr git_version $DRONE_COMMIT + + - name: integration + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + commands: + - nix-shell --run ./script/test-smoke.sh || (cat /tmp/garage.log; false) + + - name: update cache + image: nixpkgs/nix:nixos-21.05 + environment: + AWS_ACCESS_KEY_ID: + from_secret: cache_aws_access_key_id + AWS_SECRET_ACCESS_KEY: + from_secret: cache_aws_secret_access_key + NIX_PRIV_KEY: + from_secret: nix_priv_key + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + commands: + - (umask 377 && echo $NIX_PRIV_KEY > /etc/nix/signing-key.sec) + - | + nix copy --to 's3://nix?endpoint=garage.deuxfleurs.fr®ion=garage&secret-key=/etc/nix/signing-key.sec' \ + $(nix-store -qR --include-outputs \ + $(nix-instantiate --argstr target $TARGET --arg release true)) + + - name: push static binary + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + environment: + AWS_ACCESS_KEY_ID: + from_secret: garagehq_aws_access_key_id + AWS_SECRET_ACCESS_KEY: + from_secret: garagehq_aws_secret_access_key + commands: + - nix-shell --arg rust false --arg integration false --run "to_s3" + + - name: docker build and publish + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + environment: + DOCKER_AUTH: + from_secret: docker_auth + DOCKER_PLATFORM: "linux/amd64" + CONTAINER_NAME: "dxflrs/amd64_garage" + HOME: "/kaniko" + commands: + - mkdir -p /kaniko/.docker + - echo $DOCKER_AUTH > /kaniko/.docker/config.json + - export CONTAINER_TAG=${DRONE_TAG:-$DRONE_COMMIT} + - nix-shell --arg rust false --arg integration false --run "to_docker" + + +trigger: + event: + - promote + - cron + +node: + nix: 1 + +--- +kind: pipeline +type: docker +name: release-linux-i686 + +volumes: +- name: nix_store + host: + path: /var/lib/drone/nix +- name: nix_config + temp: {} + +environment: + TARGET: i686-unknown-linux-musl + +steps: + - name: setup nix + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + commands: + - cp nix/nix.conf /etc/nix/nix.conf + - nix-build --no-build-output --no-out-link shell.nix -A inputDerivation + + - name: build + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + commands: + - nix-build --no-build-output --argstr target $TARGET --arg release true --argstr git_version $DRONE_COMMIT + + - name: integration + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + commands: + - nix-shell --run ./script/test-smoke.sh || (cat /tmp/garage.log; false) + + - name: update cache + image: nixpkgs/nix:nixos-21.05 + environment: + AWS_ACCESS_KEY_ID: + from_secret: cache_aws_access_key_id + AWS_SECRET_ACCESS_KEY: + from_secret: cache_aws_secret_access_key + NIX_PRIV_KEY: + from_secret: nix_priv_key + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + commands: + - (umask 377 && echo $NIX_PRIV_KEY > /etc/nix/signing-key.sec) + - | + nix copy --to 's3://nix?endpoint=garage.deuxfleurs.fr®ion=garage&secret-key=/etc/nix/signing-key.sec' \ + $(nix-store -qR --include-outputs \ + $(nix-instantiate --argstr target $TARGET --arg release true)) + + - name: push static binary + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + environment: + AWS_ACCESS_KEY_ID: + from_secret: garagehq_aws_access_key_id + AWS_SECRET_ACCESS_KEY: + from_secret: garagehq_aws_secret_access_key + commands: + - nix-shell --arg rust false --arg integration false --run "to_s3" + + - name: docker build and publish + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + environment: + DOCKER_AUTH: + from_secret: docker_auth + DOCKER_PLATFORM: "linux/386" + CONTAINER_NAME: "dxflrs/386_garage" + HOME: "/kaniko" + commands: + - mkdir -p /kaniko/.docker + - echo $DOCKER_AUTH > /kaniko/.docker/config.json + - export CONTAINER_TAG=${DRONE_TAG:-$DRONE_COMMIT} + - nix-shell --arg rust false --arg integration false --run "to_docker" + +trigger: + event: + - promote + - cron + +node: + nix: 1 + +--- +kind: pipeline +type: docker +name: release-linux-aarch64 + +volumes: +- name: nix_store + host: + path: /var/lib/drone/nix +- name: nix_config + temp: {} + +environment: + TARGET: aarch64-unknown-linux-musl + +steps: + - name: setup nix + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + commands: + - cp nix/nix.conf /etc/nix/nix.conf + - nix-build --no-build-output --no-out-link ./shell.nix --arg rust false --arg integration false -A inputDerivation + + - name: build + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + commands: + - nix-build --no-build-output --argstr target $TARGET --arg release true --argstr git_version $DRONE_COMMIT + + - name: update cache + image: nixpkgs/nix:nixos-21.05 + environment: + AWS_ACCESS_KEY_ID: + from_secret: cache_aws_access_key_id + AWS_SECRET_ACCESS_KEY: + from_secret: cache_aws_secret_access_key + NIX_PRIV_KEY: + from_secret: nix_priv_key + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + commands: + - (umask 377 && echo $NIX_PRIV_KEY > /etc/nix/signing-key.sec) + - | + nix copy --to 's3://nix?endpoint=garage.deuxfleurs.fr®ion=garage&secret-key=/etc/nix/signing-key.sec' \ + $(nix-store -qR --include-outputs \ + $(nix-instantiate --argstr target $TARGET --arg release true)) + + - name: push static binary + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + environment: + AWS_ACCESS_KEY_ID: + from_secret: garagehq_aws_access_key_id + AWS_SECRET_ACCESS_KEY: + from_secret: garagehq_aws_secret_access_key + commands: + - nix-shell --arg rust false --arg integration false --run "to_s3" + + - name: docker build and publish + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + environment: + DOCKER_AUTH: + from_secret: docker_auth + DOCKER_PLATFORM: "linux/arm64" + CONTAINER_NAME: "dxflrs/arm64_garage" + HOME: "/kaniko" + commands: + - mkdir -p /kaniko/.docker + - echo $DOCKER_AUTH > /kaniko/.docker/config.json + - export CONTAINER_TAG=${DRONE_TAG:-$DRONE_COMMIT} + - nix-shell --arg rust false --arg integration false --run "to_docker" + +trigger: + event: + - promote + - cron + +node: + nix: 1 + +--- +kind: pipeline +type: docker +name: release-linux-armv6l + +volumes: +- name: nix_store + host: + path: /var/lib/drone/nix +- name: nix_config + temp: {} + +environment: + TARGET: armv6l-unknown-linux-musleabihf + +steps: + - name: setup nix + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + commands: + - cp nix/nix.conf /etc/nix/nix.conf + - nix-build --no-build-output --no-out-link --arg rust false --arg integration false -A inputDerivation + + - name: build + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + commands: + - nix-build --no-build-output --argstr target $TARGET --arg release true --argstr git_version $DRONE_COMMIT + + - name: update cache + image: nixpkgs/nix:nixos-21.05 + environment: + AWS_ACCESS_KEY_ID: + from_secret: cache_aws_access_key_id + AWS_SECRET_ACCESS_KEY: + from_secret: cache_aws_secret_access_key + NIX_PRIV_KEY: + from_secret: nix_priv_key + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + commands: + - (umask 377 && echo $NIX_PRIV_KEY > /etc/nix/signing-key.sec) + - | + nix copy --to 's3://nix?endpoint=garage.deuxfleurs.fr®ion=garage&secret-key=/etc/nix/signing-key.sec' \ + $(nix-store -qR --include-outputs \ + $(nix-instantiate --argstr target $TARGET --arg release true)) + + - name: push static binary + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + environment: + AWS_ACCESS_KEY_ID: + from_secret: garagehq_aws_access_key_id + AWS_SECRET_ACCESS_KEY: + from_secret: garagehq_aws_secret_access_key + commands: + - nix-shell --arg integration false --arg rust false --run "to_s3" + + - name: docker build and publish + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + - name: nix_config + path: /etc/nix + environment: + DOCKER_AUTH: + from_secret: docker_auth + DOCKER_PLATFORM: "linux/arm" + CONTAINER_NAME: "dxflrs/arm_garage" + HOME: "/kaniko" + commands: + - mkdir -p /kaniko/.docker + - echo $DOCKER_AUTH > /kaniko/.docker/config.json + - export CONTAINER_TAG=${DRONE_TAG:-$DRONE_COMMIT} + - nix-shell --arg rust false --arg integration false --run "to_docker" + +trigger: + event: + - promote + - cron + +node: + nix: 1 + +--- +kind: pipeline +type: docker +name: refresh-release-page + +volumes: +- name: nix_store + host: + path: /var/lib/drone/nix + +steps: + - name: refresh-index + image: nixpkgs/nix:nixos-21.05 + volumes: + - name: nix_store + path: /nix + environment: + AWS_ACCESS_KEY_ID: + from_secret: garagehq_aws_access_key_id + AWS_SECRET_ACCESS_KEY: + from_secret: garagehq_aws_secret_access_key + commands: + - mkdir -p /etc/nix && cp nix/nix.conf /etc/nix/nix.conf + - nix-shell --arg integration false --arg rust false --run "refresh_index" + +depends_on: + - release-linux-x86_64 + - release-linux-i686 + - release-linux-aarch64 + - release-linux-armv6l + +trigger: + event: + - promote + - cron + +node: + nix: 1 + --- kind: signature -hmac: f0f2e947c8aa8bc5b83d25b4da22f3eb711b3fe1cc80ead4f93428dbd3d44164 +hmac: 1c33490cc2902564c4250a409c156683d0d549b8c9d5aee4e46d1bde4e0ccf2c ... diff --git a/Cargo.nix b/Cargo.nix new file mode 100644 index 00000000..7038ce8b --- /dev/null +++ b/Cargo.nix @@ -0,0 +1,2496 @@ +# This file was @generated by cargo2nix 0.9.0. +# It is not intended to be manually edited. + +args@{ + release ? true, + rootFeatures ? [ + "garage_util/default" + "garage_rpc/default" + "garage_table/default" + "garage_model/default" + "garage_api/default" + "garage_web/default" + "garage/default" + ], + rustPackages, + buildRustPackages, + hostPlatform, + hostPlatformCpu ? null, + hostPlatformFeatures ? [], + mkRustCrate, + rustLib, + lib, + workspaceSrc, +}: +let + workspaceSrc = if args.workspaceSrc == null then ./. else args.workspaceSrc; +in let + inherit (rustLib) fetchCratesIo fetchCrateLocal fetchCrateGit fetchCrateAlternativeRegistry expandFeatures decideProfile genDrvsByProfile; + profilesByName = { + dev = builtins.fromTOML "lto = \"off\"\n"; + release = builtins.fromTOML "debug = true\n"; + }; + rootFeatures' = expandFeatures rootFeatures; + overridableMkRustCrate = f: + let + drvs = genDrvsByProfile profilesByName ({ profile, profileName }: mkRustCrate ({ inherit release profile hostPlatformCpu hostPlatformFeatures; } // (f profileName))); + in { compileMode ? null, profileName ? decideProfile compileMode release }: + let drv = drvs.${profileName}; in if compileMode == null then drv else drv.override { inherit compileMode; }; +in +{ + cargo2nixVersion = "0.9.0"; + workspace = { + garage_util = rustPackages.unknown.garage_util."0.3.0"; + garage_rpc = rustPackages.unknown.garage_rpc."0.3.0"; + garage_table = rustPackages.unknown.garage_table."0.3.0"; + garage_model = rustPackages.unknown.garage_model."0.3.0"; + garage_api = rustPackages.unknown.garage_api."0.3.0"; + garage_web = rustPackages.unknown.garage_web."0.3.0"; + garage = rustPackages.unknown.garage."0.3.0"; + }; + "registry+https://github.com/rust-lang/crates.io-index".aho-corasick."0.7.15" = overridableMkRustCrate (profileName: rec { + name = "aho-corasick"; + version = "0.7.15"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + dependencies = { + memchr = rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.3.4" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".arc-swap."1.2.0" = overridableMkRustCrate (profileName: rec { + name = "arc-swap"; + version = "1.2.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "d4d7d63395147b81a9e570bcc6243aaf71c017bd666d4909cfef0085bdda8d73"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".arrayvec."0.5.2" = overridableMkRustCrate (profileName: rec { + name = "arrayvec"; + version = "0.5.2"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".atty."0.2.14" = overridableMkRustCrate (profileName: rec { + name = "atty"; + version = "0.2.14"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"; }; + dependencies = { + ${ if hostPlatform.parsed.kernel.name == "hermit" then "hermit_abi" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hermit-abi."0.1.18" { inherit profileName; }; + ${ if hostPlatform.isUnix then "libc" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.90" { inherit profileName; }; + ${ if hostPlatform.isWindows then "winapi" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".autocfg."1.0.1" = overridableMkRustCrate (profileName: rec { + name = "autocfg"; + version = "1.0.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".base64."0.13.0" = overridableMkRustCrate (profileName: rec { + name = "base64"; + version = "0.13.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".bitflags."1.2.1" = overridableMkRustCrate (profileName: rec { + name = "bitflags"; + version = "1.2.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"; }; + features = builtins.concatLists [ + [ "default" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".blake2."0.9.1" = overridableMkRustCrate (profileName: rec { + name = "blake2"; + version = "0.9.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "10a5720225ef5daecf08657f23791354e1685a8c91a4c60c7f3d3b2892f978f4"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + dependencies = { + crypto_mac = rustPackages."registry+https://github.com/rust-lang/crates.io-index".crypto-mac."0.8.0" { inherit profileName; }; + digest = rustPackages."registry+https://github.com/rust-lang/crates.io-index".digest."0.9.0" { inherit profileName; }; + opaque_debug = rustPackages."registry+https://github.com/rust-lang/crates.io-index".opaque-debug."0.3.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".block-buffer."0.9.0" = overridableMkRustCrate (profileName: rec { + name = "block-buffer"; + version = "0.9.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"; }; + dependencies = { + generic_array = rustPackages."registry+https://github.com/rust-lang/crates.io-index".generic-array."0.14.4" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".bumpalo."3.6.1" = overridableMkRustCrate (profileName: rec { + name = "bumpalo"; + version = "3.6.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe"; }; + features = builtins.concatLists [ + [ "default" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".byteorder."1.4.3" = overridableMkRustCrate (profileName: rec { + name = "byteorder"; + version = "1.4.3"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".bytes."1.0.1" = overridableMkRustCrate (profileName: rec { + name = "bytes"; + version = "1.0.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".cc."1.0.67" = overridableMkRustCrate (profileName: rec { + name = "cc"; + version = "1.0.67"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" = overridableMkRustCrate (profileName: rec { + name = "cfg-if"; + version = "1.0.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.19" = overridableMkRustCrate (profileName: rec { + name = "chrono"; + version = "0.4.19"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"; }; + features = builtins.concatLists [ + [ "clock" ] + [ "default" ] + [ "libc" ] + [ "oldtime" ] + [ "std" ] + [ "time" ] + [ "winapi" ] + ]; + dependencies = { + libc = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.90" { inherit profileName; }; + num_integer = rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-integer."0.1.44" { inherit profileName; }; + num_traits = rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.14" { inherit profileName; }; + time = rustPackages."registry+https://github.com/rust-lang/crates.io-index".time."0.1.43" { inherit profileName; }; + ${ if hostPlatform.isWindows then "winapi" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".clap."2.33.3" = overridableMkRustCrate (profileName: rec { + name = "clap"; + version = "2.33.3"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"; }; + dependencies = { + bitflags = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."1.2.1" { inherit profileName; }; + textwrap = rustPackages."registry+https://github.com/rust-lang/crates.io-index".textwrap."0.11.0" { inherit profileName; }; + unicode_width = rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-width."0.1.8" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".cpuid-bool."0.1.2" = overridableMkRustCrate (profileName: rec { + name = "cpuid-bool"; + version = "0.1.2"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".crc32fast."1.2.1" = overridableMkRustCrate (profileName: rec { + name = "crc32fast"; + version = "1.2.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + dependencies = { + cfg_if = rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".crossbeam-epoch."0.9.3" = overridableMkRustCrate (profileName: rec { + name = "crossbeam-epoch"; + version = "0.9.3"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "2584f639eb95fea8c798496315b297cf81b9b58b6d30ab066a75455333cf4b12"; }; + features = builtins.concatLists [ + [ "alloc" ] + [ "default" ] + [ "lazy_static" ] + [ "std" ] + ]; + dependencies = { + cfg_if = rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }; + crossbeam_utils = rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-utils."0.8.3" { inherit profileName; }; + lazy_static = rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; }; + memoffset = rustPackages."registry+https://github.com/rust-lang/crates.io-index".memoffset."0.6.1" { inherit profileName; }; + scopeguard = rustPackages."registry+https://github.com/rust-lang/crates.io-index".scopeguard."1.1.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".crossbeam-utils."0.8.3" = overridableMkRustCrate (profileName: rec { + name = "crossbeam-utils"; + version = "0.8.3"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49"; }; + features = builtins.concatLists [ + [ "default" ] + [ "lazy_static" ] + [ "std" ] + ]; + dependencies = { + cfg_if = rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }; + lazy_static = rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; }; + }; + buildDependencies = { + autocfg = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".autocfg."1.0.1" { profileName = "__noProfile"; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".crypto-mac."0.8.0" = overridableMkRustCrate (profileName: rec { + name = "crypto-mac"; + version = "0.8.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab"; }; + features = builtins.concatLists [ + [ "std" ] + ]; + dependencies = { + generic_array = rustPackages."registry+https://github.com/rust-lang/crates.io-index".generic-array."0.14.4" { inherit profileName; }; + subtle = rustPackages."registry+https://github.com/rust-lang/crates.io-index".subtle."2.4.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".crypto-mac."0.10.0" = overridableMkRustCrate (profileName: rec { + name = "crypto-mac"; + version = "0.10.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6"; }; + dependencies = { + generic_array = rustPackages."registry+https://github.com/rust-lang/crates.io-index".generic-array."0.14.4" { inherit profileName; }; + subtle = rustPackages."registry+https://github.com/rust-lang/crates.io-index".subtle."2.4.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".digest."0.9.0" = overridableMkRustCrate (profileName: rec { + name = "digest"; + version = "0.9.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"; }; + features = builtins.concatLists [ + [ "alloc" ] + [ "std" ] + ]; + dependencies = { + generic_array = rustPackages."registry+https://github.com/rust-lang/crates.io-index".generic-array."0.14.4" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".env_logger."0.7.1" = overridableMkRustCrate (profileName: rec { + name = "env_logger"; + version = "0.7.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"; }; + features = builtins.concatLists [ + [ "atty" ] + [ "default" ] + [ "humantime" ] + [ "regex" ] + [ "termcolor" ] + ]; + dependencies = { + atty = rustPackages."registry+https://github.com/rust-lang/crates.io-index".atty."0.2.14" { inherit profileName; }; + humantime = rustPackages."registry+https://github.com/rust-lang/crates.io-index".humantime."1.3.0" { inherit profileName; }; + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + regex = rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.4.5" { inherit profileName; }; + termcolor = rustPackages."registry+https://github.com/rust-lang/crates.io-index".termcolor."1.1.2" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".err-derive."0.3.0" = overridableMkRustCrate (profileName: rec { + name = "err-derive"; + version = "0.3.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "dcc7f65832b62ed38939f98966824eb6294911c3629b0e9a262bfb80836d9686"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + dependencies = { + proc_macro_error = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-error."1.0.4" { inherit profileName; }; + proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.24" { inherit profileName; }; + quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.9" { inherit profileName; }; + syn = rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.64" { inherit profileName; }; + synstructure = rustPackages."registry+https://github.com/rust-lang/crates.io-index".synstructure."0.12.4" { inherit profileName; }; + }; + buildDependencies = { + rustversion = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".rustversion."1.0.4" { profileName = "__noProfile"; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".fnv."1.0.7" = overridableMkRustCrate (profileName: rec { + name = "fnv"; + version = "1.0.7"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.0.1" = overridableMkRustCrate (profileName: rec { + name = "form_urlencoded"; + version = "1.0.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191"; }; + dependencies = { + matches = rustPackages."registry+https://github.com/rust-lang/crates.io-index".matches."0.1.8" { inherit profileName; }; + percent_encoding = rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.1.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".fs2."0.4.3" = overridableMkRustCrate (profileName: rec { + name = "fs2"; + version = "0.4.3"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213"; }; + dependencies = { + ${ if hostPlatform.isUnix then "libc" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.90" { inherit profileName; }; + ${ if hostPlatform.isWindows then "winapi" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".futures."0.3.13" = overridableMkRustCrate (profileName: rec { + name = "futures"; + version = "0.3.13"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "7f55667319111d593ba876406af7c409c0ebb44dc4be6132a783ccf163ea14c1"; }; + features = builtins.concatLists [ + [ "alloc" ] + [ "async-await" ] + [ "default" ] + [ "executor" ] + [ "futures-executor" ] + [ "std" ] + ]; + dependencies = { + futures_channel = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.13" { inherit profileName; }; + futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.13" { inherit profileName; }; + futures_executor = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-executor."0.3.13" { inherit profileName; }; + futures_io = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-io."0.3.13" { inherit profileName; }; + futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.13" { inherit profileName; }; + futures_task = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.13" { inherit profileName; }; + futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.13" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.13" = overridableMkRustCrate (profileName: rec { + name = "futures-channel"; + version = "0.3.13"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "8c2dd2df839b57db9ab69c2c9d8f3e8c81984781937fe2807dc6dcf3b2ad2939"; }; + features = builtins.concatLists [ + [ "alloc" ] + [ "default" ] + [ "futures-sink" ] + [ "sink" ] + [ "std" ] + ]; + dependencies = { + futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.13" { inherit profileName; }; + futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.13" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.13" = overridableMkRustCrate (profileName: rec { + name = "futures-core"; + version = "0.3.13"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "15496a72fabf0e62bdc3df11a59a3787429221dd0710ba8ef163d6f7a9112c94"; }; + features = builtins.concatLists [ + [ "alloc" ] + (lib.optional (rootFeatures' ? "garage" || rootFeatures' ? "garage_api" || rootFeatures' ? "garage_model" || rootFeatures' ? "garage_rpc" || rootFeatures' ? "garage_table" || rootFeatures' ? "garage_web") "default") + [ "std" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".futures-executor."0.3.13" = overridableMkRustCrate (profileName: rec { + name = "futures-executor"; + version = "0.3.13"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "891a4b7b96d84d5940084b2a37632dd65deeae662c114ceaa2c879629c9c0ad1"; }; + features = builtins.concatLists [ + [ "std" ] + ]; + dependencies = { + futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.13" { inherit profileName; }; + futures_task = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.13" { inherit profileName; }; + futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.13" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".futures-io."0.3.13" = overridableMkRustCrate (profileName: rec { + name = "futures-io"; + version = "0.3.13"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "d71c2c65c57704c32f5241c1223167c2c3294fd34ac020c807ddbe6db287ba59"; }; + features = builtins.concatLists [ + [ "std" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".futures-macro."0.3.13" = overridableMkRustCrate (profileName: rec { + name = "futures-macro"; + version = "0.3.13"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "ea405816a5139fb39af82c2beb921d52143f556038378d6db21183a5c37fbfb7"; }; + dependencies = { + proc_macro_hack = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-hack."0.5.19" { profileName = "__noProfile"; }; + proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.24" { inherit profileName; }; + quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.9" { inherit profileName; }; + syn = rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.64" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.13" = overridableMkRustCrate (profileName: rec { + name = "futures-sink"; + version = "0.3.13"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "85754d98985841b7d4f5e8e6fbfa4a4ac847916893ec511a2917ccd8525b8bb3"; }; + features = builtins.concatLists [ + [ "alloc" ] + (lib.optional (rootFeatures' ? "garage" || rootFeatures' ? "garage_api" || rootFeatures' ? "garage_model" || rootFeatures' ? "garage_rpc" || rootFeatures' ? "garage_table" || rootFeatures' ? "garage_web") "default") + [ "std" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.13" = overridableMkRustCrate (profileName: rec { + name = "futures-task"; + version = "0.3.13"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "fa189ef211c15ee602667a6fcfe1c1fd9e07d42250d2156382820fba33c9df80"; }; + features = builtins.concatLists [ + [ "alloc" ] + [ "std" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.13" = overridableMkRustCrate (profileName: rec { + name = "futures-util"; + version = "0.3.13"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "1812c7ab8aedf8d6f2701a43e1243acdbcc2b36ab26e2ad421eb99ac963d96d1"; }; + features = builtins.concatLists [ + [ "alloc" ] + [ "async-await" ] + [ "async-await-macro" ] + [ "channel" ] + (lib.optional (rootFeatures' ? "garage" || rootFeatures' ? "garage_api" || rootFeatures' ? "garage_model" || rootFeatures' ? "garage_rpc" || rootFeatures' ? "garage_table" || rootFeatures' ? "garage_web") "default") + [ "futures-channel" ] + [ "futures-io" ] + [ "futures-macro" ] + [ "futures-sink" ] + [ "io" ] + [ "memchr" ] + [ "proc-macro-hack" ] + [ "proc-macro-nested" ] + [ "sink" ] + [ "slab" ] + [ "std" ] + ]; + dependencies = { + futures_channel = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.13" { inherit profileName; }; + futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.13" { inherit profileName; }; + futures_io = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-io."0.3.13" { inherit profileName; }; + futures_macro = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-macro."0.3.13" { profileName = "__noProfile"; }; + futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.13" { inherit profileName; }; + futures_task = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.13" { inherit profileName; }; + memchr = rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.3.4" { inherit profileName; }; + pin_project_lite = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.6" { inherit profileName; }; + pin_utils = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-utils."0.1.0" { inherit profileName; }; + proc_macro_hack = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-hack."0.5.19" { profileName = "__noProfile"; }; + proc_macro_nested = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-nested."0.1.7" { inherit profileName; }; + slab = rustPackages."registry+https://github.com/rust-lang/crates.io-index".slab."0.4.2" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".fxhash."0.2.1" = overridableMkRustCrate (profileName: rec { + name = "fxhash"; + version = "0.2.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"; }; + dependencies = { + byteorder = rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.4.3" { inherit profileName; }; + }; + }); + + "unknown".garage."0.3.0" = overridableMkRustCrate (profileName: rec { + name = "garage"; + version = "0.3.0"; + registry = "unknown"; + src = fetchCrateLocal (workspaceSrc + "/src/garage"); + dependencies = { + bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.0.1" { inherit profileName; }; + futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.13" { inherit profileName; }; + futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.13" { inherit profileName; }; + garage_api = rustPackages."unknown".garage_api."0.3.0" { inherit profileName; }; + garage_model = rustPackages."unknown".garage_model."0.3.0" { inherit profileName; }; + garage_rpc = rustPackages."unknown".garage_rpc."0.3.0" { inherit profileName; }; + garage_table = rustPackages."unknown".garage_table."0.3.0" { inherit profileName; }; + garage_util = rustPackages."unknown".garage_util."0.3.0" { inherit profileName; }; + garage_web = rustPackages."unknown".garage_web."0.3.0" { inherit profileName; }; + git_version = rustPackages."registry+https://github.com/rust-lang/crates.io-index".git-version."0.3.4" { inherit profileName; }; + hex = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }; + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + pretty_env_logger = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pretty_env_logger."0.4.0" { inherit profileName; }; + rand = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.3" { inherit profileName; }; + rmp_serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rmp-serde."0.15.4" { inherit profileName; }; + serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.124" { inherit profileName; }; + sled = rustPackages."registry+https://github.com/rust-lang/crates.io-index".sled."0.34.6" { inherit profileName; }; + structopt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".structopt."0.3.21" { inherit profileName; }; + tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.3.0" { inherit profileName; }; + toml = rustPackages."registry+https://github.com/rust-lang/crates.io-index".toml."0.5.8" { inherit profileName; }; + }; + }); + + "unknown".garage_api."0.3.0" = overridableMkRustCrate (profileName: rec { + name = "garage_api"; + version = "0.3.0"; + registry = "unknown"; + src = fetchCrateLocal (workspaceSrc + "/src/api"); + dependencies = { + base64 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.13.0" { inherit profileName; }; + bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.0.1" { inherit profileName; }; + chrono = rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.19" { inherit profileName; }; + crypto_mac = rustPackages."registry+https://github.com/rust-lang/crates.io-index".crypto-mac."0.10.0" { inherit profileName; }; + err_derive = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".err-derive."0.3.0" { profileName = "__noProfile"; }; + futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.13" { inherit profileName; }; + futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.13" { inherit profileName; }; + garage_model = rustPackages."unknown".garage_model."0.3.0" { inherit profileName; }; + garage_table = rustPackages."unknown".garage_table."0.3.0" { inherit profileName; }; + garage_util = rustPackages."unknown".garage_util."0.3.0" { inherit profileName; }; + hex = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }; + hmac = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hmac."0.10.1" { inherit profileName; }; + http = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.3" { inherit profileName; }; + http_range = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-range."0.1.4" { inherit profileName; }; + httpdate = rustPackages."registry+https://github.com/rust-lang/crates.io-index".httpdate."0.3.2" { inherit profileName; }; + hyper = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.4" { inherit profileName; }; + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + md5 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".md-5."0.9.1" { inherit profileName; }; + percent_encoding = rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.1.0" { inherit profileName; }; + quick_xml = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quick-xml."0.21.0" { inherit profileName; }; + roxmltree = rustPackages."registry+https://github.com/rust-lang/crates.io-index".roxmltree."0.14.0" { inherit profileName; }; + serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.124" { inherit profileName; }; + sha2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.9.3" { inherit profileName; }; + tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.3.0" { inherit profileName; }; + url = rustPackages."registry+https://github.com/rust-lang/crates.io-index".url."2.2.1" { inherit profileName; }; + }; + }); + + "unknown".garage_model."0.3.0" = overridableMkRustCrate (profileName: rec { + name = "garage_model"; + version = "0.3.0"; + registry = "unknown"; + src = fetchCrateLocal (workspaceSrc + "/src/model"); + dependencies = { + arc_swap = rustPackages."registry+https://github.com/rust-lang/crates.io-index".arc-swap."1.2.0" { inherit profileName; }; + futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.13" { inherit profileName; }; + futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.13" { inherit profileName; }; + garage_rpc = rustPackages."unknown".garage_rpc."0.3.0" { inherit profileName; }; + garage_table = rustPackages."unknown".garage_table."0.3.0" { inherit profileName; }; + garage_util = rustPackages."unknown".garage_util."0.3.0" { inherit profileName; }; + hex = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }; + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + rand = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.3" { inherit profileName; }; + rmp_serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rmp-serde."0.15.4" { inherit profileName; }; + serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.124" { inherit profileName; }; + serde_bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_bytes."0.11.5" { inherit profileName; }; + sled = rustPackages."registry+https://github.com/rust-lang/crates.io-index".sled."0.34.6" { inherit profileName; }; + tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.3.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".garage_rpc."0.2.1" = overridableMkRustCrate (profileName: rec { + name = "garage_rpc"; + version = "0.2.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "48c182633cebe4abed9594afb14770fc45402513765d38a4b19659ae0ccb2a2f"; }; + dependencies = { + arc_swap = rustPackages."registry+https://github.com/rust-lang/crates.io-index".arc-swap."1.2.0" { inherit profileName; }; + bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.0.1" { inherit profileName; }; + futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.13" { inherit profileName; }; + futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.13" { inherit profileName; }; + garage_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".garage_util."0.2.1" { inherit profileName; }; + gethostname = rustPackages."registry+https://github.com/rust-lang/crates.io-index".gethostname."0.2.1" { inherit profileName; }; + hex = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }; + http = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.3" { inherit profileName; }; + hyper = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.4" { inherit profileName; }; + hyper_rustls = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.22.1" { inherit profileName; }; + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + rmp_serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rmp-serde."0.15.4" { inherit profileName; }; + rustls = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.19.0" { inherit profileName; }; + serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.124" { inherit profileName; }; + serde_json = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.64" { inherit profileName; }; + tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.3.0" { inherit profileName; }; + tokio_rustls = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-rustls."0.22.0" { inherit profileName; }; + tokio_stream = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-stream."0.1.4" { inherit profileName; }; + webpki = rustPackages."registry+https://github.com/rust-lang/crates.io-index".webpki."0.21.4" { inherit profileName; }; + }; + }); + + "unknown".garage_rpc."0.3.0" = overridableMkRustCrate (profileName: rec { + name = "garage_rpc"; + version = "0.3.0"; + registry = "unknown"; + src = fetchCrateLocal (workspaceSrc + "/src/rpc"); + dependencies = { + arc_swap = rustPackages."registry+https://github.com/rust-lang/crates.io-index".arc-swap."1.2.0" { inherit profileName; }; + bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.0.1" { inherit profileName; }; + futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.13" { inherit profileName; }; + futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.13" { inherit profileName; }; + garage_rpc_021 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".garage_rpc."0.2.1" { inherit profileName; }; + garage_util = rustPackages."unknown".garage_util."0.3.0" { inherit profileName; }; + gethostname = rustPackages."registry+https://github.com/rust-lang/crates.io-index".gethostname."0.2.1" { inherit profileName; }; + hex = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }; + http = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.3" { inherit profileName; }; + hyper = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.4" { inherit profileName; }; + hyper_rustls = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.22.1" { inherit profileName; }; + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + rmp_serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rmp-serde."0.15.4" { inherit profileName; }; + rustls = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.19.0" { inherit profileName; }; + serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.124" { inherit profileName; }; + serde_json = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.64" { inherit profileName; }; + tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.3.0" { inherit profileName; }; + tokio_rustls = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-rustls."0.22.0" { inherit profileName; }; + tokio_stream = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-stream."0.1.4" { inherit profileName; }; + webpki = rustPackages."registry+https://github.com/rust-lang/crates.io-index".webpki."0.21.4" { inherit profileName; }; + }; + }); + + "unknown".garage_table."0.3.0" = overridableMkRustCrate (profileName: rec { + name = "garage_table"; + version = "0.3.0"; + registry = "unknown"; + src = fetchCrateLocal (workspaceSrc + "/src/table"); + dependencies = { + bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.0.1" { inherit profileName; }; + futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.13" { inherit profileName; }; + futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.13" { inherit profileName; }; + garage_rpc = rustPackages."unknown".garage_rpc."0.3.0" { inherit profileName; }; + garage_util = rustPackages."unknown".garage_util."0.3.0" { inherit profileName; }; + hexdump = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hexdump."0.1.1" { inherit profileName; }; + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + rand = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.3" { inherit profileName; }; + rmp_serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rmp-serde."0.15.4" { inherit profileName; }; + serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.124" { inherit profileName; }; + serde_bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_bytes."0.11.5" { inherit profileName; }; + sled = rustPackages."registry+https://github.com/rust-lang/crates.io-index".sled."0.34.6" { inherit profileName; }; + tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.3.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".garage_util."0.2.1" = overridableMkRustCrate (profileName: rec { + name = "garage_util"; + version = "0.2.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "aef76d3779e406a16fdcaffe8d86b8ae2943a549d2b33f2c20930838764464c0"; }; + dependencies = { + blake2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".blake2."0.9.1" { inherit profileName; }; + chrono = rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.19" { inherit profileName; }; + err_derive = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".err-derive."0.3.0" { profileName = "__noProfile"; }; + futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.13" { inherit profileName; }; + hex = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }; + http = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.3" { inherit profileName; }; + hyper = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.4" { inherit profileName; }; + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + rand = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.3" { inherit profileName; }; + rmp_serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rmp-serde."0.15.4" { inherit profileName; }; + rustls = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.19.0" { inherit profileName; }; + serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.124" { inherit profileName; }; + serde_json = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.64" { inherit profileName; }; + sha2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.9.3" { inherit profileName; }; + sled = rustPackages."registry+https://github.com/rust-lang/crates.io-index".sled."0.34.6" { inherit profileName; }; + tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.3.0" { inherit profileName; }; + toml = rustPackages."registry+https://github.com/rust-lang/crates.io-index".toml."0.5.8" { inherit profileName; }; + webpki = rustPackages."registry+https://github.com/rust-lang/crates.io-index".webpki."0.21.4" { inherit profileName; }; + xxhash_rust = rustPackages."registry+https://github.com/rust-lang/crates.io-index".xxhash-rust."0.8.2" { inherit profileName; }; + }; + }); + + "unknown".garage_util."0.3.0" = overridableMkRustCrate (profileName: rec { + name = "garage_util"; + version = "0.3.0"; + registry = "unknown"; + src = fetchCrateLocal (workspaceSrc + "/src/util"); + dependencies = { + blake2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".blake2."0.9.1" { inherit profileName; }; + chrono = rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.19" { inherit profileName; }; + err_derive = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".err-derive."0.3.0" { profileName = "__noProfile"; }; + futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.13" { inherit profileName; }; + hex = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }; + http = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.3" { inherit profileName; }; + hyper = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.4" { inherit profileName; }; + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + rand = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.3" { inherit profileName; }; + rmp_serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rmp-serde."0.15.4" { inherit profileName; }; + rustls = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.19.0" { inherit profileName; }; + serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.124" { inherit profileName; }; + serde_json = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.64" { inherit profileName; }; + sha2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.9.3" { inherit profileName; }; + sled = rustPackages."registry+https://github.com/rust-lang/crates.io-index".sled."0.34.6" { inherit profileName; }; + tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.3.0" { inherit profileName; }; + toml = rustPackages."registry+https://github.com/rust-lang/crates.io-index".toml."0.5.8" { inherit profileName; }; + webpki = rustPackages."registry+https://github.com/rust-lang/crates.io-index".webpki."0.21.4" { inherit profileName; }; + xxhash_rust = rustPackages."registry+https://github.com/rust-lang/crates.io-index".xxhash-rust."0.8.2" { inherit profileName; }; + }; + }); + + "unknown".garage_web."0.3.0" = overridableMkRustCrate (profileName: rec { + name = "garage_web"; + version = "0.3.0"; + registry = "unknown"; + src = fetchCrateLocal (workspaceSrc + "/src/web"); + dependencies = { + err_derive = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".err-derive."0.3.0" { profileName = "__noProfile"; }; + futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.13" { inherit profileName; }; + garage_api = rustPackages."unknown".garage_api."0.3.0" { inherit profileName; }; + garage_model = rustPackages."unknown".garage_model."0.3.0" { inherit profileName; }; + garage_table = rustPackages."unknown".garage_table."0.3.0" { inherit profileName; }; + garage_util = rustPackages."unknown".garage_util."0.3.0" { inherit profileName; }; + http = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.3" { inherit profileName; }; + hyper = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.4" { inherit profileName; }; + idna = rustPackages."registry+https://github.com/rust-lang/crates.io-index".idna."0.2.2" { inherit profileName; }; + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + percent_encoding = rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.1.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".generic-array."0.14.4" = overridableMkRustCrate (profileName: rec { + name = "generic-array"; + version = "0.14.4"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817"; }; + dependencies = { + typenum = rustPackages."registry+https://github.com/rust-lang/crates.io-index".typenum."1.13.0" { inherit profileName; }; + }; + buildDependencies = { + version_check = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".version_check."0.9.3" { profileName = "__noProfile"; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".gethostname."0.2.1" = overridableMkRustCrate (profileName: rec { + name = "gethostname"; + version = "0.2.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "e692e296bfac1d2533ef168d0b60ff5897b8b70a4009276834014dd8924cc028"; }; + dependencies = { + ${ if !hostPlatform.isWindows then "libc" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.90" { inherit profileName; }; + ${ if hostPlatform.isWindows then "winapi" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".getrandom."0.2.2" = overridableMkRustCrate (profileName: rec { + name = "getrandom"; + version = "0.2.2"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8"; }; + features = builtins.concatLists [ + [ "std" ] + ]; + dependencies = { + cfg_if = rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }; + ${ if hostPlatform.isUnix then "libc" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.90" { inherit profileName; }; + ${ if hostPlatform.parsed.kernel.name == "wasi" then "wasi" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasi."0.10.2+wasi-snapshot-preview1" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".git-version."0.3.4" = overridableMkRustCrate (profileName: rec { + name = "git-version"; + version = "0.3.4"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "94918e83f1e01dedc2e361d00ce9487b14c58c7f40bab148026fa39d42cb41e2"; }; + dependencies = { + git_version_macro = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".git-version-macro."0.3.4" { profileName = "__noProfile"; }; + proc_macro_hack = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-hack."0.5.19" { profileName = "__noProfile"; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".git-version-macro."0.3.4" = overridableMkRustCrate (profileName: rec { + name = "git-version-macro"; + version = "0.3.4"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "34a97a52fdee1870a34fa6e4b77570cba531b27d1838874fef4429a791a3d657"; }; + dependencies = { + proc_macro_hack = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-hack."0.5.19" { profileName = "__noProfile"; }; + proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.24" { inherit profileName; }; + quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.9" { inherit profileName; }; + syn = rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.64" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".h2."0.3.1" = overridableMkRustCrate (profileName: rec { + name = "h2"; + version = "0.3.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "d832b01df74254fe364568d6ddc294443f61cbec82816b60904303af87efae78"; }; + dependencies = { + bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.0.1" { inherit profileName; }; + fnv = rustPackages."registry+https://github.com/rust-lang/crates.io-index".fnv."1.0.7" { inherit profileName; }; + futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.13" { inherit profileName; }; + futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.13" { inherit profileName; }; + futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.13" { inherit profileName; }; + http = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.3" { inherit profileName; }; + indexmap = rustPackages."registry+https://github.com/rust-lang/crates.io-index".indexmap."1.6.2" { inherit profileName; }; + slab = rustPackages."registry+https://github.com/rust-lang/crates.io-index".slab."0.4.2" { inherit profileName; }; + tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.3.0" { inherit profileName; }; + tokio_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.6.4" { inherit profileName; }; + tracing = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.25" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".hashbrown."0.9.1" = overridableMkRustCrate (profileName: rec { + name = "hashbrown"; + version = "0.9.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"; }; + features = builtins.concatLists [ + [ "raw" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".heck."0.3.2" = overridableMkRustCrate (profileName: rec { + name = "heck"; + version = "0.3.2"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac"; }; + dependencies = { + unicode_segmentation = rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-segmentation."1.7.1" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".hermit-abi."0.1.18" = overridableMkRustCrate (profileName: rec { + name = "hermit-abi"; + version = "0.1.18"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c"; }; + features = builtins.concatLists [ + [ "default" ] + ]; + dependencies = { + libc = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.90" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" = overridableMkRustCrate (profileName: rec { + name = "hex"; + version = "0.4.3"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"; }; + features = builtins.concatLists [ + [ "alloc" ] + [ "default" ] + [ "std" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".hexdump."0.1.1" = overridableMkRustCrate (profileName: rec { + name = "hexdump"; + version = "0.1.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "e40283dadb02f3af778878be1d717b17b4e4ab92e1d935ab03a730b0542905f2"; }; + dependencies = { + arrayvec = rustPackages."registry+https://github.com/rust-lang/crates.io-index".arrayvec."0.5.2" { inherit profileName; }; + itertools = rustPackages."registry+https://github.com/rust-lang/crates.io-index".itertools."0.4.19" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".hmac."0.10.1" = overridableMkRustCrate (profileName: rec { + name = "hmac"; + version = "0.10.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15"; }; + dependencies = { + crypto_mac = rustPackages."registry+https://github.com/rust-lang/crates.io-index".crypto-mac."0.10.0" { inherit profileName; }; + digest = rustPackages."registry+https://github.com/rust-lang/crates.io-index".digest."0.9.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".http."0.2.3" = overridableMkRustCrate (profileName: rec { + name = "http"; + version = "0.2.3"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "7245cd7449cc792608c3c8a9eaf69bd4eabbabf802713748fd739c98b82f0747"; }; + dependencies = { + bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.0.1" { inherit profileName; }; + fnv = rustPackages."registry+https://github.com/rust-lang/crates.io-index".fnv."1.0.7" { inherit profileName; }; + itoa = rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."0.4.7" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.0" = overridableMkRustCrate (profileName: rec { + name = "http-body"; + version = "0.4.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "2861bd27ee074e5ee891e8b539837a9430012e249d7f0ca2d795650f579c1994"; }; + dependencies = { + bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.0.1" { inherit profileName; }; + http = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.3" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".http-range."0.1.4" = overridableMkRustCrate (profileName: rec { + name = "http-range"; + version = "0.1.4"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "eee9694f83d9b7c09682fdb32213682939507884e5bcf227be9aff5d644b90dc"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".httparse."1.3.5" = overridableMkRustCrate (profileName: rec { + name = "httparse"; + version = "1.3.5"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "615caabe2c3160b313d52ccc905335f4ed5f10881dd63dc5699d47e90be85691"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".httpdate."0.3.2" = overridableMkRustCrate (profileName: rec { + name = "httpdate"; + version = "0.3.2"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".humantime."1.3.0" = overridableMkRustCrate (profileName: rec { + name = "humantime"; + version = "1.3.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"; }; + dependencies = { + quick_error = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quick-error."1.2.3" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.4" = overridableMkRustCrate (profileName: rec { + name = "hyper"; + version = "0.14.4"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "e8e946c2b1349055e0b72ae281b238baf1a3ea7307c7e9f9d64673bdd9c26ac7"; }; + features = builtins.concatLists [ + (lib.optional (rootFeatures' ? "garage" || rootFeatures' ? "garage_api" || rootFeatures' ? "garage_model" || rootFeatures' ? "garage_rpc" || rootFeatures' ? "garage_table" || rootFeatures' ? "garage_web") "client") + [ "default" ] + (lib.optional (rootFeatures' ? "garage" || rootFeatures' ? "garage_api" || rootFeatures' ? "garage_model" || rootFeatures' ? "garage_rpc" || rootFeatures' ? "garage_table" || rootFeatures' ? "garage_web") "full") + (lib.optional (rootFeatures' ? "garage" || rootFeatures' ? "garage_api" || rootFeatures' ? "garage_model" || rootFeatures' ? "garage_rpc" || rootFeatures' ? "garage_table" || rootFeatures' ? "garage_web") "h2") + (lib.optional (rootFeatures' ? "garage" || rootFeatures' ? "garage_api" || rootFeatures' ? "garage_model" || rootFeatures' ? "garage_rpc" || rootFeatures' ? "garage_table" || rootFeatures' ? "garage_web") "http1") + (lib.optional (rootFeatures' ? "garage" || rootFeatures' ? "garage_api" || rootFeatures' ? "garage_model" || rootFeatures' ? "garage_rpc" || rootFeatures' ? "garage_table" || rootFeatures' ? "garage_web") "http2") + (lib.optional (rootFeatures' ? "garage" || rootFeatures' ? "garage_api" || rootFeatures' ? "garage_model" || rootFeatures' ? "garage_rpc" || rootFeatures' ? "garage_table" || rootFeatures' ? "garage_web") "runtime") + (lib.optional (rootFeatures' ? "garage" || rootFeatures' ? "garage_api" || rootFeatures' ? "garage_model" || rootFeatures' ? "garage_rpc" || rootFeatures' ? "garage_table" || rootFeatures' ? "garage_web") "server") + (lib.optional (rootFeatures' ? "garage" || rootFeatures' ? "garage_api" || rootFeatures' ? "garage_model" || rootFeatures' ? "garage_rpc" || rootFeatures' ? "garage_table" || rootFeatures' ? "garage_web") "socket2") + (lib.optional (rootFeatures' ? "garage" || rootFeatures' ? "garage_api" || rootFeatures' ? "garage_model" || rootFeatures' ? "garage_rpc" || rootFeatures' ? "garage_table" || rootFeatures' ? "garage_web") "stream") + (lib.optional (rootFeatures' ? "garage" || rootFeatures' ? "garage_api" || rootFeatures' ? "garage_model" || rootFeatures' ? "garage_rpc" || rootFeatures' ? "garage_table" || rootFeatures' ? "garage_web") "tcp") + ]; + dependencies = { + bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.0.1" { inherit profileName; }; + futures_channel = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.13" { inherit profileName; }; + futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.13" { inherit profileName; }; + futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.13" { inherit profileName; }; + ${ if rootFeatures' ? "garage" || rootFeatures' ? "garage_api" || rootFeatures' ? "garage_model" || rootFeatures' ? "garage_rpc" || rootFeatures' ? "garage_table" || rootFeatures' ? "garage_web" then "h2" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".h2."0.3.1" { inherit profileName; }; + http = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.3" { inherit profileName; }; + http_body = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.0" { inherit profileName; }; + httparse = rustPackages."registry+https://github.com/rust-lang/crates.io-index".httparse."1.3.5" { inherit profileName; }; + httpdate = rustPackages."registry+https://github.com/rust-lang/crates.io-index".httpdate."0.3.2" { inherit profileName; }; + itoa = rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."0.4.7" { inherit profileName; }; + pin_project = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.0.5" { inherit profileName; }; + ${ if rootFeatures' ? "garage" || rootFeatures' ? "garage_api" || rootFeatures' ? "garage_model" || rootFeatures' ? "garage_rpc" || rootFeatures' ? "garage_table" || rootFeatures' ? "garage_web" then "socket2" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".socket2."0.3.19" { inherit profileName; }; + tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.3.0" { inherit profileName; }; + tower_service = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-service."0.3.1" { inherit profileName; }; + tracing = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.25" { inherit profileName; }; + want = rustPackages."registry+https://github.com/rust-lang/crates.io-index".want."0.3.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.22.1" = overridableMkRustCrate (profileName: rec { + name = "hyper-rustls"; + version = "0.22.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64"; }; + dependencies = { + futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.13" { inherit profileName; }; + hyper = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.4" { inherit profileName; }; + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + rustls = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.19.0" { inherit profileName; }; + tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.3.0" { inherit profileName; }; + tokio_rustls = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-rustls."0.22.0" { inherit profileName; }; + webpki = rustPackages."registry+https://github.com/rust-lang/crates.io-index".webpki."0.21.4" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".idna."0.2.2" = overridableMkRustCrate (profileName: rec { + name = "idna"; + version = "0.2.2"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "89829a5d69c23d348314a7ac337fe39173b61149a9864deabd260983aed48c21"; }; + dependencies = { + matches = rustPackages."registry+https://github.com/rust-lang/crates.io-index".matches."0.1.8" { inherit profileName; }; + unicode_bidi = rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-bidi."0.3.4" { inherit profileName; }; + unicode_normalization = rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-normalization."0.1.17" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".indexmap."1.6.2" = overridableMkRustCrate (profileName: rec { + name = "indexmap"; + version = "1.6.2"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3"; }; + features = builtins.concatLists [ + [ "std" ] + ]; + dependencies = { + hashbrown = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hashbrown."0.9.1" { inherit profileName; }; + }; + buildDependencies = { + autocfg = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".autocfg."1.0.1" { profileName = "__noProfile"; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".instant."0.1.9" = overridableMkRustCrate (profileName: rec { + name = "instant"; + version = "0.1.9"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec"; }; + dependencies = { + cfg_if = rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".itertools."0.4.19" = overridableMkRustCrate (profileName: rec { + name = "itertools"; + version = "0.4.19"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "c4a9b56eb56058f43dc66e58f40a214b2ccbc9f3df51861b63d51dec7b65bc3f"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".itoa."0.4.7" = overridableMkRustCrate (profileName: rec { + name = "itoa"; + version = "0.4.7"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".js-sys."0.3.49" = overridableMkRustCrate (profileName: rec { + name = "js-sys"; + version = "0.3.49"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "dc15e39392125075f60c95ba416f5381ff6c3a948ff02ab12464715adf56c821"; }; + dependencies = { + wasm_bindgen = rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen."0.2.72" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" = overridableMkRustCrate (profileName: rec { + name = "lazy_static"; + version = "1.4.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".libc."0.2.90" = overridableMkRustCrate (profileName: rec { + name = "libc"; + version = "0.2.90"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "ba4aede83fc3617411dc6993bc8c70919750c1c257c6ca6a502aed6e0e2394ae"; }; + features = builtins.concatLists [ + [ "align" ] + [ "default" ] + [ "std" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".lock_api."0.4.2" = overridableMkRustCrate (profileName: rec { + name = "lock_api"; + version = "0.4.2"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312"; }; + dependencies = { + scopeguard = rustPackages."registry+https://github.com/rust-lang/crates.io-index".scopeguard."1.1.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" = overridableMkRustCrate (profileName: rec { + name = "log"; + version = "0.4.14"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"; }; + features = builtins.concatLists [ + (lib.optional (rootFeatures' ? "garage") "std") + ]; + dependencies = { + cfg_if = rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".matches."0.1.8" = overridableMkRustCrate (profileName: rec { + name = "matches"; + version = "0.1.8"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".md-5."0.9.1" = overridableMkRustCrate (profileName: rec { + name = "md-5"; + version = "0.9.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "7b5a279bb9607f9f53c22d496eade00d138d1bdcccd07d74650387cf94942a15"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + dependencies = { + block_buffer = rustPackages."registry+https://github.com/rust-lang/crates.io-index".block-buffer."0.9.0" { inherit profileName; }; + digest = rustPackages."registry+https://github.com/rust-lang/crates.io-index".digest."0.9.0" { inherit profileName; }; + opaque_debug = rustPackages."registry+https://github.com/rust-lang/crates.io-index".opaque-debug."0.3.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".memchr."2.3.4" = overridableMkRustCrate (profileName: rec { + name = "memchr"; + version = "2.3.4"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + (lib.optional (rootFeatures' ? "garage") "use_std") + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".memoffset."0.6.1" = overridableMkRustCrate (profileName: rec { + name = "memoffset"; + version = "0.6.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87"; }; + features = builtins.concatLists [ + [ "default" ] + ]; + buildDependencies = { + autocfg = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".autocfg."1.0.1" { profileName = "__noProfile"; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".mio."0.7.10" = overridableMkRustCrate (profileName: rec { + name = "mio"; + version = "0.7.10"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "2182a122f3b7f3f5329cb1972cee089ba2459a0a80a56935e6e674f096f8d839"; }; + features = builtins.concatLists [ + [ "default" ] + [ "net" ] + [ "os-ext" ] + [ "os-poll" ] + [ "os-util" ] + [ "tcp" ] + [ "udp" ] + [ "uds" ] + ]; + dependencies = { + ${ if hostPlatform.isUnix then "libc" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.90" { inherit profileName; }; + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + ${ if hostPlatform.isWindows then "miow" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".miow."0.3.6" { inherit profileName; }; + ${ if hostPlatform.isWindows then "ntapi" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".ntapi."0.3.6" { inherit profileName; }; + ${ if hostPlatform.isWindows then "winapi" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".miow."0.3.6" = overridableMkRustCrate (profileName: rec { + name = "miow"; + version = "0.3.6"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "5a33c1b55807fbed163481b5ba66db4b2fa6cde694a5027be10fb724206c5897"; }; + dependencies = { + socket2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".socket2."0.3.19" { inherit profileName; }; + winapi = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".ntapi."0.3.6" = overridableMkRustCrate (profileName: rec { + name = "ntapi"; + version = "0.3.6"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44"; }; + features = builtins.concatLists [ + [ "default" ] + [ "user" ] + ]; + dependencies = { + winapi = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".num-integer."0.1.44" = overridableMkRustCrate (profileName: rec { + name = "num-integer"; + version = "0.1.44"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"; }; + dependencies = { + num_traits = rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.14" { inherit profileName; }; + }; + buildDependencies = { + autocfg = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".autocfg."1.0.1" { profileName = "__noProfile"; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.14" = overridableMkRustCrate (profileName: rec { + name = "num-traits"; + version = "0.2.14"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + buildDependencies = { + autocfg = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".autocfg."1.0.1" { profileName = "__noProfile"; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".num_cpus."1.13.0" = overridableMkRustCrate (profileName: rec { + name = "num_cpus"; + version = "1.13.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"; }; + dependencies = { + ${ if (hostPlatform.parsed.cpu.name == "x86_64" || hostPlatform.parsed.cpu.name == "aarch64") && hostPlatform.parsed.kernel.name == "hermit" then "hermit_abi" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hermit-abi."0.1.18" { inherit profileName; }; + libc = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.90" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".once_cell."1.7.2" = overridableMkRustCrate (profileName: rec { + name = "once_cell"; + version = "1.7.2"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3"; }; + features = builtins.concatLists [ + [ "alloc" ] + [ "default" ] + [ "race" ] + [ "std" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".opaque-debug."0.3.0" = overridableMkRustCrate (profileName: rec { + name = "opaque-debug"; + version = "0.3.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".parking_lot."0.11.1" = overridableMkRustCrate (profileName: rec { + name = "parking_lot"; + version = "0.11.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb"; }; + features = builtins.concatLists [ + [ "default" ] + ]; + dependencies = { + instant = rustPackages."registry+https://github.com/rust-lang/crates.io-index".instant."0.1.9" { inherit profileName; }; + lock_api = rustPackages."registry+https://github.com/rust-lang/crates.io-index".lock_api."0.4.2" { inherit profileName; }; + parking_lot_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".parking_lot_core."0.8.3" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".parking_lot_core."0.8.3" = overridableMkRustCrate (profileName: rec { + name = "parking_lot_core"; + version = "0.8.3"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018"; }; + dependencies = { + cfg_if = rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }; + instant = rustPackages."registry+https://github.com/rust-lang/crates.io-index".instant."0.1.9" { inherit profileName; }; + ${ if hostPlatform.isUnix then "libc" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.90" { inherit profileName; }; + ${ if hostPlatform.parsed.kernel.name == "redox" then "syscall" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".redox_syscall."0.2.5" { inherit profileName; }; + smallvec = rustPackages."registry+https://github.com/rust-lang/crates.io-index".smallvec."1.6.1" { inherit profileName; }; + ${ if hostPlatform.isWindows then "winapi" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.1.0" = overridableMkRustCrate (profileName: rec { + name = "percent-encoding"; + version = "2.1.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".pin-project."1.0.5" = overridableMkRustCrate (profileName: rec { + name = "pin-project"; + version = "1.0.5"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "96fa8ebb90271c4477f144354485b8068bd8f6b78b428b01ba892ca26caf0b63"; }; + dependencies = { + pin_project_internal = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-internal."1.0.5" { profileName = "__noProfile"; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".pin-project-internal."1.0.5" = overridableMkRustCrate (profileName: rec { + name = "pin-project-internal"; + version = "1.0.5"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "758669ae3558c6f74bd2a18b41f7ac0b5a195aea6639d6a9b5e5d1ad5ba24c0b"; }; + dependencies = { + proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.24" { inherit profileName; }; + quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.9" { inherit profileName; }; + syn = rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.64" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.6" = overridableMkRustCrate (profileName: rec { + name = "pin-project-lite"; + version = "0.2.6"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".pin-utils."0.1.0" = overridableMkRustCrate (profileName: rec { + name = "pin-utils"; + version = "0.1.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".ppv-lite86."0.2.10" = overridableMkRustCrate (profileName: rec { + name = "ppv-lite86"; + version = "0.2.10"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"; }; + features = builtins.concatLists [ + [ "simd" ] + [ "std" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".pretty_env_logger."0.4.0" = overridableMkRustCrate (profileName: rec { + name = "pretty_env_logger"; + version = "0.4.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d"; }; + dependencies = { + env_logger = rustPackages."registry+https://github.com/rust-lang/crates.io-index".env_logger."0.7.1" { inherit profileName; }; + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".proc-macro-error."1.0.4" = overridableMkRustCrate (profileName: rec { + name = "proc-macro-error"; + version = "1.0.4"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"; }; + features = builtins.concatLists [ + [ "default" ] + [ "syn" ] + [ "syn-error" ] + ]; + dependencies = { + proc_macro_error_attr = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-error-attr."1.0.4" { profileName = "__noProfile"; }; + proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.24" { inherit profileName; }; + quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.9" { inherit profileName; }; + syn = rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.64" { inherit profileName; }; + }; + buildDependencies = { + version_check = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".version_check."0.9.3" { profileName = "__noProfile"; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".proc-macro-error-attr."1.0.4" = overridableMkRustCrate (profileName: rec { + name = "proc-macro-error-attr"; + version = "1.0.4"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"; }; + dependencies = { + proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.24" { inherit profileName; }; + quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.9" { inherit profileName; }; + }; + buildDependencies = { + version_check = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".version_check."0.9.3" { profileName = "__noProfile"; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".proc-macro-hack."0.5.19" = overridableMkRustCrate (profileName: rec { + name = "proc-macro-hack"; + version = "0.5.19"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".proc-macro-nested."0.1.7" = overridableMkRustCrate (profileName: rec { + name = "proc-macro-nested"; + version = "0.1.7"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.24" = overridableMkRustCrate (profileName: rec { + name = "proc-macro2"; + version = "1.0.24"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"; }; + features = builtins.concatLists [ + [ "default" ] + [ "proc-macro" ] + ]; + dependencies = { + unicode_xid = rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-xid."0.2.1" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".quick-error."1.2.3" = overridableMkRustCrate (profileName: rec { + name = "quick-error"; + version = "1.2.3"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".quick-xml."0.21.0" = overridableMkRustCrate (profileName: rec { + name = "quick-xml"; + version = "0.21.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "0452695941410a58c8ce4391707ba9bad26a247173bd9886a05a5e8a8babec75"; }; + features = builtins.concatLists [ + [ "default" ] + [ "serde" ] + [ "serialize" ] + ]; + dependencies = { + memchr = rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.3.4" { inherit profileName; }; + serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.124" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".quote."1.0.9" = overridableMkRustCrate (profileName: rec { + name = "quote"; + version = "1.0.9"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"; }; + features = builtins.concatLists [ + [ "default" ] + [ "proc-macro" ] + ]; + dependencies = { + proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.24" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".rand."0.8.3" = overridableMkRustCrate (profileName: rec { + name = "rand"; + version = "0.8.3"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e"; }; + features = builtins.concatLists [ + [ "alloc" ] + [ "default" ] + [ "getrandom" ] + [ "libc" ] + [ "rand_chacha" ] + [ "rand_hc" ] + [ "std" ] + [ "std_rng" ] + ]; + dependencies = { + ${ if hostPlatform.isUnix then "libc" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.90" { inherit profileName; }; + ${ if !(hostPlatform.parsed.kernel.name == "emscripten") then "rand_chacha" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand_chacha."0.3.0" { inherit profileName; }; + rand_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand_core."0.6.2" { inherit profileName; }; + ${ if hostPlatform.parsed.kernel.name == "emscripten" then "rand_hc" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand_hc."0.3.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".rand_chacha."0.3.0" = overridableMkRustCrate (profileName: rec { + name = "rand_chacha"; + version = "0.3.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d"; }; + features = builtins.concatLists [ + [ "std" ] + ]; + dependencies = { + ppv_lite86 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".ppv-lite86."0.2.10" { inherit profileName; }; + rand_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand_core."0.6.2" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".rand_core."0.6.2" = overridableMkRustCrate (profileName: rec { + name = "rand_core"; + version = "0.6.2"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7"; }; + features = builtins.concatLists [ + [ "alloc" ] + [ "getrandom" ] + [ "std" ] + ]; + dependencies = { + getrandom = rustPackages."registry+https://github.com/rust-lang/crates.io-index".getrandom."0.2.2" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".rand_hc."0.3.0" = overridableMkRustCrate (profileName: rec { + name = "rand_hc"; + version = "0.3.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73"; }; + dependencies = { + rand_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand_core."0.6.2" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".redox_syscall."0.2.5" = overridableMkRustCrate (profileName: rec { + name = "redox_syscall"; + version = "0.2.5"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9"; }; + dependencies = { + bitflags = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."1.2.1" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".regex."1.4.5" = overridableMkRustCrate (profileName: rec { + name = "regex"; + version = "1.4.5"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "957056ecddbeba1b26965114e191d2e8589ce74db242b6ea25fc4062427a5c19"; }; + features = builtins.concatLists [ + [ "aho-corasick" ] + [ "default" ] + [ "memchr" ] + [ "perf" ] + [ "perf-cache" ] + [ "perf-dfa" ] + [ "perf-inline" ] + [ "perf-literal" ] + [ "std" ] + [ "unicode" ] + [ "unicode-age" ] + [ "unicode-bool" ] + [ "unicode-case" ] + [ "unicode-gencat" ] + [ "unicode-perl" ] + [ "unicode-script" ] + [ "unicode-segment" ] + ]; + dependencies = { + aho_corasick = rustPackages."registry+https://github.com/rust-lang/crates.io-index".aho-corasick."0.7.15" { inherit profileName; }; + memchr = rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.3.4" { inherit profileName; }; + regex_syntax = rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex-syntax."0.6.23" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".regex-syntax."0.6.23" = overridableMkRustCrate (profileName: rec { + name = "regex-syntax"; + version = "0.6.23"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "24d5f089152e60f62d28b835fbff2cd2e8dc0baf1ac13343bef92ab7eed84548"; }; + features = builtins.concatLists [ + [ "default" ] + [ "unicode" ] + [ "unicode-age" ] + [ "unicode-bool" ] + [ "unicode-case" ] + [ "unicode-gencat" ] + [ "unicode-perl" ] + [ "unicode-script" ] + [ "unicode-segment" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".ring."0.16.20" = overridableMkRustCrate (profileName: rec { + name = "ring"; + version = "0.16.20"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"; }; + features = builtins.concatLists [ + [ "alloc" ] + [ "default" ] + [ "dev_urandom_fallback" ] + [ "once_cell" ] + ]; + dependencies = { + ${ if hostPlatform.parsed.kernel.name == "android" || hostPlatform.parsed.kernel.name == "linux" then "libc" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.90" { inherit profileName; }; + ${ if hostPlatform.parsed.kernel.name == "dragonfly" || hostPlatform.parsed.kernel.name == "freebsd" || hostPlatform.parsed.kernel.name == "illumos" || hostPlatform.parsed.kernel.name == "netbsd" || hostPlatform.parsed.kernel.name == "openbsd" || hostPlatform.parsed.kernel.name == "solaris" || hostPlatform.parsed.kernel.name == "android" || hostPlatform.parsed.kernel.name == "linux" then "once_cell" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.7.2" { inherit profileName; }; + ${ if hostPlatform.parsed.cpu.name == "i686" || hostPlatform.parsed.cpu.name == "x86_64" || (hostPlatform.parsed.cpu.name == "aarch64" || hostPlatform.parsed.cpu.name == "arm" || hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l") && (hostPlatform.parsed.kernel.name == "android" || hostPlatform.parsed.kernel.name == "fuchsia" || hostPlatform.parsed.kernel.name == "linux") then "spin" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".spin."0.5.2" { inherit profileName; }; + untrusted = rustPackages."registry+https://github.com/rust-lang/crates.io-index".untrusted."0.7.1" { inherit profileName; }; + ${ if hostPlatform.parsed.cpu.name == "wasm32" && hostPlatform.parsed.vendor.name == "unknown" && hostPlatform.parsed.kernel.name == "unknown" && hostPlatform.parsed.abi.name == "" then "web_sys" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".web-sys."0.3.49" { inherit profileName; }; + ${ if hostPlatform.parsed.kernel.name == "windows" then "winapi" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }; + }; + buildDependencies = { + cc = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".cc."1.0.67" { profileName = "__noProfile"; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".rmp."0.8.10" = overridableMkRustCrate (profileName: rec { + name = "rmp"; + version = "0.8.10"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "4f55e5fa1446c4d5dd1f5daeed2a4fe193071771a2636274d0d7a3b082aa7ad6"; }; + dependencies = { + byteorder = rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.4.3" { inherit profileName; }; + num_traits = rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.14" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".rmp-serde."0.15.4" = overridableMkRustCrate (profileName: rec { + name = "rmp-serde"; + version = "0.15.4"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "839395ef53057db96b84c9238ab29e1a13f2e5c8ec9f66bef853ab4197303924"; }; + dependencies = { + byteorder = rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.4.3" { inherit profileName; }; + rmp = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rmp."0.8.10" { inherit profileName; }; + serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.124" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".roxmltree."0.14.0" = overridableMkRustCrate (profileName: rec { + name = "roxmltree"; + version = "0.14.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "bf58a7d05b28e14b1e8902fa04c4d5d6109f5450ef71a5e6597f66e53f541504"; }; + dependencies = { + xmlparser = rustPackages."registry+https://github.com/rust-lang/crates.io-index".xmlparser."0.13.3" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".rustls."0.19.0" = overridableMkRustCrate (profileName: rec { + name = "rustls"; + version = "0.19.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "064fd21ff87c6e87ed4506e68beb42459caa4a0e2eb144932e6776768556980b"; }; + features = builtins.concatLists [ + [ "default" ] + [ "log" ] + [ "logging" ] + ]; + dependencies = { + base64 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.13.0" { inherit profileName; }; + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + ring = rustPackages."registry+https://github.com/rust-lang/crates.io-index".ring."0.16.20" { inherit profileName; }; + sct = rustPackages."registry+https://github.com/rust-lang/crates.io-index".sct."0.6.0" { inherit profileName; }; + webpki = rustPackages."registry+https://github.com/rust-lang/crates.io-index".webpki."0.21.4" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".rustversion."1.0.4" = overridableMkRustCrate (profileName: rec { + name = "rustversion"; + version = "1.0.4"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "cb5d2a036dc6d2d8fd16fde3498b04306e29bd193bf306a57427019b823d5acd"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".ryu."1.0.5" = overridableMkRustCrate (profileName: rec { + name = "ryu"; + version = "1.0.5"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".scopeguard."1.1.0" = overridableMkRustCrate (profileName: rec { + name = "scopeguard"; + version = "1.1.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".sct."0.6.0" = overridableMkRustCrate (profileName: rec { + name = "sct"; + version = "0.6.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c"; }; + dependencies = { + ring = rustPackages."registry+https://github.com/rust-lang/crates.io-index".ring."0.16.20" { inherit profileName; }; + untrusted = rustPackages."registry+https://github.com/rust-lang/crates.io-index".untrusted."0.7.1" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".serde."1.0.124" = overridableMkRustCrate (profileName: rec { + name = "serde"; + version = "1.0.124"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "bd761ff957cb2a45fbb9ab3da6512de9de55872866160b23c25f1a841e99d29f"; }; + features = builtins.concatLists [ + [ "default" ] + [ "derive" ] + [ "rc" ] + [ "serde_derive" ] + [ "std" ] + ]; + dependencies = { + serde_derive = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_derive."1.0.124" { profileName = "__noProfile"; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".serde_bytes."0.11.5" = overridableMkRustCrate (profileName: rec { + name = "serde_bytes"; + version = "0.11.5"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + dependencies = { + serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.124" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".serde_derive."1.0.124" = overridableMkRustCrate (profileName: rec { + name = "serde_derive"; + version = "1.0.124"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "1800f7693e94e186f5e25a28291ae1570da908aff7d97a095dec1e56ff99069b"; }; + features = builtins.concatLists [ + [ "default" ] + ]; + dependencies = { + proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.24" { inherit profileName; }; + quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.9" { inherit profileName; }; + syn = rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.64" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.64" = overridableMkRustCrate (profileName: rec { + name = "serde_json"; + version = "1.0.64"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + dependencies = { + itoa = rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."0.4.7" { inherit profileName; }; + ryu = rustPackages."registry+https://github.com/rust-lang/crates.io-index".ryu."1.0.5" { inherit profileName; }; + serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.124" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".sha2."0.9.3" = overridableMkRustCrate (profileName: rec { + name = "sha2"; + version = "0.9.3"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "fa827a14b29ab7f44778d14a88d3cb76e949c45083f7dbfa507d0cb699dc12de"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + dependencies = { + block_buffer = rustPackages."registry+https://github.com/rust-lang/crates.io-index".block-buffer."0.9.0" { inherit profileName; }; + cfg_if = rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }; + ${ if hostPlatform.parsed.cpu.name == "i686" || hostPlatform.parsed.cpu.name == "x86_64" then "cpuid_bool" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".cpuid-bool."0.1.2" { inherit profileName; }; + digest = rustPackages."registry+https://github.com/rust-lang/crates.io-index".digest."0.9.0" { inherit profileName; }; + opaque_debug = rustPackages."registry+https://github.com/rust-lang/crates.io-index".opaque-debug."0.3.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".signal-hook-registry."1.3.0" = overridableMkRustCrate (profileName: rec { + name = "signal-hook-registry"; + version = "1.3.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "16f1d0fef1604ba8f7a073c7e701f213e056707210e9020af4528e0101ce11a6"; }; + dependencies = { + libc = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.90" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".slab."0.4.2" = overridableMkRustCrate (profileName: rec { + name = "slab"; + version = "0.4.2"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".sled."0.34.6" = overridableMkRustCrate (profileName: rec { + name = "sled"; + version = "0.34.6"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "1d0132f3e393bcb7390c60bb45769498cf4550bcb7a21d7f95c02b69f6362cdc"; }; + features = builtins.concatLists [ + [ "default" ] + [ "no_metrics" ] + ]; + dependencies = { + crc32fast = rustPackages."registry+https://github.com/rust-lang/crates.io-index".crc32fast."1.2.1" { inherit profileName; }; + crossbeam_epoch = rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-epoch."0.9.3" { inherit profileName; }; + crossbeam_utils = rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-utils."0.8.3" { inherit profileName; }; + ${ if hostPlatform.parsed.kernel.name == "linux" || hostPlatform.parsed.kernel.name == "darwin" || hostPlatform.parsed.kernel.name == "windows" then "fs2" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".fs2."0.4.3" { inherit profileName; }; + fxhash = rustPackages."registry+https://github.com/rust-lang/crates.io-index".fxhash."0.2.1" { inherit profileName; }; + libc = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.90" { inherit profileName; }; + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + parking_lot = rustPackages."registry+https://github.com/rust-lang/crates.io-index".parking_lot."0.11.1" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".smallvec."1.6.1" = overridableMkRustCrate (profileName: rec { + name = "smallvec"; + version = "1.6.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".socket2."0.3.19" = overridableMkRustCrate (profileName: rec { + name = "socket2"; + version = "0.3.19"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e"; }; + dependencies = { + ${ if hostPlatform.isUnix then "cfg_if" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }; + ${ if hostPlatform.isUnix then "libc" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.90" { inherit profileName; }; + ${ if hostPlatform.isWindows then "winapi" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".spin."0.5.2" = overridableMkRustCrate (profileName: rec { + name = "spin"; + version = "0.5.2"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".structopt."0.3.21" = overridableMkRustCrate (profileName: rec { + name = "structopt"; + version = "0.3.21"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "5277acd7ee46e63e5168a80734c9f6ee81b1367a7d8772a2d765df2a3705d28c"; }; + dependencies = { + clap = rustPackages."registry+https://github.com/rust-lang/crates.io-index".clap."2.33.3" { inherit profileName; }; + lazy_static = rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; }; + structopt_derive = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".structopt-derive."0.4.14" { profileName = "__noProfile"; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".structopt-derive."0.4.14" = overridableMkRustCrate (profileName: rec { + name = "structopt-derive"; + version = "0.4.14"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "5ba9cdfda491b814720b6b06e0cac513d922fc407582032e8706e9f137976f90"; }; + dependencies = { + heck = rustPackages."registry+https://github.com/rust-lang/crates.io-index".heck."0.3.2" { inherit profileName; }; + proc_macro_error = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-error."1.0.4" { inherit profileName; }; + proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.24" { inherit profileName; }; + quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.9" { inherit profileName; }; + syn = rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.64" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".subtle."2.4.0" = overridableMkRustCrate (profileName: rec { + name = "subtle"; + version = "2.4.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".syn."1.0.64" = overridableMkRustCrate (profileName: rec { + name = "syn"; + version = "1.0.64"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "3fd9d1e9976102a03c542daa2eff1b43f9d72306342f3f8b3ed5fb8908195d6f"; }; + features = builtins.concatLists [ + [ "clone-impls" ] + [ "default" ] + [ "derive" ] + [ "extra-traits" ] + [ "full" ] + [ "parsing" ] + [ "printing" ] + [ "proc-macro" ] + [ "quote" ] + [ "visit" ] + [ "visit-mut" ] + ]; + dependencies = { + proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.24" { inherit profileName; }; + quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.9" { inherit profileName; }; + unicode_xid = rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-xid."0.2.1" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".synstructure."0.12.4" = overridableMkRustCrate (profileName: rec { + name = "synstructure"; + version = "0.12.4"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701"; }; + features = builtins.concatLists [ + [ "default" ] + [ "proc-macro" ] + ]; + dependencies = { + proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.24" { inherit profileName; }; + quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.9" { inherit profileName; }; + syn = rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.64" { inherit profileName; }; + unicode_xid = rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-xid."0.2.1" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".termcolor."1.1.2" = overridableMkRustCrate (profileName: rec { + name = "termcolor"; + version = "1.1.2"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4"; }; + dependencies = { + ${ if hostPlatform.isWindows then "winapi_util" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi-util."0.1.5" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".textwrap."0.11.0" = overridableMkRustCrate (profileName: rec { + name = "textwrap"; + version = "0.11.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"; }; + dependencies = { + unicode_width = rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-width."0.1.8" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".time."0.1.43" = overridableMkRustCrate (profileName: rec { + name = "time"; + version = "0.1.43"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438"; }; + dependencies = { + libc = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.90" { inherit profileName; }; + ${ if hostPlatform.isWindows then "winapi" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".tinyvec."1.1.1" = overridableMkRustCrate (profileName: rec { + name = "tinyvec"; + version = "1.1.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023"; }; + features = builtins.concatLists [ + [ "alloc" ] + [ "default" ] + [ "tinyvec_macros" ] + ]; + dependencies = { + tinyvec_macros = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tinyvec_macros."0.1.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".tinyvec_macros."0.1.0" = overridableMkRustCrate (profileName: rec { + name = "tinyvec_macros"; + version = "0.1.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".tokio."1.3.0" = overridableMkRustCrate (profileName: rec { + name = "tokio"; + version = "1.3.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "8d56477f6ed99e10225f38f9f75f872f29b8b8bd8c0b946f63345bb144e9eeda"; }; + features = builtins.concatLists [ + [ "bytes" ] + [ "default" ] + [ "fs" ] + [ "io-util" ] + [ "libc" ] + [ "macros" ] + [ "memchr" ] + [ "mio" ] + [ "net" ] + [ "num_cpus" ] + [ "once_cell" ] + [ "rt" ] + [ "rt-multi-thread" ] + [ "signal" ] + [ "signal-hook-registry" ] + [ "sync" ] + [ "time" ] + [ "tokio-macros" ] + [ "winapi" ] + ]; + dependencies = { + bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.0.1" { inherit profileName; }; + ${ if hostPlatform.isUnix then "libc" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.90" { inherit profileName; }; + memchr = rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.3.4" { inherit profileName; }; + mio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".mio."0.7.10" { inherit profileName; }; + num_cpus = rustPackages."registry+https://github.com/rust-lang/crates.io-index".num_cpus."1.13.0" { inherit profileName; }; + once_cell = rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.7.2" { inherit profileName; }; + pin_project_lite = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.6" { inherit profileName; }; + ${ if hostPlatform.isUnix then "signal_hook_registry" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".signal-hook-registry."1.3.0" { inherit profileName; }; + tokio_macros = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-macros."1.1.0" { profileName = "__noProfile"; }; + ${ if hostPlatform.isWindows then "winapi" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }; + }; + buildDependencies = { + autocfg = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".autocfg."1.0.1" { profileName = "__noProfile"; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".tokio-macros."1.1.0" = overridableMkRustCrate (profileName: rec { + name = "tokio-macros"; + version = "1.1.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "caf7b11a536f46a809a8a9f0bb4237020f70ecbf115b842360afb127ea2fda57"; }; + dependencies = { + proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.24" { inherit profileName; }; + quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.9" { inherit profileName; }; + syn = rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.64" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".tokio-rustls."0.22.0" = overridableMkRustCrate (profileName: rec { + name = "tokio-rustls"; + version = "0.22.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6"; }; + dependencies = { + rustls = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.19.0" { inherit profileName; }; + tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.3.0" { inherit profileName; }; + webpki = rustPackages."registry+https://github.com/rust-lang/crates.io-index".webpki."0.21.4" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".tokio-stream."0.1.4" = overridableMkRustCrate (profileName: rec { + name = "tokio-stream"; + version = "0.1.4"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "c535f53c0cfa1acace62995a8994fc9cc1f12d202420da96ff306ee24d576469"; }; + features = builtins.concatLists [ + [ "default" ] + [ "net" ] + [ "time" ] + ]; + dependencies = { + futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.13" { inherit profileName; }; + pin_project_lite = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.6" { inherit profileName; }; + tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.3.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.6.4" = overridableMkRustCrate (profileName: rec { + name = "tokio-util"; + version = "0.6.4"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "ec31e5cc6b46e653cf57762f36f71d5e6386391d88a72fd6db4508f8f676fb29"; }; + features = builtins.concatLists [ + [ "codec" ] + [ "default" ] + ]; + dependencies = { + bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.0.1" { inherit profileName; }; + futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.13" { inherit profileName; }; + futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.13" { inherit profileName; }; + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + pin_project_lite = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.6" { inherit profileName; }; + tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.3.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".toml."0.5.8" = overridableMkRustCrate (profileName: rec { + name = "toml"; + version = "0.5.8"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa"; }; + features = builtins.concatLists [ + [ "default" ] + ]; + dependencies = { + serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.124" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".tower-service."0.3.1" = overridableMkRustCrate (profileName: rec { + name = "tower-service"; + version = "0.3.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.25" = overridableMkRustCrate (profileName: rec { + name = "tracing"; + version = "0.1.25"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f"; }; + features = builtins.concatLists [ + [ "std" ] + ]; + dependencies = { + cfg_if = rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }; + pin_project_lite = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.6" { inherit profileName; }; + tracing_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-core."0.1.17" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".tracing-core."0.1.17" = overridableMkRustCrate (profileName: rec { + name = "tracing-core"; + version = "0.1.17"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f"; }; + features = builtins.concatLists [ + [ "lazy_static" ] + [ "std" ] + ]; + dependencies = { + lazy_static = rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".try-lock."0.2.3" = overridableMkRustCrate (profileName: rec { + name = "try-lock"; + version = "0.2.3"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".typenum."1.13.0" = overridableMkRustCrate (profileName: rec { + name = "typenum"; + version = "1.13.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".unicode-bidi."0.3.4" = overridableMkRustCrate (profileName: rec { + name = "unicode-bidi"; + version = "0.3.4"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"; }; + features = builtins.concatLists [ + [ "default" ] + ]; + dependencies = { + matches = rustPackages."registry+https://github.com/rust-lang/crates.io-index".matches."0.1.8" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".unicode-normalization."0.1.17" = overridableMkRustCrate (profileName: rec { + name = "unicode-normalization"; + version = "0.1.17"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + dependencies = { + tinyvec = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tinyvec."1.1.1" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".unicode-segmentation."1.7.1" = overridableMkRustCrate (profileName: rec { + name = "unicode-segmentation"; + version = "1.7.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".unicode-width."0.1.8" = overridableMkRustCrate (profileName: rec { + name = "unicode-width"; + version = "0.1.8"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"; }; + features = builtins.concatLists [ + [ "default" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".unicode-xid."0.2.1" = overridableMkRustCrate (profileName: rec { + name = "unicode-xid"; + version = "0.2.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"; }; + features = builtins.concatLists [ + [ "default" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".untrusted."0.7.1" = overridableMkRustCrate (profileName: rec { + name = "untrusted"; + version = "0.7.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".url."2.2.1" = overridableMkRustCrate (profileName: rec { + name = "url"; + version = "2.2.1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "9ccd964113622c8e9322cfac19eb1004a07e636c545f325da085d5cdde6f1f8b"; }; + dependencies = { + form_urlencoded = rustPackages."registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.0.1" { inherit profileName; }; + idna = rustPackages."registry+https://github.com/rust-lang/crates.io-index".idna."0.2.2" { inherit profileName; }; + matches = rustPackages."registry+https://github.com/rust-lang/crates.io-index".matches."0.1.8" { inherit profileName; }; + percent_encoding = rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.1.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".version_check."0.9.3" = overridableMkRustCrate (profileName: rec { + name = "version_check"; + version = "0.9.3"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".want."0.3.0" = overridableMkRustCrate (profileName: rec { + name = "want"; + version = "0.3.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0"; }; + dependencies = { + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + try_lock = rustPackages."registry+https://github.com/rust-lang/crates.io-index".try-lock."0.2.3" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".wasi."0.10.2+wasi-snapshot-preview1" = overridableMkRustCrate (profileName: rec { + name = "wasi"; + version = "0.10.2+wasi-snapshot-preview1"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen."0.2.72" = overridableMkRustCrate (profileName: rec { + name = "wasm-bindgen"; + version = "0.2.72"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "8fe8f61dba8e5d645a4d8132dc7a0a66861ed5e1045d2c0ed940fab33bac0fbe"; }; + features = builtins.concatLists [ + [ "default" ] + [ "spans" ] + [ "std" ] + ]; + dependencies = { + cfg_if = rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }; + wasm_bindgen_macro = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-macro."0.2.72" { profileName = "__noProfile"; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-backend."0.2.72" = overridableMkRustCrate (profileName: rec { + name = "wasm-bindgen-backend"; + version = "0.2.72"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "046ceba58ff062da072c7cb4ba5b22a37f00a302483f7e2a6cdc18fedbdc1fd3"; }; + features = builtins.concatLists [ + [ "spans" ] + ]; + dependencies = { + bumpalo = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bumpalo."3.6.1" { inherit profileName; }; + lazy_static = rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; }; + log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.14" { inherit profileName; }; + proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.24" { inherit profileName; }; + quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.9" { inherit profileName; }; + syn = rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.64" { inherit profileName; }; + wasm_bindgen_shared = rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-shared."0.2.72" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-macro."0.2.72" = overridableMkRustCrate (profileName: rec { + name = "wasm-bindgen-macro"; + version = "0.2.72"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "0ef9aa01d36cda046f797c57959ff5f3c615c9cc63997a8d545831ec7976819b"; }; + features = builtins.concatLists [ + [ "spans" ] + ]; + dependencies = { + quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.9" { inherit profileName; }; + wasm_bindgen_macro_support = rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-macro-support."0.2.72" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-macro-support."0.2.72" = overridableMkRustCrate (profileName: rec { + name = "wasm-bindgen-macro-support"; + version = "0.2.72"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "96eb45c1b2ee33545a813a92dbb53856418bf7eb54ab34f7f7ff1448a5b3735d"; }; + features = builtins.concatLists [ + [ "spans" ] + ]; + dependencies = { + proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.24" { inherit profileName; }; + quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.9" { inherit profileName; }; + syn = rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.64" { inherit profileName; }; + wasm_bindgen_backend = rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-backend."0.2.72" { inherit profileName; }; + wasm_bindgen_shared = rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-shared."0.2.72" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-shared."0.2.72" = overridableMkRustCrate (profileName: rec { + name = "wasm-bindgen-shared"; + version = "0.2.72"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "b7148f4696fb4960a346eaa60bbfb42a1ac4ebba21f750f75fc1375b098d5ffa"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".web-sys."0.3.49" = overridableMkRustCrate (profileName: rec { + name = "web-sys"; + version = "0.3.49"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "59fe19d70f5dacc03f6e46777213facae5ac3801575d56ca6cbd4c93dcd12310"; }; + features = builtins.concatLists [ + [ "Crypto" ] + [ "EventTarget" ] + [ "Window" ] + ]; + dependencies = { + js_sys = rustPackages."registry+https://github.com/rust-lang/crates.io-index".js-sys."0.3.49" { inherit profileName; }; + wasm_bindgen = rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen."0.2.72" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".webpki."0.21.4" = overridableMkRustCrate (profileName: rec { + name = "webpki"; + version = "0.21.4"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + [ "trust_anchor_util" ] + ]; + dependencies = { + ring = rustPackages."registry+https://github.com/rust-lang/crates.io-index".ring."0.16.20" { inherit profileName; }; + untrusted = rustPackages."registry+https://github.com/rust-lang/crates.io-index".untrusted."0.7.1" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" = overridableMkRustCrate (profileName: rec { + name = "winapi"; + version = "0.3.9"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"; }; + features = builtins.concatLists [ + [ "cfg" ] + [ "consoleapi" ] + [ "errhandlingapi" ] + [ "evntrace" ] + [ "fileapi" ] + [ "handleapi" ] + [ "in6addr" ] + [ "inaddr" ] + [ "ioapiset" ] + [ "minwinbase" ] + [ "minwindef" ] + [ "mswsock" ] + [ "namedpipeapi" ] + [ "ntdef" ] + [ "ntsecapi" ] + [ "ntstatus" ] + (lib.optional (rootFeatures' ? "garage") "processenv") + [ "processthreadsapi" ] + [ "profileapi" ] + [ "std" ] + [ "synchapi" ] + [ "sysinfoapi" ] + [ "timezoneapi" ] + [ "winbase" ] + (lib.optional (rootFeatures' ? "garage") "wincon") + [ "windef" ] + [ "winerror" ] + [ "winioctl" ] + [ "winnt" ] + [ "winsock2" ] + [ "ws2def" ] + [ "ws2ipdef" ] + [ "ws2tcpip" ] + [ "wtypesbase" ] + ]; + dependencies = { + ${ if hostPlatform.config == "i686-pc-windows-gnu" then "winapi_i686_pc_windows_gnu" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi-i686-pc-windows-gnu."0.4.0" { inherit profileName; }; + ${ if hostPlatform.config == "x86_64-pc-windows-gnu" then "winapi_x86_64_pc_windows_gnu" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi-x86_64-pc-windows-gnu."0.4.0" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".winapi-i686-pc-windows-gnu."0.4.0" = overridableMkRustCrate (profileName: rec { + name = "winapi-i686-pc-windows-gnu"; + version = "0.4.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".winapi-util."0.1.5" = overridableMkRustCrate (profileName: rec { + name = "winapi-util"; + version = "0.1.5"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"; }; + dependencies = { + ${ if hostPlatform.isWindows then "winapi" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }; + }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".winapi-x86_64-pc-windows-gnu."0.4.0" = overridableMkRustCrate (profileName: rec { + name = "winapi-x86_64-pc-windows-gnu"; + version = "0.4.0"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"; }; + }); + + "registry+https://github.com/rust-lang/crates.io-index".xmlparser."0.13.3" = overridableMkRustCrate (profileName: rec { + name = "xmlparser"; + version = "0.13.3"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8"; }; + features = builtins.concatLists [ + [ "default" ] + [ "std" ] + ]; + }); + + "registry+https://github.com/rust-lang/crates.io-index".xxhash-rust."0.8.2" = overridableMkRustCrate (profileName: rec { + name = "xxhash-rust"; + version = "0.8.2"; + registry = "registry+https://github.com/rust-lang/crates.io-index"; + src = fetchCratesIo { inherit name version; sha256 = "e575e15bedf6e57b5c2d763ffc6c3c760143466cbd09d762d539680ab5992ded"; }; + features = builtins.concatLists [ + [ "xxh3" ] + ]; + }); + +} @@ -1,10 +1,7 @@ -FROM archlinux:latest +FROM scratch -RUN mkdir -p /garage/meta -RUN mkdir -p /garage/data ENV RUST_BACKTRACE=1 ENV RUST_LOG=garage=info -COPY target/release/garage.stripped /garage/garage - -CMD /garage/garage server -c /garage/config.toml +COPY result/bin/garage / +CMD [ "/garage", "server", "-c", "config.toml"] @@ -1,4 +1,4 @@ -.PHONY: doc +.PHONY: doc all release shell all: clear; cargo build @@ -7,4 +7,7 @@ doc: cd doc/book; mdbook build release: - RUSTFLAGS="-C link-arg=-fuse-ld=lld -C target-cpu=x86-64 -C target-feature=+sse2" cargo build --release --no-default-features + nix-build --arg release true + +shell: + nix-shell diff --git a/default.nix b/default.nix new file mode 100644 index 00000000..649f0133 --- /dev/null +++ b/default.nix @@ -0,0 +1,75 @@ +{ + system ? builtins.currentSystem, + release ? false, + target ? "x86_64-unknown-linux-musl", + compileMode ? null, + git_version ? null, +}: + +with import ./nix/common.nix; + +let + crossSystem = { config = target; }; +in let + + pkgs = import pkgsSrc { + inherit system crossSystem; + overlays = [ cargo2nixOverlay rustOverlay ]; + }; + rustDist = pkgs.buildPackages.rust-bin.stable.latest.default; + + /* + The following complexity should be abstracted by makePackageSet' (note the final quote). + However its code uses deprecated features of rust-overlay that can lead to bug. + Instead, we build our own rustChannel object with the recommended API of rust-overlay. + */ + rustChannel = rustDist // { + cargo = rustDist; + rustc = rustDist.override { + targets = [ + (pkgs.rustBuilder.rustLib.realHostTriple pkgs.stdenv.targetPlatform) + ]; + }; + }; + + overrides = pkgs.buildPackages.rustBuilder.overrides.all ++ [ + (pkgs.rustBuilder.rustLib.makeOverride { + name = "garage"; + overrideAttrs = drv: if git_version != null then { + preConfigure = '' + ${drv.preConfigure or ""} + export GIT_VERSION="${git_version}" + ''; + } else {}; + }) + ]; + + packageFun = import ./Cargo.nix; + + rustPkgs = pkgs.rustBuilder.makePackageSet { + inherit packageFun rustChannel release; + packageOverrides = overrides; + + buildRustPackages = pkgs.buildPackages.rustBuilder.makePackageSet { + inherit rustChannel packageFun; + packageOverrides = overrides; + }; + + localPatterns = [ + /* + The way the default rules are written make think we match recursively, on full path, but the rules are misleading. + In fact, the regex is only called on root elements of the crate (and not recursively). + This behavior does not work well with our nested modules. + We tried to build a "deny list" but negative lookup ahead are not supported on Nix. + As a workaround, we have to register all our submodules in this allow list... + */ + ''^(src|tests)'' # fixed default + ''.*\.(rs|toml)$'' # fixed default + ''^(crdt|replication)'' # our crate submodules + ]; + }; + +in + if compileMode == "test" + then builtins.mapAttrs (name: value: rustPkgs.workspace.${name} { inherit compileMode; }) rustPkgs.workspace + else rustPkgs.workspace.garage { inherit compileMode; } diff --git a/doc/book/src/SUMMARY.md b/doc/book/src/SUMMARY.md index 9447c3b2..264714b1 100644 --- a/doc/book/src/SUMMARY.md +++ b/doc/book/src/SUMMARY.md @@ -25,7 +25,8 @@ - [Development](./development/index.md) - [Setup your environment](./development/devenv.md) - - [Your first contribution]() + - [Development scripts](./development/scripts.md) + - [Release process](./development/release_process.md) - [Working Documents](./working_documents/index.md) - [Load Balancing Data](./working_documents/load_balancing.md) diff --git a/doc/book/src/development/devenv.md b/doc/book/src/development/devenv.md index 6cb7c554..78affa48 100644 --- a/doc/book/src/development/devenv.md +++ b/doc/book/src/development/devenv.md @@ -1,17 +1,145 @@ # Setup your development environment -We propose the following quickstart to setup a full dev. environment as quickly as possible: +Depending on your tastes, you can bootstrap your development environment in a traditional Rust way or through Nix. - 1. Setup a rust/cargo environment. eg. `dnf install rust cargo` - 2. Install awscli v2 by following the guide [here](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html). - 3. Run `cargo build` to build the project - 4. Run `./script/dev-cluster.sh` to launch a test cluster (feel free to read the script) - 5. Run `./script/dev-configure.sh` to configure your test cluster with default values (same datacenter, 100 tokens) - 6. Run `./script/dev-bucket.sh` to create a bucket named `eprouvette` and an API key that will be stored in `/tmp/garage.s3` - 7. Run `source ./script/dev-env-aws.sh` to configure your CLI environment - 8. You can use `garage` to manage the cluster. Try `garage --help`. - 9. You can use the `awsgrg` alias to add, remove, and delete files. Try `awsgrg help`, `awsgrg cp /proc/cpuinfo s3://eprouvette/cpuinfo.txt`, or `awsgrg ls s3://eprouvette`. `awsgrg` is a wrapper on the `aws s3` command pre-configured with the previously generated API key (the one in `/tmp/garage.s3`) and localhost as the endpoint. +## The Nix way -Now you should be ready to start hacking on garage! +Nix is a generic package manager we use to precisely define our development environment. +Instructions on how to install it are given on their [Download page](https://nixos.org/download.html). +Check that your installation is working by running the following commands: +``` +nix-shell --version +nix-build --version +nix-env --version +``` + +Now, you can clone our git repository (run `nix-env -iA git` if you do not have git yet): + +```bash +git clone https://git.deuxfleurs.fr/Deuxfleurs/garage +cd garage +``` + +*Optionnaly, you can use our nix.conf file to speed up compilations:* + +```bash +sudo mkdir -p /etc/nix +sudo cp nix/nix.conf /etc/nix/nix.conf +sudo killall nix-daemon +``` + +Now you can enter our nix-shell, all the required packages will be downloaded but they will not pollute your environment outside of the shell: + +```bash +nix-shell +``` + +You can use the traditionnal Rust development workflow: + +```bash +cargo build # compile the project +cargo run # execute the project +cargo test # run the tests +cargo fmt # format the project, run it before any commit! +cargo clippy # run the linter, run it before any commit! +``` + +You can build the project with Nix by running: + +```bash +nix-build +``` + +You can parallelize the build (if you use our nix.conf file, it is already automatically done). +To use all your cores when building a derivation use `-j`, and to build multiple derivations at once use `--max-jobs`. +The special value `auto` will be replaced by the number of cores of your computer. +An example: + +```bash +nix-build -j $(nproc) --max-jobs auto +``` + +Our build has multiple parameters you might want to set: + - `release` build with release optimisations instead of debug + - `target allows` for cross compilation + - `compileMode` can be set to test or bench to build a unit test runner + - `git_version` to inject the hash to display when running `garage stats` + +An example: + +```bash +nix-build \ + --arg release true \ + --argstr target x86_64-unknown-linux-musl \ + --argstr compileMode build \ + --git_version $(git rev-parse HEAD) +``` + +*The result is located in `result/bin`. You can pass arguments to cross compile: check `.drone.yml` for examples.* + +If you modify a `Cargo.toml` or regenerate any `Cargo.lock`, you must run `cargo2nix`: + +``` +cargo2nix -f +``` + +Many tools like rclone, `mc` (minio-client), or `aws` (awscliv2) will be available in your environment and will be useful to test Garage. + +**This is the recommended method.** + +## The Rust way + +You need a Rust distribution installed on your computer. +The most simple way is to install it from [rustup](https://rustup.rs). +Please avoid using your package manager to install Rust as some tools might be outdated or missing. + +Now, check your Rust distribution works by running the following commands: + +```bash +rustc --version +cargo --version +rustfmt --version +clippy-driver --version +``` + +Now, you need to clone our git repository ([how to install git](https://git-scm.com/downloads)): + +```bash +git clone https://git.deuxfleurs.fr/Deuxfleurs/garage +cd garage +``` + +You can now use the following commands: + +```bash +cargo build # compile the project +cargo run # execute the project +cargo test # run the tests +cargo fmt # format the project, run it before any commit! +cargo clippy # run the linter, run it before any commit! +``` + +This is specific to our project, but you will need one last tool, `cargo2nix`. +To install it, run: + +```bash +cargo install --git https://github.com/superboum/cargo2nix --branch main cargo2nix +``` + +You must use it every time you modify a `Cargo.toml` or regenerate a `Cargo.lock` file as follow: + +```bash +cargo build # Rebuild Cargo.lock if needed +cargo2nix -f +``` + +It will output a `Cargo.nix` file which is a specific `Cargo.lock` file dedicated to Nix that is required by our CI +which means you must include it in your commits. + +Later, to use our scripts and integration tests, you might need additional tools. +These tools are listed at the end of the `shell.nix` package in the `nativeBuildInputs` part. +It is up to you to find a way to install the ones you need on your computer. + +**A global drawback of this method is that it is up to you to adapt your environment to the one defined in the Nix files.** diff --git a/doc/book/src/development/miscellaneous_notes.md b/doc/book/src/development/miscellaneous_notes.md new file mode 100644 index 00000000..c259cba1 --- /dev/null +++ b/doc/book/src/development/miscellaneous_notes.md @@ -0,0 +1,134 @@ +# Miscellaneous Notes + +## Quirks about cargo2nix/rust in Nix + +If you use submodules in your crate (like `crdt` and `replication` in `garage_table`), you must list them in `default.nix` + +The Windows target does not work. it might be solvable through [overrides](https://github.com/cargo2nix/cargo2nix/blob/master/overlay/overrides.nix). Indeed, we pass `x86_64-pc-windows-gnu` but mingw need `x86_64-w64-mingw32` + +We have a simple [PR on cargo2nix](https://github.com/cargo2nix/cargo2nix/pull/201) that fixes critical bugs but the project does not seem very active currently. We must use [my patched version of cargo2nix](https://github.com/superboum/cargo2nix) to enable i686 and armv6l compilation. We might need to contribute to cargo2nix in the future. + + +## Nix + +Nix has no armv7 + musl toolchains but armv7l is backward compatible with armv6l. + +Signing keys are generated with: + +``` +nix-store --generate-binary-cache-key nix.web.deuxfleurs.fr cache-priv-key.pem cache-pub-key.pem +``` + +We copy the secret key in our nix folder: + +``` +cp cache-priv-key.pem /etc/nix/signing-key.sec +``` + +Manually sign + +We can sign the whole store with: + +``` +nix sign-paths --all -k /etc/nix/signing-key.sec +``` + +Or simply the current package and its dependencies with: + +``` +nix sign-paths --recursive -k /etc/nix/signing-key.sec +``` + +Setting a key in `nix.conf` will do the signature at build time automatically without additional commands, edit the `nix.conf` of your builder: + +```toml +secret-key-files = /etc/nix/signing-key.sec +max-jobs = auto +cores = 8 +``` + +Now you are ready to build your packages: + +```bash +cat > $HOME/.awsrc <<EOF +export AWS_ACCESS_KEY_ID="xxx" +export AWS_SECRET_ACCESS_KEY="xxx" +EOF + +# source each time you want to send on the cache +source ~/.awsrc + +# copy garage build dependencies (and not only the output) +nix-build +nix-store -qR --include-outputs $(nix-instantiate default.nix) + | xargs nix copy --to 's3://nix?endpoint=garage.deuxfleurs.fr®ion=garage' + +# copy shell dependencies +nix-build shell.nix -A inputDerivation +nix copy $(nix-store -qR result/) --to 's3://nix?endpoint=garage.deuxfleurs.fr®ion=garage' +``` + +More example of nix-copy + +``` +# nix-build produces a result/ symlink +nix copy result/ --to 's3://nix?endpoint=garage.deuxfleurs.fr®ion=garage' + +# alternative ways to use nix copy +nix copy nixpkgs.garage --to ... +nix copy /nix/store/3rbb9qsc2w6xl5xccz5ncfhy33nzv3dp-crate-garage-0.3.0 --to ... +``` + + +Clear the cache: + +```bash +mc rm --recursive --force garage/nix/ +``` + +--- + +A desirable `nix.conf` for a consumer: + +```toml +substituters = https://cache.nixos.org https://nix.web.deuxfleurs.fr +trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= nix.web.deuxfleurs.fr:eTGL6kvaQn6cDR/F9lDYUIP9nCVR/kkshYfLDJf1yKs= +``` + +And now, whenever you run a command like: + +``` +nix-shell +nix-build +``` + +Our cache will be checked. + +### Some references about Nix + + + - https://doc.rust-lang.org/nightly/rustc/platform-support.html + - https://nix.dev/tutorials/cross-compilation + - https://nixos.org/manual/nix/unstable/package-management/s3-substituter.html + - https://fzakaria.com/2020/09/28/nix-copy-closure-your-nix-shell.html + - http://www.lpenz.org/articles/nixchannel/index.html + + +## Drone + +Do not try to set a build as trusted from the interface or the CLI tool, +your request would be ignored. Instead, directly edit the database (table `repos`, column `repo_trusted`). + +Drone can do parallelism both at the step and the pipeline level. At the step level, parallelism is restricted to the same runner. + +## Building Docker containers + +We were: + - Unable to use the official Docker plugin because + - it requires to mount docker socket in the container but it is not recommended + - you cant set the platform when building + - Unable to use buildah because it needs `CLONE_USERNS` capability + - Unable to use the kaniko plugin for Drone as we can't set the target platform + - Unable to use the kaniko container provided by Google as we can't run arbitrary logic: we need to put our secret in .docker/config.json. + +Finally we chose to build kaniko through nix and use it in a `nix-shell`. diff --git a/doc/book/src/development/release_process.md b/doc/book/src/development/release_process.md new file mode 100644 index 00000000..8591fd9f --- /dev/null +++ b/doc/book/src/development/release_process.md @@ -0,0 +1,184 @@ +# Release process + +Before releasing a new version of Garage, our code pass through a succession of checks and transformations. +We define them as our release process. + +## Trigger and classify a release + +While we run some tests on every commits, we do not make a release for all of them. + +A release can be triggered manually by "promoting" a successful build. +Otherwise, every weeks, a release build is triggered on the `main` branch. + +If the build is from a tag following the regex: `v[0-9]+\.[0-9]+\.[0-9]+`, it will be listed as stable. +If it is a tag but with a different format, it will be listed as Extra. +Otherwise, if it is a commit, it will be listed as development. +This logic is defined in `nix/build_index.nix`. + +## Testing + +For each commit, we first pass the code to a formatter (rustfmt) and a linter (clippy). +Then we try to build it in debug mode and run both unit tests and our integration tests. + +Additionnaly, when releasing, our integration tests are run on the release build for amd64 and i686. + +## Generated Artifacts + +We generate the following binary artifacts for now: + - **architecture**: amd64, i686, aarch64, armv6 + - **os**: linux + - **format**: static binary, docker container + +Additionnaly we also build two web pages: + - the documentation (this website) + - [the release page](https://garagehq.deuxfleurs.fr/releases.html) + +We publish the static binaries on our own garage cluster (you can access them through the releases page) +and the docker containers on Docker Hub. + +## Automation + +We automated our release process with Nix and Drone to make it more reliable. +Here we describe how we have done in case you want to debug or improve it. + +### Caching build steps + +To speed up the CI, we use the caching feature provided by Nix. + +You can benefit from it by using our provided `nix.conf` as recommended or by simply adding the following lines to your file: + +```toml +substituters = https://cache.nixos.org https://nix.web.deuxfleurs.fr +trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= nix.web.deuxfleurs.fr:eTGL6kvaQn6cDR/F9lDYUIP9nCVR/kkshYfLDJf1yKs= +``` + +Sending to the cache is done through `nix copy`, for example: + +```bash +nix copy --to 's3://nix?endpoint=garage.deuxfleurs.fr®ion=garage&secret-key=/etc/nix/signing-key.sec' result +``` + +*Note that you need the signing key. In our case, it is stored as a secret in Drone.* + +The previous command will only send the built packet and not its dependencies. +To send its dependency, a tool named `nix-copy-closure` has been created but it is not compatible with the S3 protocol. + +Instead, you can use the following commands to list all the runtime dependencies: + +```bash +nix copy \ + --to 's3://nix?endpoint=garage.deuxfleurs.fr®ion=garage&secret-key=/etc/nix/signing-key.sec' \ + $(nix-store -qR result/) +``` + +*We could also write this expression with xargs but this tool is not available in our container.* + +But in certain cases, we want to cache compile time dependencies also. +For example, the Nix project does not provide binaries for cross compiling to i686 and thus we need to compile gcc on our own. +We do not want to compile gcc each time, so even if it is a compile time dependency, we want to cache it. + +This time, the command is a bit more involved: + +```bash +nix copy --to \ + 's3://nix?endpoint=garage.deuxfleurs.fr®ion=garage&secret-key=/etc/nix/signing-key.sec' \ + $(nix-store -qR --include-outputs \ + $(nix-instantiate)) +``` + +This is the command we use in our CI as we expect the final binary to change, so we mainly focus on +caching our development dependencies. + +*Currently there is no automatic garbage collection of the cache: we should monitor its growth. +Hopefully, we can erase it totally without breaking any build, the next build will only be slower.* + +To erase the cache: + +``` +mc rm --recursive --force 'garage/nix/*' +``` + +### Publishing Garage + +We defined our publishing logic in Nix, mostly as shell hooks. +You can inspect them in `shell.nix` to see exactly how. +Here, we will give a quick explanation on how to use them to manually publish a release. + +Supposing you just have built garage as follow: + +```bash +nix-build --arg release true +``` + +To publish a static binary in `result/bin` on garagehq, run: + +```bash +export AWS_ACCESS_KEY_ID=xxx +export AWS_SECRET_ACCESS_KEY=xxx +export DRONE_TAG=handcrafted-1.0.0 # or DRONE_COMMIT +export TARGET=x86_64-unknown-linux-musl + +nix-shell --run to_s3 +``` + +To create and publish a docker container, run: + +```bash +export DOCKER_AUTH='{ "auths": { "https://index.docker.io/v1/": { "auth": "xxxx" }}}' +export DOCKER_PLATFORM='linux/amd64' # check GOARCH and GOOS from golang.org +export CONTAINER_NAME='me/amd64_garage' +export CONTAINER_TAG='handcrafted-1.0.0' + +nix-shell --run to_docker +``` + +To rebuild the release page, run: +```bash +export AWS_ACCESS_KEY_ID=xxx +export AWS_SECRET_ACCESS_KEY=xxx + +nix-shell --run refresh_index +``` + +If you want to compile for different architectures, you will need to repeat all these commands for each architecture. + +**In practise, and except for debugging, you will never directly run these commands. Release is handled by drone** + +### Drone + +Our instance is available at [https://drone.deuxfleurs.fr](https://drone.deuxfleurs.fr). +You need an account on [https://git.deuxfleurs.fr](https://git.deuxfleurs.fr) to use it. + +**Drone CLI** - Drone has a CLI tool to interact with. +It can be downloaded from its Github [release page](https://github.com/drone/drone-cli/releases). + +To communicate with our instance, you must setup some environment variables. +You can get them from your [Account Settings](https://drone.deuxfleurs.fr/account). + +To make drone easier to use, you could create a `~/.dronerc` that you could source each time you want to use it. + +``` +export DRONE_SERVER=https://drone.deuxfleurs.fr +export DRONE_TOKEN=xxx +drone info +``` + +The CLI tool is very self-discoverable, just append `--help` to each subcommands. +Start with: + +```bash +drone --help +``` + +**.drone.yml** - The builds steps are defined in `.drone.yml`. +You can not edit this file without resigning it. + +To sign it, you must be a maintainer and then run: + +```bash +drone sign --save Deuxfleurs/garage +``` + +Looking at the file, you will see that most of the commands are `nix-shell` and `nix-build` commands with various parameters. + + diff --git a/doc/book/src/development/scripts.md b/doc/book/src/development/scripts.md new file mode 100644 index 00000000..387cb349 --- /dev/null +++ b/doc/book/src/development/scripts.md @@ -0,0 +1,113 @@ +# Development scripts + +We maintain a `script/` folder that contains some useful script to ease testing on Garage. + +A fully integrated script, `test-smoke.sh`, runs some basic tests on various tools such as minio client, awscli and rclone. +To run it, enter a `nix-shell` (or install all required tools) and simply run: + +```bash +nix-build # or cargo build +./script/test-smoke.sh +``` + +If something fails, you can find useful logs in `/tmp/garage.log`. +You can inspect the generated configuration and local data created by inspecting your `/tmp` directory: +the script creates files and folder prefixed with the name "garage". + +## Bootstrapping a test cluster + +Under the hood `test-smoke.sh` uses multiple helpers scripts you can also run in case you want to manually test Garage. +In this section, we introduce 3 scripts to quickly bootstrap a full test cluster with 3 instances. + +### 1. Start each daemon + +```bash +./script/dev-cluster.sh +``` + +This script spawns 3 Garage instances with 3 configuration files. +You can inspect the detailed configuration, including ports, by inspecting `/tmp/config.1` (change 1 by the instance number you want). + +This script also spawns a simple HTTPS reverse proxy through `socat` for the S3 endpoint that listens on port `4443`. +Some libraries might require a TLS endpoint to work, refer to our issue [#64](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/64) for more detailed information on this subject. + +This script covers the [Launching the garage server](/quick_start/index.html#launching-the-garage-server) section of our Quick start page. + +### 2. Make them join the cluster + +```bash +./script/dev-configure.sh +``` + +This script will configure each instance by assigning them a zone (`dc1`) and a weight (`1`). + +This script covers the [Configuring your Garage node](/quick_start/index.html#configuring-your-garage-node) section of our Quick start page. + +### 3. Create a key and a bucket + +```bash +./script/dev-bucket.sh +``` + +This script will create a bucket named `eprouvette` with a key having read and write rights on this bucket. +The key is stored in a filed named `/tmp/garage.s3` and can be used by the following tools to pre-configure them. + +This script covers the [Creating buckets and keys](/quick_start/index.html#creating-buckets-and-keys) section of our Quick start page. + +## Handlers for generic tools + +We provide wrappers for some CLI tools that configure themselves for your development cluster. +They are meant to save you some configuration time as to use them, you are only required to source the right file. + +### awscli + +```bash +source ./script/dev-env-aws.sh + +# some examples +aws s3 ls s3://eprouvette +aws s3 cp /proc/cpuinfo s3://eprouvette/cpuinfo.txt +``` + +### minio-client + + +```bash +source ./script/dev-env-mc.sh + +# some examples +mc ls garage/ +mc cp /proc/cpuinfo garage/eprouvette/cpuinfo.txt +``` + +### rclone + +```bash +source ./script/dev-env-rclone.sh + +# some examples +rclone lsd garage: +rclone copy /proc/cpuinfo garage:eprouvette/cpuinfo.txt +``` + +### s3cmd + +```bash +source ./script/dev-env-s3cmd.sh + +# some examples +s3cmd ls +s3cmd put /proc/cpuinfo s3://eprouvette/cpuinfo.txt +``` + +### duck + +*Warning! Duck is not yet provided by nix-shell.* + +```bash +source ./script/dev-env-duck.sh + +# some examples +duck --list garage:/ +duck --upload garage:/eprouvette/ /proc/cpuinfo +``` diff --git a/make_docker.sh b/make_docker.sh deleted file mode 100755 index c338d0a6..00000000 --- a/make_docker.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -BIN=target/release/garage -DOCKER=lxpz/garage_amd64 - -TAG=$1 -if [ -z "$1" ]; then - echo "Usage: $0 <tag>" - exit 1 -fi - -RUSTFLAGS="-C link-arg=-fuse-ld=lld -C target-cpu=x86-64 -C target-feature=+sse2" cargo build --release --no-default-features -cp $BIN $BIN.stripped -strip $BIN.stripped - -docker pull archlinux:latest -docker build -t $DOCKER:$TAG . -docker push $DOCKER:$TAG -docker tag $DOCKER:$TAG $DOCKER:latest -docker push $DOCKER:latest diff --git a/nix/build_index.nix b/nix/build_index.nix new file mode 100644 index 00000000..5107324e --- /dev/null +++ b/nix/build_index.nix @@ -0,0 +1,146 @@ +{ + path ? "/../aws-list.txt", +}: + +with import ./common.nix; +let + pkgs = import pkgsSrc {}; + lib = pkgs.lib; + + /* Converts a key list and a value list to a set + + Example: + listToSet [ "name" "version" ] [ "latex" "3.14" ] + => { name = "latex"; version = "3.14"; } + */ + listToSet = keys: values: + builtins.listToAttrs + (lib.zipListsWith + (a: b: { name = a; value = b; }) + keys + values); + + /* Says if datetime a is more recent than datetime b + + Example: + cmpDate { date = "2021-09-10"; time = "22:12:15"; } { date = "2021-02-03"; time = "23:54:12"; } + => true + */ + cmpDate = a: b: + let da = (builtins.head a.builds).date; + db = (builtins.head b.builds).date; + in + if da == db then (builtins.head a.builds).time > (builtins.head b.builds).time + else da > db; + + /* Pretty platforms */ + prettyPlatform = name: + if name == "aarch64-unknown-linux-musl" then "linux/arm64" + else if name == "armv6l-unknown-linux-musleabihf" then "linux/arm" + else if name == "x86_64-unknown-linux-musl" then "linux/amd64" + else if name == "i686-unknown-linux-musl" then "linux/386" + else name; + + /* Parsing */ + list = builtins.readFile (./. + path); + entries = lib.splitString "\n" list; + + elems = builtins.filter + (e: (builtins.length e) == 4) + (map + (x: builtins.filter (e: e != "") (lib.splitString " " x)) + entries); + + keys = ["date" "time" "size" "path"]; + parsed = map (entry: listToSet keys entry) elems; + + subkeys = ["root" "version" "platform" "binary" ]; + builds = map (entry: entry // listToSet subkeys (lib.splitString "/" entry.path)) parsed; + + /* Aggregation */ + builds_per_version = lib.foldl (acc: v: acc // { ${v.version} = if builtins.hasAttr v.version acc then acc.${v.version} ++ [ v ] else [ v ]; }) {} builds; + + versions = builtins.attrNames builds_per_version; + versions_release = builtins.filter (x: builtins.match "v[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?" x != null) versions; + versions_commit = builtins.filter (x: builtins.match "[0-9a-f]{40}" x != null) versions; + versions_extra = lib.subtractLists (versions_release ++ versions_commit) versions; + + sorted_builds = [ + { + name = "Release"; + hide = false; + type = "tag"; + description = "Release builds are the official builds, they are tailored for productions and are the most tested."; + builds = builtins.sort (a: b: a.version > b.version) (map (x: { version = x; builds = builtins.getAttr x builds_per_version; }) versions_release); + } + { + name = "Extra"; + hide = true; + type = "tag"; + description = "Extra builds are built on demand to test a specific feature or a specific need."; + builds = builtins.sort cmpDate (map (x: { version = x; builds = builtins.getAttr x builds_per_version; }) versions_extra); + } + { + name = "Development"; + hide = true; + type = "commit"; + description = "Development builds are built periodically. Use them if you want to test a specific feature that is not yet released."; + builds = builtins.sort cmpDate (map (x: { version = x; builds = builtins.getAttr x builds_per_version; }) versions_commit); + } + ]; + +in + pkgs.writeText "index.html" '' +<!doctype html> +<html> + <head> + <meta charset="utf-8" /> + <title>Garage releases</title> + <style> + html, body { margin:0; padding: 0 } + body { font-family: 'Helvetica', Sans; } + section { margin: 1rem; } + ul { padding:0; margin: 0.2rem } + li { + border-radius: 0.2rem; + display: inline; + border: 2px #0b5d83 solid; + padding: 0.5rem; + line-height: 3rem; + color: #0b5d83; + } + li:hover { background-color: #0b5d83; color: #fff; } + li a, li a:hover { color: inherit; text-decoration: none } + </style> + </head> + <body> + ${ builtins.toString (lib.forEach sorted_builds (r: '' + <section> + <h2>${r.name} builds</h2> + + <p>${r.description}</p> + + ${if r.hide then "<details><summary>Show ${r.name} builds</summary>" else ""} + ${ builtins.toString (lib.forEach r.builds (x: '' + <h3> ${x.version} (${(builtins.head x.builds).date}) </h3> + <p>See this build on</p> + <p> Binaries: + <ul> + ${ builtins.toString (lib.forEach x.builds (b: '' + <li><a href="/${b.path}">${prettyPlatform b.platform}</a></li> + ''))} + </ul></p> + <p> Sources: + <ul> + <li><a href="https://git.deuxfleurs.fr/Deuxfleurs/garage/src/${r.type}/${x.version}">gitea</a></li> + <li><a href="https://git.deuxfleurs.fr/Deuxfleurs/garage/archive/${x.version}.zip">.zip</a></li> + <li><a href="https://git.deuxfleurs.fr/Deuxfleurs/garage/archive/${x.version}.tar.gz">.tar.gz</a></li> + </ul></p> + '')) } + ${ if builtins.length r.builds == 0 then "<em>There is no build for this category</em>" else "" } + ${if r.hide then "</details>" else ""} + </section> + ''))} + </body> +</html> +'' diff --git a/nix/common.nix b/nix/common.nix new file mode 100644 index 00000000..aee38bd8 --- /dev/null +++ b/nix/common.nix @@ -0,0 +1,27 @@ +rec { + /* + * Fixed dependencies + */ + pkgsSrc = fetchTarball { + # As of 2021-10-04 + url ="https://github.com/NixOS/nixpkgs/archive/b27d18a412b071f5d7991d1648cfe78ee7afe68a.tar.gz"; + sha256 = "1xy9zpypqfxs5gcq5dcla4bfkhxmh5nzn9dyqkr03lqycm9wg5cr"; + }; + cargo2nixSrc = fetchGit { + # As of 2021-10-06 + url = "https://github.com/superboum/cargo2nix"; + rev = "1364752cd784764db2ef5b1e1248727cebfae2ce"; + }; + rustOverlaySrc = fetchGit { + # As of 2021-10-05 + url = "https://github.com/oxalica/rust-overlay"; + rev = "9c2fc6a62ccbc6f420d71ecac6bf0b84dbbee64f"; + }; + + /* + * Shared objects + */ + rustOverlay = import rustOverlaySrc; + cargo2nix = import cargo2nixSrc; + cargo2nixOverlay = import "${cargo2nixSrc}/overlay"; +} diff --git a/nix/kaniko.nix b/nix/kaniko.nix new file mode 100644 index 00000000..140328b8 --- /dev/null +++ b/nix/kaniko.nix @@ -0,0 +1,23 @@ +pkgs: +pkgs.buildGoModule rec { + pname = "kaniko"; + version = "1.6.0"; + + src = pkgs.fetchFromGitHub { + owner = "GoogleContainerTools"; + repo = "kaniko"; + rev = "v${version}"; + sha256 = "1fnclr556avxay6pvgw5ya3xbxfnf2gv4njq2hr4fd6fcjyslq5h"; + }; + + vendorSha256 = null; + + checkPhase = "true"; + + meta = with pkgs.lib; { + description = "kaniko is a tool to build container images from a Dockerfile, inside a container or Kubernetes cluster."; + homepage = "https://github.com/GoogleContainerTools/kaniko"; + license = licenses.asl20; + platforms = platforms.linux; + }; +} diff --git a/nix/nix.conf b/nix/nix.conf new file mode 100644 index 00000000..8764eb3e --- /dev/null +++ b/nix/nix.conf @@ -0,0 +1,7 @@ +substituters = https://cache.nixos.org https://nix.web.deuxfleurs.fr +trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= nix.web.deuxfleurs.fr:eTGL6kvaQn6cDR/F9lDYUIP9nCVR/kkshYfLDJf1yKs= +max-jobs = auto +cores = 4 + +# required for containers +sandbox = false diff --git a/script/builder_image/Dockerfile b/script/builder_image/Dockerfile deleted file mode 100644 index 908c7e3c..00000000 --- a/script/builder_image/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM rust:buster -RUN apt-get update && \ - apt-get install --yes libsodium-dev awscli python-pip wget rclone openssl socat && \ - rm -rf /var/lib/apt/lists/* -RUN wget https://dl.min.io/client/mc/release/linux-amd64/mc -O /usr/local/bin/mc && chmod +x /usr/local/bin/mc -RUN rustup component add rustfmt clippy -RUN pip install s3cmd diff --git a/script/builder_image/Makefile b/script/builder_image/Makefile deleted file mode 100644 index 00b0f6c7..00000000 --- a/script/builder_image/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -DOCKER=lxpz/garage_builder_amd64 - -docker: - docker build -t $(DOCKER):$(TAG) . - docker push $(DOCKER):$(TAG) - docker tag $(DOCKER):$(TAG) $(DOCKER):latest - docker push $(DOCKER):latest - diff --git a/script/dev-bucket.sh b/script/dev-bucket.sh index 8a3587be..05d8c105 100755 --- a/script/dev-bucket.sh +++ b/script/dev-bucket.sh @@ -6,7 +6,8 @@ SCRIPT_FOLDER="`dirname \"$0\"`" REPO_FOLDER="${SCRIPT_FOLDER}/../" GARAGE_DEBUG="${REPO_FOLDER}/target/debug/" GARAGE_RELEASE="${REPO_FOLDER}/target/release/" -PATH="${GARAGE_DEBUG}:${GARAGE_RELEASE}:$PATH" +NIX_RELEASE="${REPO_FOLDER}/result/bin/" +PATH="${GARAGE_DEBUG}:${GARAGE_RELEASE}:${NIX_RELEASE}:$PATH" garage bucket create eprouvette KEY_INFO=`garage key new --name opérateur` diff --git a/script/dev-cluster.sh b/script/dev-cluster.sh index bb5f9a08..0afdd97c 100755 --- a/script/dev-cluster.sh +++ b/script/dev-cluster.sh @@ -6,7 +6,8 @@ SCRIPT_FOLDER="`dirname \"$0\"`" REPO_FOLDER="${SCRIPT_FOLDER}/../" GARAGE_DEBUG="${REPO_FOLDER}/target/debug/" GARAGE_RELEASE="${REPO_FOLDER}/target/release/" -PATH="${GARAGE_DEBUG}:${GARAGE_RELEASE}:$PATH" +NIX_RELEASE="${REPO_FOLDER}/result/bin/" +PATH="${GARAGE_DEBUG}:${GARAGE_RELEASE}:${NIX_RELEASE}:$PATH" FANCYCOLORS=("41m" "42m" "44m" "45m" "100m" "104m") export RUST_BACKTRACE=1 @@ -63,7 +64,13 @@ fi (garage server -c /tmp/config.$count.toml 2>&1|while read r; do echo -en "$LABEL $r\n"; done) & done +RETRY=120 until garage status 2>&1|grep -q Healthy ; do + (( RETRY-- )) + if (( RETRY <= 0 )); then + echo -en "${MAIN_LABEL} Garage did not start" + exit 1 + fi echo -en "${MAIN_LABEL} cluster starting...\n" sleep 1 done diff --git a/script/dev-configure.sh b/script/dev-configure.sh index bc8352d8..fdae959b 100755 --- a/script/dev-configure.sh +++ b/script/dev-configure.sh @@ -6,10 +6,17 @@ SCRIPT_FOLDER="`dirname \"$0\"`" REPO_FOLDER="${SCRIPT_FOLDER}/../" GARAGE_DEBUG="${REPO_FOLDER}/target/debug/" GARAGE_RELEASE="${REPO_FOLDER}/target/release/" -PATH="${GARAGE_DEBUG}:${GARAGE_RELEASE}:$PATH" +NIX_RELEASE="${REPO_FOLDER}/result/bin/" +PATH="${GARAGE_DEBUG}:${GARAGE_RELEASE}:${NIX_RELEASE}:$PATH" sleep 5 +RETRY=120 until garage status 2>&1|grep -q Healthy ; do + (( RETRY-- )) + if (( RETRY <= 0 )); then + echo "garage did not start in time, failing." + exit 1 + fi echo "cluster starting..." sleep 1 done diff --git a/script/test-smoke.sh b/script/test-smoke.sh index 0417b2af..335d55e9 100755 --- a/script/test-smoke.sh +++ b/script/test-smoke.sh @@ -8,13 +8,13 @@ SCRIPT_FOLDER="`dirname \"$0\"`" REPO_FOLDER="${SCRIPT_FOLDER}/../" GARAGE_DEBUG="${REPO_FOLDER}/target/debug/" GARAGE_RELEASE="${REPO_FOLDER}/target/release/" -PATH="${GARAGE_DEBUG}:${GARAGE_RELEASE}:$PATH" +NIX_RELEASE="${REPO_FOLDER}/result/bin/" +PATH="${GARAGE_DEBUG}:${GARAGE_RELEASE}:${NIX_RELEASE}:$PATH" # @FIXME Duck is not ready for testing, we have a bug SKIP_DUCK=1 echo "⏳ Setup" -cargo build ${SCRIPT_FOLDER}/dev-clean.sh ${SCRIPT_FOLDER}/dev-cluster.sh > /tmp/garage.log 2>&1 & ${SCRIPT_FOLDER}/dev-configure.sh diff --git a/shell.nix b/shell.nix new file mode 100644 index 00000000..f407ed95 --- /dev/null +++ b/shell.nix @@ -0,0 +1,69 @@ +{ + system ? builtins.currentSystem, + crossSystem ? null, + rust ? true, + integration ? true, + release ? true, +}: + +with import ./nix/common.nix; + +let + pkgs = import pkgsSrc { + inherit system crossSystem; + overlays = [ cargo2nixOverlay rustOverlay ]; + }; + rustDist = pkgs.buildPackages.rust-bin.stable.latest.default; + kaniko = (import ./nix/kaniko.nix) pkgs; + +in + +pkgs.mkShell { + shellHook = '' +function to_s3 { + aws \ + --endpoint-url https://garage.deuxfleurs.fr \ + --region garage \ + s3 cp \ + ./result/bin/garage \ + s3://garagehq.deuxfleurs.fr/_releases/''${DRONE_TAG:-$DRONE_COMMIT}/''${TARGET}/garage +} + +function to_docker { + executor \ + --force \ + --customPlatform="''${DOCKER_PLATFORM}" \ + --destination "''${CONTAINER_NAME}:''${CONTAINER_TAG}" \ + --context dir://`pwd` \ + --verbosity=debug +} + +function refresh_index { + aws \ + --endpoint-url https://garage.deuxfleurs.fr \ + --region garage \ + s3 ls \ + --recursive \ + s3://garagehq.deuxfleurs.fr/_releases/ \ + > aws-list.txt + + nix-build nix/build_index.nix + + aws \ + --endpoint-url https://garage.deuxfleurs.fr \ + --region garage \ + s3 cp \ + --content-type "text/html" \ + result \ + s3://garagehq.deuxfleurs.fr/_releases.html +} + ''; + + nativeBuildInputs = + (if rust then [ rustDist (pkgs.callPackage cargo2nix {}).package ] else []) + ++ + (if integration then [ pkgs.s3cmd pkgs.awscli2 pkgs.minio-client pkgs.rclone pkgs.socat pkgs.psmisc pkgs.which ] else []) + ++ + (if release then [ pkgs.awscli2 kaniko ] else []) + ; +} diff --git a/src/garage/admin_rpc.rs b/src/garage/admin_rpc.rs index 19cba3b6..fe5a9d88 100644 --- a/src/garage/admin_rpc.rs +++ b/src/garage/admin_rpc.rs @@ -423,11 +423,11 @@ impl AdminRpcHandler { writeln!( &mut ret, "\nGarage version: {}", - git_version::git_version!( + option_env!("GIT_VERSION").unwrap_or(git_version::git_version!( prefix = "git:", cargo_prefix = "cargo:", fallback = "unknown" - ) + )) ) .unwrap(); |