OSDN Git Service

[update] : Added JP translation
[alterlinux/wfa.git] / wfa
diff --git a/wfa b/wfa
index fad007f..d944205 100755 (executable)
--- a/wfa
+++ b/wfa
@@ -2,31 +2,89 @@
 
 set -eu
 
-msgdebug=false
-nocolor=false
-debug=false
+
+######################################################################################
+# ここから翻訳データ
+
+declare -A ja_JP=(
+    ["Undefined operation"]="未定義のオペレーションです"
+    ["only one operation may be used at a time"]="一度に使用できるオペレーションは1つだけです"
+    ["Failed to set the argument of %s"]="%sの引数の設定に失敗しました"
+    ["Setting that command is not currently supported"]="そのコマンドの設定は現在サポートされていません"
+    ["Install dependent packages..."]="依存パッケージをインストールします..."
+    ["No package with an exact name match was found"]="完全に一致する名前のパッケージが見つかりませんでした"
+    ["Select a package %s with an exact name match"]="名前が完全に一致するパッケージ %s を選択します"
+    ["Download PKGBUILD of %s"]="%s のPKGBUILDをダウンロード"
+    ["Get PKGBUILD from %s"]="%sからPKGBUILDを取得します"
+    ["PKGBUILD has already been downloaded"]="PKGBUILDは既にダウンロードされています"
+    ["Do you want to overwrite and download? [n] :"]="上書きダウンロードしますか? [n] :"
+    ["Unpacking the tarball of PKGBUILD ..."]="PKGBUILDを展開しています ..."
+)
+######################################################################################
+# ここからデフォルト設定の定義
+
+#-- wfa configs --#
+wfa_version="0.1"
+wfa_name="WFA"
+wfa_command="wfa"
+
+#-- options (int) --#
+option_y_count=0
+
+#-- options (str) --#
+aururl="https://aur.archlinux.org/"
 operation="none"
+
+#-- options (bool) --#
+bash_debug=false
+debug=false
 force_aur=false
+msgdebug=false
+nocolor=false
 noconfirm=false
-wfa_version="0.1"
-aururl="https://aur.archlinux.org/"
+nodeps=false
 nomakepkgconf=false
+sync_search=false
 
-
-makepkg_command="/usr/bin/makepkg"
+#-- makepkg --#
+# 実行ファイル
+makepkg_command="/usr/bin/makepkg" 
+# 設定ファイル
 makepkg_config="/etc/makepkg.conf"
+# 引数
 makepkg_args=""
 
+#-- pacman --#
+# 実行ファイル
 pacman_command="/usr/bin/pacman"
+# 設定ファイル
 pacman_config="/etc/pacman.conf"
+# 引数
 pacman_args=""
 
+#-- git --#
+# 実行ファイル
 git_command="/usr/bin/git"
+# 引数
 git_args=""
 
+#-- gpg --#
+# 実行ファイル
 gpg_command="/usr/bin/gpg"
+# 引数
 gpg_args=""
 
+#-- sudo --#
+# 実行ファイル
+sudo_command="/usr/bin/sudo"
+# 引数
+sudo_args=""
+
+
+
+######################################################################################
+# ここからメッセージ関連の関数定義
+
 
 # メッセージ出力の制御
 # https://github.com/FascodeNet/alterlinux/blob/dev/tools/msg.sh の変数名にアンダーバーを追加し関数化
@@ -286,44 +344,96 @@ msg() {
     done
 }
 
