From 0357677608925f0dc3e0a02314633df78f281bba Mon Sep 17 00:00:00 2001 From: Kory Draughn Date: Fri, 20 Mar 2026 16:34:30 -0400 Subject: [PATCH 1/4] [irods/irods_development_environment 165] Add option to build with release packages --- ..._consortium_continuous_integration_build_hook.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/irods_consortium_continuous_integration_build_hook.py b/irods_consortium_continuous_integration_build_hook.py index ad2dbe1..7640204 100644 --- a/irods_consortium_continuous_integration_build_hook.py +++ b/irods_consortium_continuous_integration_build_hook.py @@ -1,5 +1,3 @@ -from __future__ import print_function - import glob import multiprocessing import optparse @@ -84,9 +82,12 @@ def copy_output_packages(build_directory, output_root_directory): irods_python_ci_utilities.append_os_specific_directory(output_root_directory), lambda s:s.endswith(irods_python_ci_utilities.get_package_suffix())) -def main(build_directory, output_root_directory, irods_packages_root_directory, externals_directory): +def main(build_directory, output_root_directory, irods_packages_root_directory, externals_directory, irods_package_version): install_building_dependencies(externals_directory) - if irods_packages_root_directory: + if irods_package_version is not None: + irods_python_ci_utilities.install_irods_packages_repository() + irods_python_ci_utilities.install_released_irods_dev_and_runtime_packages(irods_package_version) + elif irods_packages_root_directory: irods_python_ci_utilities.install_irods_dev_and_runtime_packages(irods_packages_root_directory) build_directory = os.path.abspath(build_directory or tempfile.mkdtemp(prefix='irods_python_rule_engine_plugin_build_directory')) irods_python_ci_utilities.subprocess_get_output(['cmake', os.path.dirname(os.path.realpath(__file__))], check_rc=True, cwd=build_directory) @@ -100,9 +101,11 @@ def main(build_directory, output_root_directory, irods_packages_root_directory, parser.add_option('--output_root_directory') parser.add_option('--irods_packages_root_directory') parser.add_option('--externals_packages_directory') + parser.add_option('--irods_package_version') options, _ = parser.parse_args() main(options.build_directory, options.output_root_directory, options.irods_packages_root_directory, - options.externals_packages_directory) + options.externals_packages_directory, + options.irods_package_version) From 0cda13f0acb302c282721933ed41b062f2a06206 Mon Sep 17 00:00:00 2001 From: Terrell Russell Date: Fri, 22 May 2026 22:05:28 +0000 Subject: [PATCH 2/4] [258] Fix total_rows recount for case-insensitive queries When Query.total_rows() is called on a GenQuery1 query with a non-zero offset, genquery.py issues a second query with offset=0 so iRODS can return the full row count. That recount query was being built via Query(...) without passing through the original case_sensitive setting. Because Query.__init__() defaults case_sensitive to True, the recount path cleared UPPER_CASE_WHERE and skipped uppercasing the condition string. This allowed a case-insensitive fetch query to be paired with a case-sensitive recount query, producing total_rows() values smaller than the number of rows actually returned. Use self.copy(offset=0, limit=0, ...) for the recount path so the original query attributes are preserved, including case sensitivity and the rest of the query configuration. This keeps the recount query aligned with the fetch query while still forcing RETURN_TOTAL_ROW_COUNT for the manual recount. --- genquery.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/genquery.py b/genquery.py index 57eeeda..8e80879 100644 --- a/genquery.py +++ b/genquery.py @@ -267,8 +267,11 @@ def total_rows(self): # So instead, we run the query twice manually. This should # perform only slightly worse. # [1]: https://github.com/irods/irods/blob/4.2.6/plugins/database/src/general_query.cpp#L2393 - self._total = Query(self.callback, self.columns, self.conditions, limit=0, - options=self.options|Option.RETURN_TOTAL_ROW_COUNT).total_rows() + # Preserve query attributes such as case_sensitive when + # issuing the recount query. + self._total = self.copy(offset=0, + limit=0, + options=self.options | Option.RETURN_TOTAL_ROW_COUNT).total_rows() return self._total From 9738bfbf221eb56bc96a36a81dcf6e306f02f532 Mon Sep 17 00:00:00 2001 From: Kory Draughn Date: Fri, 11 Sep 2026 16:41:45 -0400 Subject: [PATCH 3/4] [265] Build hook: Add --debug_build option --- ...rtium_continuous_integration_build_hook.py | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/irods_consortium_continuous_integration_build_hook.py b/irods_consortium_continuous_integration_build_hook.py index 7640204..4acf7c2 100644 --- a/irods_consortium_continuous_integration_build_hook.py +++ b/irods_consortium_continuous_integration_build_hook.py @@ -1,6 +1,6 @@ +import argparse import glob import multiprocessing -import optparse import os import shutil import subprocess @@ -56,12 +56,15 @@ def install_building_dependencies(externals_directory): add_cmake_to_front_of_path() install_os_specific_dependencies() + def install_os_specific_dependencies_apt(): irods_python_ci_utilities.install_os_packages(['make', 'python3-dev', 'libssl-dev', 'gcc']) + def install_os_specific_dependencies_yum(): irods_python_ci_utilities.install_os_packages(['make', 'gcc', 'python3-devel', 'openssl-devel']) + def install_os_specific_dependencies(): dispatch_map = { 'Ubuntu': install_os_specific_dependencies_apt, @@ -76,13 +79,15 @@ def install_os_specific_dependencies(): except KeyError: irods_python_ci_utilities.raise_not_implemented_for_distribution() + def copy_output_packages(build_directory, output_root_directory): irods_python_ci_utilities.gather_files_satisfying_predicate( build_directory, irods_python_ci_utilities.append_os_specific_directory(output_root_directory), lambda s:s.endswith(irods_python_ci_utilities.get_package_suffix())) -def main(build_directory, output_root_directory, irods_packages_root_directory, externals_directory, irods_package_version): + +def main(build_directory, output_root_directory, irods_packages_root_directory, externals_directory, irods_package_version, debug_build=False): install_building_dependencies(externals_directory) if irods_package_version is not None: irods_python_ci_utilities.install_irods_packages_repository() @@ -90,22 +95,28 @@ def main(build_directory, output_root_directory, irods_packages_root_directory, elif irods_packages_root_directory: irods_python_ci_utilities.install_irods_dev_and_runtime_packages(irods_packages_root_directory) build_directory = os.path.abspath(build_directory or tempfile.mkdtemp(prefix='irods_python_rule_engine_plugin_build_directory')) - irods_python_ci_utilities.subprocess_get_output(['cmake', os.path.dirname(os.path.realpath(__file__))], check_rc=True, cwd=build_directory) + build_type = 'Debug' if debug_build else 'Release' + cmake_command = ['cmake', f'-DCMAKE_BUILD_TYPE={build_type}', os.path.dirname(os.path.realpath(__file__))] + print(cmake_command) + irods_python_ci_utilities.subprocess_get_output(cmake_command, check_rc=True, cwd=build_directory) irods_python_ci_utilities.subprocess_get_output(['make', '-j', str(multiprocessing.cpu_count()), 'package'], check_rc=True, cwd=build_directory) if output_root_directory: copy_output_packages(build_directory, output_root_directory) + if __name__ == '__main__': - parser = optparse.OptionParser() - parser.add_option('--build_directory') - parser.add_option('--output_root_directory') - parser.add_option('--irods_packages_root_directory') - parser.add_option('--externals_packages_directory') - parser.add_option('--irods_package_version') - options, _ = parser.parse_args() - - main(options.build_directory, - options.output_root_directory, - options.irods_packages_root_directory, - options.externals_packages_directory, - options.irods_package_version) + parser = argparse.ArgumentParser(description='Build python rule engine plugin.') + parser.add_argument('--build_directory') + parser.add_argument('--output_root_directory') + parser.add_argument('--irods_packages_root_directory') + parser.add_argument('--externals_packages_directory') + parser.add_argument('--irods_package_version') + parser.add_argument('--debug_build', action='store_true') + args = parser.parse_args() + + main(args.build_directory, + args.output_root_directory, + args.irods_packages_root_directory, + args.externals_packages_directory, + args.irods_package_version, + args.debug_build) From 861890126d9c14098bd54706e03b48c37efd9313 Mon Sep 17 00:00:00 2001 From: Kory Draughn Date: Fri, 11 Sep 2026 11:58:05 -0400 Subject: [PATCH 4/4] [263] Update default dynamic PEP regex to cover except/finally PEPs --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 098ca58..0c099a0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -94,7 +94,7 @@ const std::string STRING_VALUE_KEY = "STRING_VALUE_KEY"; const std::string IRODS_ERROR_PREFIX = "[iRods__Error__Code:"; const std::string STATIC_PEP_RULE_REGEX = "ac[^ ]*"; -const std::string DYNAMIC_PEP_RULE_REGEX = "[^ ]*pep_[^ ]*_(pre|post)"; +const std::string DYNAMIC_PEP_RULE_REGEX = "[^ ]*pep_[^ ]*_(pre|post|except|finally)"; namespace bp = boost::python;