source: wspkg/arch/arch.deps.sh @ f6d5ca1

Last change on this file since f6d5ca1 was f6d5ca1, checked in by Ting-Wei Lan <lantw44@…>, 3 years ago

Use 'printf' to print non-constant strings in shell scripts

It is unsafe to use 'echo' with strings with variable substitutions.
Different 'echo' implementations may accept different options, and they
can interpret strings with escape characters in different ways. The
behavior of 'printf' is much more consistent so it should be preferred.

  • Property mode set to 100755
File size: 2.2 KB
Line 
1#!/bin/sh
2
3msg () {
4        printf '%s\n' "$1" 1>&2
5}
6
7quote () {
8        printf \''%s'\' "$(printf '%s' "$1" | sed s,\',\'\"\'\"\',g)"
9}
10
11list_file="$1"
12: ${list_file:="arch.list"}
13: ${TAR:="tar"}
14: ${ARCH_DBPATH:="/var/lib/pacman"}
15dbpath_sync="${ARCH_DBPATH}/sync"
16
17newline='
18'
19pkg_groups_map=''
20pkg_groups_prev=''
21
22# pkg_groups_add <package> <group>
23pkg_groups_add () {
24        if [ "$1" = "${pkg_groups_prev}" ]; then
25                pkg_groups_map="${pkg_groups_map}/$2/"
26        else
27                pkg_groups_map="${pkg_groups_map}${newline}$1 /$2/"
28        fi
29        pkg_groups_prev="$1"
30}
31
32# pkg_groups_find <group>
33pkg_groups_find () {
34        printf '%s\n' "${pkg_groups_map}" | grep "/$1/" | cut -f 1 -d ' '
35}
36
37# Build the list of groups
38for db in "${dbpath_sync}"/*.db; do
39        msg "==> Loading package database ${db}"
40        tmpdir="`mktemp -d`"
41        if [ -z "${tmpdir}" ] || [ "`dirname "${tmpdir}"`" = "/" ]; then
42                msg "==> Invalid temporary directory ${tmpdir}"
43                exit 1
44        fi
45        ${TAR} -xf "${db}" -C "${tmpdir}"
46        for desc in "${tmpdir}"/*/desc; do
47                have_groups=0
48                case "`cat "${desc}"`" in
49                        *%GROUPS%*)
50                                have_groups=1
51                                ;;
52                esac
53                if [ "${have_groups}" = "0" ]; then
54                        continue
55                fi
56                name=''
57                name_next=0
58                groups_found=0
59                while read -r oneline; do
60                        case "${oneline}" in
61                                %GROUPS%)
62                                        groups_found=1
63                                        continue
64                                        ;;
65                                %NAME%)
66                                        if [ "${name_next}" = "0" ]; then
67                                                name_next=1
68                                                continue
69                                        fi
70                                        ;;
71                                %*%)
72                                        if [ "${groups_found}" = "1" ]; then
73                                                break
74                                        fi
75                                        ;;
76                        esac
77                        if [ "${name_next}" = "1" ]; then
78                                name="${oneline}"
79                                name_next=2
80                                continue
81                        fi
82                        if [ "${groups_found}" = "1" ]; then
83                                if [ "${name_next}" != "2" ]; then
84                                        msg "==> %GROUPS% found before %NAME%"
85                                        exit 1
86                                fi
87                                if [ -z "${oneline}" ]; then
88                                        continue
89                                fi
90                                pkg_groups_add "${name}" "${oneline}"
91                        fi
92                done < "${desc}"
93        done
94        rm -rf "${tmpdir}"
95done
96
97loop_first=1
98msg "==> Expanding all groups"
99for pkg_or_group in `cat "${list_file}"`; do
100        pkgs="`pkg_groups_find "${pkg_or_group}"`"
101        if [ -z "${pkgs}" ]; then
102                pkgs="${pkg_or_group}"
103        fi
104        for pkg in ${pkgs}; do
105                if [ "${loop_first}" = "1" ]; then
106                        printf '%s' "$(quote "${pkg}")"
107                else
108                        printf ' %s' "$(quote "${pkg}")"
109                fi
110                loop_first=0
111        done
112done
Note: See TracBrowser for help on using the repository browser.