1+ #! /usr/bin/env bash
2+
3+ set -euo pipefail
4+
5+ # Get TEST_ALL_RECIPES from environment variable, default to 0 (false)
6+ PYTHON_NG_TEST_ALL_RECIPES=${PYTHON_NG_TEST_ALL_RECIPES:- 0}
7+
8+ SAMPLE_RECIPES_NUM=30
9+ RECIPES_BUILD_NUM=10
10+ RECIPES_BUILT_COUNT=0
11+
12+ # Ensure required tools are installed
13+ COMMANDS=(" conan" " yq" " jq" )
14+ for cmd in " ${COMMANDS[@]} " ; do
15+ if ! which $cmd & > /dev/null; then
16+ echo " ERROR: $cmd is not installed. Please install $cmd to proceed."
17+ exit 1
18+ fi
19+ done
20+
21+ # Find all conanfile.py files that use apply_conandata_patches
22+ RECIPES=$( find . -type f -name " conanfile.py" -exec grep -l " apply_conandata_patches(self)" {} + | sort | uniq)
23+ # And does not need system requirement
24+ RECIPES=$( grep -L " /system" $RECIPES )
25+ # And does not contain Conan 1 imports
26+ RECIPES=$( grep -L " from conans" $RECIPES )
27+
28+ echo " Found $( echo " $RECIPES " | wc -l) recipes using apply_conandata_patches."
29+
30+ if [ " ${PYTHON_NG_TEST_ALL_RECIPES} " -eq " 1" ]; then
31+ SAMPLE_RECIPES_NUM=$( echo " $RECIPES " | wc -l)
32+ RECIPES_BUILD_NUM=$SAMPLE_RECIPES_NUM
33+ echo " PYTHON_NG_TEST_ALL_RECIPES is set to 1, testing all $SAMPLE_RECIPES_NUM recipes."
34+ else
35+ RECIPES=$( shuf -e ${RECIPES[@]} -n $SAMPLE_RECIPES_NUM )
36+ echo " Pick $SAMPLE_RECIPES_NUM random recipes to test:"
37+ echo " $RECIPES "
38+ fi
39+
40+ # Run conan create for each sampled recipe
41+ for it in $RECIPES ; do
42+
43+ if [ $RECIPES_BUILT_COUNT -ge $RECIPES_BUILD_NUM ]; then
44+ echo " Reached the limit of $RECIPES_BUILD_NUM recipes built, stopping. All done."
45+ break
46+ fi
47+
48+ recipe_dir=$( dirname " ${it} " )
49+ pushd " $recipe_dir " > /dev/null
50+ echo " Testing recipe in directory: ${recipe_dir} "
51+ # Get a version from conandata.yml that uses a patch
52+ version=$( yq ' .patches | keys | .[0]' conandata.yml 2> /dev/null)
53+ if [ -z " $version " ]; then
54+ echo " ERROR: No patches found in conandata.yml for $recipe_dir , skipping."
55+ popd > /dev/null
56+ continue
57+ fi
58+ version=$( echo ${version} | tr -d ' "' )
59+ # Replace apply_conandata_patches to exit just after applying patches
60+ sed -i -e ' s/apply_conandata_patches(self)/apply_conandata_patches(self); import sys; sys.exit(0)/g' conanfile.py
61+
62+ # Allow conan create to fail without stopping the script, we will handle errors manually
63+ set +e
64+
65+ # Create the package with the specified version
66+ output=$( conan create . --version=${version} 2>&1 )
67+ # Accept some errors as non-fatal
68+ if [ $? -ne 0 ]; then
69+ echo " WARNING: conan create failed for $recipe_dir "
70+ allowed_errors=(
71+ " ERROR: There are invalid packages"
72+ " ERROR: Version conflict"
73+ " ERROR: Missing binary"
74+ " Failed to establish a new connection"
75+ " ConanException: sha256 signature failed"
76+ " ConanException: Error downloading file"
77+ " ConanException: Cannot find"
78+ " certificate verify failed: certificate has expired"
79+ " NotFoundException: Not found"
80+ )
81+ # check if any allowed error is in the output
82+ if printf ' %s\n' " ${allowed_errors[@]} " | grep -q -f - <( echo " $output " ) ; then
83+ echo " WARNING: Could not apply patches, skipping build:"
84+ echo " $output " | tail -n 10
85+ echo " -------------------------------------------------------"
86+ else
87+ echo " ERROR: Fatal error during conan create command execution:"
88+ echo " $output "
89+ popd > /dev/null
90+ exit 1
91+ fi
92+ else
93+ echo " INFO: Successfully patched $recipe_dir ."
94+ echo " $output " | tail -n 10
95+ echo " -------------------------------------------------------"
96+ RECIPES_BUILT_COUNT=$(( RECIPES_BUILT_COUNT + 1 ))
97+ fi
98+ popd > /dev/null
99+ done
0 commit comments