OSDN Git Service

53f52dbbe183053041e5425c34bff36613a458a9
[alterlinux/aptpac.git] / aptpac
1 #!/usr/bin/env bash
2 #
3 #               __
4 #              /\ \__
5 #   __    _____\ \ ,_\ _____     __      ___
6 # /'__`\ /\ '__`\ \ \//\ '__`\ /'__`\   /'___\
7 #/\ \L\.\\ \ \L\ \ \ \\ \ \L\ /\ \L\.\_/\ \__/
8 #\ \__/.\_\ \ ,__/\ \__\ \ ,__\ \__/.\_\ \____\
9 # \/__/\/_/\ \ \/  \/__/\ \ \/ \/__/\/_/\/____/
10 #           \ \_\        \ \_\
11 #            \/_/         \/_/
12 # a pacman wrapper with syntax based on debian's apt
13 # (c) 2019-2020 Fascode Network.
14 # License: Do What The Fuck You Want To Public License
15 # maintained by Yamada Hayao
16
17 # Enter the path to the AUR helper you want to use here. 
18 # If it is empty, the corresponding AUR helper will be searched automatically.
19 #AURHELPER=
20
21
22 set -e
23 APTPAC_VERSION="3.3.0"
24 PACMAN_OPTIONS=()
25 HELPERS=(
26     "/usr/bin/yay"
27     "/usr/bin/paru"
28     "/usr/bin/yaourt"
29     "/usr/bin/aurman"
30     "/usr/bin/pikaur"
31     "/usr/bin/pacaur"
32     "/usr/bin/aura"
33     "/usr/bin/wfa"
34 )
35 DEFAULT_PACMAN_COMMAND="/usr/bin/pacman"
36 PACMAN_COMMAND="${DEFAULT_PACMAN_COMMAND}"
37 PACMAN_CONFIG="/etc/pacman.conf"
38 DEBUG=false
39 RUN_WITH_SUDO=false
40
41 direct_option=false
42 autoremove=false
43
44 _msg_error () {
45     echo -e "${@}" >&2
46 }
47
48 _msg_debug () {
49     if "${DEBUG}"; then
50         echo -e "${@}" >&1
51     fi
52 }
53
54 if [[ ! "${UID}" = 0 ]]; then
55     if [[ -z "${AURHELPER+SET}" ]]; then
56         for AURHELPER in "${HELPERS[@]}"; do
57             if [[ -f "${AURHELPER}" ]]; then
58                 PACMAN_COMMAND="${AURHELPER}"
59                 break
60             elif hash "$(basename "${AURHELPER}")" 2> /dev/null; then
61                 PACMAN_COMMAND="$(basename "${AURHELPER}")"
62                 break
63             fi
64         done
65     else
66         if [[ -f "${AURHELPER}" ]]; then
67             PACMAN_COMMAND="${AURHELPER}"
68         elif hash "$(basename "${AURHELPER}")" 2> /dev/null; then
69             PACMAN_COMMAND="$(basename "${AURHELPER}")"
70         else
71             _msg_error "${AURHELPER} is not installed"
72             exit 1
73         fi
74     fi
75 fi
76
77
78 # List option
79 installed=false
80
81 _usage () {
82     echo "usage ${0} [options] [command] [packages]"
83     echo
84     echo " apt commands:"
85     echo "    install                              Install the specified package"
86     echo "    remove                               Remove the specified package"
87     echo "    purge                                Permanently remove the package"
88     echo "    update                               Update package database"
89     echo "    upgrade | full-upgrade               Update packages"
90     echo "    edit-sources                         Edit config file of pacman"
91     echo "    search                               Search for a package"
92     echo "    autoremove                           Remove unnecessary packages"
93     echo "    clean                                Remove the package cache"
94     echo "    list                                 Display a list of packages"
95     echo "    show | showpkg                       Display the package records"
96     echo "    rdepends                             Display the dependencies"
97     echo
98     echo " apt options:"
99     echo "    -y | --yes  | --assume-yes           Do not check"
100     echo "    -d | --download-only                 Only download the package"
101     echo "    -c | --config-file <file>            Config file for pacman"
102     echo "    -h | --help                          Display this help"
103     echo "    -v | --version                       Display the version of aptpac and pacman"
104     echo "         --auto-remove | --autoremove    Remove unnecessary packages with other command"
105     echo "         --purge                         Delete the entire configuration file"
106     echo
107     echo " pacapt options:"
108     echo "         --aur-helper <command>          Specifies the command to use as the AUR helper"
109     echo "                                         Ignored if pacapt is run as root"
110     echo "                                         Specify AUR helper that supports common command line options with pacman"
111     echo
112     echo " aptpac supports not only above options but also options of pacman"
113 }
114
115 _exit () {
116     exit "${1}"
117 }
118
119 _version () {
120 cat << EOF
121 aptpac ${APTPAC_VERSION} - A pacman wrapper with syntax based on debian's apt
122 License: Do What The Fuck You Want To Public License
123 (c) 2019-2020 Fascode Network. Yamada Hayao
124 EOF
125 echo
126 pacman --version
127 }
128
129
130 ADD_OPTION () {
131     PACMAN_OPTIONS+=("${@}")
132 }
133
134 # Argument analysis and processing
135 set +e
136 PACAPT_ARGUMENTS=("${@}")
137 _opt_short="ydfc:hvVDFQRSTU"
138 _opt_long="yes,assume-yes,download-only,fix-broken,purse,installed,debug,help,version,config-file:,auto-remove,autoremove,aur-helper:"
139 OPT=$(getopt -o ${_opt_short} -l ${_opt_long} -- "${@}" 2> /dev/null)
140 set -e
141 #if [[ ${?} != 0 ]]; then
142 #    exit 1
143 #fi
144
145 eval set -- "${OPT}"
146 #echo "Argument is \"${OPT}\""
147 unset OPT _opt_short _opt_long
148
149 while true; do
150     case "${1}" in
151         -y | --yes | --assume-yes)
152             ADD_OPTION "--noconfirm"
153             shift 1
154             ;;
155         -d | --download-only)
156             ADD_OPTION "-w"
157             shift 1
158             ;;
159         -f | --fix-broken)
160             shift 1
161             ;;
162         -c | --config-file)
163             PACMAN_CONFIG="${2}"
164             shift 2
165             ;;
166         --purge)
167             ADD_OPTION "-n"
168             shift 1
169             ;;
170         --installed)
171             installed=true
172             shift 1
173             ;;
174         --debug)
175             DEBUG=true
176             shift 1
177             ;;
178         -h | --help)
179             _usage
180             shift 1
181             exit 0
182             ;;
183         -v | --version)
184             _version
185             shift 1
186             exit 0
187             ;;
188         --autoremove | --auto-remove)
189             autoremove=true
190             shift 1
191             ;;
192         --aur-helper)
193             if [[ ! "${UID}" = 0 ]] && [[ -f "${2}" ]]; then
194                 PACMAN_COMMAND="${2}"
195             elif [[ "${UID}" = 0 ]]; then
196                 _msg_warn "The specified AUR helper is not used because pacapt is running on the root."
197             elif hash "$(basename "${2}")" 2> /dev/null; then
198                 PACMAN_COMMAND="$(basename "${2}")"
199             else
200                 _msg_error "${2} is not installed"
201                 exit 1
202             fi
203             shift 2
204             ;;
205         -V | -D | -F | -Q | -R | -S | -T | -U)
206             direct_option=true
207             ADD_OPTION "${PACAPT_ARGUMENTS[@]}"
208             break
209             ;;
210         --)
211             shift 1
212             break
213             ;;
214         *)
215             _msg_error "Invalid argument '${1}'"
216             _help
217             exit 1
218             ;;
219     esac
220 done
221
222 if [[ "${direct_option}" = false ]]; then
223     if [[ $# -lt 1 ]]; then
224         _msg_error "No command specified"
225         _usage
226         _exit 1
227     fi
228     COMMAND="${1}"
229
230     shift 1
231
232     PACKAGE=("${@}")
233
234     case "${COMMAND}" in
235         install)
236             ADD_OPTION "-S"
237             ;;
238         remove)
239             ADD_OPTION "-Rsc"
240             ;;
241         purge)
242             ADD_OPTION "-Rsnc"
243             ;;
244         update)
245             ADD_OPTION "-Syy"
246             ;;
247         upgrade)
248             ADD_OPTION "-Syu"
249             ;;
250         search)
251             ADD_OPTION "-Ss"
252             ;;
253         full-upgrade)
254             ADD_OPTION "-Syu"
255             ;;
256         clean)
257             ADD_OPTION "-Sccc"
258             ;;
259         dist-upgrade)
260             ADD_OPTION "-Syu"
261             ;;
262         edit-sources)
263             if [[ -n "${EDITOR}" ]]; then
264                 sudo "${EDITOR}" "${PACMAN_CONFIG}"
265             else
266                 sudo nano "${PACMAN_CONFIG}"
267             fi
268             _exit 0
269             ;;
270         huawei) 
271             if [[ "$(source "/etc/locale.conf" 2> /dev/null; echo -n "${LANG}")" = "ja_JP.UTF-8" ]]; then
272                 echo "(ง •ᴗ•)ว ⁾⁾ファーウェイでウェイウェイ"
273                 _exit 0
274             else
275                 _msg_error "Invalid command '${COMMAND}'"
276                 _exit 1
277             fi
278             ;;
279         moo)
280             echo "         (__) "
281             echo "         (oo) "
282             echo "   /------\/ "
283             echo "  / |    ||   "
284             echo " *  /\---/\ "
285             echo "    ~~   ~~   "
286             echo "....\"Have you mooed today?\"..."
287             exit 0
288             ;;
289         autoremove) 
290             if [[ -n "$(${PACMAN_COMMAND} -Qttdq)" ]]; then
291                 ADD_OPTION "-Rsc"
292                 while read -r pkg; do
293                     PACKAGE+=("${pkg}")
294                 done < <(${PACMAN_COMMAND} -Qttdq)
295             else
296                 echo "No packages to remove"
297                 exit 0
298             fi
299             ;;
300         list)
301             if ${installed}; then
302                 ADD_OPTION "-Q | grep"
303             else
304                 ADD_OPTION "-Ss"
305             fi
306             ;;
307         show | showpkg)
308             for pkg in "${PACKAGE[@]}"; do
309                 if pacman -Qq "${pkg}" 2> /dev/null 1>&2; then
310                     ${PACMAN_COMMAND} "${PACMAN_OPTIONS[@]}" -Qi --config "${PACMAN_CONFIG}" "${pkg}"
311                 else
312                     ${PACMAN_COMMAND} "${PACMAN_OPTIONS[@]}" -Si --config "${PACMAN_CONFIG}" "${pkg}"
313                 fi
314             done
315             unset pkg
316             _exit 0
317             ;;
318         rdepends)
319             ADD_OPTION "-Sii"
320             ;;
321         help)
322             _usage
323             exit 0
324             ;;
325         *)
326             _msg_error "Invalid command '${COMMAND}'"
327             _exit 1
328             ;;
329     esac
330 fi
331
332 if [[ ! "${PACMAN_COMMAND}" = "${DEFAULT_PACMAN_COMMAND}" ]] && [[ ! "$(basename "${PACMAN_COMMAND}")" = "$(basename "${DEFAULT_PACMAN_COMMAND}")" ]]; then
333     _msg_debug "Use AUR helper ${PACMAN_COMMAND}"
334 else
335     RUN_WITH_SUDO=true
336 fi
337
338 _sudo(){
339     if "${RUN_WITH_SUDO}"; then
340         eval sudo "${@}"
341     else
342         eval "${@}"
343     fi
344 }
345
346 _sudo "${PACMAN_COMMAND}" "${PACMAN_OPTIONS[@]}" --config "${PACMAN_CONFIG}" "${PACKAGE[@]}"
347
348 if "${autoremove}"; then
349     if [[ -n $(${PACMAN_COMMAND} -Qttdq) ]]; then
350         "${PACMAN_COMMAND}" -Qttdq | _sudo "${PACMAN_COMMAND}" -Rsc --config "${PACMAN_CONFIG}" -
351     else
352         echo "No packages to remove"
353         exit 0
354     fi
355 fi