summaryrefslogtreecommitdiff
path: root/src/toru/toru-path
blob: f2445a6693072daaff98bb6c2f3673a2e86d0c34 (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
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
133
#!/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

	load_files libretools
	load_files abs

	# TODO: better option parsing
	TORUPATH=${T:-${TORUPATH}}
	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 0
		fi
		usage >&2
		return 2
	fi

	check_vars libretools TORUPATH REPOS || return 1
	check_vars abs ABSROOT || return 1

	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 "$@"