lib, perl: formatting changes
[aurutils.git] / lib / aur-repo
blob41b3244b81c98489e624b210518c6b36c03689d2
1 #!/bin/bash
2 # aur-repo - operate on local repositories
3 [[ -v AUR_DEBUG ]] && set -o xtrace
4 argv0=repo
5 PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
7 # default options
8 db_query=file mode=none conf_args=() vercmp_args=() parse_args=() missing=0
10 args_csv() {
11 # shellcheck disable=SC2155
12 local str=$(printf '%s,' "$@")
13 printf '%s' "${str%,}"
16 usage() {
17 printf >&2 'usage: %s [-d repo] [-r path] [-alqtuS]\n' "$argv0"
18 exit 1
21 # option parsing
22 opt_short='c:f:d:i:r:s:F:almqtuJS'
23 opt_long=('config:' 'database:' 'root:' 'all' 'list' 'path' 'list-path' 'list-repo'
24 'search:' 'search-by:' 'list-attr' 'sync' 'upgrades' 'table' 'quiet'
25 'attr:' 'json' 'jsonl' 'format:' 'delim:' 'dbext:' 'missing' 'ignore:' 'ignore-by:')
26 opt_hidden=('dump-options' 'repo:' 'repo-list' 'path-list' 'attr-list' 'status' 'field:')
28 if opts=$(getopt -o "$opt_short" -l "$(args_csv "${opt_long[@]}" "${opt_hidden[@]}")" -n "$argv0" -- "$@"); then
29 eval set -- "$opts"
30 else
31 usage
34 unset mode list db_ext db_name db_root format status_file pacman_conf format_args vercmp_args attr
35 while true; do
36 case $1 in
37 -d|--database|--repo)
38 shift; db_name=$1 ;;
39 -f|--format)
40 shift; format=$1; mode=format ;;
41 --delim)
42 shift; format_args+=(--delim "$1") ;;
43 -r|--root)
44 shift; db_root=$1 ;;
45 --dbext)
46 shift; db_ext=$1 ;;
47 -c|--config)
48 shift; pacman_conf=$1; conf_args+=(--config "$1") ;;
49 -m|--missing)
50 missing=1 ;;
51 -l|--list)
52 mode=list ;;
53 -t|--table)
54 mode=table ;;
55 -J|--json)
56 mode=json ;;
57 --jsonl)
58 mode=jsonl ;;
59 -a|--all)
60 mode=upgrades; vercmp_args+=(-a) ;;
61 -u|--upgrades)
62 mode=upgrades ;;
63 -q|--quiet)
64 parse_args+=(-q); vercmp_args+=(-q) ;;
65 -S|--sync)
66 db_query=sync ;;
67 -F|--attr|--field)
68 shift; mode=attr; attr=$1 ;;
69 -s|--search)
70 shift; parse_args+=(--search "$1") ;;
71 --search-by)
72 shift; parse_args+=(--search-by "$1") ;;
73 -i|--ignore)
74 shift; parse_args+=(--ignore "$1") ;;
75 --ignore-by)
76 shift; parse_args+=(--ignore-by "$1") ;;
77 --path)
78 mode=path ;;
79 --status)
80 mode=status ;;
81 --path-list|--list-path)
82 list=path ;;
83 --repo-list|--list-repo)
84 list=repo ;;
85 --attr-list|--list-attr)
86 list=attr ;;
87 --dump-options)
88 printf -- '--%s\n' "${opt_long[@]}" ${AUR_DEBUG+"${opt_hidden[@]}"}
89 printf -- '%s' "${opt_short}" | sed 's/.:\?/-&\n/g'
90 exit ;;
91 --) shift; break ;;
92 esac
93 shift
94 done
96 # assign environment variables
97 db_ext=${db_ext:-$AUR_DBEXT} db_name=${db_name:-$AUR_REPO} db_root=${db_root:-$AUR_DBROOT}
99 # option sanity check
100 if [[ $db_query == 'sync' ]] && [[ $db_root ]]; then
101 printf >&2 'warning: ignoring repository root %q with --sync\n' "$db_root"
104 # parse pacman configuration
105 declare -A conf_file_serv conf_file_path conf_sync_serv
107 while read -r key _ value; do
108 case $key=$value in
109 \[*\]*)
110 section=${key:1:-1}
112 DBPath=*)
113 pacman_dbpath=${value%/}
115 Server=file://*)
116 value=${value#file://}
118 conf_file_serv[$section]=$value
119 conf_file_path[$section]=$value/$section.${db_ext:-db}
121 Server=*://*)
122 conf_sync_serv[$section]=$value
124 if [[ $section == "$db_name" ]] && [[ ! $db_root ]]; then
125 db_root=$value
126 fi ;;
127 esac
128 done < <(pacman-conf "${conf_args[@]}")
129 wait $! || exit
131 # prefix error messages with pacman.conf (#1118)
132 if [[ -v pacman_conf ]]; then
133 err_prefix="$argv0: $pacman_conf"
134 else
135 err_prefix="$argv0"
138 # existing path is optional for printf modes (#1142)
139 if (( missing )); then
140 realpath_args=(-m)
141 else
142 # require all path components to exist
143 realpath_args=(-e)
146 # list information on available local repositories
147 case $list in
148 path|repo)
149 if ! [[ ${!conf_file_path[*]} ]]; then
150 printf >&2 '%s: no file:// repository configured\n' "$err_prefix"
151 exit 2
152 fi ;;&
153 path)
154 # resolve repo-add symlinks
155 realpath "${realpath_args[@]}" -- "${conf_file_path[@]}" || exit 2
156 exit 0 ;;
157 repo)
158 # quote repository name
159 printf '%s\n' "${!conf_file_path[@]}"
160 exit 0 ;;
161 attr)
162 aur repo-parse --list-attr # holds for any repository
163 exit ;;
164 esac
166 # select local repository from pacman configuration, if no repository
167 # was specified on the command-line
168 if [[ ! $db_name ]]; then
169 conf_file_repo=("${!conf_file_serv[@]}")
171 case ${#conf_file_repo[@]} in
172 1) db_root=${conf_file_serv[${conf_file_repo[0]}]}
173 db_name=${conf_file_repo[0]}
175 0) printf >&2 '%s: no file:// repository configured\n' "$err_prefix"
176 exit 2
178 *) printf >&2 '%s: repository choice is ambiguous (use -d to specify)\n' "$err_prefix"
180 for db in "${conf_file_repo[@]}"; do
181 printf '%q\t%q\n' "$db" "${conf_file_path[$db]}"
182 done | column -o $'\t' -t >&2
183 exit 1
185 esac
187 # check $db_name is a configured pacman repository (local or remote, #1113)
188 elif ! [[ ${conf_sync_serv[$db_name]} ]]; then
189 printf >&2 "%s: repository %q not configured\n" "$err_prefix" "$db_name"
190 exit 2
193 # basic file checks
194 case $db_query in
195 file)
196 if [[ $db_root == *://* ]]; then
197 printf >&2 '%s: %q: object is remote (use -S to query)\n' "$argv0" "$db_root"
198 exit 66
200 db_path=$db_root/$db_name.${db_ext:-db}
202 sync)
203 db_path=$pacman_dbpath/sync/$db_name.${db_ext:-db}
204 db_root=$pacman_dbpath/sync
206 esac
208 # resolve repo-add symlink
209 db_path=$(realpath "${realpath_args[@]}" -- "$db_path") || exit 2
210 db_root=$(realpath "${realpath_args[@]}" -- "$db_root") || exit 2
212 # database operations
213 case $mode in
214 list|table|json|jsonl)
215 aur repo-parse "${parse_args[@]}" -p "$db_path" --"$mode"
217 format)
218 aur repo-parse "${parse_args[@]}" -p "$db_path" --jsonl | aur format "${format_args[@]}" -f "$format"
220 upgrades)
221 aur repo-parse "${parse_args[@]}" -p "$db_path" --list | aur vercmp "${vercmp_args[@]}"
223 attr)
224 aur repo-parse "${parse_args[@]}" -p "$db_path" --attr "$attr"
226 path)
227 printf '%s\n' "$db_path"
230 printf 'repo:%s\nroot:%s\npath:%s\n' "$db_name" "$db_root" "$db_path"
232 esac
234 # vim: set et sw=4 sts=4 ft=sh: