summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bin')
-rwxr-xr-xbin/bootstrap-mysql72
-rwxr-xr-xbin/build-master-status25
-rwxr-xr-xbin/build-packages3
-rwxr-xr-xbin/cleanup4
-rwxr-xr-xbin/copy-to-build-support2
-rwxr-xr-xbin/db-update6
-rwxr-xr-xbin/delete-packages10
-rwxr-xr-xbin/find-obsolete-packages127
-rwxr-xr-xbin/get-assignment138
-rwxr-xr-xbin/get-package-updates181
-rwxr-xr-xbin/ii-connect18
-rwxr-xr-xbin/ping-from-slave3
-rwxr-xr-xbin/return-assignment10
-rwxr-xr-xbin/sanity-check216
-rwxr-xr-xbin/slave-build-connect29
15 files changed, 570 insertions, 274 deletions
diff --git a/bin/bootstrap-mysql b/bin/bootstrap-mysql
index 822d995..35f5398 100755
--- a/bin/bootstrap-mysql
+++ b/bin/bootstrap-mysql
@@ -367,6 +367,25 @@ if [ ! "$1" = 'slim' ]; then
printf 'CREATE TEMPORARY TABLE `moveable_binary_packages%s` (`id` BIGINT, `to_repository` MEDIUMINT, UNIQUE KEY (`id`));\n' \
"${copy}"
done
+ printf 'DROP TEMPORARY TABLE IF EXISTS `package_blobs`;\n'
+ printf 'CREATE TEMPORARY TABLE `package_blobs` (`ps_a` BIGINT, `ps_b` BIGINT, UNIQUE KEY `content` (`ps_a`,`ps_b`));\n'
+ # all packages being vaguely relevant enter `package_blobs`, because
+ # they might block any other package from moving
+ printf 'INSERT IGNORE INTO `package_blobs` (`ps_a`,`ps_b`)'
+ printf ' SELECT `a_ps`.`id`,`b_ps`.`id`'
+ printf ' FROM `package_sources` AS `a_ps`'
+ printf ' JOIN `package_sources` AS `b_ps`'
+ printf ' ON UNIX_TIMESTAMP(`a_ps`.`commit_time`) - UNIX_TIMESTAMP(`b_ps`.`commit_time`) BETWEEN -10 AND 10'
+ mysql_join_package_sources_build_assignments 'a_ps' 'a_ba'
+ mysql_join_package_sources_build_assignments 'b_ps' 'b_ba'
+ mysql_join_build_assignments_binary_packages 'a_ba' 'a_bp'
+ mysql_join_build_assignments_binary_packages 'b_ba' 'b_bp'
+ mysql_join_binary_packages_repositories 'a_bp' 'a_r'
+ mysql_join_binary_packages_repositories 'b_bp' 'b_r'
+ mysql_join_repositories_repository_stabilities 'a_r' 'a_rs'
+ mysql_join_repositories_repository_stabilities 'b_r' 'b_rs'
+ printf ' WHERE `a_rs`.`name` = `from_stability`'
+ printf ' AND `b_rs`.`name` = `from_stability`;\n'
# these packages are considered for moving:
printf 'INSERT IGNORE INTO `moveable_binary_packages` (`id`,`to_repository`)'
printf ' SELECT `binary_packages`.`id`,`repository_moves`.`to_repository`'
@@ -408,6 +427,8 @@ if [ ! "$1" = 'slim' ]; then
# now we delete all unreplaceable and unmoveable packages from the respective
# list until no further changes are required
printf 'REPEAT\n'
+ printf 'SET row_count_saved = 0;\n'
+
# create copies of our temporary tables *yuck*
for table in 'replaced' 'moveable'; do
for copy in '' '2'; do
@@ -433,23 +454,23 @@ if [ ! "$1" = 'slim' ]; then
printf ' AND `dependency_types`.`relevant_for_binary_packages`'
# ... by a not-deleted, "more stable" package already in place or ...
printf ' WHERE NOT EXISTS ('
- printf 'SELECT * FROM `install_target_providers`'
+ printf 'SELECT 1 FROM `install_target_providers`'
mysql_join_install_target_providers_binary_packages '' 'prov_bp'
mysql_join_binary_packages_repositories 'prov_bp' 'prov_r'
printf ' JOIN `repository_stability_relations` ON `prov_r`.`stability`=`repository_stability_relations`.`more_stable`'
printf ' WHERE `install_target_providers`.`install_target`=`dependencies`.`depending_on`'
printf ' AND `target_repositories`.`stability`=`repository_stability_relations`.`less_stable`'
printf ' AND NOT EXISTS ('
- printf 'SELECT * FROM `replaced_binary_packages_copy`'
+ printf 'SELECT 1 FROM `replaced_binary_packages_copy`'
printf ' WHERE `replaced_binary_packages_copy`.`id`=`prov_bp`.`id`'
printf ')'
# ... by a moved package
printf ') AND NOT EXISTS ('
- printf 'SELECT * FROM `install_target_providers`'
+ printf 'SELECT 1 FROM `install_target_providers`'
printf ' JOIN `moveable_binary_packages_copy` ON `moveable_binary_packages_copy`.`id`=`install_target_providers`.`package`'
printf ' WHERE `install_target_providers`.`install_target`=`dependencies`.`depending_on`'
printf ');\n'
- printf 'SET @row_count_saved = ROW_COUNT();\n'
+ printf 'SET row_count_saved = row_count_saved + ROW_COUNT();\n'
# refresh copies of our temporary tables *yuck*
for table in 'replaced' 'moveable'; do
@@ -485,7 +506,7 @@ if [ ! "$1" = 'slim' ]; then
mysql_join_install_target_providers_dependencies
printf ' AND NOT EXISTS ('
# dependencies of replaced packages don't matter
- printf 'SELECT * FROM `replaced_binary_packages_copy`'
+ printf 'SELECT 1 FROM `replaced_binary_packages_copy`'
printf ' WHERE `replaced_binary_packages_copy`.`id`=`dependencies`.`dependent`'
printf ')'
mysql_join_dependencies_dependency_types
@@ -502,7 +523,7 @@ if [ ! "$1" = 'slim' ]; then
# a) ^
printf ' WHERE NOT EXISTS ('
# no moved package ...
- printf 'SELECT *'
+ printf 'SELECT 1'
printf ' FROM `moveable_binary_packages_copy`'
mysql_join_binary_packages_install_target_providers 'moveable_binary_packages_copy' 'subst_itp'
# ... provides the same
@@ -510,7 +531,7 @@ if [ ! "$1" = 'slim' ]; then
# b) 1) ^
printf ') AND NOT EXISTS ('
# no current package ...
- printf 'SELECT *'
+ printf 'SELECT 1'
printf ' FROM `binary_packages` AS `subst_bp`'
mysql_join_binary_packages_install_target_providers 'subst_bp' 'subst_itp'
# ... in a repository ...
@@ -522,14 +543,47 @@ if [ ! "$1" = 'slim' ]; then
printf ' WHERE `subst_rr`.`less_stable`=`repl_r`.`stability`'
printf ' AND NOT EXISTS ('
# ... and which is not replaced ...
- printf 'SELECT * FROM `replaced_binary_packages_copy2`'
+ printf 'SELECT 1 FROM `replaced_binary_packages_copy2`'
printf ' WHERE `replaced_binary_packages_copy2`.`id`=`subst_bp`.`id`'
printf ')'
# ... and provides the same
printf ' AND `subst_itp`.`install_target`=`install_target_providers`.`install_target`'
# b) 2) ^
printf ');\n'
- printf 'UNTIL row_count_saved=0 AND ROW_COUNT()=0\n'
+ printf 'SET row_count_saved = row_count_saved + ROW_COUNT();\n'
+
+ # refresh copies of our temporary tables *yuck*
+ for table in 'replaced' 'moveable'; do
+ for copy in '' '2'; do
+ if [ "${table}" = 'moveable' ] && \
+ [ "${copy}" = '2' ]; then
+ continue
+ fi
+ printf 'DELETE FROM `%s_binary_packages_copy%s`;\n' "${table}" "${copy}"
+ printf 'INSERT IGNORE INTO `%s_binary_packages_copy%s`' "${table}" "${copy}"
+ printf ' SELECT `%s_binary_packages`.*' "${table}"
+ printf ' FROM `%s_binary_packages`;\n' "${table}"
+ done
+ done
+
+ printf 'DELETE `replaced_binary_packages`,`moveable_binary_packages` FROM `replaced_binary_packages`'
+ printf ' RIGHT JOIN `moveable_binary_packages`'
+ printf ' ON `replaced_binary_packages`.`replaced_by`=`moveable_binary_packages`.`id`'
+ printf ' JOIN `binary_packages`'
+ printf ' ON `binary_packages`.`id`=`moveable_binary_packages`.`id`'
+ mysql_join_binary_packages_build_assignments
+ printf ' JOIN `package_blobs`'
+ printf ' ON `build_assignments`.`package_source`=`package_blobs`.`ps_a`'
+ printf ' JOIN `build_assignments` AS `bl_ba`'
+ printf ' ON `bl_ba`.`package_source`=`package_blobs`.`ps_b`'
+ mysql_join_build_assignments_binary_packages 'bl_ba' 'bl_bp'
+ printf ' WHERE NOT EXISTS ('
+ printf 'SELECT 1 FROM `moveable_binary_packages_copy`'
+ printf ' WHERE `moveable_binary_packages_copy`.`id`=`bl_bp`.`id`'
+ printf ');\n'
+ printf 'SET row_count_saved = row_count_saved + ROW_COUNT();\n'
+
+ printf 'UNTIL row_count_saved=0\n'
printf 'END REPEAT;\n'
for table in 'moveable' 'replaced'; do
for copy in '' '2'; do
diff --git a/bin/build-master-status b/bin/build-master-status
index 9503d71..7ab38d4 100755
--- a/bin/build-master-status
+++ b/bin/build-master-status
@@ -19,7 +19,7 @@ fi
mysql_cleanup
# update todos
-find "${base_dir}/bin/" "${base_dir}/conf/" -type f \
+find "${base_dir}/bin/" "${base_dir}/conf/" "${base_dir}/lib/" -type f \
-exec grep -nHF '' '{}' \; | \
sed 's,^'"$(str_to_regex "${base_dir}")"'/,,' | \
sed -n '
@@ -206,15 +206,20 @@ if [ ! -s "${work_dir}/build-master-sanity" ]; then
mysql_join_build_assignments_binary_packages
mysql_join_binary_packages_repositories
printf ' WHERE `repositories`.`name`="build-list"'
- printf ' AND NOT EXISTS ('
- printf 'SELECT * FROM `dependencies`'
- mysql_join_dependencies_dependency_types
- printf ' AND `dependency_types`.`relevant_for_binary_packages`'
- mysql_join_dependencies_install_target_providers
- mysql_join_install_target_providers_binary_packages '' 'prov_bp'
- mysql_join_binary_packages_repositories 'prov_bp' 'prov_r'
- printf ' WHERE `prov_r`.`name`="build-list"'
- printf ' AND `dependencies`.`dependent`=`binary_packages`.`id`'
+ printf ' AND ('
+ printf 'NOT EXISTS ('
+ printf 'SELECT 1 FROM `dependencies`'
+ mysql_join_dependencies_dependency_types
+ printf ' AND `dependency_types`.`relevant_for_building`'
+ mysql_join_dependencies_install_target_providers
+ mysql_join_install_target_providers_binary_packages '' 'prov_bp'
+ mysql_join_binary_packages_repositories 'prov_bp' 'prov_r'
+ printf ' WHERE `prov_r`.`name`="build-list"'
+ printf ' AND `dependencies`.`dependent`=`binary_packages`.`id`'
+ printf ') OR EXISTS ('
+ printf 'SELECT 1 FROM `build_dependency_loops`'
+ printf ' WHERE `build_dependency_loops`.`build_assignment`=`build_assignments`.`id`'
+ printf ')'
printf '))'
printf ');\n'
} | \
diff --git a/bin/build-packages b/bin/build-packages
index e9ac0c4..fc80ab1 100755
--- a/bin/build-packages
+++ b/bin/build-packages
@@ -466,6 +466,9 @@ while [ "${count}" -ne 0 ]; do
find "${package_content_dir}/${pkgfile##*/}" \
-name 'opt' -prune , \
-exec objdump -x '{}' \; 2>/dev/null | \
+ sed '
+ /^architecture:.* i386:x86-64, /,/^architecture:.* i386:x86-32, / d
+ ' | \
grep -w 'NEEDED' | \
awk '{print $2}' | \
sed '
diff --git a/bin/cleanup b/bin/cleanup
index 83bb209..830cb94 100755
--- a/bin/cleanup
+++ b/bin/cleanup
@@ -60,10 +60,6 @@ find "${build_log_directory}/error" -maxdepth 1 -type f -printf '%f\n' | \
done
}
-# only keep last 50 lines of ssh-log
-tail -n50 "${work_dir}/ssh-log" | \
- sponge "${work_dir}/ssh-log"
-
# only keep namcap logs of last 2 weeks for succeeded packages
find "${build_log_directory}/success" -maxdepth 1 -type f -mtime +14 \
-not -exec zgrep -q '^+.*ELF file .* has text relocations' '{}' \; \
diff --git a/bin/copy-to-build-support b/bin/copy-to-build-support
index 5382235..1164c1d 100755
--- a/bin/copy-to-build-support
+++ b/bin/copy-to-build-support
@@ -2,6 +2,8 @@
# copy the given package(s) into build-support
+# TODO: enable separate repositories for each architecture
+
# shellcheck source=../conf/default.conf
. "${0%/*}/../conf/default.conf"
diff --git a/bin/db-update b/bin/db-update
index 54d2f87..28e9861 100755
--- a/bin/db-update
+++ b/bin/db-update
@@ -12,6 +12,8 @@
# TODO: we should delete more packages than just the ones in repositories
# where we move to (think of [extra] -> [community])
+# TODO: enable separate repositories for each architecture
+
# shellcheck disable=SC2039
# shellcheck source=../conf/default.conf
. "${0%/*}/../conf/default.conf"
@@ -392,7 +394,9 @@ for source_stability in 'testing' 'staging'; do
printf ' JOIN `replaced_binary_packages` ON `binary_packages`.`id`=`replaced_binary_packages`.`id`;\n'
printf 'UPDATE `binary_packages`'
printf ' JOIN `moved_binary_packages` ON `binary_packages`.`id`=`moved_binary_packages`.`id`'
- printf ' SET `binary_packages`.`repository`=`moved_binary_packages`.`new_repository`;\n'
+ printf ' SET `binary_packages`.`repository`=`moved_binary_packages`.`new_repository`,'
+ printf ' `binary_packages`.`last_moved`=NOW()'
+ printf ' WHERE `binary_packages`.`repository`!=`moved_binary_packages`.`new_repository`;\n'
} | \
mysql_run_query
done
diff --git a/bin/delete-packages b/bin/delete-packages
index 7d2a3bd..5f60b40 100755
--- a/bin/delete-packages
+++ b/bin/delete-packages
@@ -15,6 +15,8 @@
# TODO: delete other to-be-deleted packages if asked to do so
+# TODO: enable separate repositories for each architecture
+
# shellcheck disable=SC2016
usage() {
>&2 echo ''
@@ -135,19 +137,19 @@ export TMPDIR="${tmp_dir}"
printf ')'
printf ');\n'
- printf ' SELECT DISTINCT "repo",`repositories`.`name`'
+ printf 'SELECT DISTINCT "repo",`repositories`.`name`'
printf ' FROM `to_deletes`'
printf ' JOIN `binary_packages` ON `to_deletes`.`id`=`binary_packages`.`id`'
mysql_join_binary_packages_repositories
printf ';\n'
- printf ' SELECT "package",`repositories`.`name`,`binary_packages`.`pkgname`'
+ printf 'SELECT "package",`repositories`.`name`,`binary_packages`.`pkgname`'
printf ' FROM `to_deletes`'
printf ' JOIN `binary_packages` ON `to_deletes`.`id`=`binary_packages`.`id`'
mysql_join_binary_packages_repositories
printf ';\n'
- printf ' SELECT "package-file",`repositories`.`name`,'
+ printf 'SELECT "package-file",`repositories`.`name`,'
mysql_package_name_query
printf ' FROM `to_deletes`'
printf ' JOIN `binary_packages` ON `to_deletes`.`id`=`binary_packages`.`id`'
@@ -155,7 +157,7 @@ export TMPDIR="${tmp_dir}"
mysql_join_binary_packages_architectures
printf ';\n'
- printf ' SELECT "package-id",`to_deletes`.`id`'
+ printf 'SELECT "package-id",`to_deletes`.`id`'
printf ' FROM `to_deletes`'
printf ';\n'
} | \
diff --git a/bin/find-obsolete-packages b/bin/find-obsolete-packages
new file mode 100755
index 0000000..3a4bebc
--- /dev/null
+++ b/bin/find-obsolete-packages
@@ -0,0 +1,127 @@
+#!/bin/sh
+
+# shellcheck source=../conf/default.conf
+. "${0%/*}/../conf/default.conf"
+
+usage() {
+ >&2 echo ''
+ >&2 echo 'find-obsolete-packages: find packages which are no longer available upstream.'
+ >&2 echo ''
+ >&2 echo 'possible options:'
+ >&2 echo ' -h|--help:'
+ >&2 echo ' Show this help and exit.'
+ >&2 echo ' -m|--mirror https://mirror.example.com/archlinux'
+ >&2 echo ' Mirror url to take upstream'"'"'s packages from.'
+ >&2 echo ' -n|--no-action:'
+ >&2 echo ' Do not mark packages as to_be_deleted.'
+ >&2 echo ' -w|--wait:'
+ >&2 echo ' Wait for lock if necessary.'
+ [ -z "$1" ] && exit 1 || exit "$1"
+}
+
+eval set -- "$(
+ getopt -o hm:nw \
+ --long help \
+ --long mirror: \
+ --long no-action \
+ --long wait \
+ -n "$(basename "$0")" -- "$@" || \
+ echo usage
+)"
+
+mirror=''
+no_action=false
+wait_for_lock='-n'
+
+while true
+do
+ case "$1" in
+ -h|--help)
+ usage 0
+ ;;
+ -m|--mirror)
+ if [ -n "${mirror}" ]; then
+ >&2 echo 'Already have one -m flag.'
+ usage
+ fi
+ shift
+ mirror="$1"
+ ;;
+ -n|--no-action)
+ no_action=true
+ ;;
+ -w|--wait)
+ wait_for_lock=''
+ ;;
+ --)
+ shift
+ break
+ ;;
+ *)
+ >&2 echo 'Whoops, forgot to implement option "'"$1"'" internally.'
+ exit 42
+ ;;
+ esac
+ shift
+done
+
+if [ $# -ne 0 ]; then
+ >&2 echo 'Too many arguments.'
+ usage
+fi
+
+if [ -z "${mirror}" ]; then
+ >&2 echo 'Flag -m missing'
+ usage
+fi
+
+if ! ${no_action}; then
+ exec 9> "${sanity_check_lock_file}"
+ if ! flock -s ${wait_for_lock} 9; then
+ >&2 echo 'Cannot get sanity-check lock.'
+ exit 1
+ fi
+
+ exec 8> "${build_list_lock_file}"
+ if ! flock ${wait_for_lock} 8; then
+ >&2 echo 'Cannot get build-list lock.'
+ exit 1
+ fi
+fi
+
+{
+ for repo in core extra community; do
+ curl -Ss "${mirror}/${repo}/os/x86_64/${repo}.db.tar.gz" | \
+ tar -tz
+ done | \
+ sed -n '
+ s,\(-[^-]*\)\{2\}/desc$,,
+ T
+ p
+ p
+ '
+ # shellcheck disable=SC2016
+ {
+ printf 'SELECT DISTINCT `binary_packages`.`pkgname`'
+ printf ' FROM `binary_packages`'
+ mysql_join_binary_packages_repositories
+ printf ' WHERE `repositories`.`is_on_master_mirror`'
+ printf ' AND NOT `binary_packages`.`is_to_be_deleted`'
+ } | \
+ mysql_run_query
+} | \
+ sort | \
+ uniq -u | \
+ if ${no_action}; then
+ cat
+ else
+ # shellcheck disable=SC2016
+ base64_encode_each | \
+ sed '
+ s/^/from_base64("/
+ s/$/"),/
+ 1 s/^/UPDATE `binary_packages` SET `is_to_be_deleted`=1 WHERE `binary_packages`.`pkgname` IN (/
+ $ s/,$/);/
+ ' | \
+ mysql_run_query
+ fi
diff --git a/bin/get-assignment b/bin/get-assignment
index 7f08d42..34a990e 100755
--- a/bin/get-assignment
+++ b/bin/get-assignment
@@ -18,6 +18,7 @@
# TODO: honor manual build order of tool-chain:
# toolchain build order: linux-api-headers->glibc->binutils->gcc->binutils->glibc
+# hand_out_assignment $build_assignments.id
hand_out_assignment() {
# shellcheck disable=SC2016
@@ -32,46 +33,28 @@ hand_out_assignment() {
mysql_join_build_assignments_binary_packages
mysql_join_binary_packages_repositories
printf ' WHERE `repositories`.`name`="build-list"'
- printf ' AND `package_sources`.`%s`=from_base64("%s")' \
- 'pkgbase' "$(printf '%s' "$1" | base64 -w0)" \
- 'git_revision' "$(printf '%s' "$2" | base64 -w0)" \
- 'mod_git_revision' "$(printf '%s' "$3" | base64 -w0)"
- printf ' AND `upstream_repositories`.`name`=from_base64("%s")' \
- "$(printf '%s' "$4" | base64 -w0)"
+ printf ' AND `build_assignments`.`id`=from_base64("%s")' \
+ "$(printf '%s' "$1" | base64 -w0)"
printf ' LIMIT 1;\n'
+ } | \
+ mysql_run_query | \
+ tr '\t' ' '
+ # shellcheck disable=SC2016
+ {
printf 'UPDATE `build_slaves`'
- printf ' SET `currently_building` = ('
- printf ' SELECT `build_assignments`.`id`'
- printf ' FROM `build_assignments`'
- mysql_join_build_assignments_package_sources
- mysql_join_package_sources_upstream_repositories
- printf ' WHERE'
- printf ' `package_sources`.`%s` = from_base64("%s") AND' \
- 'pkgbase' "$(printf '%s' "$1" | base64 -w0)" \
- 'git_revision' "$(printf '%s' "$2" | base64 -w0)" \
- 'mod_git_revision' "$(printf '%s' "$3" | base64 -w0)"
- printf ' `upstream_repositories`.`name` = from_base64("%s")' \
- "$(printf '%s' "$4" | base64 -w0)"
- printf ')'
+ printf ' SET `currently_building` = from_base64("%s")' \
+ "$(printf '%s' "$1" | base64 -w0)"
# shellcheck disable=SC2154
- printf ' WHERE `build_slaves`.`name`=from_base64("%s");\n' \
- "$(printf '%s' "${slave}" | base64 -w0)"
+ printf ' WHERE `build_slaves`.`id`=from_base64("%s");\n' \
+ "$(printf '%s' "${slave_id}" | base64 -w0)"
printf 'UPDATE `build_assignments`'
- mysql_join_build_assignments_package_sources
- mysql_join_package_sources_upstream_repositories
printf ' SET `build_assignments`.`priority`=0'
- printf ' WHERE'
- printf ' `package_sources`.`%s` = from_base64("%s") AND' \
- 'pkgbase' "$(printf '%s' "$1" | base64 -w0)" \
- 'git_revision' "$(printf '%s' "$2" | base64 -w0)" \
- 'mod_git_revision' "$(printf '%s' "$3" | base64 -w0)"
- printf ' `upstream_repositories`.`name` = from_base64("%s");\n' \
- "$(printf '%s' "$4" | base64 -w0)"
+ printf ' WHERE `build_assignments`.`id`=from_base64("%s");\n' \
+ "$(printf '%s' "${slave_id}" | base64 -w0)"
} | \
- mysql_run_query | \
- tr '\t' ' '
+ mysql_run_query
exit 0
@@ -108,13 +91,13 @@ trap clean_up EXIT
currently_building=$(
# shellcheck disable=SC2016
{
- printf 'SELECT '
- mysql_query_select_pkgbase_and_revision
+ printf 'SELECT `build_assignments`.`id`'
+ printf ' FROM `build_assignments`'
mysql_join_build_assignments_build_slaves
mysql_join_build_assignments_binary_packages
mysql_join_binary_packages_repositories
- printf ' WHERE `build_slaves`.`name`=from_base64("%s")' \
- "$(printf '%s' "${slave}" | base64 -w0)"
+ printf ' WHERE `build_slaves`.`id`=from_base64("%s")' \
+ "$(printf '%s' "${slave_id}" | base64 -w0)"
printf ' AND `repositories`.`name`="build-list"'
printf ' LIMIT 1;\n'
} | \
@@ -122,8 +105,7 @@ currently_building=$(
)
if [ -n "${currently_building}" ]; then
- # shellcheck disable=SC2086
- hand_out_assignment ${currently_building}
+ hand_out_assignment "${currently_building}"
fi
# a package with [all dependencies met or which is part of a loop]
@@ -135,54 +117,54 @@ fi
next_building=$(
# shellcheck disable=SC2016
{
- printf 'SELECT '
- printf '`package_sources`.`pkgbase`=from_base64("%s") AS `requested`,' \
- "$(
- printf '%s' "$1" | \
- base64 -w0
- )"
- printf '`build_assignments`.`priority`,'
- printf 'COALESCE('
- printf 'MAX(`failed_builds`.`date`),0'
- printf ') AS `last_trial`,'
- mysql_query_is_part_of_loop '`build_assignments`.`id`'
- printf ' AS `part_of_loop`,'
- mysql_query_select_pkgbase_and_revision
- mysql_join_build_assignments_binary_packages
- mysql_join_binary_packages_repositories
- printf ' LEFT'
- mysql_join_build_assignments_failed_builds
- printf ' WHERE `repositories`.`name`="build-list"'
- printf ' AND NOT EXISTS ('
- printf ' SELECT *'
- printf ' FROM `build_slaves`'
- printf ' WHERE `build_slaves`.`currently_building`=`build_assignments`.`id`'
- printf ') AND ('
- printf '`build_assignments`.`is_blocked` IS NULL'
- printf ' OR'
- printf ' `package_sources`.`pkgbase`=from_base64("%s")' \
+ printf 'SELECT `q`.`ba_id` FROM'
+ printf '('
+ printf 'SELECT '
+ printf '`package_sources`.`pkgbase`=from_base64("%s") AS `requested`,' \
"$(
printf '%s' "$1" | \
base64 -w0
)"
- printf ') AND ('
+ printf '`build_assignments`.`priority`,'
+ printf 'COALESCE('
+ printf 'MAX(`failed_builds`.`date`),0'
+ printf ') AS `last_trial`,'
mysql_query_is_part_of_loop '`build_assignments`.`id`'
- printf ' OR NOT '
- mysql_query_has_pending_dependencies '`build_assignments`.`id`'
- printf ')'
- printf ' GROUP BY `build_assignments`.`id`'
- printf ' ORDER BY `requested` DESC, `priority` DESC, `last_trial`, `part_of_loop`, `build_assignments`.`id`'
- printf ' LIMIT 1;\n'
+ printf ' AS `part_of_loop`,'
+ printf '`build_assignments`.`id` AS `ba_id`'
+ printf ' FROM `build_assignments`'
+ mysql_join_build_assignments_package_sources
+ mysql_join_build_assignments_binary_packages
+ mysql_join_binary_packages_repositories
+ printf ' LEFT'
+ mysql_join_build_assignments_failed_builds
+ printf ' WHERE `repositories`.`name`="build-list"'
+ printf ' AND NOT EXISTS ('
+ printf ' SELECT 1'
+ printf ' FROM `build_slaves`'
+ printf ' WHERE `build_slaves`.`currently_building`=`build_assignments`.`id`'
+ printf ') AND ('
+ printf '`build_assignments`.`is_blocked` IS NULL'
+ printf ' OR'
+ printf ' `package_sources`.`pkgbase`=from_base64("%s")' \
+ "$(
+ printf '%s' "$1" | \
+ base64 -w0
+ )"
+ printf ') AND ('
+ mysql_query_is_part_of_loop '`build_assignments`.`id`'
+ printf ' OR NOT '
+ mysql_query_has_pending_dependencies '`build_assignments`.`id`'
+ printf ')'
+ printf ' GROUP BY `build_assignments`.`id`'
+ printf ' ORDER BY `requested` DESC, `priority` DESC, `last_trial`, `part_of_loop`, `build_assignments`.`id`'
+ printf ' LIMIT 1'
+ printf ') AS `q`;\n'
} | \
- mysql_run_query | \
- sed '
- y/\t/ /
- s/^.* \(\S\+\( \S\+\)\{3\}\)$/\1/
- '
+ mysql_run_query
)
if [ -n "${next_building}" ]; then
- # shellcheck disable=SC2086
- hand_out_assignment ${next_building}
+ hand_out_assignment "${next_building}"
fi
# Check if there are any pending packages at all
diff --git a/bin/get-package-updates b/bin/get-package-updates
index f581e13..73766c8 100755
--- a/bin/get-package-updates
+++ b/bin/get-package-updates
@@ -14,9 +14,6 @@
# TODO: keep database clean in case of abort
-# TODO: removing something from the blacklist should trigger a build
-# (if it is found in upstreams repositories)
-
# shellcheck disable=SC2016
usage() {
>&2 echo ''
@@ -25,8 +22,12 @@ usage() {
>&2 echo ''
>&2 echo 'possible options:'
>&2 echo ' -b|--block: If necessary, wait for lock blocking.'
+ >&2 echo ' -d|--date $datetime:'
+ >&2 echo ' Pull latest commit before $datetime'
+ >&2 echo ' (yyyy-mm-ddThh:mm:ss). Conflicts -n.'
>&2 echo ' -h|--help: Show this help and exit.'
>&2 echo ' -n|--no-pull: Do not pull git repos, merely reorder build list.'
+ >&2 echo ' Conflicts -d.'
>&2 echo ' -x|--test-exclusion $package:'
>&2 echo ' Print additionally deleted/excluded packages if'
>&2 echo ' "$package" would be black listed.'
@@ -34,8 +35,9 @@ usage() {
}
eval set -- "$(
- getopt -o bhnx: \
+ getopt -o bd:hnx: \
--long block \
+ --long date: \
--long help \
--long no-pull \
--long test-exclusion: \
@@ -44,6 +46,7 @@ eval set -- "$(
)"
block_flag='-n'
+date_time=''
test_exclusion=''
pull=true
@@ -53,6 +56,10 @@ do
-b|--block)
block_flag=''
;;
+ -d|--date)
+ shift
+ date_time="$1"
+ ;;
-h|--help)
usage 0
;;
@@ -85,6 +92,11 @@ if [ $# -ne 0 ]; then
usage
fi
+if [ -n "${date_time}" ] && ! ${pull}; then
+ >&2 printf -- '-d and -n are mutually exclusive.\n'
+ usage
+fi
+
if [ -s "${work_dir}/build-master-sanity" ]; then
>&2 echo 'Build master is not sane.'
exit
@@ -146,9 +158,15 @@ for repo in ${repo_names}; do
)'"
# determine new git revision
if ${pull}; then
- eval "new_repo_revisions__${repo}='$(
- git -C "${repo_path}" rev-parse HEAD
- )'"
+ if [ -z "${date_time}" ]; then
+ eval "new_repo_revisions__${repo}='$(
+ git -C "${repo_path}" rev-parse HEAD
+ )'"
+ else
+ eval "new_repo_revisions__${repo}='$(
+ git -C "${repo_path}" rev-list -n1 --until "${date_time}" HEAD
+ )'"
+ fi
else
eval 'new_repo_revisions__'"${repo}"'="${old_repo_revisions__'"${repo}"'}"'
fi
@@ -189,11 +207,66 @@ echo 'Check modified packages from the last update, and put them to the build li
# If a package is deleted, remove from the rebuild list, and add it to the deletion list.
# If a new package is added, then ensure that it's not on the deletion list.
-for repo in ${repo_names}; do
- eval repo_path='"${repo_paths__'"${repo}"'}"'
- eval old_repo_revision='"${old_repo_revisions__'"${repo}"'}"'
- eval new_repo_revision='"${new_repo_revisions__'"${repo}"'}"'
+trigger_rebuild_on_any_file_sed_expression=$(
+ # note: This only works for upstream sources!
+ # shellcheck disable=SC2016
+ {
+ printf 'SELECT DISTINCT CONCAT('
+ printf '`package_sources`.`pkgbase`,"/repos/",'
+ printf '`upstream_repositories`.`name`,"-",'
+ printf 'IF(`architectures`.`name`="any","any","x86_64"))'
+ printf ' FROM `binary_packages`'
+ mysql_join_binary_packages_repositories
+ mysql_join_binary_packages_build_assignments
+ mysql_join_build_assignments_architectures
+ mysql_join_build_assignments_package_sources
+ mysql_join_package_sources_upstream_repositories
+ printf ' WHERE `repositories`.`name`="build-list";\n'
+ } | \
+ mysql_run_query | \
+ sed '
+ s@.*@s,^\\(.\\t\0/\\)[^/]\\+,\\1PKGBUILD,@
+ '
+)
+
+{
+ # trigger rebuild of packages removed from blacklist
+ # shellcheck disable=SC2016
{
+ printf 'SELECT `package_sources`.`pkgbase`,`upstream_repositories`.`name`,`git_repositories`.`name`'
+ printf ' FROM `package_sources`'
+ mysql_join_package_sources_upstream_repositories
+ mysql_join_upstream_repositories_git_repositories
+ printf ' WHERE `package_sources`.`pkgbase` IN ('
+ # shellcheck disable=SC2154
+ git -C "${repo_paths__archlinux32}" diff "${old_repo_revisions__archlinux32}" "${new_repo_revisions__archlinux32}" -- blacklist | \
+ sed -n '
+ s/^-\([^-]\)/\1/
+ T
+ s/\s*#.*$//
+ p
+ ' | \
+ base64_encode_each | \
+ sed '
+ s/^/from_base64("/
+ s/$/")/
+ ' | \
+ tr '\n' ','
+ printf '"");\n'
+ } | \
+ mysql_run_query | \
+ while read -r pkgbase repository git_repository; do
+ printf 'A %s ' \
+ "${pkgbase}"
+ eval 'printf '"'"'%s'"'"' "${new_repo_revisions__'"${git_repository}"'}"'
+ printf ' empty %s\n' \
+ "${repository}"
+ done
+ # actual updates/removes
+ for repo in ${repo_names}; do
+ eval repo_path='"${repo_paths__'"${repo}"'}"'
+ eval old_repo_revision='"${old_repo_revisions__'"${repo}"'}"'
+ eval new_repo_revision='"${new_repo_revisions__'"${repo}"'}"'
# if old revision unknown, mimic "git diff"-output
# shellcheck disable=SC2154
if [ "${old_repo_revision}" = "NONE" ]; then
@@ -202,45 +275,48 @@ for repo in ${repo_names}; do
sed 's|^|A\t|'
else
git -C "${repo_path}" diff --no-renames --name-status "${old_repo_revision}" "${new_repo_revision}"
- fi
- } | \
- # only track changes in PKGBUILDs
- # TODO: However, packages which are already on the build list should
- # receive a git_revision bump if _any_ file changed.
- grep '/PKGBUILD$' | \
- if [ "${repo}" = "archlinux32" ]; then
- # modify the directory structure from the modifiaction-repository
- # to the one of an original source repository
- # shellcheck disable=SC2016
- sed 's|^\(.\t\)\([^/]\+\)/\([^/]\+\)/\(.\+\)$|\2 \1\3/repos/\2-x86_64/\4|' | \
- while read -r pkg_repo rest; do
- repo=$(find_git_repository_to_package_repository "${pkg_repo}")
- eval 'printf '"'"'%s %s %s\n'"'" \
- "$(printf '"${new_repo_revisions__%s}"' "${repo}")" \
- "$(printf '"${old_repo_revisions__%s}"' "${repo}")" \
- "'${rest}'"
- done
- else
- sed "s|^|${new_repo_revision} ${old_repo_revision} |"
fi | \
- grep '^\S\+ \S\+ .\s[^/]\+/repos/[^/]\+/PKGBUILD$' | \
- # ignore i686
- grep -v -- '-i686/PKGBUILD$' | \
- # ignore staging and testing
- grep -v -- '[-/]\(staging\|testing\|unstable\)-[^/]\+/PKGBUILD$' | \
- sed 's|^\(\S\+ \S\+\) \(.\)\t\([^/]\+\)/repos/\([^/]\+\)-[^/-]\+/PKGBUILD$|\2 \3 \1 \4|'
-done | \
- sort -u | \
- sed '
- s|^D\s|0 \0|
- t
- s|^[AM]\s|1 \0|
- t
- s|^|2 |
- ' | \
- sort -k1,1 | \
- sed 's|^[012] ||' | \
+ # rename any file to "PKGBUILD" for packages on the build-list
+ sed "${trigger_rebuild_on_any_file_sed_expression}" | \
+ # only track changes in PKGBUILDs
+ grep '/PKGBUILD$' | \
+ if [ "${repo}" = "archlinux32" ]; then
+ # modify the directory structure from the modifiaction-repository
+ # to the one of an original source repository
+ # shellcheck disable=SC2016
+ sed 's|^\(.\t\)\([^/]\+\)/\([^/]\+\)/\(.\+\)$|\2 \1\3/repos/\2-x86_64/\4|' | \
+ while read -r pkg_repo rest; do
+ repo=$(find_git_repository_to_package_repository "${pkg_repo}")
+ eval 'printf '"'"'%s %s %s\n'"'" \
+ "$(printf '"${new_repo_revisions__%s}"' "${repo}")" \
+ "$(printf '"${old_repo_revisions__%s}"' "${repo}")" \
+ "'${rest}'"
+ done
+ else
+ sed "s|^|${new_repo_revision} ${old_repo_revision} |"
+ fi | \
+ grep '^\S\+ \S\+ .\s[^/]\+/repos/[^/]\+/PKGBUILD$' | \
+ # ignore i686
+ grep -v -- '-i686/PKGBUILD$' | \
+ # ignore staging and testing
+ grep -v -- '[-/]\(staging\|testing\|unstable\)-[^/]\+/PKGBUILD$' | \
+ sed 's|^\(\S\+ \S\+\) \(.\)\t\([^/]\+\)/repos/\([^/]\+\)-[^/-]\+/PKGBUILD$|\2 \3 \1 \4|'
+ done | \
+ sort -u | \
+ sed '
+ s|^D\s|0 \0|
+ t
+ s|^[AM]\s|1 \0|
+ t
+ s|^|2 |
+ ' | \
+ sort -k1,1 | \
+ sed 's|^[012] ||'
+} | \
while read -r mode package git_revision old_git_revision repository; do
+ if [ "${old_git_revision}" = 'empty' ]; then
+ old_git_revision=''
+ fi
if [ "${mode}" = 'D' ]; then
# deleted PKGBUILD
# shellcheck disable=SC2154
@@ -376,11 +452,14 @@ while [ -n "${black_listed_new}" ]; do
mysql_join_package_sources_build_assignments 'a_ps' 'a_ba'
mysql_join_build_assignments_binary_packages 'a_ba' 'a_bp'
mysql_join_binary_packages_dependencies 'a_bp'
+ mysql_join_dependencies_dependency_types
+ printf ' AND `dependency_types`.`relevant_for_building`'
+ printf ' AND `dependency_types`.`relevant_for_binary_packages`'
printf ' WHERE NOT EXISTS ('
- printf ' SELECT *'
+ printf ' SELECT 1'
printf ' FROM `install_target_providers`'
printf ' WHERE NOT EXISTS ('
- printf ' SELECT *'
+ printf ' SELECT 1'
printf ' FROM `bl`'
printf ' JOIN `package_sources` AS `b_ps` ON `bl`.`pkgbase`=`b_ps`.`pkgbase`'
mysql_join_package_sources_build_assignments 'b_ps' 'b_ba'
@@ -391,7 +470,7 @@ while [ -n "${black_listed_new}" ]; do
printf ') AND EXISTS ('
# TODO: This should be corrected at the root: automatic install targets, which are bogus should
# not be added in the first place - but how do we detect that?
- printf ' SELECT *'
+ printf ' SELECT 1'
printf ' FROM `install_target_providers`'
printf ' WHERE `install_target_providers`.`install_target`=`dependencies`.`depending_on`'
printf ');\n'
diff --git a/bin/ii-connect b/bin/ii-connect
index ca8ea99..5fc5f37 100755
--- a/bin/ii-connect
+++ b/bin/ii-connect
@@ -79,8 +79,10 @@ if [ "$1" = 'watch' ]; then
channel="${channel##*/}"
if [ -z "${channel%%#*}" ]; then
prefix='buildmaster: '
+ sloppy_salutation='buildmaster'
else
prefix=''
+ sloppy_salutation=''
fi
regex='^\(\S\+ \)\?\S\+ <\S\+> '"${prefix}"'why[- ]don'"'"'\?t[- ]you \(build\|stabilize\|unstage\|keep\|stubbornly_keep\) '
if grep -q "${regex}" "${out_file}"; then
@@ -130,6 +132,22 @@ if [ "$1" = 'watch' ]; then
done
sed -i "/${regex}/d" "${out_file}"
fi
+ regex='^\(\S\+ \)\?\S\+ <\S\+> .*[Ww]hat'"'"'\?s *[Uu]p'
+ if grep "${regex}" "${out_file}" | \
+ grep -q "${sloppy_salutation}"; then
+ done_something=true
+ sed -i "/${regex}/d" "${out_file}"
+ printf 'up? I'"'"'m up for %s, %s\n' "$(uptime -p | sed 's/^up //')" "$(uptime | sed 's/.*, //')" | \
+ sponge "${out_file%/out}/in"
+ fi
+ regex='^\(\S\+ \)\?\S\+ <\S\+> \(.* \)\?[Tt]h\(anks\|x\)\([ ,.!]\|$\)'
+ if grep "${regex}" "${out_file}" | \
+ grep -q "${sloppy_salutation}"; then
+ done_something=true
+ sed -i "/${regex}/d" "${out_file}"
+ printf 'np\n' | \
+ sponge "${out_file%/out}/in"
+ fi
done
sleep 1
done
diff --git a/bin/ping-from-slave b/bin/ping-from-slave
index 3c03b45..7611f44 100755
--- a/bin/ping-from-slave
+++ b/bin/ping-from-slave
@@ -18,7 +18,8 @@ if [ "$(
printf ' WHERE `build_slaves`.`name`=from_base64("%s");\n' \
"$(printf '%s' "${slave}" | base64 -w0)"
} | \
- mysql_run_query 'unimportant'
+ mysql_run_query 'unimportant' || \
+ echo '1'
)" -ne 1 ]; then
>&2 echo 'You do not build anything currently - abort whatever you are doing.'
exit 2
diff --git a/bin/return-assignment b/bin/return-assignment
index 9e64ff0..bcdb717 100755
--- a/bin/return-assignment
+++ b/bin/return-assignment
@@ -99,7 +99,6 @@ if [ "$5" = 'ERROR' ]; then
'log_file' 'VARCHAR(512)' | \
sed 's/,$//'
printf ');\n'
- printf 'INSERT INTO `failures` (`date`,`reason`,`log_file`) VALUES'
fail_reason_identifiers=$(
{
printf 'SELECT `fail_reasons`.`id`,replace(to_base64(`fail_reasons`.`identifier`),"\\n","")'
@@ -131,8 +130,10 @@ if [ "$5" = 'ERROR' ]; then
fi
done
done | \
- sed 's/,$//'
- printf ';\n'
+ sed '
+ 1 s/^/INSERT INTO `failures` (`date`,`reason`,`log_file`) VALUES /
+ s/,$/;\n/
+ '
printf 'INSERT INTO `failed_builds` (`build_slave`,`build_assignment`,`date`,`reason`,`log_file`)'
printf ' SELECT '
printf '`build_slaves`.`%s`,' \
@@ -536,7 +537,8 @@ trigger_mirror_refreshs
base64 -w0
)"
printf ' `binary_packages`.`has_issues`=0,'
- printf ' `binary_packages`.`is_tested`=0'
+ printf ' `binary_packages`.`is_tested`=0,'
+ printf ' `binary_packages`.`last_moved`=NOW()'
printf ' WHERE `build_slaves`.`name`=from_base64("%s")' \
"$(
printf '%s' "${slave}" | \
diff --git a/bin/sanity-check b/bin/sanity-check
index 06da288..96f028f 100755
--- a/bin/sanity-check
+++ b/bin/sanity-check
@@ -41,6 +41,7 @@ eval set -- "$(
silence=0
repos="${standalone_package_repositories} ${stable_package_repositories} ${testing_package_repositories} ${staging_package_repositories}"
+archs='i686'
web=false
while true
@@ -218,11 +219,13 @@ while [ $# -gt 0 ]; do
errors=$(
{
# shellcheck disable=SC2086
- printf 'expected %s\n' ${repos}
- ls_master_mirror 'i686' | \
- sed 's|^|found |'
+ for arch in ${archs}; do
+ printf 'expected '"${arch}"' %s\n' ${repos}
+ ls_master_mirror "${arch}" | \
+ sed 's|^|found '"${arch}"' |'
+ done
} | \
- sort -k2 | \
+ sort -k2,3 | \
uniq -uf1
)
if [ -n "${errors}" ]; then
@@ -242,109 +245,111 @@ while [ $# -gt 0 ]; do
package-database)
- for repo in ${repos}; do
-
- [ ${silence} -gt 0 ] || \
- printf 'checking consistency of repository "%s" on the master mirror ...' "${repo}" >> \
- "${tmp_dir}/messages"
+ for arch in ${archs}; do
+ for repo in ${repos}; do
- packages=$(
- ls_master_mirror "i686/${repo}" | \
- grep '\.pkg\.tar\.xz\(\.sig\)\?$'
- ) || true
-
- errors=$(
- echo "${packages}" | \
- grep '\S' | \
- sed '
- s|^\(.*\.pkg\.tar\.xz\)$|package \1|
- s|^\(.*\.pkg\.tar\.xz\)\.sig$|signature \1|
- ' | \
- sort -k2 | \
- uniq -cf1 | \
- grep -v '^\s*2\s' | \
- awk '{print $2 " " $3}'
- ) || true
- if [ -n "${errors}" ]; then
- if [ ${silence} -le 1 ]; then
- printf '\nThe following packages in %s are missing a signature or vice versa:\n%s\n' \
- "${repo}" \
- "${errors}" >> \
- "${tmp_dir}/messages"
- fi
- i_am_insane
- fi
+ [ ${silence} -gt 0 ] || \
+ printf 'checking consistency of repository "%s/%s" on the master mirror ...' "${arch}" "${repo}" >> \
+ "${tmp_dir}/messages"
- ${master_mirror_rsync_command} \
- "${master_mirror_rsync_directory}/i686/${repo}/${repo}.db.tar.gz" \
- "${master_mirror_rsync_directory}/i686/${repo}/${repo}.files.tar.gz" \
- "${tmp_dir}/"
+ packages=$(
+ ls_master_mirror "${arch}/${repo}" | \
+ grep '\.pkg\.tar\.xz\(\.sig\)\?$'
+ ) || true
- errors=$(
- {
- tar -Oxzf "${tmp_dir}/${repo}.db.tar.gz" --wildcards '*/desc' 2>/dev/null | \
- sed -n '
- /^%FILENAME%$/ {
- N
- s/^.*\n/in_database /
- p
- }
- '
+ errors=$(
echo "${packages}" | \
+ grep '\S' | \
sed '
- /\.pkg\.tar\.xz$/ !d
- s/^/in_repository /
+ s|^\(.*\.pkg\.tar\.xz\)$|package \1|
+ s|^\(.*\.pkg\.tar\.xz\)\.sig$|signature \1|
' | \
- sort -u
- } | \
- sort -k2 | \
- uniq -uf1
- )
- if [ -n "${errors}" ]; then
- if [ ${silence} -le 1 ]; then
- printf '\nThe following packages in %s are missing from the database or vice versa:\n%s\n' \
- "${repo}" \
- "${errors}" >> \
- "${tmp_dir}/messages"
+ sort -k2 | \
+ uniq -cf1 | \
+ grep -v '^\s*2\s' | \
+ awk '{print $2 " " $3}'
+ ) || true
+ if [ -n "${errors}" ]; then
+ if [ ${silence} -le 1 ]; then
+ printf '\nThe following packages in %s are missing a signature or vice versa:\n%s\n' \
+ "${repo}" \
+ "${errors}" >> \
+ "${tmp_dir}/messages"
+ fi
+ i_am_insane
fi
- i_am_insane
- fi
- errors=$(
- {
- tar -tzf "${tmp_dir}/${repo}.files.tar.gz" | \
- grep '/$' | \
- sed '
- s|/$||
- s|^|in_database |
- '
- echo "${packages}" | \
- grep '\S' | \
- sed '
- s|-[^-]\+$||
- s|^|in_repository |
- ' | \
- sort -u
- } | \
- sort -k2 | \
- uniq -uf1
- )
- if [ -n "${errors}" ]; then
- if [ ${silence} -le 1 ]; then
- printf '\nThe following packages in %s are missing from the file-database or vice versa:\n%s\n' \
- "${repo}" \
- "${errors}" >> \
- "${tmp_dir}/messages"
+ ${master_mirror_rsync_command} \
+ "${master_mirror_rsync_directory}/${arch}/${repo}/${repo}.db.tar.gz" \
+ "${master_mirror_rsync_directory}/${arch}/${repo}/${repo}.files.tar.gz" \
+ "${tmp_dir}/"
+
+ errors=$(
+ {
+ tar -Oxzf "${tmp_dir}/${repo}.db.tar.gz" --wildcards '*/desc' 2>/dev/null | \
+ sed -n '
+ /^%FILENAME%$/ {
+ N
+ s/^.*\n/in_database /
+ p
+ }
+ '
+ echo "${packages}" | \
+ sed '
+ /\.pkg\.tar\.xz$/ !d
+ s/^/in_repository /
+ ' | \
+ sort -u
+ } | \
+ sort -k2 | \
+ uniq -uf1
+ )
+ if [ -n "${errors}" ]; then
+ if [ ${silence} -le 1 ]; then
+ printf '\nThe following packages in %s are missing from the database or vice versa:\n%s\n' \
+ "${repo}" \
+ "${errors}" >> \
+ "${tmp_dir}/messages"
+ fi
+ i_am_insane
+ fi
+
+ errors=$(
+ {
+ tar -tzf "${tmp_dir}/${repo}.files.tar.gz" | \
+ grep '/$' | \
+ sed '
+ s|/$||
+ s|^|in_database |
+ '
+ echo "${packages}" | \
+ grep '\S' | \
+ sed '
+ s|-[^-]\+$||
+ s|^|in_repository |
+ ' | \
+ sort -u
+ } | \
+ sort -k2 | \
+ uniq -uf1
+ )
+ if [ -n "${errors}" ]; then
+ if [ ${silence} -le 1 ]; then
+ printf '\nThe following packages in %s are missing from the file-database or vice versa:\n%s\n' \
+ "${repo}" \
+ "${errors}" >> \
+ "${tmp_dir}/messages"
+ fi
+ i_am_insane
fi
- i_am_insane
- fi
- find "${tmp_dir:?}" -mindepth 1 \( -not -name 'messages' \) -delete
+ find "${tmp_dir:?}" -mindepth 1 \( -not -name 'messages' \) -delete
- [ ${silence} -gt 0 ] || \
- echo ' passed.' >> \
- "${tmp_dir}/messages"
+ [ ${silence} -gt 0 ] || \
+ echo ' passed.' >> \
+ "${tmp_dir}/messages"
+ done
done
;;
@@ -359,23 +364,26 @@ while [ $# -gt 0 ]; do
{
# shellcheck disable=SC2016
{
- printf 'SELECT "mysql",CONCAT(`repositories`.`name`,"/",'
+ printf 'SELECT "mysql",CONCAT(`r_a`.`name`,"/",`repositories`.`name`,"/",'
mysql_package_name_query
printf ') FROM `binary_packages`'
mysql_join_binary_packages_repositories
printf ' AND `repositories`.`is_on_master_mirror`'
mysql_join_binary_packages_architectures
+ mysql_join_repositories_architectures '' 'r_a'
} | \
mysql_run_query | \
tr '\t' ' '
- ls_master_mirror 'i686' | \
- while read -r repo; do
- ls_master_mirror "i686/${repo}" | \
- sed '
- /\.pkg\.tar\.xz$/!d
- s,^,package-file '"${repo}"'/,
- '
- done
+ for arch in ${archs}; do
+ ls_master_mirror "${arch}" | \
+ while read -r repo; do
+ ls_master_mirror "${arch}/${repo}" | \
+ sed '
+ /\.pkg\.tar\.xz$/!d
+ s,^,package-file '"${arch}"'/'"${repo}"'/,
+ '
+ done
+ done
} | \
sed 's/\(-[0-9]\+\)\.0\(-[^- ]\+$\)/\1\2/' | \
sort -k2 | \
diff --git a/bin/slave-build-connect b/bin/slave-build-connect
index b176c8f..4fcb38a 100755
--- a/bin/slave-build-connect
+++ b/bin/slave-build-connect
@@ -17,9 +17,27 @@ if [ "x${SSH_ORIGINAL_COMMAND%% *}" = 'xget-assignment' ] || \
fi
# shellcheck disable=SC2016
+ slave_id=$(
+ {
+ printf 'SELECT `build_slaves`.`id` FROM `build_slaves`'
+ printf ' WHERE `build_slaves`.`name`=from_base64("%s");\n' \
+ "$(
+ printf '%s' "$1" | \
+ base64 -w0
+ )"
+ } | \
+ mysql_run_query
+ )
+ if [ -z "${slave_id}" ]; then
+ >&2 printf 'Build slave "%s" is unnknown to the database.\n' "$1"
+ exit 42
+ fi
+
+ # shellcheck disable=SC2016
{
printf 'INSERT INTO `ssh_log` (`build_slave`,`action`,`parameters`)'
- printf ' SELECT `build_slaves`.`id`'
+ printf ' VALUES (%s' \
+ "${slave_id}"
printf ',from_base64("%s")' \
"$(
printf '%s' "${SSH_ORIGINAL_COMMAND%% *}" | \
@@ -29,16 +47,11 @@ if [ "x${SSH_ORIGINAL_COMMAND%% *}" = 'xget-assignment' ] || \
printf '%s' "${SSH_ORIGINAL_COMMAND#* }" | \
base64 -w0
)"
- printf ' FROM `build_slaves`'
- printf ' WHERE `build_slaves`.`name`=from_base64("%s");\n' \
- "$(
- printf '%s' "$1" | \
- base64 -w0
- )"
+ printf ');\n'
} | \
mysql_run_query 'unimportant'
- slave="$1" /bin/sh -c "${base_dir}/bin/${SSH_ORIGINAL_COMMAND}"
+ slave="$1" slave_id="${slave_id}" /bin/sh -c "${base_dir}/bin/${SSH_ORIGINAL_COMMAND}"
else