#!/bin/sh # report about status of build master # shellcheck disable=SC2119,SC2120 # shellcheck source=../lib/load-configuration . "${0%/*}/../lib/load-configuration" tmp_dir=$(mktemp -d 'tmp.build-master-status.XXXXXXXXXX' --tmpdir) trap 'rm -rf --one-file-system "${tmp_dir}"' EXIT # do not block if locked exec 9> "${status_lock_file}" if ! verbose_flock -n 9; then >&2 echo 'Saving status skipped, cannot acquire lock.' exit fi # update todos find "${base_dir}/bin/" "${base_dir}/conf/" "${base_dir}/lib/" -type f \ -exec grep -nHF '' '{}' \; | \ sed 's,^'"$(str_to_regex "${base_dir}")"'/,,' | \ sed -n ' /^[^:]\+:[0-9]\+:\s*#\s*TODO:/ { :a $! { N s/\n[^:[:space:]]\+:[0-9]\+:\s*\([^#[:space:]].*\)\?$// Ta } s/\n[^:[:space:]]\+:[0-9]\+:\s*#\s*/\\\\n/g s/^\([^:]\+\):\([0-9]\+\):\s*#\s*TODO:\s*/\1\t\2\t/ p } ' > "${tmp_dir}/todos" if [ -s "${tmp_dir}/todos" ]; then # shellcheck disable=SC2016 { printf 'SHOW CREATE TABLE `todos`' | \ mysql_run_query 'unimportant' | \ sed ' 1s/^\S\+\s\+CREATE TABLE `todos` /CREATE TEMPORARY TABLE `td` / s/ NOT NULL AUTO_INCREMENT/ NULL/ s/PRIMARY KEY/INDEX/ ' printf ';\n' printf 'LOAD DATA LOCAL INFILE "%s" INTO TABLE `td` (`file`,`line`,`description`);\n' \ "${tmp_dir}/todos" for matches in 'file line description' 'file description' 'file line' 'description'; do printf 'UPDATE `td`' printf ' JOIN `todos`' for match in ${matches}; do printf ' AND `td`.`%s`=`todos`.`%s`' \ "${match}" "${match}" done | \ sed 's/^ AND / ON /' printf ' SET `td`.`id`=`todos`.`id`' printf ' WHERE `td`.`id` IS NULL;\n' done printf 'UPDATE `todos`' printf ' JOIN `td`' printf ' ON `todos`.`id`=`td`.`id`' printf ',`todos`.`%s`=`td`.`%s`' \ 'file' 'file' \ 'line' 'line' \ 'description' 'description' | \ sed 's/^,/ SET /' printf ';\n' printf 'INSERT IGNORE INTO `todos` (`file`,`line`,`description`)' printf ' SELECT `td`.`file`,`td`.`line`,`td`.`description`' printf ' FROM `td`' printf ' WHERE `td`.`id` IS NULL;\n' printf 'DELETE FROM `todos`' printf ' WHERE NOT EXISTS (' printf 'SELECT 1' printf ' FROM `td`' printf ' AND `td`.`%s`=`todos`.`%s`' \ 'file' 'file' \ 'line' 'line' \ 'description' 'description' | \ sed 's/^ AND / WHERE /' printf ');\n' printf 'DROP TEMPORARY TABLE `td`;\n' printf 'DELETE FROM `todo_links`' printf ' WHERE NOT EXISTS (' printf 'SELECT 1' printf ' FROM `todos` ' printf 'WHERE `todos`.`id`=`todo_links`.`depending_on`' printf ') OR NOT EXISTS (' printf 'SELECT 1' printf ' FROM `todos` ' printf 'WHERE `todos`.`id`=`todo_links`.`dependent`' printf ');\n' } | \ mysql_run_query 'unimportant' fi rm -f "${tmp_dir}/todos" if [ ! -s "${work_dir}/build-master-sanity" ]; then # shellcheck disable=SC2016 { printf 'INSERT IGNORE INTO `statistics` (' printf '`%s`,' \ 'pending_tasks_count' \ 'pending_packages_count' \ 'broken_tasks_count' \ 'dependency_loops_count' \ 'dependency_looped_tasks_count' \ 'locked_tasks_count' \ 'blocked_tasks_count' \ 'next_tasks_count' \ 'stable_packages_count' \ 'staging_packages_count' \ 'testing_packages_count' \ 'tested_packages_count' \ 'architecture' | \ sed 's/,$//' printf ') SELECT ' printf '`ba_q`.`%s`,' \ 'pending_tasks_count' \ 'pending_packages_count' \ 'broken_tasks_count' \ 'dependency_loops_count' \ 'dependency_looped_tasks_count' \ 'locked_tasks_count' \ 'blocked_tasks_count' \ 'next_tasks_count' printf '`bp_q`.`%s`,' \ 'stable_packages_count' \ 'staging_packages_count' \ 'testing_packages_count' \ 'tested_packages_count' printf '`architectures`.`id`' printf ' FROM `architectures`' printf ' LEFT JOIN (' printf 'SELECT' printf ' COUNT(' printf 'DISTINCT `build_assignments`.`id`' printf ') AS `pending_tasks_count`,' printf ' COUNT(' printf 'DISTINCT `binary_packages`.`id`' printf ') AS `pending_packages_count`,' printf ' COUNT(' printf 'DISTINCT IF(' printf '`build_assignments`.`is_broken`,' printf '`build_assignments`.`id`,' printf 'NULL' printf ')' printf ') AS `broken_tasks_count`,' printf ' COUNT(' printf 'DISTINCT `build_dependency_loops`.`loop`' printf ') AS `dependency_loops_count`,' printf ' COUNT(' printf 'DISTINCT `build_dependency_loops`.`build_assignment`' printf ') AS `dependency_looped_tasks_count`,' printf ' COUNT(' printf 'DISTINCT `build_slaves`.`currently_building`' printf ') AS `locked_tasks_count`,' printf ' COUNT(' printf 'DISTINCT IF(' printf '`build_assignments`.`is_blocked` IS NULL,' printf 'NULL,' printf '`build_assignments`.`id`' printf ')' printf ') AS `blocked_tasks_count`,' printf ' COUNT(' printf 'DISTINCT IF(' mysql_query_has_pending_dependencies \ "$( # shellcheck disable=SC2154 printf 'IF(`build_assignments`.`architecture`=%s,%s,`build_assignments`.`architecture`)' \ "${architecture_ids__any}" \ "${architecture_ids__i686}" )" \ '`build_assignments`.`id`' printf ',' printf 'NULL,' printf '`build_assignments`.`id`' printf ')' printf ') AS `next_tasks_count`,' printf ' `build_assignments`.`architecture`' printf ' FROM `build_assignments`' mysql_join_build_assignments_binary_packages mysql_join_binary_packages_binary_packages_in_repositories mysql_join_binary_packages_in_repositories_repositories printf ' JOIN (' printf 'SELECT `binary_packages`.`build_assignment`' printf ' FROM `binary_packages`' mysql_join_binary_packages_binary_packages_in_repositories printf ' WHERE `binary_packages_in_repositories`.`repository`=%s' \ "${repository_ids__any_build_list}" printf ' GROUP BY `binary_packages`.`build_assignment`' printf ') AS `bp_subq`' printf ' ON `bp_subq`.`build_assignment`=`build_assignments`.`id`' printf ' LEFT' mysql_join_build_assignments_build_slaves printf ' LEFT' mysql_join_build_assignments_build_dependency_loops printf ' GROUP BY `build_assignments`.`architecture`' printf ') AS `ba_q`' printf ' ON `ba_q`.`architecture`=`architectures`.`id`' printf ' LEFT JOIN (' printf 'SELECT' printf ' SUM(' printf 'IF(' # shellcheck disable=SC2154 printf '`repositories`.`stability`=%s,' \ "${repository_stability_ids__stable}" printf '1,0' printf ')' printf ') AS `stable_packages_count`,' printf ' SUM(' printf 'IF(' # shellcheck disable=SC2154 printf '`repositories`.`stability`=%s,' \ "${repository_stability_ids__staging}" printf '1,0' printf ')' printf ') AS `staging_packages_count`,' printf ' SUM(' printf 'IF(' # shellcheck disable=SC2154 printf '`repositories`.`stability`=%s' \ "${repository_stability_ids__testing}" printf ' AND NOT `binary_packages`.`is_tested`,' printf '1,0' printf ')' printf ') AS `testing_packages_count`,' printf ' SUM(' printf 'IF(' printf '`repositories`.`stability`=%s' \ "${repository_stability_ids__testing}" printf ' AND `binary_packages`.`is_tested`,' printf '1,0' printf ')' printf ') AS `tested_packages_count`,' printf ' `repositories`.`architecture`' printf ' FROM `binary_packages`' mysql_join_binary_packages_binary_packages_in_repositories mysql_join_binary_packages_in_repositories_repositories printf ' GROUP BY `repositories`.`architecture`' printf ') AS `bp_q`' printf ' ON `bp_q`.`architecture`=`architectures`.`id`;\n' } | \ mysql_run_query 'unimportant' fi # update count of blocked packages update_blocked_packages_count