addons-server/scripts/check_pip_packages.sh

89 строки
2.3 KiB
Bash
Executable File

#!/bin/bash
set -ue
requirements_dir="requirements"
requirements_files=$(ls $requirements_dir)
function fail() {
echo "Error:"
echo $1;
exit 1;
}
function pip_show_package() {
local output=$(pip show $1)
local name=$(echo "$output" | grep '^Name: ' | cut -d' ' -f2)
local version=$(echo "$output" | grep '^Version: ' | cut -d' ' -f2)
echo "$name==$version"
}
function get_package_name() {
echo $(echo $1 | cut -d'=' -f1 || fail "Name not found for $1")
}
function get_package_version() {
echo $(echo $1 | cut -d'=' -f3 || fail "Version not found for $1")
}
function get_required_packages() {
echo $(grep -E '^[a-zA-Z0-9_-]+==[0-9.]+' "requirements/$file" | sort |sed 's/ \\$//')
}
function to_sorted_set() {
echo "$1"$'\n'"$2" | sort | uniq | tr ' ' '\n' | grep -v '^$'
}
# Get all passed arguments as a list of files
files=("$@")
# if no arguments are passed, files=requirements_files
if [ ${#files[@]} -eq 0 ]; then
files=(${requirements_files[@]})
fi
required_packages=""
# make sure each file exists in requirements directory
for file in ${files[@]}; do
file_path="$requirements_dir/$file"
if [ ! -f $file_path ]; then
fail "File $file_path does not exist"
fi
required_packages=$(to_sorted_set "$required_packages" "$(get_required_packages)")
done
echo "Checking for packages required in ${files[@]}"
installed_packages=$(pip freeze --all --exclude-editable | sort -u)
function check_package() {
local expected_package=$1
expected_name=$(get_package_name $expected_package)
echo "$expected_name"
actual_package=$(
echo "$installed_packages" | grep "^$expected_name==" || pip_show_package $expected_name
)
actual_name=$(get_package_name $actual_package)
if [ "$expected_name" != "$actual_name" ]; then
fail "Package missing. Expected ${expected_name}. Received ${actual_name}"
fi
expected_version=$(get_package_version $expected_package)
actual_version=$(get_package_version $actual_package)
if [ "$expected_version" != "$actual_version" ]; then
fail "Package $expected_package has version $actual_version, expected $expected_version"
fi
}
for expected_package in $required_packages; do
check_package $expected_package
done
echo "All packages are installed correctly"