+# テキストの翻訳
+#set -xv
+translate() {
+    local _msg_translate
+    _msg_translate() {
+        local _get_text
+        local _locale="$(echo "${LANG}" | cut -d "." -f 1)"
+
+        _get_text() {
+            set +eu
+            local _translated_text="$(eval echo '$'{${_locale}["${*}"]})"
+            set -eu
+            if [[ -z "${_translated_text}" ]]; then
+                echo "${*}"
+            else
+                echo "${_translated_text}"
+            fi
+        }
+
+        local _text _fulltext=() _main
+
+        if declare -p "${_locale}" 2> /dev/null 1>/dev/null; then
+            _main="$(_get_text ${1})"
+        else
+            _main="${1}"
+        fi
+        shift 1
+        echo "$(printf "${_main}" ${@})"
+    }
+    _msg_translate "${@}"
+}
+
+
+
 # Show an INFO message
 # $1: message string
 msg_info() {
-    local _msg_opts="-a WFA"
+    if [[ "${msgdebug}" = false ]]; then
+        set +xv
+    fi
+    local _msg_opts="-a ${wfa_name}"
     if [[ "${1}" = "-n" ]]; then
         _msg_opts="${_msg_opts} -o -n"
         shift 1
     fi
     [[ "${msgdebug}" = true ]] && _msg_opts="${_msg_opts} -x"
     [[ "${nocolor}"  = true ]] && _msg_opts="${_msg_opts} -n"
-    msg ${_msg_opts} info "${1}"
+    msg ${_msg_opts} info "$(translate "${@}")"
+    if [[ "${bash_debug}" = true ]]; then
+        set -xv
+    fi
 }
 
 # Show an Warning message
 # $1: message string
 msg_warn() {
-    local _msg_opts="-a WFA"
+    if [[ "${msgdebug}" = false ]]; then
+        set +xv
+    fi
+    local _msg_opts="-a ${wfa_name}"
     if [[ "${1}" = "-n" ]]; then
         _msg_opts="${_msg_opts} -o -n"
         shift 1
     fi
     [[ "${msgdebug}" = true ]] && _msg_opts="${_msg_opts} -x"
     [[ "${nocolor}"  = true ]] && _msg_opts="${_msg_opts} -n"
-    msg ${_msg_opts} warn "${1}"
+    msg ${_msg_opts} warn "$(translate "${@}")"
+    if [[ "${bash_debug}" = true ]]; then
+        set -xv
+    fi
 }
 
 # Show an debug message
 # $1: message string
 msg_debug() {
+    if [[ "${msgdebug}" = false ]]; then
+        set +xv
+    fi
     if [[ "${debug}" = true ]]; then
-        local _msg_opts="-a WFA"
+        local _msg_opts="-a ${wfa_name}"
         if [[ "${1}" = "-n" ]]; then
             _msg_opts="${_msg_opts} -o -n"
             shift 1
         fi
         [[ "${msgdebug}" = true ]] && _msg_opts="${_msg_opts} -x"
         [[ "${nocolor}"  = true ]] && _msg_opts="${_msg_opts} -n"
-        msg ${_msg_opts} debug "${1}"
+        msg ${_msg_opts} debug "$(translate "${@}")"
+    fi
+    if [[ "${bash_debug}" = true ]]; then
+        set -xv
     fi
 }
 
@@ -331,19 +441,26 @@ msg_debug() {
 # $1: message string
 # $2: exit code number (with 0 does not exit)
 msg_error() {
-    local _msg_opts="-a WFA"
+    if [[ "${msgdebug}" = false ]]; then
+        set +xv
+    fi
+    local _msg_opts="-a ${wfa_name}"
     if [[ "${1}" = "-n" ]]; then
         _msg_opts="${_msg_opts} -o -n"
         shift 1
     fi
     [[ "${msgdebug}" = true ]] && _msg_opts="${_msg_opts} -x"
     [[ "${nocolor}"  = true ]] && _msg_opts="${_msg_opts} -n"
-    msg ${_msg_opts} error "${1}"
-    if [[ -n "${2:-}" ]]; then
-        exit ${2}
+    msg ${_msg_opts} error "$(translate "${@}")"
+    if [[ "${bash_debug}" = true ]]; then
+        set -xv
     fi
 }
 
+######################################################################################
+# ここから実際の処理開始
+# ここから下のメッセージは翻訳可能です
+
 # rm helper
 # Delete the file if it exists.
 # For directories, rm -rf is used.
@@ -367,23 +484,23 @@ usage (){
     local _wfa_usage
     _wfa_usage() {
         echo "Usage:"
-        echo "wfa"
-        echo "wfa <operation> [...]"
+        echo "${wfa_command}"
+        echo "${wfa_command} <operation> [...]"
         echo
         echo "operations:"
-        echo "    wfa {-h --help}"
-        echo "    wfa {-V --version}"
-       #echo "    wfa {-D --database}    <options> <package(s)>"
-       #echo "    wfa {-F --files}       [options] [package(s)]"
-        echo "    wfa {-Q --query}       [options] [package(s)]"
-        echo "    wfa {-R --remove}      [options] <package(s)>"
-        echo "    wfa {-S --sync}        [options] [package(s)]"
-       #echo "    wfa {-T --deptest}     [options] [package(s)]"
-       #echo "    wfa {-U --upgrade}     [options] <file(s)>"
+        echo "    ${wfa_command} {-h --help}"
+        echo "    ${wfa_command} {-V --version}"
+       #echo "    ${wfa_command} {-D --database}    <options> <package(s)>"
+       #echo "    ${wfa_command} {-F --files}       [options] [package(s)]"
+        echo "    ${wfa_command} {-Q --query}       [options] [package(s)]"
+        echo "    ${wfa_command} {-R --remove}      [options] <package(s)>"
+        echo "    ${wfa_command} {-S --sync}        [options] [package(s)]"
+       #echo "    ${wfa_command} {-T --deptest}     [options] [package(s)]"
+       #echo "    ${wfa_command} {-U --upgrade}     [options] <file(s)>"
        #echo
        #echo "New operations:"
-       #echo "    wfa {-P --show}        [options]"
-       #echo "    wfa {-G --getpkgbuild} [package(s)]"
+       #echo "    ${wfa_command} {-P --show}        [options]"
+       #echo "    ${wfa_command} {-G --getpkgbuild} [package(s)]"
         echo
         echo "New options:"
         echo "       --repo             Assume targets are from the repositories"
@@ -406,7 +523,7 @@ usage (){
 
     local _wfa_usage_sync
     _wfa_usage_sync() {
-        echo "usage:  wfa {-S --sync} [options] [package(s)]"
+        echo "usage:  ${wfa_command} {-S --sync} [options] [package(s)]"
         echo "options:"
         echo "  -b, --dbpath <path>  set an alternate database location"
         echo "      --config <path>  set an alternate configuration file"
@@ -421,7 +538,8 @@ usage (){
     elif [[ "$(type -t "_wfa_usage_${operation}" )" = "function" ]]; then
         _wfa_usage_${operation}
     else
-        msg_error "Undefined operation." 1
+        msg_error "Undefined operation"
+        exit 1
     fi
 }
 
@@ -430,7 +548,8 @@ set_operation() {
         operation="${1}"
         add_args pacman "--${operation}"
     else
-        msg_error "only one operation may be used at a time" 1
+        msg_error "only one operation may be used at a time"
+        exit 1
     fi
 }
 
@@ -459,14 +578,37 @@ add_args() {
             _args_array=(${makepkg_args})
             _args_array+=(${@})
             makepkg_args=${_args_array[@]}
-            msg_debug "MAKEPKG ARGS: ${makepkg_args}"
+            msg_debug "makepkg ARGS: ${makepkg_args}"
             ;;
 
         "pacman")
             _args_array=(${pacman_args})
             _args_array+=(${@})
             pacman_args=${_args_array[@]}
-            msg_debug "PACMAN ARGS: ${pacman_args}"
+            msg_debug "pacman ARGS: ${pacman_args}"
+            ;;
+        "git")
+            _args_array=(${mpg_args})
+            _args_array+=(${@})
+            git_args=${_args_array[@]}
+            msg_debug "git ARGS: ${git_args}"
+            ;;
+        "gpg")
+            _args_array=(${gpg_args})
+            _args_array+=(${@})
+            gpg_args=${_args_array[@]}
+            msg_debug "gpg ARGS: ${gpg_args}"
+            ;;
+        "sudo")
+            _args_array=(${sudo_args})
+            _args_array+=(${@})
+            sudo_args=${_args_array[@]}
+            msg_debug "sudo ARGS: ${sudo_args}"
+            ;;
+        *)
+            msg_error "Failed to set the argument of %s" "${_target}"
+            msg_error "Setting that command is not currently supported"
+            exit 1
             ;;
     esac
 }
@@ -545,29 +687,31 @@ install_aur_package() {
     # AurJsonから値を取得
     local _aur_json=$(curl -sL "https://aur.archlinux.org/rpc/?v=5&type=search&by=name&arg=${_package}" | jq -r)
     if (( "$(echo "${_aur_json}" | jq -r ".resultcount")" == 0 )); then
-        msg_error "Could not find all required packages:\n     ${_package}" 1
+        msg_error "Could not find all required packages:\n     ${_package}"
+        exit 1
     fi
 
     local _found_packages="$(echo "${_aur_json}" | jq -r --tab '.results[].Name')"
     #msg_debug "Found package: $(echo ${_found_packages} | tr '\n' ' ')"
 
     if [[ -n "$(echo "${_found_packages}" | grep -x "${_package}" )" ]]; then
-        msg_debug "Select a package ${_package} with an exact name match"
+        msg_debug "Select a package %s with an exact name match" "${_package}"
     else
-        msg_error "No package with an exact name match was found." 1
+        msg_error "No package with an exact name match was found"
+        exit 1
     fi
 
     # PKGBUILDをダウンロード
-    msg_info "Download PKGBUILD of ${_package}"
+    msg_info "Download PKGBUILD of %s" "${_package}"
     _aur_json=$(echo "${_aur_json}" | jq -r ".results[] | select(.Name == \"${_package}\")" )
     local _aur_snapshot_url="${aururl%/}$(echo "${_aur_json}" | jq -r ".URLPath")"
     local _aur_version="$(echo "${_aur_json}" | jq -r ".Version")"
-    msg_debug "Get PKGBUILD from ${_aur_snapshot_url}"
+    msg_debug "Get PKGBUILD from %s" "${_aur_snapshot_url}"
 
     local _pkgbuild_archive_path="${wfa_cache_dir}/archive/${_package}-${_aur_version}"
     local _download_pkgbuild=true
     if [[ -f "${_pkgbuild_archive_path}" ]]; then
-        msg_warn "PKGBUILD has already been downloaded."
+        msg_warn "PKGBUILD has already been downloaded"
         msg_warn -n "Do you want to overwrite and download? [n] :"
         local _yes_or_no
         if [[ "${noconfirm}" = true ]]; then
@@ -587,7 +731,7 @@ install_aur_package() {
     fi
 
     # PKGBUILDを展開
-    msg_info "Unpacking the tarball of PKGBUILD ..."
+    msg_info "Unpacking the tarball of PKGBUILD ..."  #ここまで翻訳
     tar -xv -f "${_pkgbuild_archive_path}" -C "${wfa_cache_dir}/build/" > /dev/null 2>&1
 
     # .SRCINFOを解析
@@ -621,17 +765,20 @@ install_aur_package() {
         _conflicts_found=true
     fi
     if [[ "${_conflicts_found}" = true ]]; then
-        msg_error "A conflict was found." 1
+        msg_error "A conflict was found."
+        exit 1
     fi
 
 
     # 依存パッケージをインストール
-    msg_info "Install dependent packages..."
-    local _force_aur="${force_aur}"
-    force_aur=false
-    install_package "${_depends}"
-    force_aur="${_force_aur}"
-    unset _force_aur
+    if [[ "${nodeps}" = false ]]; then
+        msg_info "Install dependent packages..."
+        local _force_aur="${force_aur}"
+        force_aur=false
+        install_package "${_depends}"
+        force_aur="${_force_aur}"
+        unset _force_aur
+    fi
 
     # ビルド準備
     # srcdirの確認
@@ -653,7 +800,7 @@ install_aur_package() {
 
 
     # ビルド
-    add_args "${makepkg_command}" "-sf"
+    add_args "makepkg" "-sf"
     (
         cd "${_build_dir}"
         "${makepkg_command}" "${makepkg_args}"
@@ -663,7 +810,7 @@ install_aur_package() {
     # ビルド後のパッケージ一覧を生成
     (
         cd "${_build_dir}"
-        makepkg --printsrcinfo > "${_build_dir}/.SRCINFO"
+        "${makepkg_command}" --printsrcinfo > "${_build_dir}/.SRCINFO"
     )
     local _pkgnames=($(get_srcinfo_data "${_build_dir}/.SRCINFO" ".packages | keys[]" | sed 's/ //g'))
     local _pkgver="$(get_srcinfo_data "${_build_dir}/.SRCINFO" ".pkgver" | sed 's/ //g')"
@@ -688,6 +835,38 @@ install_aur_package() {
     run_pacman -U --noconfirm ${_pkgfilelist[@]}
 }
 
+# AURのパッケージを検索
+search_aur_package() {
+    local _package="${1}"
+    local _aur_json=$(curl -sL "https://aur.archlinux.org/rpc/?v=5&type=search&by=name-desc&arg=${_package}" | jq -r )
+    local _found_result_count="$(echo "${_aur_json}" | jq -r ".resultcount")"
+    if (( "${_found_result_count}" == 0 )); then
+        msg_error "Could not find all required packages:\n     ${_package}"
+        exit 1
+    fi
+    _aur_json=$(echo "${_aur_json}" | jq -r ".results[]")
+
+    #echo ${_aur_json} 
+
+    local _found_pkgname=($(echo "${_aur_json}" | jq -r ".Name" ))
+
+
+
+
+    local  _found_package __pkgver __popularity __vote __pkgdesc
+    for _found_package in ${_found_pkgname[@]}; do
+        _found_json="$(echo ${_aur_json} | jq "select(.Name == \"${_found_package}\")")"
+        __pkgver="$(echo "${_found_json}" | jq -r ".Version" )"
+        __popularity="$(echo "${_found_json}" | jq -r ".Popularity" )"
+        __vote="$(echo "${_found_json}" | jq -r ".NumVotes" )"
+        __pkgdesc="$(echo "${_found_json}" | jq -r ".Description" )"
+    
+        echo "aur/${_found_package} ${__pkgver} (+${__vote} ${__popularity})"
+        echo "    ${__pkgdesc}"
+        unset __pkgver __popularity __vote __pkgdesc _found_json
+    done
+}
+
 # バージョンを表示して終了
 operation_version() {
     # Pyalpmからlibalpmの値を取得
@@ -712,7 +891,8 @@ install_package() {
             else
                 # AUR上のパッケージの場合の処理
                 install_aur_package "${_package}"
-                #msg_error "Getting the AUR package has not been implemented yet." 1
+                #msg_error "Getting the AUR package has not been implemented yet.
+                #exit 1
             fi
         fi
     done
@@ -720,23 +900,31 @@ install_package() {
 
 operation_sync(){
     local _package
-    for _package in ${specified_packages[@]}; do
-        if ! check_aur_package "${_package}" && [[ "${force_aur}" = false ]]; then
-            # 公式パッケージなのでpacmanでそのままインストール
-            run_pacman ${pacman_args} "${_package}"
-        else
-            # AUR上のパッケージの場合の処理
-            install_aur_package "${_package}"
-            #msg_error "Getting the AUR package has not been implemented yet." 1
-        fi
-    done
+    if [[ "${sync_search}" = true ]]; then
+        for _package in ${specified_packages[@]}; do
+            search_aur_package "${_package}"
+        done
+        "${pacman_command}" ${pacman_args} ${specified_packages[@]}
+    else
+        for _package in ${specified_packages[@]}; do
+            if ! check_aur_package "${_package}" && [[ "${force_aur}" = false ]]; then
+                # 公式パッケージなのでpacmanでそのままインストール
+                run_pacman ${pacman_args} "${_package}"
+            else
+                # AUR上のパッケージの場合の処理
+                install_aur_package "${_package}"
+                #msg_error "Getting the AUR package has not been implemented yet."
+                #exit 1
+            fi
+        done
+    fi
 }
 
 
 # Parse options
 ARGUMENT="${@}"
-_opt_short="QRShVdb:a"
-_opt_long="query,remove,sync,help,version,debug,dbpath:,aururl,aur,noconfirm,config:,makepkg:,mflags:,pacman:,git:,gitflags:,gpg:,gpgflags:,makepkgconf:,nomakepkgconf"
+_opt_short="QRShVdb:ays"
+_opt_long="query,remove,sync,help,version,debug,dbpath:,aururl,aur,noconfirm,config:,makepkg:,mflags:,pacman:,git:,gitflags:,gpg:,gpgflags:,makepkgconf:,nomakepkgconf,nodeps,refresh,bash-debug,msg-debug"
 
 OPT=$(getopt -o ${_opt_short} -l ${_opt_long} -- ${ARGUMENT})
 [[ ${?} != 0 ]] && exit 1
@@ -782,15 +970,29 @@ while :; do
             msg_debug "Assume targets are from the AUR"
             shift 1
             ;;
-        -d | --debug)
+        --debug)
             debug=true
             add_args pacman "--debug"
             shift 1
             ;;
+        -d | --nodeps)
+            nodeps=true
+            add_args pacman "--nodeps"
+            shift 1
+            ;;
         -b | --dbpath)
             add_args pacman "--dbpath '${2}'"
             shift 2
             ;;
+        -y | --refresh)
+            option_y_count=$(( option_y_count + 1 ))
+            shift 1
+            ;;
+        -s | --search)
+            add_args pacman "--search"
+            sync_search=true
+            shift 1
+            ;;
         --aururl)
             aururl="${2}"
             shift 2
@@ -830,6 +1032,7 @@ while :; do
                 makepkg_config="${2}"
             else
                 msg_warn "--nomakepkgconf is specified.\n--makepkgconf has been ignored."
+            fi
             shift 2
             ;;
         --nomakepkgconf)
@@ -837,6 +1040,15 @@ while :; do
             nomakepkgconf=true
             shift 1
         ;;
+        --bash-debug)
+            bash_debug=true
+            set -xv
+            shift 1
+            ;;
+        --msg-debug)
+            msgdebug=true
+            shift 1
+            ;;
         -h | --help)
             usage
             shift 1
@@ -854,6 +1066,13 @@ done
 
 specified_packages=(${@})
 
+# Run database update
+if (( "${option_y_count}" == 1 )); then
+    run_pacman -Sy
+elif (( "${option_y_count}" >= 2 )); then
+    run_pacman -Syy
+fi
+
 case "${operation}" in
     "version")
         operation_version
@@ -868,6 +1087,7 @@ case "${operation}" in
         exit 0
         ;;
     *)
-        msg_error "Undefined operation." 1
+        msg_error "Undefined operation"
+        exit 1
         ;;
 esac