@@ -135,26 +135,51 @@ update_pyproject_version() {
135135detect_changed_packages () {
136136 echo " Detecting changed dependencies..."
137137
138- # Try requirements files first
139- CHANGED_PACKAGES=$( git diff --cached requirements/* .txt 2> /dev/null | grep -E " ^[-+][a-zA-Z0-9_-]+==" | sed ' s/^[+-]//' | sort -u | head -20 || true)
138+ # Package name regex per PEP 508: starts with letter/digit, can contain letters, digits, dots, underscores, hyphens
139+ local pkg_pattern=' ^[-+][a-zA-Z0-9][a-zA-Z0-9._-]*=='
140+
141+ # Try requirements/*.txt files first (pip-compile output format)
142+ CHANGED_PACKAGES=$( git diff --cached requirements/* .txt 2> /dev/null | grep -E " $pkg_pattern " | sed ' s/^[+-]//' | sort -u | head -20 || true)
143+
144+ if [ -z " $CHANGED_PACKAGES " ]; then
145+ CHANGED_PACKAGES=$( git diff requirements/* .txt 2> /dev/null | grep -E " $pkg_pattern " | sed ' s/^[+-]//' | sort -u | head -20 || true)
146+ fi
147+
148+ # Try requirements/*.in files (unpinned requirements)
149+ if [ -z " $CHANGED_PACKAGES " ]; then
150+ CHANGED_PACKAGES=$( git diff --cached requirements/* .in 2> /dev/null | grep -E ' ^[-+][a-zA-Z0-9][a-zA-Z0-9._-]*' | grep -v ' ^[-+]#' | grep -v ' ^[-+]-' | sed ' s/^[+-]//' | sed ' s/[<>=].*//' | sort -u | head -20 || true)
151+ fi
140152
141153 if [ -z " $CHANGED_PACKAGES " ]; then
142- CHANGED_PACKAGES=$( git diff requirements/* .txt 2> /dev/null | grep -E " ^[-+][a-zA-Z0-9_-]+== " | sed ' s/^[+-]//' | sort -u | head -20 || true)
154+ CHANGED_PACKAGES=$( git diff requirements/* .in 2> /dev/null | grep -E ' ^[-+][a-zA-Z0-9][a-zA-Z0-9._-]* ' | grep -v ' ^[-+]# ' | grep -v ' ^[-+]- ' | sed ' s/^[+-]// ' | sed ' s/[<>=].* //' | sort -u | head -20 || true)
143155 fi
144156
145157 # Try uv.lock if no requirements changes found
146158 if [ -z " $CHANGED_PACKAGES " ]; then
147- CHANGED_PACKAGES=$( git diff --cached uv.lock 2> /dev/null | grep -E " ^[-+]name\s*=" | sed -E ' s/^[-+]name\s*=\s*"([^"]+)"/\1/' | sort -u | head -20 || true)
159+ CHANGED_PACKAGES=$( git diff --cached uv.lock 2> /dev/null | grep -E ' ^[-+]name\s*=' | sed -E ' s/^[-+]name\s*=\s*"([^"]+)"/\1/' | sort -u | head -20 || true)
148160 fi
149161
150162 if [ -z " $CHANGED_PACKAGES " ]; then
151- CHANGED_PACKAGES=$( git diff uv.lock 2> /dev/null | grep -E " ^[-+]name\s*=" | sed -E ' s/^[-+]name\s*=\s*"([^"]+)"/\1/' | sort -u | head -20 || true)
163+ CHANGED_PACKAGES=$( git diff uv.lock 2> /dev/null | grep -E ' ^[-+]name\s*=' | sed -E ' s/^[-+]name\s*=\s*"([^"]+)"/\1/' | sort -u | head -20 || true)
164+ fi
165+
166+ # Try pyproject.toml dependencies section
167+ if [ -z " $CHANGED_PACKAGES " ]; then
168+ CHANGED_PACKAGES=$( git diff --cached pyproject.toml 2> /dev/null | grep -E ' ^[-+]\s*"?[a-zA-Z0-9][a-zA-Z0-9._-]*[<>=]' | sed -E ' s/^[-+]\s*"?([a-zA-Z0-9][a-zA-Z0-9._-]*).*/\1/' | sort -u | head -20 || true)
169+ fi
170+
171+ if [ -z " $CHANGED_PACKAGES " ]; then
172+ CHANGED_PACKAGES=$( git diff pyproject.toml 2> /dev/null | grep -E ' ^[-+]\s*"?[a-zA-Z0-9][a-zA-Z0-9._-]*[<>=]' | sed -E ' s/^[-+]\s*"?([a-zA-Z0-9][a-zA-Z0-9._-]*).*/\1/' | sort -u | head -20 || true)
152173 fi
153174
154175 # Build changelog entry
155176 if [ -n " $CHANGED_PACKAGES " ]; then
156177 PACKAGE_COUNT=$( echo " $CHANGED_PACKAGES " | wc -l | tr -d ' ' )
157- echo " Found $PACKAGE_COUNT changed package(s)"
178+ echo " Found $PACKAGE_COUNT changed package(s):"
179+ echo " $CHANGED_PACKAGES " | head -5 | sed ' s/^/ - /'
180+ if [ " $PACKAGE_COUNT " -gt 5 ]; then
181+ echo " ... and $(( PACKAGE_COUNT - 5 )) more"
182+ fi
158183 else
159184 echo " Could not auto-detect packages, using generic entry"
160185 fi
0 commit comments