123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- #!/usr/bin/env bash
- # Copyright Materialize, Inc. and contributors. All rights reserved.
- #
- # Use of this software is governed by the Business Source License
- # included in the LICENSE file at the root of this repository.
- #
- # As of the Change Date specified in that file, in accordance with
- # the Business Source License, use of this software will be governed
- # by the Apache License, Version 2.0.
- #
- # Compare dependencies and their flags against a ground truth. This serves against accidentally enabling dependencies
- # or feature flags.
- #
- # Example usages:
- #
- # $ ci/test/lint-deps.sh
- #
- # To rewrite the stored files, pass the --rewrite option.
- #
- # See the [README](lint-deps/README.md) for more details.
- set -euo pipefail
- . misc/shlib/shlib.bash
- # Explicitly name targets to check dependencies. We support Apple and Linux on ARM64 and x86_64.
- targets=(
- aarch64-apple-darwin
- x86_64-apple-darwin
- aarch64-unknown-linux-gnu
- x86_64-unknown-linux-gnu
- )
- if [[ "$(uname -s)" = Darwin ]]; then
- tac() {
- tail -r
- }
- fi
- rewrite=false
- resources="$(dirname "$0")/lint-deps"
- if [[ "${1:-}" = --rewrite ]]; then
- shift
- rewrite=true
- fi
- function deps() {
- echo "# generated by $0 -- see ${resources}/README.md for details"
- # We iterate $crates instead of passing all to `cargo tree` because it produces no
- # output if there is no dependency to any of the specified packages.
- for crate in "${crates[@]}"; do
- # Gather data for the current target, reverse lines, find the dependency hierarchy to the root, reverse lines.
- # shellcheck disable=SC2046
- output=$(cargo tree \
- $(printf -- "-p %s " "${entrypoints[@]}") \
- --format ':{lib}:{f}' \
- --prefix depth \
- --edges normal,build \
- --locked \
- --target "$target" \
- "$@" \
- | tac \
- | awk -F: 'BEGIN {f=-1} /^([0-9]+):'"$crate"'/{print;f=$0-1} f==$1{print;f=f-1}' \
- | tac)
- # Only print crate and dependency chain if there is a dependency.
- if [ -n "$output" ]; then
- echo "$crate"
- echo "$output"
- fi
- done
- }
- ci_uncollapsed_heading "Linting dependencies -- if the check fails, consult ci/test/lint-deps/README.md"
- ################################################
- # Jemalloc lints
- ################################################
- # List of crates to include in the dependency lint, including an explanation why they're listed.
- crates=(
- # Checks that the default allocator is jemalloc on supported platforms, but can
- # be disabled using --no-default-features or explicitly enabled with --features=jemalloc
- tikv_jemalloc_ctl
- tikv_jemallocator
- tikv_jemalloc_sys
- )
- # The crates whose dependency graphs we want to lint.
- entrypoints=(
- mz-clusterd
- mz-environmentd
- mz-materialized
- )
- for target in "${targets[@]}"; do
- if $rewrite; then
- deps > "$resources/$target-default"
- deps --no-default-features > "$resources/$target-no-default-features"
- deps --features jemalloc > "$resources/$target-jemalloc"
- else
- try diff "$resources/$target-default" <(deps)
- try diff "$resources/$target-no-default-features" <(deps --no-default-features)
- try diff "$resources/$target-jemalloc" <(deps --features jemalloc)
- fi
- done
- ################################################
- # workspace-hack lints
- ################################################
- # List of crates to include in the dependency lint, including an explanation why they're listed.
- crates=(
- # Should not be included in anything that may end up in the cloud repo.
- # Eventually, we should be able to disable this everywhere with --no-default-features.
- workspace_hack
- )
- # The crates whose dependency graphs we want to lint.
- # This should include any current or potential dependencies
- # used by the cloud repo.
- entrypoints=(
- mz-alloc
- mz-aws-secrets-controller
- mz-aws-util
- mz-build-info
- mz-build-tools
- mz-cloud-provider
- mz-cloud-resources
- mz-http-util
- mz-license-keys
- mz-lowertest
- mz-lowertest-derive
- mz-npm
- mz-orchestrator
- mz-orchestrator-kubernetes
- mz-orchestrator-process
- mz-orchestrator-tracing
- mz-orchestratord
- mz-ore
- mz-ore-build
- mz-ore-proc
- mz-persist-types
- mz-pgrepr-consts
- mz-pgtz
- mz-prof
- mz-prof-http
- mz-proto
- mz-repr
- mz-secrets
- mz-segment
- mz-service
- mz-sql-lexer
- mz-sql-parser
- mz-tls-util
- mz-tracing
- mz-walkabout
- )
- for target in "${targets[@]}"; do
- if $rewrite; then
- deps --no-default-features > "$resources/$target-workspace-hack-no-default-features"
- else
- try diff "$resources/$target-workspace-hack-no-default-features" <(deps --no-default-features)
- fi
- done
- try_status_report
|