OSDN Git Service

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