OSDN Git Service

[update] : Fully customizable AUR helper
[alterlinux/alterlinux.git] / system / aur.sh
index e32c760..2eaa284 100755 (executable)
 set -e -u
 
 aur_username="aurbuild"
+pacman_debug=false
+pacman_args=()
+failedpkg=()
+remove_list=()
+aur_helper_depends=("go")
+aur_helper_command="yay"
+aur_helper_package="yay"
+aur_helper_args=()
+pkglist=()
 
-# Check yay
-if ! type -p yay > /dev/null; then
-    echo "yay was not found. Please install it."
-    exit 1
-fi
+trap 'exit 1' 1 2 3 15
+
+_help() {
+    echo "usage ${0} [option] [aur helper args] ..."
+    echo
+    echo "Install aur packages with ${aur_helper_command}" 
+    echo
+    echo " General options:"
+    echo "    -a [command]             Set the command of aur helper"
+    echo "    -c                       Enable pacman debug message"
+    echo "    -e [pkg]                 Set the package name of aur helper"
+    echo "    -d [pkg1,pkg2...]        Set the oackage of the depends of aur helper"
+    echo "    -p [pkg1,pkg2...]        Set the AUR package to install"
+    echo "    -u [user]                Set the user name to build packages"
+    echo "    -x                       Enable bash debug message"
+    echo "    -h                       This help message"
+}
 
+while getopts "a:cd:e:p:u:xh" arg; do
+    case "${arg}" in
+        a) aur_helper="${OPTARG}" ;;
+        c) pacman_debug=true ;;
+        e) aur_helper_command="${OPTARG}" ;;
+        p) readarray -t pkglist < <(tr "," "\n" <<< "${OPTARG}") ;;
+        d) readarray -t aur_helper_depends < <(tr "," "\n" <<< "${OPTARG}") ;;
+        u) aur_username="${OPTARG}" ;;
+        x) set -xv ;;
+        h) 
+            _help
+            exit 0
+            ;;
+        *)
+            _help
+            exit 1
+            ;;
+    esac
+done
 
