#!/usr/bin/env bash # Copyright (C) 2011-2012 Nicolás Reynolds # Copyright (C) 2012 Michał Masłowski # Copyright (C) 2012 Joshua Ismael Haase Hernández (xihh) # Copyright (C) 2014-2015, 2017 Luke Shumaker # # License: GNU GPLv3+ # # 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 Affero 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 . . "$(librelib messages)" . "$(librelib conf)" usage() { print 'Usage: [T=$TORUPATH] [V=true] [F=true] %q [-h]' "${0##*/}" print 'Create/update the `$TORUPATH/paths.tch` database.' echo prose 'The file `%s` is a Tokyo Cabinet database a mapping between paths to PKGBUILD files and `pkgname`s and `pkgbase`s. PKGBUILD files are scanned for in `$ABSROOT` in each of `$REPOS`.' \ '$TORUPATH/paths.tch' echo prose 'Additionally, it creates a timestamp file at `%s`, so that skip PKGBUILD files that have not changed since the previous invocation.' \ '$TORUPATH/lastsync.paths' echo print 'Configuration:' flag \ 'libretools.conf : TORUPATH' 'Where to store `paths.tch`' \ 'libretools.conf : REPOS' 'Which repositories to consider from `$ABSROOT`' \ 'abs.conf : ABSROOT' 'Where to find PKGBUILD files' echo print 'Options:' flag \ 'T=$TORUPATH' 'Override libretools.conf:TORUPATH' \ 'V=true' 'Be verbose' \ 'F=true' 'Ignore timestamps; force re-scan all PKGBUILDs' \ '-h' 'Show this message' } main() { setup_traps # TODO: better option parsing VERBOSE=${V:-false} FORCE=${F:-false} # TODO: add an option to override/augment libretools.conf:REPOS if [[ $# != 0 ]]; then if [[ $# == 1 && "$1" == '-h' ]]; then usage return $EXIT_SUCCESS fi usage >&2 return $EXIT_INVALIDARGUMENT fi declare -i ret=0 if [[ -n "${T:-}" ]]; then load_conf libretools.conf REPOS || ret=$? TORUPATH=$T else load_conf libretools.conf TORUPATH REPOS || ret=$? fi load_conf abs.conf ABSROOT || ret=$? [[ $ret = 0 ]] || exit $ret if [ ! -w "$TORUPATH" ]; then error "Toru's path isn't writable. Please check your TORUPATH: %q" "$TORUPATH" exit $EXIT_NOPERMISSION fi local lastsyncfile=${TORUPATH}/lastsync.paths local pathfile=${TORUPATH}/paths.tch if [ ! -e "${pathfile}" ]; then tcamgr create "${pathfile}" fi local fullrepos=() # This loops over ${REPOS[@]} backward. This is because early entries # in REPOS have higher precidence, but the way this is implemented, # the later entries have precedence, so we need to flip the order. for (( i = ${#REPOS[@]}-1 ; i >= 0 ; i-- )); do $VERBOSE && msg "Processing [%s]" "${REPOS[$i]}" if [ -d "${ABSROOT}/${REPOS[$i]}" ]; then fullrepos+=("${ABSROOT}/${REPOS[$i]}") fi done # Find PKGBUILDs in ${fullrepos[@]} find_args=("${fullrepos[@]}" -mindepth 2 -maxdepth 3 -type f -name PKGBUILD) if [[ -e $lastsyncfile ]] && ! $FORCE; then # if lastfilesync exists, only look at things that have # changed since then (unless $FORCE is on) find_args+=(-newer "${lastsyncfile}") fi IFS=$'\n' pkgbuilds=($(find "${find_args[@]}")) # Add information from each of the PKGBUILDs to the toru cache. msg "Updating path cache" msg2 "%d PKGBUILDs to update" ${#pkgbuilds[@]} local _pkgbuild fullpath for _pkgbuild in "${pkgbuilds[@]}"; do # plain "$_pkgbuild" if ! load_PKGBUILD "${_pkgbuild}" &>/dev/null; then error "%q contains errors, skipping" "${_pkgbuild}" continue fi fullpath="$(dirname -- "${_pkgbuild}")" for _pkg in "${pkgbase}" "${pkgname[@]}" "${provides[@]}"; do $VERBOSE && msg2 '%s -> %s' "${_pkg}" "${fullpath}" tcamgr put "${pathfile}" "${_pkg%%[<>=]*}" "${fullpath}" done done date +%s > "${lastsyncfile}" } main "$@"