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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
#!/usr/bin/env bash
# Copyright (C) 2011-2012 Nicolás Reynolds <fauno@parabola.nu>
# Copyright (C) 2012 Michał Masłowski <mtjm@mtjm.eu>
# Copyright (C) 2012 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
# Copyright (C) 2014-2015, 2017 Luke Shumaker <lukeshu@sbcglobal.net>
#
# 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 <http://www.gnu.org/licenses/>.
. "$(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
TORUPATH=${T:-${TORUPATH}}
VERBOSE=${V:-false}
FORCE=${F:-false}
load_files libretools
check_vars libretools TORUPATH REPOS || exit 1
load_files abs
check_vars abs ABSROOT || exit 1
# TODO: add an option to override/augment libretools.conf:REPOS
if [[ $# != 0 ]]; then
if [[ $# == 1 && "$1" == '-h' ]]; then
usage
return 0
fi
usage >&2
return 2
fi
if [ ! -w "$TORUPATH" ]; then
error "Toru's path isn't writable. Please check your TORUPATH: %q" "$TORUPATH"
exit 1
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 "$@"
|