grim/containers/msys2-cross

Parents
Children 4854271ab9d2
Initial revision, pacman works in the container, but doesn't work with other roots yet
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Dockerfile Sun Nov 18 23:52:58 2018 -0600
@@ -0,0 +1,26 @@
+# vi:et:ts=4 sw=4 sts=4:ft=dockerfile
+FROM debian:buster-slim
+
+# Get our base dependencies
+RUN set -ex && \
+ apt-get update && \
+ apt-get install -y mingw-w64 mingw-w64-tools wget xz-utils gnupg2 && \
+ apt-get clean && \
+ rm -rf /var/lib/apt/lists
+
+COPY sync/ /var/lib/pacman/sync/
+COPY etc/ /etc/
+COPY bin/ /usr/local/bin/
+COPY keyrings/ /usr/share/pacman/keyrings/
+
+# Install pacman-static
+RUN set -ex && \
+ wget -O /usr/local/bin/pacman https://pkgbuild.com/~eschwartz/repo/x86_64-extracted/pacman-static && \
+ chmod +x /usr/local/bin/pacman && \
+ mkdir -p /windows/etc /windows/var/lib/pacman /windows/var/log /windows/tmp
+
+# setup pacman-key
+RUN set -ex && \
+ pacman-key --init && \
+ pacman-key --populate msys2
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/pacman-key Sun Nov 18 23:52:58 2018 -0600
@@ -0,0 +1,856 @@
+#!/usr/bin/env bash
+#
+# pacman-key - manages pacman's keyring
+# Based on apt-key, from Debian
+# Generated from pacman-key.sh.in; do not edit by hand.
+#
+# Copyright (c) 2010-2016 Pacman Development Team <pacman-dev@archlinux.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+# gettext initialization
+export TEXTDOMAIN='pacman-scripts'
+export TEXTDOMAINDIR='/usr/share/locale'
+
+declare -r myver="5.0.1"
+
+# Options
+ADD=0
+DELETE=0
+EDITKEY=0
+EXPORT=0
+FINGER=0
+IMPORT=0
+IMPORT_TRUSTDB=0
+INIT=0
+KEYSERVER=''
+LISTKEYS=0
+LISTSIGS=0
+LSIGNKEY=0
+POPULATE=0
+RECEIVE=0
+REFRESH=0
+UPDATEDB=0
+USE_COLOR='y'
+VERIFY=0
+
+DEFAULT_KEYSERVER='hkp://pool.sks-keyservers.net'
+
+plain() {
+ (( QUIET )) && return
+ local mesg=$1; shift
+ printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&1
+}
+
+msg() {
+ (( QUIET )) && return
+ local mesg=$1; shift
+ printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&1
+}
+
+msg2() {
+ (( QUIET )) && return
+ local mesg=$1; shift
+ printf "${BLUE} ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&1
+}
+
+ask() {
+ local mesg=$1; shift
+ printf "${BLUE}::${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}" "$@" >&1
+}
+
+warning() {
+ local mesg=$1; shift
+ printf "${YELLOW}==> $(gettext "WARNING:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
+}
+
+error() {
+ local mesg=$1; shift
+ printf "${RED}==> $(gettext "ERROR:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
+}
+
+
+# getopt-like parser
+parseopts() {
+ local opt= optarg= i= shortopts=$1
+ local -a longopts=() unused_argv=()
+
+ shift
+ while [[ $1 && $1 != '--' ]]; do
+ longopts+=("$1")
+ shift
+ done
+ shift
+
+ longoptmatch() {
+ local o longmatch=()
+ for o in "${longopts[@]}"; do
+ if [[ ${o%:} = "$1" ]]; then
+ longmatch=("$o")
+ break
+ fi
+ [[ ${o%:} = "$1"* ]] && longmatch+=("$o")
+ done
+
+ case ${#longmatch[*]} in
+ 1)
+ # success, override with opt and return arg req (0 == none, 1 == required)
+ opt=${longmatch%:}
+ if [[ $longmatch = *: ]]; then
+ return 1
+ else
+ return 0
+ fi ;;
+ 0)
+ # fail, no match found
+ return 255 ;;
+ *)
+ # fail, ambiguous match
+ printf "pacman-key: $(gettext "option '%s' is ambiguous; possibilities:")" "--$1"
+ printf " '%s'" "${longmatch[@]%:}"
+ printf '\n'
+ return 254 ;;
+ esac >&2
+ }
+
+ while (( $# )); do
+ case $1 in
+ --) # explicit end of options
+ shift
+ break
+ ;;
+ -[!-]*) # short option
+ for (( i = 1; i < ${#1}; i++ )); do
+ opt=${1:i:1}
+
+ # option doesn't exist
+ if [[ $shortopts != *$opt* ]]; then
+ printf "pacman-key: $(gettext "invalid option") -- '%s'\n" "$opt" >&2
+ OPTRET=(--)
+ return 1
+ fi
+
+ OPTRET+=("-$opt")
+ # option requires optarg
+ if [[ $shortopts = *$opt:* ]]; then
+ # if we're not at the end of the option chunk, the rest is the optarg
+ if (( i < ${#1} - 1 )); then
+ OPTRET+=("${1:i+1}")
+ break
+ # if we're at the end, grab the the next positional, if it exists
+ elif (( i == ${#1} - 1 )) && [[ $2 ]]; then
+ OPTRET+=("$2")
+ shift
+ break
+ # parse failure
+ else
+ printf "pacman-key: $(gettext "option requires an argument") -- '%s'\n" "$opt" >&2
+ OPTRET=(--)
+ return 1
+ fi
+ fi
+ done
+ ;;
+ --?*=*|--?*) # long option
+ IFS='=' read -r opt optarg <<< "${1#--}"
+ longoptmatch "$opt"
+ case $? in
+ 0)
+ # parse failure
+ if [[ $optarg ]]; then
+ printf "pacman-key: $(gettext "option '%s' does not allow an argument")\n" "--$opt" >&2
+ OPTRET=(--)
+ return 1
+ # --longopt
+ else
+ OPTRET+=("--$opt")
+ fi
+ ;;
+ 1)
+ # --longopt=optarg
+ if [[ $optarg ]]; then
+ OPTRET+=("--$opt" "$optarg")
+ # --longopt optarg
+ elif [[ $2 ]]; then
+ OPTRET+=("--$opt" "$2" )
+ shift
+ # parse failure
+ else
+ printf "pacman-key: $(gettext "option '%s' requires an argument")\n" "--$opt" >&2
+ OPTRET=(--)
+ return 1
+ fi
+ ;;
+ 254)
+ # ambiguous option -- error was reported for us by longoptmatch()
+ OPTRET=(--)
+ return 1
+ ;;
+ 255)
+ # parse failure
+ printf "pacman-key: $(gettext "invalid option") '--%s'\n" "$opt" >&2
+ OPTRET=(--)
+ return 1
+ ;;
+ esac
+ ;;
+ *) # non-option arg encountered, add it as a parameter
+ unused_argv+=("$1")
+ ;;
+ esac
+ shift
+ done
+
+ # add end-of-opt terminator and any leftover positional parameters
+ OPTRET+=('--' "${unused_argv[@]}" "$@")
+ unset longoptmatch
+
+ return 0
+}
+
+
+if [[ -n "$MSYSTEM" ]]; then
+ readonly -a UTILS_NAME=('bsdtar'
+ 'bzip2'
+ 'bzr'
+ 'cat'
+ 'ccache'
+ 'distcc'
+ 'git'
+ 'gpg'
+ 'gzip'
+ 'hg'
+ 'lzip'
+ 'lzop'
+ 'openssl'
+ 'svn'
+ 'tput'
+ 'uncompress'
+ 'upx'
+ 'xargs'
+ 'xz'
+ )
+
+ for wrapper in ${UTILS_NAME[@]}; do
+ eval "
+ ${wrapper}"'() {
+ local UTILS_PATH="/usr/bin/"
+ if ! type -p ${UTILS_PATH}${FUNCNAME[0]} >/dev/null; then
+ error "$(gettext "Cannot find the %s binary required for makepkg.")" "${UTILS_PATH}${FUNCNAME[0]}"
+ exit 1
+ fi
+ ${UTILS_PATH}${FUNCNAME[0]} "$@"
+ }'
+ done
+fi
+
+
+usage() {
+ printf "pacman-key (pacman) %s\n" ${myver}
+ echo
+ printf -- "$(gettext "Usage: %s [options] operation [targets]")\n" $(basename $0)
+ echo
+ printf -- "$(gettext "Manage pacman's list of trusted keys")\n"
+ echo
+ printf -- "$(gettext "Operations:")\n"
+ printf -- "$(gettext " -a, --add Add the specified keys (empty for stdin)")\n"
+ printf -- "$(gettext " -d, --delete Remove the specified keyids")\n"
+ printf -- "$(gettext " -e, --export Export the specified or all keyids")\n"
+ printf -- "$(gettext " -f, --finger List fingerprint for specified or all keyids")\n"
+ printf -- "$(gettext " -l, --list-keys List the specified or all keys")\n"
+ printf -- "$(gettext " -r, --recv-keys Fetch the specified keyids")\n"
+ printf -- "$(gettext " -u, --updatedb Update the trustdb of pacman")\n"
+ printf -- "$(gettext " -v, --verify Verify the file(s) specified by the signature(s)")\n"
+ printf -- "$(gettext " --edit-key Present a menu for key management task on keyids")\n"
+ printf -- "$(gettext " --import Imports pubring.gpg from dir(s)")\n"
+ printf -- "$(gettext " --import-trustdb Imports ownertrust values from trustdb.gpg in dir(s)")\n"
+ printf -- "$(gettext " --init Ensure the keyring is properly initialized")\n"
+ printf -- "$(gettext " --list-sigs List keys and their signatures")\n"
+ printf -- "$(gettext " --lsign-key Locally sign the specified keyid")\n"
+ printf -- "$(gettext " --populate Reload the default keys from the (given) keyrings\n\
+ in '%s'")\n" "/usr/share/pacman/keyrings"
+ printf -- "$(gettext " --refresh-keys Update specified or all keys from a keyserver")\n"
+ echo
+ printf -- "$(gettext "Options:")\n"
+ printf -- "$(gettext " --config <file> Use an alternate config file (instead of\n\
+ '%s')")\n" "/etc/pacman.conf"
+ printf -- "$(gettext " --gpgdir <dir> Set an alternate directory for GnuPG (instead\n\
+ of '%s')")\n" "/etc/pacman.d/gnupg"
+ printf -- "$(gettext " --keyserver <server-url> Specify a keyserver to use if necessary")\n"
+ echo
+ printf -- "$(gettext " -h, --help Show this help message and exit")\n"
+ printf -- "$(gettext " -V, --version Show program version")\n"
+}
+
+version() {
+ printf "pacman-key (pacman) %s\n" "${myver}"
+ printf -- "$(gettext "\
+Copyright (c) 2010-2016 Pacman Development Team <pacman-dev@archlinux.org>.\n\
+This is free software; see the source for copying conditions.\n\
+There is NO WARRANTY, to the extent permitted by law.\n")"
+}
+
+# read the config file "$1" which has key=value pairs, and return the key which
+# matches "$2". the equals sign between pairs may be surrounded by any amount
+# of whitespace. Optionally, "$3" can be specified which is the default value
+# when no key is found.
+get_from() {
+ while IFS='=' read -r key value; do
+ [[ -z $key || ${key:0:1} = '#' ]] && continue
+
+ if [[ ${key%% *} = "$2" && -n ${value##* } ]]; then
+ echo "${value##* }"
+ return 0
+ fi
+ done < "$1"
+ if [[ -n "$3" ]]; then
+ printf '%s\n' "$3"
+ return 0
+ fi
+ return 1
+}
+
+key_lookup_from_name() {
+ local ids
+
+ mapfile -t ids < \
+ <("${GPG_PACMAN[@]}" --search-keys --batch --with-colons "$1" 2>/dev/null |
+ awk -F: '$1 == "pub" { print $2 }')
+
+ # only return success on non-ambiguous lookup
+ case ${#ids[*]} in
+ 0)
+ error "$(gettext "Failed to lookup key by name:") %s" "$name"
+ return 1
+ ;;
+ 1)
+ printf '%s' "${ids[0]}"
+ return 0
+ ;;
+ *)
+ error "$(gettext "Key name is ambiguous:") %s" "$name"
+ return 1
+ ;;
+ esac
+}
+
+generate_master_key() {
+ # Generate the master key, which will be in both pubring and secring
+ "${GPG_PACMAN[@]}" --gen-key --batch <<EOF
+%echo Generating pacman keyring master key...
+Key-Type: RSA
+Key-Length: 2048
+Key-Usage: sign
+Name-Real: Pacman Keyring Master Key
+Name-Email: pacman@localhost
+Expire-Date: 0
+%no-protection
+%commit
+%echo Done
+EOF
+}
+
+secret_keys_available() {
+ "${GPG_PACMAN[@]}" -K --with-colons | wc -l
+}
+
+# Adds the given gpg.conf option if it is not present in the file.
+# Note that if we find it commented out, we won't add the option.
+# args: $1 conffile, $2 option-name, $3 (optional) option-value
+add_gpg_conf_option() {
+ local conffile=$1; shift
+ # looking for the option 'bare', only leading spaces or # chars allowed,
+ # followed by at least one space and any other text or the end of line.
+ if ! grep -q "^[[:space:]#]*$1\([[:space:]].*\)*$" "$conffile" &>/dev/null; then
+ printf '%s\n' "$*" >> "$conffile"
+ fi
+}
+
+check_keyids_exist() {
+ local ret=0
+ for key in "$@"; do
+ # Verify if the key exists in pacman's keyring
+ if ! "${GPG_PACMAN[@]}" --list-keys "$key" &>/dev/null ; then
+ error "$(gettext "The key identified by %s could not be found locally.")" "$key"
+ ret=1
+ fi
+ done
+ if (( ret )); then
+ exit 1
+ fi
+}
+
+initialize() {
+ local conffile keyserv
+ # Check for simple existence rather than for a directory as someone
+ # may want to use a symlink here
+ [[ -e ${PACMAN_KEYRING_DIR} ]] || mkdir -p -m 755 "${PACMAN_KEYRING_DIR}"
+
+ # keyring files
+ [[ -f ${PACMAN_KEYRING_DIR}/pubring.gpg ]] || touch ${PACMAN_KEYRING_DIR}/pubring.gpg
+ [[ -f ${PACMAN_KEYRING_DIR}/secring.gpg ]] || touch ${PACMAN_KEYRING_DIR}/secring.gpg
+ [[ -f ${PACMAN_KEYRING_DIR}/trustdb.gpg ]] || "${GPG_PACMAN[@]}" --update-trustdb
+ chmod 644 ${PACMAN_KEYRING_DIR}/{pubring,trustdb}.gpg
+ chmod 600 ${PACMAN_KEYRING_DIR}/secring.gpg
+
+ # gpg.conf
+ conffile="${PACMAN_KEYRING_DIR}/gpg.conf"
+ [[ -f $conffile ]] || touch "$conffile"
+ chmod 644 "$conffile"
+ add_gpg_conf_option "$conffile" 'no-greeting'
+ add_gpg_conf_option "$conffile" 'no-permission-warning'
+ add_gpg_conf_option "$conffile" 'lock-never'
+ keyserv=${KEYSERVER:-$DEFAULT_KEYSERVER}
+ add_gpg_conf_option "$conffile" 'keyserver' "$keyserv"
+ add_gpg_conf_option "$conffile" 'keyserver-options' 'timeout=10'
+
+ # set up a private signing key (if none available)
+ if [[ $(secret_keys_available) -lt 1 ]]; then
+ generate_master_key
+ UPDATEDB=1
+ fi
+}
+
+check_keyring() {
+ if [[ ! -r ${PACMAN_KEYRING_DIR}/pubring.gpg || \
+ ! -r ${PACMAN_KEYRING_DIR}/trustdb.gpg ]]; then
+ error "$(gettext "You do not have sufficient permissions to read the %s keyring.")" "pacman"
+ msg "$(gettext "Use '%s' to correct the keyring permissions.")" "pacman-key --init"
+ exit 1
+ fi
+
+ if (( EXPORT || FINGER || LIST || VERIFY )); then
+ if ! grep -q "^[[:space:]]*lock-never[[:space:]]*$" ${PACMAN_KEYRING_DIR}/gpg.conf &>/dev/null; then
+ error "$(gettext "You do not have sufficient permissions to run this command.")"
+ msg "$(gettext "Use '%s' to correct the keyring permissions.")" "pacman-key --init"
+ exit 1
+ fi
+ fi
+
+ if (( LSIGNKEY )); then
+ if [[ $(secret_keys_available) -lt 1 ]]; then
+ error "$(gettext "There is no secret key available to sign with.")"
+ msg "$(gettext "Use '%s' to generate a default secret key.")" "pacman-key --init"
+ exit 1
+ fi
+ fi
+}
+
+populate_keyring() {
+ local KEYRING_IMPORT_DIR='/usr/share/pacman/keyrings'
+
+ local keyring KEYRINGIDS=("$@")
+ local ret=0
+ if (( ${#KEYRINGIDS[*]} == 0 )); then
+ # get list of all available keyrings
+ shopt -s nullglob
+ KEYRINGIDS=("$KEYRING_IMPORT_DIR"/*.gpg)
+ shopt -u nullglob
+ KEYRINGIDS=("${KEYRINGIDS[@]##*/}")
+ KEYRINGIDS=("${KEYRINGIDS[@]%.gpg}")
+ if (( ${#KEYRINGIDS[*]} == 0 )); then
+ error "$(gettext "No keyring files exist in %s.")" "$KEYRING_IMPORT_DIR"
+ ret=1
+ fi
+ else
+ # verify listed keyrings exist
+ for keyring in "${KEYRINGIDS[@]}"; do
+ if [[ ! -f "$KEYRING_IMPORT_DIR/$keyring.gpg" ]]; then
+ error "$(gettext "The keyring file %s does not exist.")" "$KEYRING_IMPORT_DIR/$keyring.gpg"
+ ret=1
+ fi
+ done
+ fi
+
+ if (( ret )); then
+ exit 1
+ fi
+
+ # Variable used for iterating on keyrings
+ local keys key_id
+
+ # Add keys from requested keyrings
+ for keyring in "${KEYRINGIDS[@]}"; do
+ msg "$(gettext "Appending keys from %s.gpg...")" "$keyring"
+ "${GPG_PACMAN[@]}" --quiet --import "${KEYRING_IMPORT_DIR}/${keyring}.gpg"
+ done
+
+ # Read the trusted key IDs to an array. Because this is an ownertrust
+ # file, we know we have the full 40 hex digit fingerprint values.
+ # Format of ownertrust dump file:
+ # 40CHARFINGERPRINTXXXXXXXXXXXXXXXXXXXXXXX:6:
+ # 40CHARFINGERPRINTXXXXXXXXXXXXXXXXXXXXXXX:5:
+ local -A trusted_ids
+ for keyring in "${KEYRINGIDS[@]}"; do
+ if [[ -s "${KEYRING_IMPORT_DIR}/${keyring}-trusted" ]]; then
+ while IFS=: read key_id _; do
+ # skip blank lines, comments; these are valid in this file
+ [[ -z $key_id || ${key_id:0:1} = \# ]] && continue
+
+ # Mark this key to be lsigned
+ trusted_ids[$key_id]=$keyring
+ done < "${KEYRING_IMPORT_DIR}/${keyring}-trusted"
+ fi
+ done
+
+ if (( ${#trusted_ids[@]} > 0 )); then
+ msg "$(gettext "Locally signing trusted keys in keyring...")"
+ lsign_keys "${!trusted_ids[@]}"
+ msg "$(gettext "Importing owner trust values...")"
+ for keyring in "${KEYRINGIDS[@]}"; do
+ if [[ -s "${KEYRING_IMPORT_DIR}/${keyring}-trusted" ]]; then
+ "${GPG_PACMAN[@]}" --import-ownertrust "${KEYRING_IMPORT_DIR}/${keyring}-trusted"
+ fi
+ done
+ fi
+
+ local -A revoked_ids
+ for keyring in "${KEYRINGIDS[@]}"; do
+ if [[ -s $KEYRING_IMPORT_DIR/$keyring-revoked ]]; then
+ while read -r key_id; do
+ revoked_ids["$key_id"]=1
+ done <"$KEYRING_IMPORT_DIR/$keyring-revoked"
+ fi
+ done
+
+ if (( ${#revoked_ids[@]} > 0 )); then
+ msg "$(gettext "Disabling revoked keys in keyring...")"
+ for key_id in "${!revoked_ids[@]}"; do
+ msg2 "$(gettext "Disabling key %s...")" "${key_id}"
+ printf 'disable\nquit\n' | LANG=C "${GPG_PACMAN[@]}" --command-fd 0 --quiet --batch --edit-key "${key_id}" 2>/dev/null
+ done
+ fi
+}
+
+add_keys() {
+ if ! "${GPG_PACMAN[@]}" --quiet --batch --import "$@" ; then
+ error "$(gettext "A specified keyfile could not be added to the keyring.")"
+ exit 1
+ fi
+}
+
+delete_keys() {
+ check_keyids_exist "$@"
+ if ! "${GPG_PACMAN[@]}" --quiet --batch --delete-key --yes "$@" ; then
+ error "$(gettext "A specified key could not be removed from the keyring.")"
+ exit 1
+ fi
+}
+
+edit_keys() {
+ check_keyids_exist "$@"
+ local ret=0
+ for key in "$@"; do
+ if ! "${GPG_PACMAN[@]}" --edit-key "$key" ; then
+ error "$(gettext "The key identified by %s could not be edited.")" "$key"
+ ret=1
+ fi
+ done
+ if (( ret )); then
+ exit 1
+ fi
+}
+
+export_keys() {
+ check_keyids_exist "$@"
+ if ! "${GPG_PACMAN[@]}" --armor --export "$@" ; then
+ error "$(gettext "A specified key could not be exported from the keyring.")"
+ exit 1
+ fi
+}
+
+finger_keys() {
+ check_keyids_exist
+ if ! "${GPG_PACMAN[@]}" --batch --fingerprint "$@" ; then
+ error "$(gettext "The fingerprint of a specified key could not be determined.")"
+ exit 1
+ fi
+}
+
+import_trustdb() {
+ local importdir
+ local ret=0
+ for importdir in "$@"; do
+ if [[ -f "${importdir}/trustdb.gpg" ]]; then
+ /bin/gpg --homedir "${importdir}" --export-ownertrust | \
+ "${GPG_PACMAN[@]}" --import-ownertrust -
+ if (( PIPESTATUS )); then
+ error "$(gettext "%s could not be imported.")" "${importdir}/trustdb.gpg"
+ ret=1
+ fi
+ else
+ error "$(gettext "File %s does not exist and could not be imported.")" "${importdir}/trustdb.gpg"
+ ret=1
+ fi
+ done
+ if (( ret )); then
+ exit 1
+ fi
+}
+
+import() {
+ local importdir
+ local ret=0
+ for importdir in "$@"; do
+ if [[ -f "${importdir}/pubring.gpg" ]]; then
+ if ! "${GPG_PACMAN[@]}" --quiet --batch --import "${importdir}/pubring.gpg" ; then
+ error "$(gettext "%s could not be imported.")" "${importdir}/pubring.gpg"
+ ret=1
+ fi
+ else
+ error "$(gettext "File %s does not exist and could not be imported.")" "${importdir}/pubring.gpg"
+ ret=1
+ fi
+ done
+ if (( ret )); then
+ exit 1
+ fi
+}
+
+list_keys() {
+ check_keyids_exist
+ if ! "${GPG_PACMAN[@]}" --batch --list-keys "$@" ; then
+ error "$(gettext "A specified key could not be listed.")"
+ exit 1
+ fi
+}
+
+list_sigs() {
+ check_keyids_exist
+ if ! "${GPG_PACMAN[@]}" --batch --list-sigs "$@" ; then
+ error "$(gettext "A specified signature could not be listed.")"
+ exit 1
+ fi
+}
+
+lsign_keys() {
+ check_keyids_exist
+
+ local ret=0
+ for key_id in "$@"; do
+ msg2 "$(gettext "Locally signing key %s...")" "${key_id}"
+ # we cannot use --yes here as gpg would still ask for confirmation if a key has more than one uid
+ printf 'y\ny\n' | LANG=C "${GPG_PACMAN[@]}" --command-fd 0 --quiet --batch --lsign-key "${key_id}" 2>/dev/null
+ if (( PIPESTATUS[1] )); then
+ error "$(gettext "%s could not be locally signed.")" "${key_id}"
+ ret=1
+ fi
+ done
+
+ if (( ret )); then
+ exit 1
+ fi
+}
+
+receive_keys() {
+ local name id keyids
+
+ # if the key is not a hex ID, do a lookup
+ for name; do
+ if [[ $name = ?(0x)+([0-9a-fA-F]) ]]; then
+ keyids+=("$name")
+ else
+ if id=$(key_lookup_from_name "$name"); then
+ keyids+=("$id")
+ fi
+ fi
+ done
+
+ (( ${#keyids[*]} > 0 )) || exit 1
+
+ if ! "${GPG_PACMAN[@]}" --recv-keys "${keyids[@]}" ; then
+ error "$(gettext "Remote key not fetched correctly from keyserver.")"
+ exit 1
+ fi
+}
+
+refresh_keys() {
+ check_keyids_exist "$@"
+ if ! "${GPG_PACMAN[@]}" --refresh-keys "$@" ; then
+ error "$(gettext "A specified local key could not be updated from a keyserver.")"
+ exit 1
+ fi
+}
+
+verify_sig() {
+ local ret=0
+ for sig; do
+ msg "Checking %s..." "$sig"
+ if ! "${GPG_PACMAN[@]}" --status-fd 1 --verify "$sig" | grep -qE '^\[GNUPG:\] TRUST_(FULLY|ULTIMATE)$'; then
+ error "$(gettext "The signature identified by %s could not be verified.")" "$sig"
+ ret=1
+ fi
+ done
+ exit $ret
+}
+
+updatedb() {
+ msg "$(gettext "Updating trust database...")"
+ if ! "${GPG_PACMAN[@]}" --batch --check-trustdb ; then
+ error "$(gettext "Trust database could not be updated.")"
+ exit 1
+ fi
+}
+
+# determine whether we have gettext; make it a no-op if we do not
+if ! type -p gettext >/dev/null; then
+ gettext() {
+ printf "%s\n" "$@"
+ }
+else
+ gettext() {
+ /usr/bin/gettext "$@"
+ }
+fi
+
+OPT_SHORT="adefhlruvV"
+OPT_LONG=('add' 'config:' 'delete' 'edit-key' 'export' 'finger' 'gpgdir:'
+ 'help' 'import' 'import-trustdb' 'init' 'keyserver:' 'list-keys' 'list-sigs'
+ 'lsign-key' 'nocolor' 'populate' 'recv-keys' 'refresh-keys' 'updatedb'
+ 'verify' 'version')
+if ! parseopts "$OPT_SHORT" "${OPT_LONG[@]}" -- "$@"; then
+ exit 1 # E_INVALID_OPTION;
+fi
+set -- "${OPTRET[@]}"
+unset OPT_SHORT OPT_LONG OPTRET
+
+if [[ $1 == "--" ]]; then
+ usage;
+ exit 0;
+fi
+
+while (( $# )); do
+ case $1 in
+ -a|--add) ADD=1 UPDATEDB=1 ;;
+ --config) shift; CONFIG=$1 ;;
+ -d|--delete) DELETE=1 UPDATEDB=1 ;;
+ --edit-key) EDITKEY=1 UPDATEDB=1 ;;
+ -e|--export) EXPORT=1 ;;
+ -f|--finger) FINGER=1 ;;
+ --gpgdir) shift; PACMAN_KEYRING_DIR=$1 ;;
+ --import) IMPORT=1 UPDATEDB=1 ;;
+ --import-trustdb) IMPORT_TRUSTDB=1 UPDATEDB=1 ;;
+ --init) INIT=1 ;;
+ --keyserver) shift; KEYSERVER=$1 ;;
+ -l|--list-keys) LISTKEYS=1 ;;
+ --list-sigs) LISTSIGS=1 ;;
+ --lsign-key) LSIGNKEY=1 UPDATEDB=1 ;;
+ --nocolor) USE_COLOR='n';;
+ --populate) POPULATE=1 UPDATEDB=1 ;;
+ -r|--recv-keys) RECEIVE=1 UPDATEDB=1 ;;
+ --refresh-keys) REFRESH=1 ;;
+ -u|--updatedb) UPDATEDB=1 ;;
+ -v|--verify) VERIFY=1 ;;
+
+ -h|--help) usage; exit 0 ;;
+ -V|--version) version; exit 0 ;;
+
+ --) shift; break 2 ;;
+ esac
+ shift
+done
+
+# check if messages are to be printed using color
+unset ALL_OFF BOLD BLUE GREEN RED YELLOW
+if [[ -t 2 && ! $USE_COLOR = "n" ]]; then
+ # prefer terminal safe colored and bold text when tput is supported
+ if tput setaf 0 &>/dev/null; then
+ ALL_OFF="$(tput sgr0)"
+ BOLD="$(tput bold)"
+ BLUE="${BOLD}$(tput setaf 4)"
+ GREEN="${BOLD}$(tput setaf 2)"
+ RED="${BOLD}$(tput setaf 1)"
+ YELLOW="${BOLD}$(tput setaf 3)"
+ else
+ ALL_OFF="\e[1;0m"
+ BOLD="\e[1;1m"
+ BLUE="${BOLD}\e[1;34m"
+ GREEN="${BOLD}\e[1;32m"
+ RED="${BOLD}\e[1;31m"
+ YELLOW="${BOLD}\e[1;33m"
+ fi
+fi
+readonly ALL_OFF BOLD BLUE GREEN RED YELLOW
+
+
+if ! type -p gpg >/dev/null; then
+ error "$(gettext "Cannot find the %s binary required for all %s operations.")" "gpg" "pacman-key"
+ exit 1
+fi
+
+CONFIG=${CONFIG:-/etc/pacman.conf}
+if [[ ! -r "${CONFIG}" ]]; then
+ error "$(gettext "%s configuration file '%s' not found.")" "pacman" "$CONFIG"
+ exit 1
+fi
+
+# if PACMAN_KEYRING_DIR isn't assigned, try to get it from the config
+# file, falling back on a hard default
+PACMAN_KEYRING_DIR=${PACMAN_KEYRING_DIR:-$(get_from "$CONFIG" "GPGDir" "/etc/pacman.d/gnupg")}
+
+GPG_PACMAN=(gpg --homedir "${PACMAN_KEYRING_DIR}" --no-permission-warning)
+if [[ -n ${KEYSERVER} ]]; then
+ GPG_PACMAN+=(--keyserver "${KEYSERVER}")
+fi
+
+# check only a single operation has been given
+# don't include UPDATEDB in here as other opts can induce it
+numopt=$(( ADD + DELETE + EDITKEY + EXPORT + FINGER + IMPORT + IMPORT_TRUSTDB +
+ INIT + LISTKEYS + LISTSIGS + LSIGNKEY + POPULATE + RECEIVE + REFRESH + VERIFY ))
+
+case $numopt in
+ 0)
+ if (( ! UPDATEDB )); then
+ error "$(gettext "no operation specified (use -h for help)")"
+ exit 1
+ fi
+ ;;
+ [!1])
+ error "$(gettext "Multiple operations specified.")"
+ msg "$(gettext "Please run %s with each operation separately.")" "pacman-key"
+ exit 1
+ ;;
+esac
+
+# check for targets where needed
+if (( (ADD || DELETE || EDIT || IMPORT || IMPORT_TRUSTDB ||
+ LSIGNKEY || RECEIVE || VERIFY) && $# == 0 )); then
+ error "$(gettext "No targets specified")"
+ exit 1
+fi
+
+(( ! INIT )) && check_keyring
+
+(( ADD )) && add_keys "$@"
+(( DELETE )) && delete_keys "$@"
+(( EDITKEY )) && edit_keys "$@"
+(( EXPORT )) && export_keys "$@"
+(( FINGER )) && finger_keys "$@"
+(( IMPORT )) && import "$@"
+(( IMPORT_TRUSTDB)) && import_trustdb "$@"
+(( INIT )) && initialize
+(( LISTKEYS )) && list_keys "$@"
+(( LISTSIGS )) && list_sigs "$@"
+(( LSIGNKEY )) && lsign_keys "$@"
+(( POPULATE )) && populate_keyring "$@"
+(( RECEIVE )) && receive_keys "$@"
+(( REFRESH )) && refresh_keys "$@"
+(( VERIFY )) && verify_sig "$@"
+
+(( UPDATEDB )) && updatedb
+
+exit 0
+
+# vim: set noet:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/convey.yml Sun Nov 18 23:52:58 2018 -0600
@@ -0,0 +1,17 @@
+tasks:
+ import:
+ type: docker/import
+ files: .:.
+ build:
+ type: docker/build
+ tag: msys2-cross:${HG_COMMIT_SHORT}
+ dockerfile: Dockerfile
+ files: .:.
+
+plans:
+ default:
+ stages:
+ - tasks:
+ - import
+ - build
+
Binary file etc/.pacman.conf.swp has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/etc/pacman.conf Sun Nov 18 23:52:58 2018 -0600
@@ -0,0 +1,86 @@
+#
+# /etc/pacman.conf
+#
+# See the pacman.conf(5) manpage for option and repository directives
+
+#
+# GENERAL OPTIONS
+#
+[options]
+# The following paths are commented out with their default values listed.
+# If you wish to use different paths, uncomment and update the paths.
+#RootDir = /
+#DBPath = /var/lib/pacman/
+#CacheDir = /var/cache/pacman/pkg/
+#LogFile = /var/log/pacman.log
+#GPGDir = /etc/pacman.d/gnupg/
+HoldPkg = pacman
+#XferCommand = /usr/bin/curl -C - -f %u > %o
+#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
+#CleanMethod = KeepInstalled
+#UseDelta = 0.7
+Architecture = auto
+
+# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
+#IgnorePkg =
+#IgnoreGroup =
+
+#NoUpgrade =
+#NoExtract =
+
+# Misc options
+#UseSyslog
+#Color
+#TotalDownload
+CheckSpace
+#VerbosePkgLists
+
+# By default, pacman accepts packages signed by keys that its local keyring
+# trusts (see pacman-key and its man page), as well as unsigned packages.
+#SigLevel = Never
+SigLevel = Required DatabaseOptional
+LocalFileSigLevel = Optional
+#RemoteFileSigLevel = Required
+
+# NOTE: You must run `pacman-key --init` before first using pacman; the local
+# keyring can then be populated with the keys of all official Arch Linux
+# packagers with `pacman-key --populate archlinux`.
+
+#
+# REPOSITORIES
+# - can be defined here or included from another file
+# - pacman will search repositories in the order defined here
+# - local/custom mirrors can be added here or in separate files
+# - repositories listed first will take precedence when packages
+# have identical names, regardless of version number
+# - URLs will have $repo replaced by the name of the current repo
+# - URLs will have $arch replaced by the name of the architecture
+#
+# Repository entries are of the format:
+# [repo-name]
+# Server = ServerName
+# Include = IncludePath
+#
+# The header [repo-name] is crucial - it must be present and
+# uncommented to enable the repo.
+#
+
+# The testing repositories are disabled by default. To enable, uncomment the
+# repo name header and Include lines. You can add preferred servers immediately
+# after the header, and they will be used before the default mirrors.
+
+[mingw32]
+Include = etc/pacman.d/mirrorlist.mingw32
+
+[mingw64]
+Include = etc/pacman.d/mirrorlist.mingw64
+
+[msys]
+Include = etc/pacman.d/mirrorlist.msys
+
+# An example of a custom package repository. See the pacman manpage for
+# tips on creating your own repositories.
+#[custom]
+#SigLevel = Optional TrustAll
+#Server = file:///home/custompkgs
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/etc/pacman.d/mirrorlist.mingw32 Sun Nov 18 23:52:58 2018 -0600
@@ -0,0 +1,10 @@
+##
+## 32-bit Mingw-w64 repository mirrorlist
+##
+
+## Primary
+## msys2.org
+Server = http://repo.msys2.org/mingw/i686
+Server = https://downloads.sourceforge.net/project/msys2/REPOS/MINGW/i686
+Server = http://www2.futureware.at/~nickoe/msys2-mirror/mingw/i686
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/etc/pacman.d/mirrorlist.mingw64 Sun Nov 18 23:52:58 2018 -0600
@@ -0,0 +1,10 @@
+##
+## 64-bit Mingw-w64 repository mirrorlist
+##
+
+## Primary
+## msys2.org
+Server = http://repo.msys2.org/mingw/x86_64
+Server = https://downloads.sourceforge.net/project/msys2/REPOS/MINGW/x86_64
+Server = http://www2.futureware.at/~nickoe/msys2-mirror/mingw/x86_64
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/etc/pacman.d/mirrorlist.msys Sun Nov 18 23:52:58 2018 -0600
@@ -0,0 +1,10 @@
+##
+## MSYS2 repository mirrorlist
+##
+
+## Primary
+## msys2.org
+Server = http://repo.msys2.org/msys/$arch
+Server = https://downloads.sourceforge.net/project/msys2/REPOS/MSYS2/$arch
+Server = http://www2.futureware.at/~nickoe/msys2-mirror/msys/$arch/
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/keyrings/msys2-trusted Sun Nov 18 23:52:58 2018 -0600
@@ -0,0 +1,4 @@
+D55E7A6D7CE9BA1587C0ACACF40D263ECA25678A:4:
+123D4D51A1793859C2BE916BBBE514E53E0D0813:4:
+B91BCF3303284BF90CC043CA9F418C233E652008:4:
+9DD0D4217D75A33B896159E6DA7EF2ABAEEA755C:4:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/keyrings/msys2.gpg Sun Nov 18 23:52:58 2018 -0600
@@ -0,0 +1,391 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQENBFQoKq4BCADQZfHzaUekzY+SH8glL5U1F7cBtaHYG3V7T64MZYvftvZsii++
+YbrYe2D9voGVJXiAtC0QSWiVlD7UTgvYfUk4HckweWg9bofhcXlRv+ob7un14yJh
+OrA6m3GfJybLeb6hIYWtQfCWJweajvhT30/TpPQFq+Qap4KGXl4qUsgCZwHTj0UC
+NSYjP1uXXS+gW0hBg10z1+L9egs6LCaLhmvvT6rf/AT2ybxK5NdO2mC1l9mtvNI7
+LpK+NCbX+fAB3UaPVkU0dM19ATDUaNw+m/GPwDoA42wmIQ29e+uhNkfgEcS4jsw9
+OOtpszc2EswR97+UsdacerXCePDl0sQhShaLABEBAAG0MUFsZXhleSBQYXZsb3Yg
+KEFsZXhwdXgpIDxhbGV4ZXkucGF3bG93QGdtYWlsLmNvbT6JATgEEwECACIFAlQo
+Kq4CGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEPQNJj7KJWeK2KoH/3A4
+Xz4HiKW6VtYkcF3Qce/Jnd9JOJ7EdGDIV0BrU+WNLN9Oj48RebEHZAtzoKHQyChC
+hXvB+Cu97HN2k6noetDfgsGJPia6qRdcFPHQDNZaoXNNGaltbpZvWhqPX5pA6qpP
+KiQGuvYe7K8A6ZSPP7WZNd0fVPGAei+pnSseq/MHn7F1cnt0SPDgt1OBY+wk/W5e
+NDAWTiok5Ci6vRkapemOAWYaVJJgXXqt50qI0DoPrG4gLIr1wu3N6gUVJS9J7NI2
+oK7V7rpW1RHULCpLwAO9/joviksJtjl0RARrfkUf1TvSt70Ngru+rADum208om0b
+chyGtQgWjGV2Mq57yrm5AQ0EVCgqrgEIAMTwg2GGDonwSmGS65C3fDjfFCT8WJrl
+W3AALM/r2nU40xOAQtZJy9D0mgh55TDfQG+Ea3Ed4Crz2IU7uuTop/nXcCD9Q6Du
+bP9X7ORZyMfUzqll1xt3Md2kLLN2hR6Y6C2VIP3KBoTkJf6/uAqSY3N2lVbJxOZY
+IWJ2qNNQLP6G0h5jq8KNlf4hC8Cou8r+Ti0OqW9pHV2RN1RseR46Rcc0oHZibyM/
+btKk/NiXeWvNRnUpUDOHu1padUgtt1xjh7Wj2tpHRjKgUQ9fXAwPRgHV3+v+iy4W
+3oP6xa38d1lQCRA0o6/mDmStNSyaE5tyEjZiESAbvVzRjUN+fBfRqnMAEQEAAYkB
+HwQYAQIACQUCVCgqrgIbDAAKCRD0DSY+yiVnimY+CAC1dISoXon2GpLGrKTnXh09
+bwlOMgHrNEIwtr+gWBIUhKwb1XbAoRlUhVE+q7QLtczTYTCW66I03PWTOFtOE1ux
+b5C6g0PUcYESm8FYwjy+TzZqjRAoxlzXNcTdB/gxUHtfSNHxUB5KIQ6H8ktJdswr
+sbfj3hJGHdAncehbDeQDxQJ/1JbBOHvn+65seHaNFF2f5zk8A3hLy/QwM0B8GsHf
+jP5S4nFFvY6+mnqWikEnkfPlLz6MPNuFPdRkObkUQW/LTWZ9OZHFa/vA0sN/Z2+s
+kdNhcQxf/fin/1UNxIzszXFwxzTiCRwprT0Y9mv+yQtY9C8obuEi1qSkCnvPitYr
+=VZan
+-----END PGP PUBLIC KEY BLOCK-----
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+80lA8d5ulMjn2/Dfqm7dE2k=
+=tgA3
+-----END PGP PUBLIC KEY BLOCK-----
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+=KiJc
+-----END PGP PUBLIC KEY BLOCK-----
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQENBFQpJ+YBCADHeKfwHoIX/C2glZvsHabl7lK/mcFMAI62WMHRGZ16oNEZp3Zy
+8W3iE+stzlsTPOkqn4mJyBANp6Rl+HSIrzW09RMpeehN3ZVN37Fhti/S2pDDVPz/
+Jf43ewENHceBXNuBT5lex0zvp8VFdCZ3DNOTEDnMzxONb49m4kkD77qW3w+OG1v2
+Kwb9CTEWTZU9FDuJLmVxG5Avsejtz/E3dx/76l0mInbT8UNtUxOXIulgq75CDOeK
+06PjJElMtlm0NVnpLwlUIkdgaOAMl57wlxMVSm83k35iDaRIlUdxLuUXO80x/ahB
+R7IO0Uxi7wvWwOANwidmaPircIWYaHW+nzoPABEBAAG0L0lnbmFjaW8gQ2FzYWwg
+UXVpbnRlaXJvIDxpY3F1aW50ZWlyb0BnbWFpbC5jb20+iQE5BBMBAgAjBQJUKSfm
+AhsDBwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQn0GMIz5lIAjMtgf+Jakx
+HKuZ5u8SB4V26mg9StIFCk0IF3SsHxRAaxZEI7Efwc4WcSOjMBEGgl2JbgkjFBJp
+U9Iftjk7kUWa6jkDfFoRzhgGIBkRpASnsQlEPZ4BmVHdIl8b1GxLP3ycOSRB2+n8
+GVd67S6T0ETz8KWfte21LI/8sdHPQYPSQPSaGo/UpOHcAhAzrQmjJlpuxQ8n2M1z
+JUPbJeMX3cYNfTNwkxx47A4+BB2/Rj9VAIGXvcTOcgE6W9GCNrbteaAybZS0mOJT
++hmDXplXIPtDbdB9A3pkBHPuFLi4mCX5YfauRuw7tm+0Q/CugSViGO0gmpA2M0IF
+e+g8RndPdNkBc7muULkBDQRUKSfmAQgAq3OhtswS9z/UnZBYLOhlaiXV5H+fU6Zp
+fTlvqBvJWdqPVeOmvaQGgTwt62W2IHdrD/dLKU9KaWzJeQbqZntUfX3HWC1IyJ0Z
+85GL/c22MHVPceJ3J+X1dydT/E0h90Mg5sOS5fzcFLoG0wSEEQYHwkU9N6Jc2j3C
+3Kf/9iQZ0dh7FD/03IwzSS8rcJV+5BwzbnEYry7fyKtdgMPESNBsMQryX2iDteu0
+eXhHbRXAnWaa+asmpkjgaFQDTALdUQU2jJbak8BhaQt2GasY26eChK6vs8aNf3J6
+KLlgGS2Rl+bIpIsA/rhSgu42gdfNv/OtQKbHoZ05cA2tl0f659uWYQARAQABiQEf
+BBgBAgAJBQJUKSfmAhsMAAoJEJ9BjCM+ZSAI6YsH/ROBsjIcIx2iXhX5OU7hn5LH
+bxS4NQHS/SWihFxSy8ecGoWcggDqA2Vc7Q9hQOobHif9zlUUCNzafbDWQEG//Q1o
+whQlk2xZZS3CT/uE9/Zi5DEB1ERthDsLG1jo5HvdqrYKoNuNb7j1+8aGH7qwRaoS
+tAe9rt4fnRLKTt4akOq1H9LguDKQNBrJgzs0Bvks538qC5HNfQFMNEHUc5O0Nf2W
+ZQRmEnPgrNpLHkfoPRXpS0012JYt961gn1hkXh5Oj7yuL5JXf0obaLZTHdPJzhoP
+Z6gC2OYoZee3WFTHVjK5K3WUPbV7P0KPF6c13yBMoJK0x+WzgahOq3Ll+zN0Rf0=
+=J+My
+-----END PGP PUBLIC KEY BLOCK-----
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+mn750AYbuSF0
+=1D2J
+-----END PGP PUBLIC KEY BLOCK-----
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+NaHfG1TX
+=gaU3
+-----END PGP PUBLIC KEY BLOCK-----
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+=/tUl
+-----END PGP PUBLIC KEY BLOCK-----
Binary file sync/mingw32.db has changed
Binary file sync/mingw32.db.sig has changed
Binary file sync/mingw64.db has changed
Binary file sync/mingw64.db.sig has changed
Binary file sync/msys.db has changed
Binary file sync/msys.db.sig has changed