summaryrefslogtreecommitdiff
path: root/bin/prioritize-build-list
blob: f68a559559dbf5f09447636b44d9b8df3ea9004c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/bin/sh

# shellcheck disable=SC2119,SC2120

# shellcheck source=../lib/load-configuration
. "${0%/*}/../lib/load-configuration"

usage() {
  >&2 echo ''
  >&2 echo 'Usage: prioritize-build-list [options] pkg-regex-file'
  >&2 echo '  moves packages matching any pkg-regex in pkg-regex-file'
  >&2 echo '  to front of build list'
  >&2 echo ''
  >&2 echo 'possible options:'
  >&2 echo '  -h|--help:'
  >&2 echo '    Show this help and exit.'
  >&2 echo '  -w|--wait:'
  >&2 echo '    Wait for lock if necessary.'
  [ -z "$1" ] && exit 1 || exit "$1"
}

eval set -- "$(
  getopt -o hw \
    --long help \
    --long wait \
    -n "$(basename "$0")" -- "$@" || \
    echo usage
  )"

wait_for_lock='-n'

while true
do
  case "$1" in
    -h|--help)
      usage 0
    ;;
    -w|--wait)
      wait_for_lock=''
    ;;
    --)
      shift
      break
    ;;
    *)
      >&2 echo 'Whoops, forgot to implement option "'"$1"'" internally.'
      exit 42
    ;;
  esac
  shift
done

if [ $# -ne 1 ]; then
  >&2 echo 'No package-regex-list was given.'
  usage
fi

if [ ! -r "$1" ]; then
  >&2 printf 'Package-list "%s" is not readable.\n' "$1"
  usage
fi

# Create a lock file for build list.

exec 9> "${sanity_check_lock_file}"
verbose_flock -s ${wait_for_lock} 9

exec 8> "${build_list_lock_file}"
verbose_flock ${wait_for_lock} 8

# shellcheck disable=SC2016
{
  printf 'UPDATE `build_assignments`'
  mysql_join_build_assignments_package_sources
  mysql_join_build_assignments_binary_packages
  mysql_join_binary_packages_binary_packages_in_repositories
  printf ' SET `build_assignments`.`priority`=('
    printf 'SELECT COALESCE(MAX(`all_priorities`.`priority`),0)+1'
    printf ' FROM ('
      printf 'SELECT `others`.`priority`'
      printf ' FROM `build_assignments` AS `others`'
    printf ') AS `all_priorities`'
  printf ')'
  printf ' WHERE ('
  base64_encode_each < "$1" | \
    sed '
      s/^/`package_sources`.`pkgbase` REGEXP from_base64("/
      s/$/") OR /
    '
  printf '0) AND `binary_packages_in_repositories`.`repository`=%s;\n' \
    "${repository_ids__any_build_list}"
  printf 'SELECT row_count();\n'
} | \
  mysql_run_query | \
  if [ -w "$1" ] && \
    [ ! -p "$1" ]; then
    cat > "$1"
  else
    cat >&2
  fi

# Remove the lock file

rm -f "${build_list_lock_file}"