#!/usr/bin/env bash set -euo pipefail # Find and combine requirements from src/*/requirements.txt, # filtering out lines whose *package name* starts with "cpl-". # Works with pinned versions, extras, markers, editable installs, and VCS refs. shopt -s nullglob req_files=(src/*/requirements.txt) if ((${#req_files[@]} == 0)); then echo "No requirements files found at src/*/requirements.txt" >&2 exit 1 fi tmp_combined="$(mktemp)" trap 'rm -f "$tmp_combined"' EXIT # Concatenate, trim comments/whitespace, filter out cpl-* packages, dedupe. # We keep non-package options/flags/constraints as-is. awk ' function trim(s){ sub(/^[[:space:]]+/,"",s); sub(/[[:space:]]+$/,"",s); return s } { line=$0 # drop full-line comments and strip inline comments if (line ~ /^[[:space:]]*#/) next sub(/#[^!].*$/,"",line) # strip trailing comment (simple heuristic) line=trim(line) if (line == "") next # Determine the package *name* even for "-e", extras, pins, markers, or VCS "@" e = line sub(/^-e[[:space:]]+/,"",e) # remove editable prefix # Tokenize up to the first of these separators: space, [ < > = ! ~ ; @ token = e sub(/\[.*/,"",token) # remove extras quickly n = split(token, a, /[<>=!~;@[:space:]]/) name = tolower(a[1]) # If the first token (name) starts with "cpl-", skip this requirement if (name ~ /^cpl-/) next print line } ' "${req_files[@]}" | sort -u > "$tmp_combined" if ! [ -s "$tmp_combined" ]; then echo "Nothing to install after filtering out cpl-* packages." >&2 exit 0 fi echo "Installing dependencies (excluding cpl-*) from:" printf ' - %s\n' "${req_files[@]}" echo echo "Final set to install:" cat "$tmp_combined" echo # Use python -m pip for reliability; change to python3 if needed. python -m pip install -r "$tmp_combined"