-# Delete file only if file exists
-# remove <file1> <file2> ...
-function remove () {
-    local _list
+shift "$((OPTIND - 1))"
+aur_helper_args=("${@}")
+eval set -- "${pkglist[@]}"
+
+# Show message when file is removed
+# remove <file> <file> ...
+remove() {
     local _file
-    _list=($(echo "$@"))
-    for _file in "${_list[@]}"; do
-        if [[ -f ${_file} ]]; then
-            rm -f "${_file}"
-        elif [[ -d ${_file} ]]; then
-            rm -rf "${_file}"
-        fi
-        echo "${_file} was deleted."
-    done
+    for _file in "${@}"; do echo "Removing ${_file}" >&2; rm -rf "${_file}"; done
 }
 
 # user_check <name>
 function user_check () {
-    if [[ $(getent passwd $1 > /dev/null ; printf $?) = 0 ]]; then
-        if [[ -z $1 ]]; then
-            echo -n "false"
-        fi
-        echo -n "true"
-    else
-        echo -n "false"
-    fi
+    if [[ ! -v 1 ]]; then return 2; fi
+    getent passwd "${1}" > /dev/null
 }
 
 # Creating a aur user.
-if [[ $(user_check ${aur_username}) = false ]]; then
+if ! user_check "${aur_username}"; then
     useradd -m -d "/aurbuild_temp" "${aur_username}"
 fi
 mkdir -p "/aurbuild_temp"
 chmod 700 -R "/aurbuild_temp"
-chown ${aur_username}:${aur_username} -R "/aurbuild_temp"
+chown "${aur_username}:${aur_username}" -R "/aurbuild_temp"
 echo "${aur_username} ALL=(ALL) NOPASSWD:ALL" > "/etc/sudoers.d/aurbuild"
 
 # Setup keyring
 pacman-key --init
-#eval $(cat "/etc/systemd/system/pacman-init.service" | grep 'ExecStart' | sed "s|ExecStart=||g" )
-ls "/usr/share/pacman/keyrings/"*".gpg" | sed "s|.gpg||g" | xargs | pacman-key --populate
+pacman-key --populate
+
+# Un comment the mirror list.
+#sed -i "s/#Server/Server/g" "/etc/pacman.d/mirrorlist"
+
+# Set pacman args
+pacman_args=("--config" "/etc/alteriso-pacman.conf" "--noconfirm")
+if [[ "${pacman_debug}" = true ]]; then
+    pacman_args+=("--debug")
+fi
+
+# Install
+if ! pacman -Qq "${aur_helper_package}" 1> /dev/null 2>&1; then
+    # Update database
+    _oldpwd="$(pwd)"
+    pacman -Syy "${pacman_args[@]}"
+
+    # Install depends
+    for _pkg in "${aur_helper_depends[@]}"; do
+        if ! pacman -Qq "${_pkg}" > /dev/null 2>&1 | grep -q "${_pkg}"; then
+            # --asdepsをつけているのでaur.shで削除される --neededをつけているので明示的にインストールされている場合削除されない
+            pacman -S --asdeps --needed "${pacman_args[@]}" "${_pkg}"
+            #remove_list+=("${_pkg}")
+        fi
+    done
+
+    # Build
+    sudo -u "${aur_username}" git clone "https://aur.archlinux.org/${aur_helper_package}.git" "/tmp/${aur_helper_package}"
+    cd "/tmp/${aur_helper_package}"
+    sudo -u "${aur_username}" makepkg --ignorearch --clean --cleanbuild --force --skippgpcheck --noconfirm
+
+    # Install
+    for _pkg in $(sudo -u "${aur_username}" makepkg --packagelist); do
+        pacman "${pacman_args[@]}" -U "${_pkg}"
+    done
+
+    # Remove debtis
+    cd ..
+    remove "/tmp/${aur_helper_package}"
+    cd "${_oldpwd}"
+fi
+
+if ! type -p "${aur_helper_command}" > /dev/null; then
+    echo "Failed to install ${aur_helper_package}"
+    exit 1
+fi
+
+installpkg(){
+    yes | sudo -u "${aur_username}" \
+        "${aur_helper_command}" -Sy \
+            --color always \
+            --cachedir "/var/cache/pacman/pkg/" \
+            "${pacman_args[@]}" \
+            "${aur_helper_args[@]}" \
+            "${@}" || true
+}
 
 
 # Build and install
 chmod +s /usr/bin/sudo
-yes | sudo -u aurbuild \
-    yay -Sy \
-        --mflags "-AcC" \
-        --aur \
-        --noconfirm \
-        --nocleanmenu \
-        --nodiffmenu \
-        --noeditmenu \
-        --noupgrademenu \
-        --noprovides \
-        --removemake \
-        --useask \
-        --color always \
-        --config "/etc/alteriso-pacman.conf" \
-        --cachedir "/var/cache/pacman/pkg/" \
-        ${*}
-
-yay -Sccc --noconfirm --config "/etc/alteriso-pacman.conf"
+for _pkg in "${@}"; do
+    pacman -Qq "${_pkg}" > /dev/null 2>&1  && continue
+    installpkg "${_pkg}"
+
+    if ! pacman -Qq "${_pkg}" > /dev/null 2>&1; then
+        echo -e "\n[aur.sh] Failed to install ${_pkg}\n"
+        failedpkg+=("${_pkg}")
+    fi
+done
+
+# Reinstall failed package
+for _pkg in "${failedpkg[@]}"; do
+    installpkg "${_pkg}"
+    if ! pacman -Qq "${_pkg}" > /dev/null 2>&1; then
+        echo -e "\n[aur.sh] Failed to install ${_pkg}\n"
+        exit 1
+    fi
+done
+
+# Remove packages
+readarray -t -O "${#remove_list[@]}" remove_list < <(pacman -Qttdq)
+(( "${#remove_list[@]}" != 0 )) && pacman -Rsnc "${remove_list[@]}" "${pacman_args[@]}"
+
+# Clean up
+"${aur_helper_command}" -Sccc "${pacman_args[@]}"
 
 # remove user and file
-userdel aurbuild
+userdel "${aur_username}"
 remove /aurbuild_temp
 remove /etc/sudoers.d/aurbuild
 remove "/etc/alteriso-pacman.conf"