diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/cmd.sh | 126 | ||||
-rw-r--r-- | lib/control.sh | 136 | ||||
-rw-r--r-- | lib/db.sh | 293 | ||||
-rw-r--r-- | lib/dir.sh | 74 | ||||
-rw-r--r-- | lib/garbage.sh | 76 | ||||
-rw-r--r-- | lib/include.sh | 181 | ||||
-rw-r--r-- | lib/index.sh | 200 | ||||
-rw-r--r-- | lib/locale.sh | 88 | ||||
-rw-r--r-- | lib/output.sh | 68 | ||||
-rw-r--r-- | lib/remove.sh | 92 | ||||
-rw-r--r-- | lib/suite.sh | 105 |
11 files changed, 0 insertions, 1439 deletions
diff --git a/lib/cmd.sh b/lib/cmd.sh deleted file mode 100644 index d05e7eb..0000000 --- a/lib/cmd.sh +++ /dev/null @@ -1,126 +0,0 @@ -# pro-archman -# lib/cmd.sh -# Command-related functions -# -# Copyright (C) 2013 Patrick "P. J." McDermott -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -[ "x${_CMD_SM+set}" = 'xset' ] && return 0 -_CMD_SM=1 - -use output -use locale - -cmds= - -load_cmds() -{ - local cmd= - - for cmd in ${PKGLIBCMD}; do - cmd="${cmd##*/}" - cmd="${cmd%.sm}" - cmds="${cmds}${cmd}${LF}" - use "cmd/${cmd}" - done -} - -print_opt_summaries() -{ - local padding= - local opt= - local opt_out= - local summary= - - padding="$(printf '%24s' '')" - for opt in $(printf '%s' "${OPTSTRING}" | sed 's/\([a-zA-Z0-9]\)/ \1/g') - do - if [ ${#opt} -eq 1 ]; then - # No argument expected. - opt_out="-${opt}" - else - # Argument expected. - opt="${opt%?}" - opt_out="-${opt} $(get_msg "opt_${opt}_arg")" - fi - if [ ${#opt_out} -gt 20 ]; then - printf ' %s\n%24s' "${opt_out}" '' - else - printf ' %-20s ' "${opt_out}" - fi - summary="$(get_msg "opt_${opt}_summary")" - printf '%s\n' "${summary}" | fold -s -w 56 | \ - sed "2,\$s/^/${padding}/;" - done -} - -print_cmd_summaries() -{ - local padding= - local cmd= - local cmd_clean= - local summary= - - padding="$(printf '%24s' '')" - for cmd in ${PKGLIBCMD}; do - cmd="${cmd##*/}" - cmd="${cmd%.sm}" - if [ ${#cmd} -gt 20 ]; then - printf ' %s\n%24s' "${cmd}" '' - else - printf ' %-20s ' "${cmd}" - fi - cmd_clean="$(printf '%s' "${cmd}" | \ - tr '[A-Z]' '[a-z]' | tr -C '[a-z0-9_]' '_')" - summary="$(get_msg "cmd_${cmd_clean}_summary")" - printf '%s\n' "${summary}" | fold -s -w 56 | \ - sed "2,\$s/^/${padding}/;" - done -} - -print_cmd_usage() -{ - local cmd="${1}" - local cmd_clean= - local usage= - - cmd_clean="$(printf '%s' "${cmd}" | \ - tr '[A-Z]' '[a-z]' | tr -C '[a-z0-9_]' '_')" - usage="$(get_msg "cmd_${cmd_clean}_usage")" - - printf "$(get_msg 'cmd_usage')\n" "${0}" "${cmd}" "${usage}" -} - -is_cmd() -{ - local cmd="${1}" - - [ "x$(printf '%s' "${cmds}" | grep "^${cmd}$")" = "x${cmd}" ] -} - -run_cmd() -{ - local cmd="${1}" - local cmd_clean= - shift - - cmd_clean="$(printf '%s' "${cmd}" | \ - tr '[A-Z]' '[a-z]' | tr -C '[a-z0-9_]' '_')" - if is_cmd "${cmd}"; then - "cmd_${cmd_clean}_main" "${@}" - else - error 1 "$(get_msg 'cmd_not_found')" "${cmd}" - fi -} diff --git a/lib/control.sh b/lib/control.sh deleted file mode 100644 index 6907b3d..0000000 --- a/lib/control.sh +++ /dev/null @@ -1,136 +0,0 @@ -# pro-archman -# lib/control.sh -# Functions for parsing control files. -# -# Copyright (C) 2012, 2013 Patrick "P. J." McDermott -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -[ "x${_CONTROL_SM+set}" = 'xset' ] && return 0 -_CONTROL_SM=1 - -use output -use locale - -control_file= -control_line_nr= - -parse_control() -{ - local field_cb="${2}" - local req_fields="${3}" - local opt_fields="${4}" - local all_fields= - local got_fields= - local line= - local name= - local value= - - control_file="${1}" - control_line_nr=0 - - req_fields="$(printf '%s\n' ${req_fields})" - opt_fields="$(printf '%s\n' ${opt_fields})" - all_fields="${LF}${req_fields}${LF}${opt_fields}${LF}" - got_fields="${LF}" - - while IFS='' read -r line; do - control_line_nr=$(($control_line_nr + 1)) - if [ "x$(echo ${line})" = 'x' ]; then - parse_control_error 'control_empty_line' - elif [ "x${line#\#}" != "x${line}" ]; then - # Comment. - : - elif [ "x${line# }" = "x${line}" ]; then - # "Name: Value" line. - if [ "x${name}" != 'x' ]; then - if ! "${field_cb}" "${name}" "${value}"; then - return 0 - fi - fi - name="${line%%:*}" - value="${line#*:}" - value="${value# }" - if [ "x${name}" = 'x' -o "x${name}" = "x${line}" ]; then - parse_control_error 'control_bad_nv' - continue - fi - if [ "x${req_fields}" != 'x' ]; then - if [ "x${all_fields%${LF}${name}${LF}*}" = \ - "x${all_fields}" ]; then - # Unknown field. - parse_control_error \ - 'control_unknown_field' \ - "${name}" - else - # Remove field from list of required - # fields. - req_fields="$(printf '%s' \ - "${req_fields}" | \ - grep -Fv "${name}")" - fi - fi - if [ "x${got_fields%${LF}${name}${LF}*}" != \ - "x${got_fields}" ]; then - # Duplicate field. - parse_control_error 'control_duplicate_field' \ - "${name}" - else - got_fields="${got_fields}${name}${LF}" - fi - else - # Continuation line. - if [ "x${name}" = 'x' ]; then - # Expecting a "Name: Value" line. - parse_control_error 'control_found_continuation' - continue - fi - value="${value}${LF}${line# }" - fi - done <<-EOF - $(cat "${control_file}") - EOF - - if [ "x${name}" != 'x' ]; then - if ! "${field_cb}" "${name}" "${value}"; then - return 0 - fi - fi - - if [ "x${req_fields}" != 'x' ]; then - req_fields="$(printf "%s$(get_msg 'list_item_separator')" \ - ${req_fields})" - parse_control_error 'control_missing_fields' "${req_fields}" - fi - - return 0 -} - -parse_control_error() -{ - local msgid="${1}" - local file_info= - shift 1 - - if [ ${control_line_nr} -eq 0 ]; then - file_info="$(printf '%20s:' "${control_file}")" - else - file_info="$(printf '%20s(l%d):' "${control_file}" \ - "${control_line_nr}")" - fi - - warn "${file_info} $(get_msg "${msgid}")" "${@}" - - return 0 -} diff --git a/lib/db.sh b/lib/db.sh deleted file mode 100644 index e2f8fb7..0000000 --- a/lib/db.sh +++ /dev/null @@ -1,293 +0,0 @@ -# pro-archman -# lib/db.sh -# Functions for querying and modifying the database -# -# Copyright (C) 2013 Patrick "P. J." McDermott -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -[ "x${_DB_SM+set}" = 'xset' ] && return 0 -_DB_SM=1 - -use dir - -# -# Functions for the suites indices -# - -db_get_srcver() -{ - local chan="${1}" - local dist="${2}" - local source="${3}" - local dir= - - dir="${base_dir}/feeds/${chan}/${dist}/.db" - dir="${dir}/$(hash_name "${source}")/${source}" - if [ -f "${dir}/srcver" ]; then - cat "${dir}/srcver" - fi - - return 0 -} - -db_set_srcver() -{ - local chan="${1}" - local dist="${2}" - local source="${3}" - local srcver="${4}" - local dir= - - dir="${base_dir}/feeds/${chan}/${dist}/.db" - dir="${dir}/$(hash_name "${source}")/${source}" - mkdir -p "${dir}" - printf '%s\n' "${srcver}" >"${dir}/srcver" - - return 0 -} - -db_del_srcver() -{ - local chan="${1}" - local dist="${2}" - local source="${3}" - local dir= - - dir="${base_dir}/feeds/${chan}/${dist}/.db" - dir="${dir}/$(hash_name "${source}")/${source}" - rm -f "${dir}/srcver" - # Remove ".../.db/<hash>/<source>". - rmdir "${dir}" - # Try to remove ".../.db/<hash>" and ".../.db". - for dir in "${dir%/*}" "${dir%/*/*}"; do - try_rmdir "${dir}" || break - done - - return 0 -} - -db_get_binver() -{ - local chan="${1}" - local dist="${2}" - local arch="${3}" - local plat="${4}" - local source="${5}" - local dir= - - dir="${base_dir}/feeds/${chan}/${dist}/.db" - dir="${dir}/$(hash_name "${source}")/${source}/${arch}_${plat}" - if [ -f "${dir}/binver" ]; then - cat "${dir}/binver" - fi - - return 0 -} - -db_set_binver() -{ - local chan="${1}" - local dist="${2}" - local arch="${3}" - local plat="${4}" - local source="${5}" - local binver="${6}" - local dir= - - dir="${base_dir}/feeds/${chan}/${dist}/.db" - dir="${dir}/$(hash_name "${source}")/${source}/${arch}_${plat}" - mkdir -p "${dir}" - printf '%s\n' "${binver}" >"${dir}/binver" - - return 0 -} - -db_del_binver() -{ - local chan="${1}" - local dist="${2}" - local arch="${3}" - local plat="${4}" - local source="${5}" - local dir= - - dir="${base_dir}/feeds/${chan}/${dist}/.db" - dir="${dir}/$(hash_name "${source}")/${source}/${arch}_${plat}" - rm -f "${dir}/binver" - # Remove ".../.db/<hash>/<source>/<arch>_<plat>". - rmdir "${dir}" - - return 0 -} - -db_foreach_source() -{ - local chan="${1}" - local dist="${2}" - local cb="${3}" - local dir= - - shift 3 - - dir="${base_dir}/feeds/${chan}/${dist}/.db" - # For each hash: - for dir in "${dir}/"*/; do - if [ ! -d "${dir}" ]; then - continue - fi - # For each source: - for dir in "${dir}/"*/; do - if [ ! -d "${dir}" ]; then - continue - fi - dir="${dir%/}" - dir="${dir##*/}" - "${cb}" "${chan}" "${dist}" "${dir}" "${@}" - done - done - - return 0 -} - -db_get_archplats() -{ - local chan="${1}" - local dist="${2}" - local source="${3}" - local dir= - - dir="${base_dir}/feeds/${chan}/${dist}/.db" - dir="${dir}/$(hash_name "${source}")/${source}" - for dir in "${dir}/"*_*/; do - if [ ! -d "${dir}" ]; then - continue - fi - dir="${dir%/}" - dir="${dir##*/}" - printf '%s %s\n' "${dir%%_*}" "${dir#*_}" - done - - return 0 -} - -# -# Functions for the pool indices -# - -db_get_packages() -{ - local arch="${1}" - local plat="${2}" - local source="${3}" - local binver="${4}" - local dir= - - dir="${base_dir}/pool/$(hash_name "${source}")/${source}/.db" - dir="${dir}/${binver}_${arch}_${plat}" - if [ -f "${dir}/packages" ]; then - cat "${dir}/packages" - fi - - return 0 -} - -db_add_package() -{ - local arch="${1}" - local plat="${2}" - local source="${3}" - local binver="${4}" - local size="${5}" - local sect="${6}" - local pkg="${7}" - local dir= - - dir="${base_dir}/pool/$(hash_name "${source}")/${source}/.db" - dir="${dir}/${binver}_${arch}_${plat}" - mkdir -p "${dir}" - printf '%s %s %s\n' "${size}" "${sect}" "${pkg}" >>"${dir}/packages" - - return 0 -} - -db_del_packages() -{ - local arch="${1}" - local plat="${2}" - local source="${3}" - local binver="${4}" - local dir= - - dir="${base_dir}/pool/$(hash_name "${source}")/${source}/.db" - dir="${dir}/${binver}_${arch}_${plat}" - rm -f "${dir}/packages" - # Remove "pool/<hash>/<source>/.db/<binver>_<arch>_<plat>". - rmdir "${dir}" - # Try to remove "pool/<hash>/<source>/.db". - try_rmdir "${dir%/*}" - - return 0 -} - -db_inc_references() -{ - local arch="${1}" - local plat="${2}" - local source="${3}" - local binver="${4}" - local dir= - local refs= - - dir="${base_dir}/pool/$(hash_name "${source}")/${source}/.db" - dir="${dir}/${binver}_${arch}_${plat}" - if [ -f "${dir}/references" ]; then - refs="$(cat "${dir}/references")" - refs=$(($refs + 1)) - else - refs=1 - mkdir -p "${dir}" - fi - printf '%d\n' "${refs}" >"${dir}/references" - printf '%d\n' "${refs}" - - return 0 -} - -db_dec_references() -{ - local arch="${1}" - local plat="${2}" - local source="${3}" - local binver="${4}" - local dir= - local refs= - - dir="${base_dir}/pool/$(hash_name "${source}")/${source}/.db" - dir="${dir}/${binver}_${arch}_${plat}" - if [ -f "${dir}/references" ]; then - refs="$(cat "${dir}/references")" - refs=$(($refs - 1)) - else - refs=0 - fi - if [ ${refs} -eq 0 ]; then - rm -f "${dir}/references" - else - printf '%d\n' "${refs}" >"${dir}/references" - fi - printf '%d\n' "${refs}" - - return 0 -} diff --git a/lib/dir.sh b/lib/dir.sh deleted file mode 100644 index 0b866c0..0000000 --- a/lib/dir.sh +++ /dev/null @@ -1,74 +0,0 @@ -# pro-archman -# lib/dir.sh -# Miscellaneous directory-related functions -# -# Copyright (C) 2013 Patrick "P. J." McDermott -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -[ "x${_DIR_SM+set}" = 'xset' ] && return 0 -_DIR_SM=1 - -hash_name() -{ - local name="${1}" - local hash= - - if [ "x${name}" != "x${name#lib?}" ]; then - hash="$(printf '%s\n' "${name}" | sed 's/^\(lib.\).*$/\1/')" - elif [ "x${name}" != "x${name#src-?}" ]; then - hash="$(printf '%s\n' "${name}" | sed 's/^\(src-.\).*$/\1/')" - else - hash="$(printf '%s\n' "${name}" | sed 's/^\(.\).*$/\1/')" - fi - printf '%s\n' "${hash}" - - return 0 -} - -dir_is_empty() -{ - local dir="${1}" - local ret= - local dirent= - - ret=0 - - # Patterns to match all dirents except "." and "..": - # * dirents whose names don't start with "." - # .[!.] dirents whose names start with ".", are two characters long, - # and aren't ".." - # .??* dirents whose names start with "." and are three or more - # characters long - for dirent in "${dir}/"* "${dir}/".[!.] "${dir}/".[!.] "${dir}/".??*; do - if [ -e "${dirent}" ]; then - ret=1 - break - fi - done - - return ${ret} -} - -try_rmdir() -{ - local dir="${1}" - - if dir_is_empty "${dir}"; then - rmdir "${dir}" - return ${?} - else - return 1 - fi -} diff --git a/lib/garbage.sh b/lib/garbage.sh deleted file mode 100644 index a6f1a3d..0000000 --- a/lib/garbage.sh +++ /dev/null @@ -1,76 +0,0 @@ -# pro-archman -# lib/garbage.sh -# Functions for garbage collection -# -# Copyright (C) 2013 Patrick "P. J." McDermott -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -[ "x${_GARBAGE_SM+set}" = 'xset' ] && return 0 -_GARBAGE_SM=1 - -use locale -use output -use dir - -collect_garbage() -{ - local cur_time= - local garbage= - local gar_time= - local dirs= - local file= - - info_v "$(get_msg 'collecting_garbage')" - - # NB: The %s format conversion specifier is not specified by POSIX, but - # it is supported by the GNU and BusyBox implementations of date. - cur_time=$(date '+%s') - - for garbage in "${base_dir}/.db/garbage/"*; do - if [ ! -f "${garbage}" ]; then - continue - fi - gar_time=${garbage##*/} - if [ ${cur_time} -lt ${gar_time} ]; then - break - fi - while read -r dirs file; do - info_v "$(get_msg 'collecting_garbage_file')" "${file}" - rm -f "${base_dir}/${file}" - while [ ${dirs} -gt 0 ]; do - file="${file%/*}" - try_rmdir "${base_dir}/${file}" - dirs=$(($dirs - 1)) - done - done <"${garbage}" - rm -f "${garbage}" - done -} - -mark_pool_garbage() -{ - local file="${1}" - local time= - - info_v "$(get_msg 'marking_garbage_file')" "${file}" - - # NB: The %s format conversion specifier is not specified by POSIX, but - # it is supported by the GNU and BusyBox implementations of date. - time=$(date '+%s') - time=$(($time + $conf_pool_gc_delay)) - - mkdir -p "${base_dir}/.db/garbage" - printf '2 %s\n' "${file}" >>"${base_dir}/.db/garbage/${time}" -} diff --git a/lib/include.sh b/lib/include.sh deleted file mode 100644 index 42ccf24..0000000 --- a/lib/include.sh +++ /dev/null @@ -1,181 +0,0 @@ -# pro-archman -# lib/include.sh -# Functions for including changes -# -# Copyright (C) 2013, 2014 Patrick "P. J." McDermott -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -[ "x${_INCLUDE_SM+set}" = 'xset' ] && return 0 -_INCLUDE_SM=1 - -use control -use db -use locale -use output - -_INCLUDE_CHANGES_FIELDS='Format Source Binary Version Architecture Platform -Distribution Maintainer Changed-By Date Description Changes Files' - -_include_format= -_include_source= -_include_version= -_include_distribution= -_include_files= - -include_changes() -{ - local changes="${1}" - local chan= - local dist= - local source= - local srcver= - local script= - local bvaps= - local binver= - local arch= - local plat= - local old_ver= - local files= - local size= - local sect= - local file= - local pkg= - local pool_file= - - parse_control "${changes}" _include_changes_field \ - "${_INCLUDE_CHANGES_FIELDS}" '' - if [ "x${_include_format}" != 'x1.0' ]; then - error 2 "$(get_msg 'include_unknown_changes_format')" \ - "${changes}" "${_include_format}" - fi - chan="${conf_incoming_channel}" - dist="${_include_distribution}" - source="${_include_source}" - srcver="${_include_version}" - - info "$(get_msg 'include_including')" "${source}" "${srcver}" \ - "${chan}" "${dist}" - - if [ "x${_include_files}" = 'x' ]; then - warn "$(get_msg 'include_no_files')" - return 0 - fi - - # List of (binver, arch, plat) tuples to be checked later. - script='s/[0-9][0-9]* [^ ][^ ]* [^_]*_\([^_]*\)' - script="${script}"'_\([^_]*\)_\([^_]*\)\.opk/\1 \2 \3/p' - bvaps="$(printf '%s\n' "${_include_files}" | \ - sed -n "${script}" | LC_COLLATE='C' sort | uniq)" - - # Pre-inclusion database sanity checks and updates: check for an - # existing version of the package in the suite. - old_ver="$(db_get_srcver "${chan}" "${dist}" "${source}")" - if [ "x${old_ver}" = 'x' ]; then - # New package. - db_set_srcver "${chan}" "${dist}" "${source}" "${srcver}" - elif [ "x${old_ver}" != "x${_include_version}" ]; then - # New source version. Remove the old source package from the - # suite. - remove_source_from_suite "${chan}" "${dist}" "${source}" - db_set_srcver "${chan}" "${dist}" "${source}" "${srcver}" - else - # Same source version. Hopefully different binary version, - # architecture, and/or platform. Make sure such "bvap" tuples - # are new. - while read -r binver arch plat; do - old_ver="$(db_get_binver "${chan}" "${dist}" \ - "${arch}" "${plat}" "${source}")" - if [ "x${old_ver}" = "x${binver}" ]; then - error 2 "$(get_msg 'include_bvap_exists')" \ - "${binver}" "${arch}" "${plat}" - fi - done <<-EOF - ${bvaps} - EOF - fi - - # For each (binver, arch, plat) tuple in the package changes: - # * Remove old binary packages of the same arch and plat from the - # suite. - # * Set the new binary version of packages of the arch and plat in the - # suite. - # * Set the reference count for the tuple to 1. - # This is done separately from the next loop because it must be done - # exactly once for each bvap tuple. The next loop can hit any given - # bvap tuple multiple times. - while read -r binver arch plat; do - old_ver="$(db_get_binver "${chan}" "${dist}" \ - "${arch}" "${plat}" "${source}")" - if [ "x${old_ver}" != 'x' ]; then - remove_packages_from_suite_archplat "${chan}" \ - "${dist}" "${arch}" "${plat}" "${source}" - fi - db_set_binver "${chan}" "${dist}" "${arch}" "${plat}" \ - "${source}" "${binver}" - db_inc_references "${arch}" "${plat}" "${source}" "${binver}" \ - >/dev/null - done <<-EOF - ${bvaps} - EOF - - # Include each binary package. - files='' - while read -r size sect file; do - if [ "x${file##[ ]}" = 'x' ]; then - continue - fi - IFS='_' read -r pkg binver arch plat <<-EOF - ${file%.opk} - EOF - db_add_package "${arch}" "${plat}" "${source}" "${binver}" \ - "${size}" "${sect}" "${pkg}" - pool_file="pool/$(hash_name "${source}")/${source}" - pool_file="${pool_file}/${pkg}_${binver}_${arch}_${plat}.opk" - file="$(dirname "${changes}")/${file}" - files="${files} ${file}" - cp -p "${file}" "${base_dir}/${pool_file}" - feed_add_package "${chan}" "${dist}" "${arch}" "${plat}" \ - "${sect}" "${pkg}" "${size}" "${pool_file}" - done <<-EOF - ${_include_files} - EOF - - printf '%s\n' ${files} - return 0 -} - -_include_changes_field() -{ - local name="${1}" - local value="${2}" - - case "${name}" in - 'Format') - _include_format="${value}" - ;; - 'Source') - _include_source="${value}" - ;; - 'Version') - _include_version="${value}" - ;; - 'Distribution') - _include_distribution="${value}" - ;; - 'Files') - _include_files="${value}" - ;; - esac -} diff --git a/lib/index.sh b/lib/index.sh deleted file mode 100644 index 8749897..0000000 --- a/lib/index.sh +++ /dev/null @@ -1,200 +0,0 @@ -# pro-archman -# lib/index.sh -# Functions for working with package feed indices -# -# Copyright (C) 2013 Patrick "P. J." McDermott -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -[ "x${_INDEX_SM+set}" = 'xset' ] && return 0 -_INDEX_SM=1 - -use locale -use output -use dir - -feed_add_package() -{ - local chan="${1}" - local dist="${2}" - local arch="${3}" - local plat="${4}" - local sect="${5}" - local pkg="${6}" - local size="${7}" - local file="${8}" - local pkg_hash= - local feed_hash_idx= - local old_dir= - - info_v "$(get_msg 'feed_adding')" "${pkg}" \ - "${chan}" "${dist}" "${arch}" "${plat}" "${sect}" - - pkg_hash="$(hash_name "${pkg}")" - - # Add package metadata to feed hash index. - feed_hash_idx="${base_dir}/feeds/${chan}/${dist}/${arch}/${plat}" - feed_hash_idx="${feed_hash_idx}/${sect}/.db/${pkg_hash}" - mkdir -p "${feed_hash_idx}/info" - tar -xzOf "${base_dir}/${file}" 'control.tar.gz' | \ - tar -xzO './control' >"${feed_hash_idx}/info/${pkg}.control" - printf 'Filename: %s\nSize: %s\nMD5sum: %s\nSHA256sum: %s\n\n' \ - "../../../../../../${file}" "${size}" \ - "$(md5sum "${base_dir}/${file}" | sed 's/ .*$//')" \ - "$(sha256sum "${base_dir}/${file}" | sed 's/ .*$//')" \ - >>"${feed_hash_idx}/info/${pkg}.control" - - # Mark feed index fragment as outdated. - old_dir="${base_dir}/feeds/.db/${chan}_${dist}/${arch}_${plat}" - old_dir="${old_dir}/${sect}" - mkdir -p "${old_dir}" - >"${old_dir}/${pkg_hash}" - - return 0 -} - -feed_remove_package() -{ - local chan="${1}" - local dist="${2}" - local arch="${3}" - local plat="${4}" - local sect="${5}" - local pkg="${6}" - local pkg_hash= - local feed_hash_idx= - local old_dir= - - info_v "$(get_msg 'feed_removing')" "${pkg}" \ - "${chan}" "${dist}" "${arch}" "${plat}" "${sect}" - - pkg_hash="$(hash_name "${pkg}")" - - # Remove package metadata from feed hash index. - feed_hash_idx="${base_dir}/feeds/${chan}/${dist}/${arch}/${plat}" - feed_hash_idx="${feed_hash_idx}/${sect}/.db/${pkg_hash}" - rm -f "${feed_hash_idx}/info/${pkg}.control" - try_rmdir "${feed_hash_idx}/info" - - # Mark feed index fragment as outdated. - old_dir="${base_dir}/feeds/.db/${chan}_${dist}/${arch}_${plat}" - old_dir="${old_dir}/${sect}" - mkdir -p "${old_dir}" - >"${old_dir}/${pkg_hash}" - - return 0 -} - -update_feeds() -{ - local suite_dirent= - local chan= - local dist= - local suite= - local archplat_dirent= - local arch= - local plat= - local archplat= - local sect_dirent= - local sect= - local manifest_entry= - local hash_dirent= - local idx= - - info_v "$(get_msg 'updating_feeds')" - - # For each suite: - for suite_dirent in "${base_dir}/feeds/.db/"*_*/; do - if [ ! -d "${suite_dirent}" ]; then - continue - fi - chan="${suite_dirent%/}" - chan="${chan##*/}" - dist="${chan##*_}" - chan="${chan%_*}" - suite="${base_dir}/feeds/${chan}/${dist}" - exec 3>"${suite}/Manifest~" - # For each archplat: - for archplat_dirent in "${suite_dirent}/"*_*/; do - if [ ! -d "${archplat_dirent}" ]; then - continue - fi - arch="${archplat_dirent%/}" - arch="${arch##*/}" - plat="${arch##*_}" - arch="${arch%_*}" - archplat="${suite}/${arch}/${plat}" - # For each section: - for sect_dirent in "${archplat_dirent}/"*/; do - if [ ! -d "${sect_dirent}" ]; then - continue - fi - sect="${sect_dirent%/}" - sect="${sect##*/}" - info_v "$(get_msg 'updating_feed')" \ - "${chan}" "${dist}" \ - "${arch}" "${plat}" "${sect}" - manifest_entry="${arch}/${plat}/${sect}" - sect="${archplat}/${sect}" - # For each package name hash: - for hash_dirent in "${sect_dirent}/"*; do - if [ ! -f "${hash_dirent}" ]; then - continue - fi - idx="${sect}/.db/${hash_dirent##*/}" - # Ensure there are still packages here. - if [ -d "${idx}/info" ]; then - cat "${idx}/info/"*.control \ - >"${idx}/Packages" - else - rm -f "${idx}/Packages" - rmdir "${idx}" - fi - rm -f "${hash_dirent}" - done - # Ensure there are still packages here. - if ! try_rmdir "${sect}/.db"; then - cat "${sect}/.db/"*/Packages \ - >"${sect}/Packages~" - mv "${sect}/Packages~" \ - "${sect}/Packages" - if ${conf_gzip}; then - gzip -9c "${sect}/Packages" \ - >"${sect}/Packages.gz" - fi - printf '%s\n' "${manifest_entry}" >&3 - else - rm -f "${sect}/Packages" \ - "${sect}/Packages.gz" - fi - rmdir "${sect_dirent}" - try_rmdir "${sect}" - done - rmdir "${archplat_dirent}" - try_rmdir "${archplat}" - try_rmdir "${archplat%/*}" - done - rmdir "${suite_dirent}" - exec 3>&- - if [ -s "${suite}/Manifest~" ]; then - mv "${suite}/Manifest~" "${suite}/Manifest" - else - rm -f "${suite}/Manifest~" "${suite}/Manifest" - rmdir "${suite}" - rmdir "${suite%/*}" - fi - done - - return 0 -} diff --git a/lib/locale.sh b/lib/locale.sh deleted file mode 100644 index 25a7758..0000000 --- a/lib/locale.sh +++ /dev/null @@ -1,88 +0,0 @@ -# pro-archman -# lib/locale.sh -# Locale functions -# -# Copyright (C) 2012, 2013 Patrick "P. J." McDermott -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -[ "x${_LOCALE_SM+set}" = 'xset' ] && return 0 -_LOCALE_SM=1 - -LOCALEDIR='@@LOCALEDIR@@' -DEFAULT_LOCALE='en_US' -TEXT_DOMAIN='pro_archman' - -load_locale() -{ - local localedir= - - # Make sure LC_MESSAGES is set. - if [ "x${LC_MESSAGES+set}" != 'xset' ]; then - if [ "x${LC_ALL+set}" = 'xset' ]; then - LC_MESSAGES="${LC_ALL}" - elif [ "x${LANG+set}" = 'xset' ]; then - LC_MESSAGES="${LANG}" - else - LC_MESSAGES="${DEFAULT_LOCALE}" - fi - fi - - if [ "${ARCHMAN_LOCALEDIR+set}" = 'set' ]; then - localedir="${ARCHMAN_LOCALEDIR:-.}" - else - localedir="${LOCALEDIR}" - fi - - # Try to load the locale. - if ! _try_load_locale "${localedir}" \ - "${LC_MESSAGES%.*}"; then - if ! _try_load_locale "${localedir}" \ - "${LC_MESSAGES%_*}"; then - if ! _try_load_locale "${localedir}" \ - "${DEFAULT_LOCALE}"; then - warn 'Cannot load locale' - return 1 - fi - fi - fi - - return 0 -} - -get_msg() -{ - local msgid="${1}" - - eval "printf '%s' \"\${msg_${TEXT_DOMAIN}_${msgid}}\"" - - return 0 -} - -_try_load_locale() -{ - local localedir="${1}" - local locale="${2}" - local ms= - - for ms in "${localedir}/${locale}/LC_MESSAGES/${TEXT_DOMAIN}.ms" \ - "${localedir}/${locale}.ms"; do - if [ -f "${ms}" ]; then - . "${ms}" - return 0 - fi - done - - return 1 -} diff --git a/lib/output.sh b/lib/output.sh deleted file mode 100644 index d3d150f..0000000 --- a/lib/output.sh +++ /dev/null @@ -1,68 +0,0 @@ -# pro-archman -# lib/output.sh -# Functions for printing messages -# -# Copyright (C) 2013 Patrick "P. J." McDermott -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -[ "x${_OUTPUT_SM+set}" = 'xset' ] && return 0 -_OUTPUT_SM=1 - -error() -{ - local status=${1} - local fmt="${2}" - shift 2 - - printf '%s: Error: ' "${0##*/}" >&2 - printf "${fmt}\n" "${@}" >&2 - - # In a subshell, this will have no effect, so the shell's exit status - # will be 128+SIGINT. Meh. - exit_status=${status} - kill -s INT ${$} -} - -warn() -{ - local fmt="${1}" - shift 1 - - printf '%s: Warning: ' "${0##*/}" >&2 - printf "${fmt}\n" "${@}" >&2 - - return 0 -} - -info() -{ - local fmt="${1}" - shift 1 - - printf '%s: ' "${0##*/}" >&2 - printf "${fmt}\n" "${@}" >&2 - - return 0 -} - -info_v() -{ - if ${opt_v:-false} || ${conf_verbose:-false}; then - info "${@}" - return ${?} - fi - - return 0 -} diff --git a/lib/remove.sh b/lib/remove.sh deleted file mode 100644 index a3a06dd..0000000 --- a/lib/remove.sh +++ /dev/null @@ -1,92 +0,0 @@ -# pro-archman -# lib/remove.sh -# Functions for removing packges -# -# Copyright (C) 2013 Patrick "P. J." McDermott -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -[ "x${_REMOVE_SM+set}" = 'xset' ] && return 0 -_REMOVE_SM=1 - -use locale -use output -use db - -remove_source_from_suite() -{ - local chan="${1}" - local dist="${2}" - local source="${3}" - local arch= - local plat= - - info "$(get_msg 'removing_from_suite')" \ - "${source}" "${chan}" "${dist}" - - while read -r arch plat; do - remove_packages_from_suite_archplat \ - "${chan}" "${dist}" "${arch}" "${plat}" "${source}" - done <<-EOF - $(db_get_archplats "${chan}" "${dist}" "${source}") - EOF - - db_del_srcver "${chan}" "${dist}" "${source}" - - return 0 -} - -remove_packages_from_suite_archplat() -{ - local chan="${1}" - local dist="${2}" - local arch="${3}" - local plat="${4}" - local source="${5}" - local binver= - local refs= - local size= - local sect= - local pkg= - local file= - - info_v "$(get_msg 'removing_from_suite_archplat')" \ - "${source}" "${chan}" "${dist}" "${arch}" "${plat}" - - binver="$(db_get_binver "${chan}" "${dist}" "${arch}" "${plat}" \ - "${source}")" - if [ "x${binver}" = 'x' ]; then - return 0 - fi - db_del_binver "${chan}" "${dist}" "${arch}" "${plat}" "${source}" - refs=$(db_dec_references "${arch}" "${plat}" "${source}" "${binver}") - - while read -r size sect pkg; do - feed_remove_package "${chan}" "${dist}" "${arch}" "${plat}" \ - "${sect}" "${pkg}" - if [ ${refs} -eq 0 ]; then - file="pool/$(hash_name "${source}")/${source}" - file="${file}/${pkg}_${binver}_${arch}_${plat}.opk" - mark_pool_garbage "${file}" - fi - done <<-EOF - $(db_get_packages "${arch}" "${plat}" "${source}" "${binver}") - EOF - - if [ ${refs} -eq 0 ]; then - db_del_packages "${arch}" "${plat}" "${source}" "${binver}" - fi - - return 0 -} diff --git a/lib/suite.sh b/lib/suite.sh deleted file mode 100644 index 4de39ef..0000000 --- a/lib/suite.sh +++ /dev/null @@ -1,105 +0,0 @@ -# pro-archman -# lib/suite.sh -# Functions for working with suites -# -# Copyright (C) 2013 Patrick "P. J." McDermott -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -[ "x${_SUITE_SM+set}" = 'xset' ] && return 0 -_SUITE_SM=1 - -use db -use dir -use remove -use locale -use output - -copy_suite() -{ - local src_chan="${1}" - local src_dist="${2}" - local dst_chan="${3}" - local dst_dist="${4}" - - info "$(get_msg 'suite_copying')" \ - "${src_chan}" "${src_dist}" "${dst_chan}" "${dst_dist}" - - remove_suite "${dst_chan}" "${dst_dist}" - - db_foreach_source "${src_chan}" "${src_dist}" _suite_copy_source \ - "${dst_chan}" "${dst_dist}" -} - -remove_suite() -{ - local chan="${1}" - local dist="${2}" - - info "$(get_msg 'suite_removing')" \ - "${chan}" "${dist}" - - db_foreach_source "${chan}" "${dist}" _suite_remove_source -} - -_suite_copy_source() -{ - local src_chan="${1}" - local src_dist="${2}" - local source="${3}" - local dst_chan="${4}" - local dst_dist="${5}" - local srcver= - local arch= - local plat= - local binver= - local size= - local sect= - local pkg= - local pool_file= - - srcver="$(db_get_srcver "${chan}" "${dist}" "${source}")" - db_set_srcver "${dst_chan}" "${dst_dist}" "${source}" "${srcver}" - - while read -r arch plat; do - binver="$(db_get_binver "${src_chan}" "${src_dist}" \ - "${arch}" "${plat}" "${source}")" - db_set_binver "${dst_chan}" "${dst_dist}" "${arch}" "${plat}" \ - "${source}" "${binver}" - db_inc_references "${arch}" "${plat}" "${source}" "${binver}" \ - >/dev/null - while read -r size sect pkg; do - pool_file="pool/$(hash_name "${source}")/${source}" - pool_file="${pool_file}/${pkg}_${binver}" - pool_file="${pool_file}_${arch}_${plat}.opk" - feed_add_package "${dst_chan}" "${dst_dist}" \ - "${arch}" "${plat}" \ - "${sect}" "${pkg}" "${size}" "${pool_file}" - done <<-EOF - $(db_get_packages "${arch}" "${plat}" \ - "${source}" "${binver}") - EOF - done <<-EOF - $(db_get_archplats "${src_chan}" "${src_dist}" "${source}") - EOF -} - -_suite_remove_source() -{ - local chan="${1}" - local dist="${2}" - local source="${3}" - - remove_source_from_suite "${chan}" "${dist}" "${source}" -} |