feat(Anaconda): Local Repo
This commit is contained in:
@@ -0,0 +1,898 @@
|
||||
format = 2
|
||||
pkgname = python-meh
|
||||
pkgbase = python-meh
|
||||
pkgver = 0.43-1
|
||||
pkgarch = any
|
||||
pkgbuild_sha256sum = 207bd70c0f151083b8194b40534aeed665c9af48e588230ad370757eb4368229
|
||||
packager = Unknown Packager
|
||||
builddate = 1781307281
|
||||
builddir = /home/nocode/Files/FWS-ISO/pkgbuilds/python-meh
|
||||
startdir = /home/nocode/Files/FWS-ISO/pkgbuilds/python-meh
|
||||
buildtool = makepkg
|
||||
buildtoolver = 7.1.0
|
||||
buildenv = !distcc
|
||||
buildenv = color
|
||||
buildenv = !ccache
|
||||
buildenv = check
|
||||
buildenv = !sign
|
||||
options = strip
|
||||
options = docs
|
||||
options = !libtool
|
||||
options = !staticlibs
|
||||
options = emptydirs
|
||||
options = zipman
|
||||
options = purge
|
||||
options = debug
|
||||
options = lto
|
||||
installed = aardvark-dns-1.17.1-1-x86_64
|
||||
installed = abseil-cpp-20260107.1-1-x86_64
|
||||
installed = accountsservice-26.13.3-1-x86_64
|
||||
installed = acl-2.3.2-2-x86_64
|
||||
installed = adwaita-cursors-50.0-1-any
|
||||
installed = adwaita-fonts-50.0-1-any
|
||||
installed = adwaita-icon-theme-50.0-1-any
|
||||
installed = adwaita-icon-theme-legacy-46.2-3-any
|
||||
installed = alsa-card-profiles-1:1.6.6-1-x86_64
|
||||
installed = alsa-lib-1.2.16-1-x86_64
|
||||
installed = alsa-plugins-1:1.2.12-5-x86_64
|
||||
installed = alsa-topology-conf-1.2.5.1-4-any
|
||||
installed = alsa-ucm-conf-1.2.16-2-any
|
||||
installed = aom-3.14.1-1-x86_64
|
||||
installed = appstream-1.1.2-1-x86_64
|
||||
installed = aquamarine-0.12.1-1-x86_64
|
||||
installed = arch-install-scripts-31-1-any
|
||||
installed = archiso-88-1-any
|
||||
installed = archlinux-keyring-20260420-1-any
|
||||
installed = argon2-20190702-6-x86_64
|
||||
installed = at-spi2-core-2.60.4-1-x86_64
|
||||
installed = atkmm-2.28.5-2-x86_64
|
||||
installed = attr-2.5.2-2-x86_64
|
||||
installed = audit-4.1.4-2-x86_64
|
||||
installed = autoconf-2.73-1-any
|
||||
installed = automake-1.18.1-1-any
|
||||
installed = avahi-1:0.9rc4-1-x86_64
|
||||
installed = base-3-3-any
|
||||
installed = base-devel-1-2-any
|
||||
installed = bash-5.3.15-1-x86_64
|
||||
installed = bemoji-0.4.0-1-any
|
||||
installed = binutils-2.46+r70+g155188ea10a7-1-x86_64
|
||||
installed = bison-3.8.2-8-x86_64
|
||||
installed = blas-3.12.1-2-x86_64
|
||||
installed = bluez-libs-5.86-6-x86_64
|
||||
installed = boost-libs-1.91.0-1-x86_64
|
||||
installed = brightnessctl-0.5.1-3-x86_64
|
||||
installed = brotli-1.2.0-1-x86_64
|
||||
installed = bubblewrap-0.11.2-1-x86_64
|
||||
installed = bzip2-1.0.8-6-x86_64
|
||||
installed = c-ares-1.34.6-1-x86_64
|
||||
installed = ca-certificates-20240618-1-any
|
||||
installed = ca-certificates-mozilla-3.124-1-x86_64
|
||||
installed = ca-certificates-utils-20240618-1-any
|
||||
installed = cabextract-1.11-2-x86_64
|
||||
installed = cairo-1.18.4-1-x86_64
|
||||
installed = cairomm-1.14.6-1-x86_64
|
||||
installed = cairomm-1.16-1.18.1-1-x86_64
|
||||
installed = catatonit-0.2.1-2-x86_64
|
||||
installed = cblas-3.12.1-2-x86_64
|
||||
installed = cliphist-1:0.7.0-2-x86_64
|
||||
installed = clucene-2.3.3.4-17-x86_64
|
||||
installed = cmake-4.3.3-1-x86_64
|
||||
installed = compiler-rt-22.1.6-1-x86_64
|
||||
installed = composefs-1.0.8-1-x86_64
|
||||
installed = conmon-1:2.2.1-1-x86_64
|
||||
installed = containers-common-1:0.67.1-3-any
|
||||
installed = coreutils-9.11-1-x86_64
|
||||
installed = cpio-2.15-3-x86_64
|
||||
installed = cppdap-1.58.0-3-x86_64
|
||||
installed = cracklib-2.10.3-1-x86_64
|
||||
installed = criu-4.2-3-x86_64
|
||||
installed = crun-1.28-1-x86_64
|
||||
installed = cryptsetup-2.8.6-1-x86_64
|
||||
installed = curl-8.20.0-7-x86_64
|
||||
installed = dav1d-1.5.3-1-x86_64
|
||||
installed = db5.3-5.3.28-7-x86_64
|
||||
installed = dbus-1.16.2-1-x86_64
|
||||
installed = dbus-broker-37-3-x86_64
|
||||
installed = dbus-broker-units-37-3-x86_64
|
||||
installed = dbus-units-37-3-x86_64
|
||||
installed = dconf-0.49.0-1-x86_64
|
||||
installed = debugedit-5.3-1-x86_64
|
||||
installed = default-cursors-3-1-any
|
||||
installed = desktop-file-utils-0.28-1-x86_64
|
||||
installed = device-mapper-2.03.41-1-x86_64
|
||||
installed = diffutils-3.12-2-x86_64
|
||||
installed = discord-1:1.0.142-1-x86_64
|
||||
installed = dkms-3.4.1-1-any
|
||||
installed = dos2unix-7.5.6-1-x86_64
|
||||
installed = dosfstools-4.2-5-x86_64
|
||||
installed = double-conversion-3.4.0-1-x86_64
|
||||
installed = duktape-2.7.0-7-x86_64
|
||||
installed = e2fsprogs-1.47.4-1-x86_64
|
||||
installed = efibootmgr-18-4-x86_64
|
||||
installed = efivar-39-2-x86_64
|
||||
installed = egl-gbm-1.1.3-1-x86_64
|
||||
installed = egl-wayland-4:1.1.21-1-x86_64
|
||||
installed = egl-wayland2-1.0.1-1-x86_64
|
||||
installed = egl-x11-1.0.5-1-x86_64
|
||||
installed = eglexternalplatform-1.2.1-1-any
|
||||
installed = electron41-41.7.2-1-x86_64
|
||||
installed = elfutils-0.195-1-x86_64
|
||||
installed = erofs-utils-1.9.1-1-x86_64
|
||||
installed = exo-4.20.0-2-x86_64
|
||||
installed = expat-2.8.1-1-x86_64
|
||||
installed = extra-cmake-modules-6.26.0-1-any
|
||||
installed = fakeroot-1:1.37.2-1-x86_64
|
||||
installed = fcft-3.3.3-1-x86_64
|
||||
installed = ffmpeg-2:8.1.1-2-x86_64
|
||||
installed = fftw-3.3.11-1-x86_64
|
||||
installed = file-5.48-1-x86_64
|
||||
installed = filesystem-2025.10.12-1-any
|
||||
installed = findutils-4.10.0-3-x86_64
|
||||
installed = firefox-151.0.4-1-x86_64
|
||||
installed = flac-1.5.0-1-x86_64
|
||||
installed = flatpak-1:1.18.0-1-x86_64
|
||||
installed = flex-2.6.4-6-x86_64
|
||||
installed = fmt-12.1.0-2-x86_64
|
||||
installed = fontconfig-2:2.18.1-1-x86_64
|
||||
installed = freerdp-2:3.26.0-1-x86_64
|
||||
installed = freetype2-2.14.3-1-x86_64
|
||||
installed = fribidi-1.0.16-2-x86_64
|
||||
installed = fuse-common-3.18.2-1-x86_64
|
||||
installed = fuse2-2.9.9-5-x86_64
|
||||
installed = fuse3-3.18.2-1-x86_64
|
||||
installed = fuzzel-1.14.1-1-x86_64
|
||||
installed = gawk-5.4.0-1-x86_64
|
||||
installed = gc-8.2.12-1-x86_64
|
||||
installed = gcc-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
||||
installed = gcc-libs-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
||||
installed = gcr-3.41.2-2-x86_64
|
||||
installed = gcr-4-4.4.0.1-1-x86_64
|
||||
installed = gdb-17.2-1-x86_64
|
||||
installed = gdb-common-17.2-1-x86_64
|
||||
installed = gdbm-1.26-2-x86_64
|
||||
installed = gdk-pixbuf2-2.44.6-2-x86_64
|
||||
installed = gettext-1.0-2-x86_64
|
||||
installed = giflib-6.1.3-1-x86_64
|
||||
installed = git-2.54.0-1-x86_64
|
||||
installed = glib-networking-1:2.80.1-1-x86_64
|
||||
installed = glib2-2.88.1-1-x86_64
|
||||
installed = glibc-2.43+r22+g8362e8ce10b2-2-x86_64
|
||||
installed = glibmm-2.66.8-2-x86_64
|
||||
installed = glibmm-2.68-2.88.0-2-x86_64
|
||||
installed = glslang-1:1.4.350.0-1-x86_64
|
||||
installed = glycin-2.1.1-1-x86_64
|
||||
installed = gmp-6.3.0-3-x86_64
|
||||
installed = gnome-themes-extra-1:3.28-1-any
|
||||
installed = gnulib-l10n-20241231-1-any
|
||||
installed = gnupg-2.4.9-1-x86_64
|
||||
installed = gnutls-3.8.13-2-x86_64
|
||||
installed = go-2:1.26.4-1-x86_64
|
||||
installed = gobject-introspection-1.86.0-2-x86_64
|
||||
installed = gobject-introspection-runtime-1.86.0-2-x86_64
|
||||
installed = gparted-1.8.1-2-x86_64
|
||||
installed = gperftools-2.18.1-1-x86_64
|
||||
installed = gpgme-2.1.0-1-x86_64
|
||||
installed = gpgmepp-2.1.0-1-x86_64
|
||||
installed = gpm-1.20.7.r38.ge82d1a6-6-x86_64
|
||||
installed = gpsd-3.27.5-1-x86_64
|
||||
installed = gptfdisk-1.0.10-2-x86_64
|
||||
installed = graphene-1.10.8-2-x86_64
|
||||
installed = graphite-1:1.3.15-1-x86_64
|
||||
installed = grep-3.12-2-x86_64
|
||||
installed = grim-1.5.0-2-x86_64
|
||||
installed = groff-1.24.1-1-x86_64
|
||||
installed = grub-2:2.14-1-x86_64
|
||||
installed = gsettings-desktop-schemas-50.1-1-any
|
||||
installed = gsettings-system-schemas-50.1-1-any
|
||||
installed = gsm-1.0.24-1-x86_64
|
||||
installed = gssdp-1.6.5-1-x86_64
|
||||
installed = gst-plugins-bad-libs-1.28.3-1-x86_64
|
||||
installed = gst-plugins-base-libs-1.28.3-1-x86_64
|
||||
installed = gstreamer-1.28.3-1-x86_64
|
||||
installed = gtest-1.17.0-2-x86_64
|
||||
installed = gtk-layer-shell-0.10.1-1-x86_64
|
||||
installed = gtk-update-icon-cache-1:4.22.4-1-x86_64
|
||||
installed = gtk3-1:3.24.52-1-x86_64
|
||||
installed = gtk4-1:4.22.4-1-x86_64
|
||||
installed = gtkmm-4.0-4.22.0-2-x86_64
|
||||
installed = gtkmm3-3.24.11-1-x86_64
|
||||
installed = guile-3.0.11-1-x86_64
|
||||
installed = gupnp-1:1.6.10-1-x86_64
|
||||
installed = gupnp-igd-1.6.0-2-x86_64
|
||||
installed = gzip-1.14-2-x86_64
|
||||
installed = harfbuzz-14.2.1-1-x86_64
|
||||
installed = harfbuzz-icu-14.2.1-1-x86_64
|
||||
installed = hicolor-icon-theme-0.18-1-any
|
||||
installed = hidapi-0.15.0-1-x86_64
|
||||
installed = highway-1.4.0-1-x86_64
|
||||
installed = hunspell-1.7.3-1-x86_64
|
||||
installed = hwdata-0.408-1-any
|
||||
installed = hwloc-2.13.0-1-x86_64
|
||||
installed = hyphen-2.8.9-1-x86_64
|
||||
installed = hyprcursor-0.1.13-6-x86_64
|
||||
installed = hyprgraphics-0.5.1-2-x86_64
|
||||
installed = hypridle-0.1.7-9-x86_64
|
||||
installed = hyprland-0.55.4-1-x86_64
|
||||
installed = hyprland-guiutils-0.2.1-6-x86_64
|
||||
installed = hyprland-qt-support-0.1.0-12-x86_64
|
||||
installed = hyprlang-0.6.8-4-x86_64
|
||||
installed = hyprlock-0.9.5-4-x86_64
|
||||
installed = hyprpaper-0.8.4-2-x86_64
|
||||
installed = hyprpicker-0.4.7-1-x86_64
|
||||
installed = hyprpolkitagent-0.1.3-7-x86_64
|
||||
installed = hyprshot-1.3.0-4-any
|
||||
installed = hyprtoolkit-0.5.4-2-x86_64
|
||||
installed = hyprutils-0.13.1-1-x86_64
|
||||
installed = hyprwayland-scanner-0.4.6-1-x86_64
|
||||
installed = hyprwire-0.3.1-2-x86_64
|
||||
installed = iana-etc-20260530-1-any
|
||||
installed = icu-78.3-1-x86_64
|
||||
installed = imagemagick-7.1.2.25-1-x86_64
|
||||
installed = iniparser-4.2.6-2-x86_64
|
||||
installed = iproute2-7.0.0-1-x86_64
|
||||
installed = iptables-1:1.8.13-1-x86_64
|
||||
installed = iputils-20250605-1-x86_64
|
||||
installed = iso-codes-4.20.1-1-any
|
||||
installed = jack2-1.9.22-2-x86_64
|
||||
installed = jansson-2.15.0-1-x86_64
|
||||
installed = jbigkit-2.1-8-x86_64
|
||||
installed = jq-1.8.1-3-x86_64
|
||||
installed = json-c-0.18-2-x86_64
|
||||
installed = json-glib-1.10.8-1-x86_64
|
||||
installed = jsoncpp-1.9.6-3-x86_64
|
||||
installed = kbd-2.10.0-1-x86_64
|
||||
installed = kcoreaddons-6.26.0-1-x86_64
|
||||
installed = keyutils-1.6.3-4-x86_64
|
||||
installed = ki18n-6.26.0-1-x86_64
|
||||
installed = kitty-0.47.1-1-x86_64
|
||||
installed = kitty-shell-integration-0.47.1-1-x86_64
|
||||
installed = kitty-terminfo-0.47.1-1-x86_64
|
||||
installed = kmod-34.2-1-x86_64
|
||||
installed = kpmcore-26.04.2-1-x86_64
|
||||
installed = krb5-1.22.2-1-x86_64
|
||||
installed = kwidgetsaddons-6.26.0-1-x86_64
|
||||
installed = l-smash-2.14.5-4-x86_64
|
||||
installed = lame-3.101.r6531-1-x86_64
|
||||
installed = lapack-3.12.1-2-x86_64
|
||||
installed = lcms2-2.19.1-1-x86_64
|
||||
installed = leancrypto-1.7.2-1-x86_64
|
||||
installed = lib32-alsa-lib-1.2.16-1-x86_64
|
||||
installed = lib32-alsa-plugins-1.2.12-1-x86_64
|
||||
installed = lib32-brotli-1.1.0-1-x86_64
|
||||
installed = lib32-bzip2-1.0.8-4-x86_64
|
||||
installed = lib32-curl-8.20.0-7-x86_64
|
||||
installed = lib32-dbus-1.16.2-1-x86_64
|
||||
installed = lib32-e2fsprogs-1.47.4-1-x86_64
|
||||
installed = lib32-expat-2.8.1-1-x86_64
|
||||
installed = lib32-fontconfig-2:2.18.1-1-x86_64
|
||||
installed = lib32-freetype2-2.14.3-1-x86_64
|
||||
installed = lib32-gcc-libs-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
||||
installed = lib32-glib2-2.88.1-1-x86_64
|
||||
installed = lib32-glibc-2.43+r22+g8362e8ce10b2-2-x86_64
|
||||
installed = lib32-gmp-6.3.0-2-x86_64
|
||||
installed = lib32-gnutls-3.8.13-3-x86_64
|
||||
installed = lib32-icu-78.3-1-x86_64
|
||||
installed = lib32-json-c-0.18-2-x86_64
|
||||
installed = lib32-keyutils-1.6.3-4-x86_64
|
||||
installed = lib32-krb5-1.22.2-1-x86_64
|
||||
installed = lib32-libdrm-2.4.134-1-x86_64
|
||||
installed = lib32-libelf-0.195-1-x86_64
|
||||
installed = lib32-libffi-3.5.2-1-x86_64
|
||||
installed = lib32-libgcrypt-1.12.2-1-x86_64
|
||||
installed = lib32-libglvnd-1.7.0-1-x86_64
|
||||
installed = lib32-libgpg-error-1.61-1-x86_64
|
||||
installed = lib32-libidn2-2.3.8-1-x86_64
|
||||
installed = lib32-libldap-2.6.13-1-x86_64
|
||||
installed = lib32-libnghttp2-1.69.0-1-x86_64
|
||||
installed = lib32-libnghttp3-1.16.0-1-x86_64
|
||||
installed = lib32-libngtcp2-1.23.0-1-x86_64
|
||||
installed = lib32-libnm-1.56.1-1-x86_64
|
||||
installed = lib32-libpciaccess-0.19-1-x86_64
|
||||
installed = lib32-libpipewire-1:1.6.6-1-x86_64
|
||||
installed = lib32-libpng-1.6.58-1-x86_64
|
||||
installed = lib32-libpsl-0.21.5-1-x86_64
|
||||
installed = lib32-libssh2-1.11.1-1-x86_64
|
||||
installed = lib32-libtasn1-4.21.0-1-x86_64
|
||||
installed = lib32-libunistring-1.4.2-1-x86_64
|
||||
installed = lib32-libva-2.22.0-1-x86_64
|
||||
installed = lib32-libx11-1.8.13-1-x86_64
|
||||
installed = lib32-libxau-1.0.12-1-x86_64
|
||||
installed = lib32-libxcb-1.17.0-1-x86_64
|
||||
installed = lib32-libxcrypt-4.5.2-1-x86_64
|
||||
installed = lib32-libxcrypt-compat-4.5.2-1-x86_64
|
||||
installed = lib32-libxdmcp-1.1.5-1-x86_64
|
||||
installed = lib32-libxext-1.3.7-1-x86_64
|
||||
installed = lib32-libxfixes-6.0.1-2-x86_64
|
||||
installed = lib32-libxinerama-1.1.6-1-x86_64
|
||||
installed = lib32-libxml2-2.15.3-1-x86_64
|
||||
installed = lib32-libxshmfence-1.3.3-1-x86_64
|
||||
installed = lib32-libxss-1.2.5-1-x86_64
|
||||
installed = lib32-libxxf86vm-1.1.5-2-x86_64
|
||||
installed = lib32-llvm-libs-1:22.1.6-1-x86_64
|
||||
installed = lib32-lm_sensors-1:3.6.2-2-x86_64
|
||||
installed = lib32-mesa-1:26.1.2-1-x86_64
|
||||
installed = lib32-ncurses-6.6-2-x86_64
|
||||
installed = lib32-nettle-4.0-2-x86_64
|
||||
installed = lib32-nspr-4.39-1-x86_64
|
||||
installed = lib32-nss-3.124-1-x86_64
|
||||
installed = lib32-nvidia-utils-610.43.02-1-x86_64
|
||||
installed = lib32-openssl-1:3.6.3-1-x86_64
|
||||
installed = lib32-p11-kit-0.26.2-1-x86_64
|
||||
installed = lib32-pcre2-10.47-1-x86_64
|
||||
installed = lib32-pipewire-1:1.6.6-1-x86_64
|
||||
installed = lib32-spirv-tools-1:1.4.350.0-1-x86_64
|
||||
installed = lib32-sqlite-3.53.2-1-x86_64
|
||||
installed = lib32-systemd-260.2-1-x86_64
|
||||
installed = lib32-util-linux-2.42.1-1-x86_64
|
||||
installed = lib32-vulkan-icd-loader-1.4.350.0-1-x86_64
|
||||
installed = lib32-wayland-1.25.0-1-x86_64
|
||||
installed = lib32-xz-5.8.3-1-x86_64
|
||||
installed = lib32-zlib-1.3.2-1-x86_64
|
||||
installed = lib32-zstd-1.5.7-2-x86_64
|
||||
installed = libabw-0.1.4-1-x86_64
|
||||
installed = libadwaita-1:1.9.1-1-x86_64
|
||||
installed = libaio-0.3.113-4-x86_64
|
||||
installed = libappindicator-12.10.1-1-x86_64
|
||||
installed = libarchive-3.8.7-1-x86_64
|
||||
installed = libasan-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
||||
installed = libass-0.17.4-2-x86_64
|
||||
installed = libassuan-3.0.0-1-x86_64
|
||||
installed = libasyncns-1:0.8+r3+g68cd5af-3-x86_64
|
||||
installed = libatomic-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
||||
installed = libatomic_ops-7.8.2-2-x86_64
|
||||
installed = libavc1394-0.5.4-7-x86_64
|
||||
installed = libavif-1.4.2-1-x86_64
|
||||
installed = libb2-0.98.1-3-x86_64
|
||||
installed = libblake3-1.8.4-1-x86_64
|
||||
installed = libbluray-1.4.1-1-x86_64
|
||||
installed = libbpf-1.7.0-1-x86_64
|
||||
installed = libbs2b-3.1.0-10-x86_64
|
||||
installed = libbsd-0.12.2-2-x86_64
|
||||
installed = libburn-1.5.8-1-x86_64
|
||||
installed = libcanberra-1:0.30+r2+gc0620e4-6-x86_64
|
||||
installed = libcap-2.78-1-x86_64
|
||||
installed = libcap-ng-0.9.3-1-x86_64
|
||||
installed = libcbor-0.14.0-1-x86_64
|
||||
installed = libcdio-2.3.0-1-x86_64
|
||||
installed = libcdio-paranoia-10.2+2.0.2-2-x86_64
|
||||
installed = libcdr-0.1.9-1-x86_64
|
||||
installed = libcloudproviders-0.4.0-1-x86_64
|
||||
installed = libcmis-0.6.3-1-x86_64
|
||||
installed = libcolord-1.4.8-1-x86_64
|
||||
installed = libcups-2:2.4.19-1-x86_64
|
||||
installed = libdaemon-0.14-6-x86_64
|
||||
installed = libdatrie-0.2.14-1-x86_64
|
||||
installed = libdbusmenu-glib-18.10.20180917-1-x86_64
|
||||
installed = libdbusmenu-gtk3-18.10.20180917-1-x86_64
|
||||
installed = libdecor-0.2.5-1-x86_64
|
||||
installed = libdeflate-1.25-1-x86_64
|
||||
installed = libdisplay-info-0.3.0-1-x86_64
|
||||
installed = libdovi-3.3.2-1-x86_64
|
||||
installed = libdrm-2.4.134-1-x86_64
|
||||
installed = libdvdnav-7.0.0-1-x86_64
|
||||
installed = libdvdread-7.0.1-1-x86_64
|
||||
installed = libe-book-0.1.3-20-x86_64
|
||||
installed = libebur128-1.2.6-2-x86_64
|
||||
installed = libedit-20260512_3.1-1-x86_64
|
||||
installed = libei-1.6.0-1-x86_64
|
||||
installed = libelf-0.195-1-x86_64
|
||||
installed = libepoxy-1.5.10-3-x86_64
|
||||
installed = libepubgen-0.1.1-6-x86_64
|
||||
installed = libetonyek-0.1.13-2-x86_64
|
||||
installed = libevdev-1.13.6-1-x86_64
|
||||
installed = libevent-2.1.12-5-x86_64
|
||||
installed = libexif-0.6.26-1-x86_64
|
||||
installed = libexttextcat-3.4.8-1-x86_64
|
||||
installed = libfdk-aac-2.0.3-2-x86_64
|
||||
installed = libffi-3.5.2-1-x86_64
|
||||
installed = libfido2-1.17.0-1-x86_64
|
||||
installed = libfontenc-1.1.9-1-x86_64
|
||||
installed = libfreeaptx-0.2.2-1-x86_64
|
||||
installed = libfreehand-0.1.3-1-x86_64
|
||||
installed = libfyaml-0.9.6-2-x86_64
|
||||
installed = libgcc-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
||||
installed = libgcrypt-1.12.2-1-x86_64
|
||||
installed = libgfortran-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
||||
installed = libgirepository-1.86.0-2-x86_64
|
||||
installed = libgit2-1:1.9.4-1-x86_64
|
||||
installed = libglvnd-1.7.0-3-x86_64
|
||||
installed = libgomp-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
||||
installed = libgpg-error-1.61-1-x86_64
|
||||
installed = libgtop-2.41.3-2-x86_64
|
||||
installed = libgudev-238-3-x86_64
|
||||
installed = libice-1.1.2-1-x86_64
|
||||
installed = libidn2-2.3.8-1-x86_64
|
||||
installed = libiec61883-1.2.0-9-x86_64
|
||||
installed = libimobiledevice-1.4.0-2-x86_64
|
||||
installed = libimobiledevice-glue-1.3.2-1-x86_64
|
||||
installed = libinih-62-2-x86_64
|
||||
installed = libinput-1.31.3-1-x86_64
|
||||
installed = libisl-0.27-1-x86_64
|
||||
installed = libisoburn-1.5.8.2-1-x86_64
|
||||
installed = libisofs-1.5.8.2-1-x86_64
|
||||
installed = libixion-0.20.0-7-x86_64
|
||||
installed = libjpeg-turbo-3.1.4.1-1-x86_64
|
||||
installed = libjxl-0.11.2-2-x86_64
|
||||
installed = libksba-1.8.0-1-x86_64
|
||||
installed = liblangtag-0.6.8-1-x86_64
|
||||
installed = liblc3-1.1.3-2-x86_64
|
||||
installed = libldac-2.0.2.3-3-x86_64
|
||||
installed = libldap-2.6.13-1-x86_64
|
||||
installed = liblqr-0.4.3-1-x86_64
|
||||
installed = liblsan-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
||||
installed = libmakepkg-dropins-20-1-any
|
||||
installed = libmalcontent-0.14.0-4-x86_64
|
||||
installed = libmd-1.2.0-1-x86_64
|
||||
installed = libmm-glib-1.24.2-1-x86_64
|
||||
installed = libmnl-1.0.5-2-x86_64
|
||||
installed = libmodplug-0.8.9.0-7-x86_64
|
||||
installed = libmpc-1.4.1-1-x86_64
|
||||
installed = libmpdclient-2.23-1-x86_64
|
||||
installed = libmspub-0.1.5-1-x86_64
|
||||
installed = libmwaw-0.3.22-4-x86_64
|
||||
installed = libmysofa-1.3.4-1-x86_64
|
||||
installed = libndp-1.9-1-x86_64
|
||||
installed = libnet-2:1.3-2-x86_64
|
||||
installed = libnetfilter_conntrack-1.1.1-1-x86_64
|
||||
installed = libnewt-0.52.25-2-x86_64
|
||||
installed = libnfnetlink-1.0.2-2-x86_64
|
||||
installed = libnftnl-1.3.1-1-x86_64
|
||||
installed = libnghttp2-1.69.0-1-x86_64
|
||||
installed = libnghttp3-1.16.0-1-x86_64
|
||||
installed = libngtcp2-1.23.0-1-x86_64
|
||||
installed = libnice-0.1.23-1-x86_64
|
||||
installed = libnl-3.12.0-1-x86_64
|
||||
installed = libnm-1.56.1-1-x86_64
|
||||
installed = libnma-1.10.6-3-x86_64
|
||||
installed = libnma-common-1.10.6-3-x86_64
|
||||
installed = libnotify-0.8.8-1-x86_64
|
||||
installed = libnsl-2.0.1-2-x86_64
|
||||
installed = libnumbertext-1.0.11-3-x86_64
|
||||
installed = libobjc-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
||||
installed = libodfgen-0.1.8-5-x86_64
|
||||
installed = libogg-1.3.6-1-x86_64
|
||||
installed = libopenmpt-0.8.7-1-x86_64
|
||||
installed = libopenrazer-0.4.0-1-x86_64
|
||||
installed = liborcus-0.21.0-6-x86_64
|
||||
installed = libp11-kit-0.26.2-1-x86_64
|
||||
installed = libpagemaker-0.0.4-5-x86_64
|
||||
installed = libpcap-1.10.6-1-x86_64
|
||||
installed = libpciaccess-0.19-1-x86_64
|
||||
installed = libpgm-5.3.128-4-x86_64
|
||||
installed = libpipewire-1:1.6.6-1-x86_64
|
||||
installed = libplacebo-7.360.1-2-x86_64
|
||||
installed = libplist-2.7.0-3-x86_64
|
||||
installed = libpng-1.6.58-1-x86_64
|
||||
installed = libproxy-0.5.12-1-x86_64
|
||||
installed = libpsl-0.21.5-2-x86_64
|
||||
installed = libpulse-17.0+r98+gb096704c0-1-x86_64
|
||||
installed = libpwquality-1.4.5-7-x86_64
|
||||
installed = libquadmath-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
||||
installed = libqxp-0.0.3-1-x86_64
|
||||
installed = libraqm-0.10.5-1-x86_64
|
||||
installed = libraw1394-2.1.2-4-x86_64
|
||||
installed = libreoffice-fresh-26.2.4-1-x86_64
|
||||
installed = librevenge-0.0.5-4-x86_64
|
||||
installed = librsvg-2:2.62.3-1-x86_64
|
||||
installed = librsync-1:2.3.4-2-x86_64
|
||||
installed = libsamplerate-0.2.2-3-x86_64
|
||||
installed = libsasl-2.1.28-5-x86_64
|
||||
installed = libseccomp-2.6.0-1-x86_64
|
||||
installed = libsecret-0.21.7-1-x86_64
|
||||
installed = libsigc++-2.12.2-1-x86_64
|
||||
installed = libsigc++-3.0-3.8.1-1-x86_64
|
||||
installed = libsixel-1.10.5-1-x86_64
|
||||
installed = libsm-1.2.6-1-x86_64
|
||||
installed = libsndfile-1.2.2-4-x86_64
|
||||
installed = libsodium-1.0.22-1-x86_64
|
||||
installed = libsoup3-3.6.6-2-x86_64
|
||||
installed = libsoxr-0.1.3-4-x86_64
|
||||
installed = libssh-0.12.0-1-x86_64
|
||||
installed = libssh2-1.11.1-1-x86_64
|
||||
installed = libstaroffice-0.0.7-5-x86_64
|
||||
installed = libstdc++-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
||||
installed = libstemmer-3.1.1-1-x86_64
|
||||
installed = libsysprof-capture-50.0-2-x86_64
|
||||
installed = libtasn1-4.21.0-1-x86_64
|
||||
installed = libtatsu-1.0.5-1-x86_64
|
||||
installed = libteam-1.32-3-x86_64
|
||||
installed = libthai-0.1.30-1-x86_64
|
||||
installed = libtheora-1.2.0-1-x86_64
|
||||
installed = libtiff-4.7.1-2-x86_64
|
||||
installed = libtirpc-1.3.7-1-x86_64
|
||||
installed = libtommath-1.3.0-2-x86_64
|
||||
installed = libtool-2.6.1-1-x86_64
|
||||
installed = libtsan-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
||||
installed = libubsan-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
||||
installed = libunibreak-7.0-1-x86_64
|
||||
installed = libunistring-1.4.2-1-x86_64
|
||||
installed = libunwind-1.8.2-1-x86_64
|
||||
installed = liburing-2.14-1-x86_64
|
||||
installed = libusb-1.0.30-1-x86_64
|
||||
installed = libusbmuxd-2.1.1-2-x86_64
|
||||
installed = libutf8proc-2.11.3-1-x86_64
|
||||
installed = libuv-1.52.1-1-x86_64
|
||||
installed = libva-2.23.0-1-x86_64
|
||||
installed = libva-nvidia-driver-0.0.17-1-x86_64
|
||||
installed = libvdpau-1.5-4-x86_64
|
||||
installed = libverto-0.3.2-6-x86_64
|
||||
installed = libvisio-0.1.11-1-x86_64
|
||||
installed = libvorbis-1.3.7-4-x86_64
|
||||
installed = libvpl-2.16.0-2-x86_64
|
||||
installed = libvpx-1.16.0-3-x86_64
|
||||
installed = libwacom-2.19.0-1-x86_64
|
||||
installed = libwebp-1.6.0-2-x86_64
|
||||
installed = libwireplumber-0.5.14-1-x86_64
|
||||
installed = libwpd-0.10.3-6-x86_64
|
||||
installed = libwps-0.4.14-4-x86_64
|
||||
installed = libx11-1.8.13-1-x86_64
|
||||
installed = libxau-1.0.12-1-x86_64
|
||||
installed = libxcb-1.17.0-1-x86_64
|
||||
installed = libxcomposite-0.4.7-1-x86_64
|
||||
installed = libxcrypt-4.5.2-1-x86_64
|
||||
installed = libxcrypt-compat-4.5.2-1-x86_64
|
||||
installed = libxcursor-1.2.3-1-x86_64
|
||||
installed = libxcvt-0.1.3-1-x86_64
|
||||
installed = libxdamage-1.1.7-1-x86_64
|
||||
installed = libxdmcp-1.1.5-2-x86_64
|
||||
installed = libxext-1.3.7-1-x86_64
|
||||
installed = libxfce4ui-4.20.2-1-x86_64
|
||||
installed = libxfce4util-4.20.1-1-x86_64
|
||||
installed = libxfixes-6.0.2-1-x86_64
|
||||
installed = libxfont2-2.0.7-1-x86_64
|
||||
installed = libxft-2.3.9-1-x86_64
|
||||
installed = libxi-1.8.3-1-x86_64
|
||||
installed = libxinerama-1.1.6-1-x86_64
|
||||
installed = libxkbcommon-1.13.2-1-x86_64
|
||||
installed = libxkbcommon-x11-1.13.2-1-x86_64
|
||||
installed = libxkbfile-1.2.0-1-x86_64
|
||||
installed = libxml2-2.15.3-1-x86_64
|
||||
installed = libxml2-legacy-2.13.9-2-x86_64
|
||||
installed = libxmlb-0.3.27-1-x86_64
|
||||
installed = libxmp-4.7.0-1-x86_64
|
||||
installed = libxmu-1.3.1-1-x86_64
|
||||
installed = libxpresent-1.0.2-1-x86_64
|
||||
installed = libxrandr-1.5.5-1-x86_64
|
||||
installed = libxrender-0.9.12-1-x86_64
|
||||
installed = libxshmfence-1.3.3-1-x86_64
|
||||
installed = libxslt-1.1.45-2-x86_64
|
||||
installed = libxss-1.2.5-1-x86_64
|
||||
installed = libxt-1.3.1-1-x86_64
|
||||
installed = libxtst-1.2.5-1-x86_64
|
||||
installed = libxv-1.0.13-1-x86_64
|
||||
installed = libxxf86vm-1.1.7-1-x86_64
|
||||
installed = libyaml-0.2.5-3-x86_64
|
||||
installed = libyuv-r2426+464c51a03-1-x86_64
|
||||
installed = libzip-1.11.4-1-x86_64
|
||||
installed = libzmf-0.0.2-20-x86_64
|
||||
installed = licenses-20240728-1-any
|
||||
installed = lilv-0.26.4-1-x86_64
|
||||
installed = linux-7.0.11.arch1-1-x86_64
|
||||
installed = linux-api-headers-7.0-1-x86_64
|
||||
installed = linux-firmware-20260519-1-any
|
||||
installed = linux-firmware-amdgpu-20260519-1-any
|
||||
installed = linux-firmware-atheros-20260519-1-any
|
||||
installed = linux-firmware-broadcom-20260519-1-any
|
||||
installed = linux-firmware-cirrus-20260519-1-any
|
||||
installed = linux-firmware-intel-20260519-1-any
|
||||
installed = linux-firmware-mediatek-20260519-1-any
|
||||
installed = linux-firmware-nvidia-20260519-1-any
|
||||
installed = linux-firmware-other-20260519-1-any
|
||||
installed = linux-firmware-radeon-20260519-1-any
|
||||
installed = linux-firmware-realtek-20260519-1-any
|
||||
installed = linux-firmware-whence-20260519-1-any
|
||||
installed = linux-headers-7.0.11.arch1-1-x86_64
|
||||
installed = lld-22.1.6-1-x86_64
|
||||
installed = llhttp-9.3.1-1-x86_64
|
||||
installed = llvm-libs-22.1.6-1-x86_64
|
||||
installed = lm_sensors-1:3.6.2-1-x86_64
|
||||
installed = lmdb-0.9.35-1-x86_64
|
||||
installed = lpsolve-5.5.2.14-1-x86_64
|
||||
installed = lsb-release-2.0.r55.a25a4fc-1-any
|
||||
installed = lsof-4.99.6-1-x86_64
|
||||
installed = lua-5.5.0-2-x86_64
|
||||
installed = lua54-5.4.8-6-x86_64
|
||||
installed = luajit-2.1.1780076327+b925b3e-1-x86_64
|
||||
installed = lug-helper-1:4.13-1-any
|
||||
installed = lv2-1.18.10-2-x86_64
|
||||
installed = lz4-1:1.10.0-2-x86_64
|
||||
installed = lzo-2.10-5-x86_64
|
||||
installed = m4-1.4.21-2-x86_64
|
||||
installed = mailcap-2.1.54-2-any
|
||||
installed = make-4.4.1-3-x86_64
|
||||
installed = mako-1.11.0-1-x86_64
|
||||
installed = md4c-0.5.3-1-x86_64
|
||||
installed = mesa-1:26.1.2-1-x86_64
|
||||
installed = meson-1.11.1-3-any
|
||||
installed = mingw-w64-binutils-2.46.0-1-x86_64
|
||||
installed = mingw-w64-crt-14.0.0-1-any
|
||||
installed = mingw-w64-gcc-16.1.0-1-x86_64
|
||||
installed = mingw-w64-headers-14.0.0-1-any
|
||||
installed = mingw-w64-winpthreads-14.0.0-1-any
|
||||
installed = minizip-1:1.3.2-3-x86_64
|
||||
installed = mkinitcpio-41-4-any
|
||||
installed = mkinitcpio-busybox-1.36.1-1-x86_64
|
||||
installed = mobile-broadband-provider-info-20251101-1-any
|
||||
installed = mpdecimal-4.0.1-3-x86_64
|
||||
installed = mpfr-4.2.2-1-x86_64
|
||||
installed = mpg123-1.33.5-1-x86_64
|
||||
installed = mpv-1:0.41.0-3-x86_64
|
||||
installed = mpvpaper-1.8-1-x86_64
|
||||
installed = mtdev-1.1.7-1-x86_64
|
||||
installed = mtools-1:4.0.49-1-x86_64
|
||||
installed = mujs-1.3.9-1-x86_64
|
||||
installed = muparser-2.3.5-2-x86_64
|
||||
installed = nano-9.0-1-x86_64
|
||||
installed = ncurses-6.6-2-x86_64
|
||||
installed = neon-0.37.1-1-x86_64
|
||||
installed = netavark-1.17.2-2-x86_64
|
||||
installed = nettle-4.0-1-x86_64
|
||||
installed = network-manager-applet-1.36.0-2-x86_64
|
||||
installed = networkmanager-1.56.1-1-x86_64
|
||||
installed = nftables-1:1.1.6-3-x86_64
|
||||
installed = ninja-1.13.2-3-x86_64
|
||||
installed = nm-connection-editor-1.36.0-2-x86_64
|
||||
installed = noto-fonts-1:2026.06.01-1-any
|
||||
installed = noto-fonts-cjk-20240730-1-any
|
||||
installed = noto-fonts-emoji-1:2.051-1-any
|
||||
installed = noto-fonts-extra-1:2026.06.01-1-any
|
||||
installed = npth-1.8-1-x86_64
|
||||
installed = nspr-4.39-1-x86_64
|
||||
installed = nss-3.124-1-x86_64
|
||||
installed = nvidia-open-610.43.02-2-x86_64
|
||||
installed = nvidia-utils-610.43.02-2-x86_64
|
||||
installed = ocl-icd-2.3.4-1-x86_64
|
||||
installed = onetbb-2023.0.0-1-x86_64
|
||||
installed = oniguruma-6.9.10-1-x86_64
|
||||
installed = openal-1.25.2-1-x86_64
|
||||
installed = opencore-amr-0.1.6-2-x86_64
|
||||
installed = openjpeg2-2.5.4-1-x86_64
|
||||
installed = openrazer-daemon-3.12.2-2-any
|
||||
installed = openrazer-driver-dkms-3.12.2-2-any
|
||||
installed = openssh-10.3p1-1-x86_64
|
||||
installed = openssl-3.6.3-1-x86_64
|
||||
installed = opus-1.6.1-1-x86_64
|
||||
installed = opusfile-0.12-4-x86_64
|
||||
installed = orc-0.4.42-1-x86_64
|
||||
installed = os-prober-1.84-1-x86_64
|
||||
installed = ostree-2025.7-3-x86_64
|
||||
installed = p11-kit-0.26.2-1-x86_64
|
||||
installed = pacman-7.1.0.r9.g54d9411-2-x86_64
|
||||
installed = pacman-mirrorlist-20260610-1-any
|
||||
installed = pahole-1:1.31-2-x86_64
|
||||
installed = pam-1.7.2-2-x86_64
|
||||
installed = pambase-20250719-1-any
|
||||
installed = pango-1:1.57.1-1-x86_64
|
||||
installed = pangomm-2.46.4-3-x86_64
|
||||
installed = pangomm-2.48-2.56.1-2-x86_64
|
||||
installed = papirus-icon-theme-20250501-1-any
|
||||
installed = parted-3.7-1-x86_64
|
||||
installed = paru-2.1.0-2-x86_64
|
||||
installed = paru-debug-2.1.0-2-x86_64
|
||||
installed = passt-2026_05_26.038c51e-1-x86_64
|
||||
installed = patch-2.8-1-x86_64
|
||||
installed = pavucontrol-1:6.2-1-x86_64
|
||||
installed = pciutils-3.15.0-1-x86_64
|
||||
installed = pcre-8.45-4-x86_64
|
||||
installed = pcre2-10.47-1-x86_64
|
||||
installed = pcsclite-2.5.1-1-x86_64
|
||||
installed = perl-5.42.2-1-x86_64
|
||||
installed = perl-error-0.17030-3-any
|
||||
installed = perl-mailtools-2.22-3-any
|
||||
installed = perl-timedate-2.35-1-any
|
||||
installed = pinentry-1.3.2-2-x86_64
|
||||
installed = pipewire-1:1.6.6-1-x86_64
|
||||
installed = pipewire-audio-1:1.6.6-1-x86_64
|
||||
installed = pipewire-pulse-1:1.6.6-1-x86_64
|
||||
installed = pixman-0.46.4-1-x86_64
|
||||
installed = pkgconf-2.5.1-1-x86_64
|
||||
installed = playerctl-2.4.1-5-x86_64
|
||||
installed = podman-5.8.3-1-x86_64
|
||||
installed = podman-compose-1.6.0-1-any
|
||||
installed = podman-desktop-1.27.2-2-x86_64
|
||||
installed = polkit-127-3-x86_64
|
||||
installed = polkit-qt6-0.201.1-1-x86_64
|
||||
installed = poppler-26.05.0-1-x86_64
|
||||
installed = popt-1.19-2-x86_64
|
||||
installed = portaudio-1:19.7.0-4-x86_64
|
||||
installed = portmidi-1:2.0.8-1-x86_64
|
||||
installed = pps-tools-1.0.3-2-x86_64
|
||||
installed = procps-ng-4.0.6-1-x86_64
|
||||
installed = protobuf-35.0-1-x86_64
|
||||
installed = protobuf-c-1.5.2-10-x86_64
|
||||
installed = psmisc-23.7-2-x86_64
|
||||
installed = pugixml-1.15-3-x86_64
|
||||
installed = python-3.14.5-1-x86_64
|
||||
installed = python-attrs-26.1.0-1-any
|
||||
installed = python-autocommand-2.2.2-9-any
|
||||
installed = python-cffi-2.0.0-2-x86_64
|
||||
installed = python-click-8.3.3-1-any
|
||||
installed = python-cryptography-48.0.1-1-x86_64
|
||||
installed = python-daemonize-2.5.0-10-any
|
||||
installed = python-dbus-1.4.0-2-x86_64
|
||||
installed = python-dotenv-1.2.2-1-any
|
||||
installed = python-filelock-3.29.0-1-any
|
||||
installed = python-gobject-3.56.3-1-x86_64
|
||||
installed = python-jaraco.collections-5.1.0-3-any
|
||||
installed = python-jaraco.context-6.1.2-1-any
|
||||
installed = python-jaraco.functools-4.1.0-3-any
|
||||
installed = python-jaraco.text-4.0.0-4-any
|
||||
installed = python-mako-1.3.11-1-any
|
||||
installed = python-markdown-3.10.2-1-any
|
||||
installed = python-markupsafe-3.0.3-1-x86_64
|
||||
installed = python-more-itertools-11.1.0-1-any
|
||||
installed = python-numpy-2.4.6-1-x86_64
|
||||
installed = python-openrazer-3.12.2-2-any
|
||||
installed = python-packaging-26.2-1-any
|
||||
installed = python-pip-26.1.2-1-any
|
||||
installed = python-pkg_resources-81.0.0-1-any
|
||||
installed = python-platformdirs-4.10.0-1-any
|
||||
installed = python-protobuf-35.0-1-x86_64
|
||||
installed = python-pycparser-3.00-1-any
|
||||
installed = python-pygame-2.6.1-5-x86_64
|
||||
installed = python-pyudev-0.24.4-1-any
|
||||
installed = python-setproctitle-1.3.7-2-x86_64
|
||||
installed = python-setuptools-1:82.0.1-1-any
|
||||
installed = python-tqdm-4.68.1-1-any
|
||||
installed = python-typing_extensions-4.15.0-3-any
|
||||
installed = python-wheel-0.47.0-1-any
|
||||
installed = python-yaml-6.0.3-2-x86_64
|
||||
installed = qt5-base-5.15.19+kde+r96-1-x86_64
|
||||
installed = qt5-declarative-5.15.19+kde+r23-1-x86_64
|
||||
installed = qt5-graphicaleffects-5.15.19-1-x86_64
|
||||
installed = qt5-quickcontrols2-5.15.19+kde+r5-1-x86_64
|
||||
installed = qt5-svg-5.15.19+kde+r5-1-x86_64
|
||||
installed = qt5-translations-5.15.19-1-any
|
||||
installed = qt5-wayland-5.15.19+kde+r55-1-x86_64
|
||||
installed = qt6-5compat-6.11.1-1-x86_64
|
||||
installed = qt6-base-6.11.1-1-x86_64
|
||||
installed = qt6-declarative-6.11.1-3-x86_64
|
||||
installed = qt6-shadertools-6.11.1-1-x86_64
|
||||
installed = qt6-svg-6.11.1-1-x86_64
|
||||
installed = qt6-tools-6.11.1-1-x86_64
|
||||
installed = qt6-translations-6.11.1-1-any
|
||||
installed = qt6-wayland-6.11.1-1-x86_64
|
||||
installed = raptor-2.0.16-9-x86_64
|
||||
installed = rasqal-1:0.9.33-9-x86_64
|
||||
installed = rav1e-0.8.1-2-x86_64
|
||||
installed = razergenie-1.3.0-1-x86_64
|
||||
installed = re2-2:2025.11.05-4-x86_64
|
||||
installed = readline-8.3.003-1-x86_64
|
||||
installed = redland-1:1.0.17-10-x86_64
|
||||
installed = reflector-2023-5-any
|
||||
installed = resvg-0.47.0-2-x86_64
|
||||
installed = rhash-1.4.6-1-x86_64
|
||||
installed = rsync-3.4.4-1-x86_64
|
||||
installed = rtkit-0.14-1-x86_64
|
||||
installed = rubberband-4.0.0-2-x86_64
|
||||
installed = rustup-1.29.0-2-x86_64
|
||||
installed = sbc-2.2-1-x86_64
|
||||
installed = scdoc-1.11.4-1-x86_64
|
||||
installed = sdbus-cpp-2.3.1-1-x86_64
|
||||
installed = sddm-0.21.0-7-x86_64
|
||||
installed = sddm-catppuccin-git-r42.10831de-1-any
|
||||
installed = sdl2-compat-2.32.70-1-x86_64
|
||||
installed = sdl2_image-2.8.12-1-x86_64
|
||||
installed = sdl2_mixer-2.8.2-1-x86_64
|
||||
installed = sdl2_ttf-2.24.0-2-x86_64
|
||||
installed = sdl3-3.4.10-1-x86_64
|
||||
installed = sdl3_ttf-3.2.2-3-x86_64
|
||||
installed = seatd-0.9.3-1-x86_64
|
||||
installed = sed-4.10-1-x86_64
|
||||
installed = serd-0.32.10-1-x86_64
|
||||
installed = shaderc-2026.2-1-x86_64
|
||||
installed = shadow-4.18.0-1-x86_64
|
||||
installed = shared-mime-info-2.4-3-x86_64
|
||||
installed = slang-2.3.3-4-x86_64
|
||||
installed = slurp-1.5.0-2-x86_64
|
||||
installed = smartmontools-7.5-1-x86_64
|
||||
installed = snappy-1.2.2-3-x86_64
|
||||
installed = sndio-1.10.0-1-x86_64
|
||||
installed = sord-0.16.22-1-x86_64
|
||||
installed = sound-theme-freedesktop-0.8-6-any
|
||||
installed = source-highlight-3.1.9-18-x86_64
|
||||
installed = spandsp-0.0.6-7-x86_64
|
||||
installed = spdlog-1.17.0-2-x86_64
|
||||
installed = speex-1.2.1-2-x86_64
|
||||
installed = speexdsp-1.2.1-2-x86_64
|
||||
installed = spirv-tools-1:1.4.350.0-1-x86_64
|
||||
installed = sqlite-3.53.2-1-x86_64
|
||||
installed = squashfs-tools-4.7.5-1-x86_64
|
||||
installed = sratom-0.6.22-1-x86_64
|
||||
installed = srt-1.5.5-1-x86_64
|
||||
installed = startup-notification-0.12-9-x86_64
|
||||
installed = steam-1.0.0.85-7-x86_64
|
||||
installed = steam-devices-1.0.0.85-7-x86_64
|
||||
installed = sudo-1.9.17.p2-2-x86_64
|
||||
installed = svt-av1-4.1.0-1-x86_64
|
||||
installed = systemd-260.2-2-x86_64
|
||||
installed = systemd-libs-260.2-2-x86_64
|
||||
installed = systemd-sysvcompat-260.2-2-x86_64
|
||||
installed = tar-1.35-2-x86_64
|
||||
installed = tcl-8.6.16-1-x86_64
|
||||
installed = tdb-1.4.15-1-x86_64
|
||||
installed = texinfo-7.3-1-x86_64
|
||||
installed = thunar-4.20.8-3-x86_64
|
||||
installed = tinysparql-3.11.1-1-x86_64
|
||||
installed = tk-8.6.16-1-x86_64
|
||||
installed = tomlplusplus-3.4.0-2-x86_64
|
||||
installed = tpm2-tss-4.1.3-1-x86_64
|
||||
installed = tslib-1.24-1-x86_64
|
||||
installed = ttf-jetbrains-mono-nerd-3.4.0-2-any
|
||||
installed = tzdata-2026b-1-x86_64
|
||||
installed = uchardet-0.0.8-4-x86_64
|
||||
installed = uefitool-debug-1:0.28.0-3-x86_64
|
||||
installed = unzip-6.0-23-x86_64
|
||||
installed = upower-1.91.2-1-x86_64
|
||||
installed = usbutils-019-1-x86_64
|
||||
installed = util-linux-2.42.1-1-x86_64
|
||||
installed = util-linux-libs-2.42.1-1-x86_64
|
||||
installed = v4l-utils-1.32.0-2-x86_64
|
||||
installed = vapoursynth-76-1-x86_64
|
||||
installed = vid.stab-1.1.1-2-x86_64
|
||||
installed = vim-9.2.0623-1-x86_64
|
||||
installed = vim-runtime-9.2.0623-1-x86_64
|
||||
installed = vmaf-3.1.0-1-x86_64
|
||||
installed = vmware-keymaps-1.0-3-any
|
||||
installed = vmware-workstation-26H1-3-x86_64
|
||||
installed = vscodium-bin-1.121.03429-1-x86_64
|
||||
installed = vulkan-icd-loader-1.4.350.0-1-x86_64
|
||||
installed = vulkan-tools-1.4.350.0-1-x86_64
|
||||
installed = waybar-0.15.0-2-x86_64
|
||||
installed = wayland-1.25.0-1-x86_64
|
||||
installed = wayland-protocols-1.49-1-any
|
||||
installed = webrtc-audio-processing-1-1.3-5-x86_64
|
||||
installed = which-2.25-1-x86_64
|
||||
installed = winboat-bin-0.9.0-1-x86_64
|
||||
installed = wine-staging-11.10-1-x86_64
|
||||
installed = wireplumber-0.5.14-1-x86_64
|
||||
installed = wl-clipboard-1:2.3.0-1-x86_64
|
||||
installed = wlogout-1.2.2-0-x86_64
|
||||
installed = woff2-font-awesome-7.2.0-1-any
|
||||
installed = wpa_supplicant-2:2.11-5-x86_64
|
||||
installed = x264-3:0.165.r3222.b35605a-2-x86_64
|
||||
installed = x265-4.1-1-x86_64
|
||||
installed = xautomation-1.09-6-x86_64
|
||||
installed = xcb-proto-1.17.0-4-any
|
||||
installed = xcb-util-0.4.1-2-x86_64
|
||||
installed = xcb-util-cursor-0.1.6-1-x86_64
|
||||
installed = xcb-util-errors-1.0.1-2-x86_64
|
||||
installed = xcb-util-image-0.4.1-3-x86_64
|
||||
installed = xcb-util-keysyms-0.4.1-5-x86_64
|
||||
installed = xcb-util-renderutil-0.3.10-2-x86_64
|
||||
installed = xcb-util-wm-0.4.2-2-x86_64
|
||||
installed = xdg-dbus-proxy-0.1.7-1-x86_64
|
||||
installed = xdg-desktop-portal-1.22.0-1-x86_64
|
||||
installed = xdg-desktop-portal-gtk-1.15.3-1-x86_64
|
||||
installed = xdg-desktop-portal-hyprland-1.3.12-2-x86_64
|
||||
installed = xdg-user-dirs-0.20-1-x86_64
|
||||
installed = xdg-utils-1.2.1-2-any
|
||||
installed = xf86-input-libinput-1.5.0-1-x86_64
|
||||
installed = xfconf-4.20.0-2-x86_64
|
||||
installed = xkeyboard-config-2.47-1-any
|
||||
installed = xmlsec-1.3.11-1-x86_64
|
||||
installed = xorg-fonts-encodings-1.1.0-2-any
|
||||
installed = xorg-server-21.1.23-1-x86_64
|
||||
installed = xorg-server-common-21.1.23-1-x86_64
|
||||
installed = xorg-setxkbmap-1.3.5-1-x86_64
|
||||
installed = xorg-xauth-1.1.5-1-x86_64
|
||||
installed = xorg-xkbcomp-1.5.0-1-x86_64
|
||||
installed = xorg-xprop-1.2.8-1-x86_64
|
||||
installed = xorg-xrandr-1.5.4-1-x86_64
|
||||
installed = xorg-xwayland-24.1.12-1-x86_64
|
||||
installed = xorgproto-2025.1-1-any
|
||||
installed = xvidcore-1.3.7-3-x86_64
|
||||
installed = xxhash-0.8.3-1-x86_64
|
||||
installed = xz-5.8.3-1-x86_64
|
||||
installed = yaml-cpp-0.9.0-1-x86_64
|
||||
installed = yay-12.6.0-1-x86_64
|
||||
installed = yay-debug-12.6.0-1-x86_64
|
||||
installed = zenity-4.2.2-1-x86_64
|
||||
installed = zeromq-4.3.5-3-x86_64
|
||||
installed = zimg-3.0.6-1-x86_64
|
||||
installed = zint-2.16.0-2-x86_64
|
||||
installed = zix-0.8.0-1-x86_64
|
||||
installed = zlib-1:1.3.2-3-x86_64
|
||||
installed = zlib-ng-2.3.3-1-x86_64
|
||||
installed = zstd-1.5.7-3-x86_64
|
||||
installed = zxing-cpp-3.0.2-1-x86_64
|
||||
Binary file not shown.
@@ -0,0 +1,16 @@
|
||||
# Generated by makepkg 7.1.0
|
||||
# using fakeroot version 1.37.2
|
||||
pkgname = python-meh
|
||||
pkgbase = python-meh
|
||||
xdata = pkgtype=pkg
|
||||
pkgver = 0.43-1
|
||||
pkgdesc = Python exception handling library (dépendance Anaconda)
|
||||
url = https://github.com/rhinstaller/python-meh
|
||||
builddate = 1781307281
|
||||
packager = Unknown Packager
|
||||
size = 170289
|
||||
arch = any
|
||||
license = GPL-2.0-or-later
|
||||
depend = python
|
||||
depend = python-gobject
|
||||
depend = python-dbus
|
||||
@@ -0,0 +1,139 @@
|
||||
#
|
||||
# __init__.py - Basic stuff for exception handling
|
||||
#
|
||||
# Copyright (C) 2009 Red Hat, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# 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/>.
|
||||
#
|
||||
# Author(s): Chris Lumens <clumens@redhat.com>
|
||||
#
|
||||
|
||||
from collections import namedtuple
|
||||
|
||||
# These constants represent the return values of buttons on the initial
|
||||
# exception handling dialog - the dialog that first pops up when an
|
||||
# exception is hit.
|
||||
MAIN_RESPONSE_DEBUG = 0
|
||||
MAIN_RESPONSE_SAVE = 1
|
||||
MAIN_RESPONSE_QUIT = 2
|
||||
MAIN_RESPONSE_SHELL = 3
|
||||
MAIN_RESPONSE_NONE = 4
|
||||
|
||||
class ConfigError(Exception):
|
||||
"""Exception class for the configuration related errors."""
|
||||
|
||||
pass
|
||||
|
||||
class Config(object):
|
||||
"""Hold configuration info useful throughout the exception handling
|
||||
classes. This prevents having to pass a bunch of arguments to a
|
||||
bunch of different functions. A Config instance must be created
|
||||
before creating an ExceptionHandler instance.
|
||||
"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
"""Create a new Config instance. Arguments may be passed in to
|
||||
set any of the configuration values. Unknown arguments will
|
||||
be ignored. Instance attributes:
|
||||
|
||||
attrSkipList -- A list of strings. When handling a traceback,
|
||||
any attributes found with the same name as an
|
||||
element of this list will not be written to
|
||||
the dump. This is to prevent writing potentially
|
||||
sensitive information like passwords. The names
|
||||
must be given without the leading name of the
|
||||
object passed to handler.install(). For instance,
|
||||
if handler.install() gets an Anaconda instance
|
||||
with the name "anaconda" and you want to skip
|
||||
anaconda.id.rootPassword, "id.rootPassword" should
|
||||
be listed in attrSkipList.
|
||||
fileList -- A list of files to find on the system and add
|
||||
to the traceback dump.
|
||||
localSkipList -- A list of strings. When handling a traceback,
|
||||
any local variables found with their name containing
|
||||
an element of this list will not be written to
|
||||
the dump. This is subtely different from
|
||||
attrSkipList.
|
||||
callbackDict -- A dictionary having item names as keys and pairs
|
||||
(function, attchmnt_only) as values.
|
||||
@see register_callback
|
||||
programName -- The name of the erroring program.
|
||||
programVersion -- The version number of the erroring program.
|
||||
Both programName and programVersion are used
|
||||
throughout the exception handler, so must be
|
||||
set.
|
||||
programArch -- The architecture of the erroring program.
|
||||
"""
|
||||
self.attrSkipList = []
|
||||
self.fileList = []
|
||||
self.localSkipList = []
|
||||
self.callbackDict = dict()
|
||||
self.programName = None
|
||||
self.programVersion = None
|
||||
self.programArch = None
|
||||
|
||||
# Override the defaults set above with whatever's passed in as an
|
||||
# argument. Unknown arguments get thrown away.
|
||||
for (key, val) in kwargs.items():
|
||||
if key in self.__dict__:
|
||||
self.__dict__[key] = val
|
||||
|
||||
# Make sure required things are set.
|
||||
if not self.programName:
|
||||
raise ValueError("programName must be set.")
|
||||
|
||||
if not self.programVersion:
|
||||
raise ValueError("programVersion must be set.")
|
||||
|
||||
def register_callback(self, item_name, callback, attchmnt_only=False,
|
||||
override=False):
|
||||
"""
|
||||
Register new callback that will be called when data about the
|
||||
crash is collected. The returned value will be included as the
|
||||
'item_name' item.
|
||||
|
||||
:param item_name: name of the item storing the value returned by the
|
||||
'callback' function
|
||||
:type item_name: string
|
||||
:param callback: a function to be called
|
||||
:type callback: a function of type: () -> string
|
||||
:param attchmnt_only: whether the returned valued should be included only
|
||||
as an attachment or also in the main '*-tb' file
|
||||
(defaults to False)
|
||||
:type attchmnt_only: bool
|
||||
:param override: whether to override the previously registered callback
|
||||
with the same item name or not (may raise exception)
|
||||
:type override: bool
|
||||
|
||||
:raise ConfigError: if callback with the 'item_name' has already been
|
||||
registered and 'override' is not set to True
|
||||
:return: None
|
||||
|
||||
"""
|
||||
|
||||
if item_name not in self.callbackDict or override:
|
||||
self.callbackDict[item_name] = (callback, attchmnt_only)
|
||||
else:
|
||||
msg = "Callback with name '%s' already registered" % item_name
|
||||
raise ConfigError(msg)
|
||||
|
||||
# type, value and stack are items provided by Python for the exception handler
|
||||
ExceptionInfo = namedtuple("ExceptionInfo", ["type", "value", "stack"])
|
||||
|
||||
# ExceptionInfo instance plus the object that should be dumped
|
||||
DumpInfo = namedtuple("DumpInfo", ["exc_info", "object"])
|
||||
|
||||
# information about a package (as provided e.g. by rpm)
|
||||
PackageInfo = namedtuple("PackageInfo", ["name", "version", "release", "epoch",
|
||||
"arch"])
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -0,0 +1,551 @@
|
||||
#
|
||||
# dump.py - general exception formatting and saving
|
||||
#
|
||||
# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 Red Hat, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# 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/>.
|
||||
#
|
||||
# Author(s): Matt Wilson <msw@redhat.com>
|
||||
# Erik Troan <ewt@redhat.com>
|
||||
# Chris Lumens <clumens@redhat.com>
|
||||
#
|
||||
# pylint: disable=bare-except,broad-except
|
||||
|
||||
import copy
|
||||
import inspect
|
||||
import os
|
||||
import traceback
|
||||
import sys
|
||||
import codecs
|
||||
import six
|
||||
from meh import PackageInfo
|
||||
from meh.safe_string import SafeStr
|
||||
|
||||
# Python 2/3 compatibilty
|
||||
try:
|
||||
longtype = long # pylint: disable=undefined-variable
|
||||
except NameError:
|
||||
longtype = int
|
||||
|
||||
try:
|
||||
unitype = unicode # pylint: disable=undefined-variable
|
||||
except NameError:
|
||||
unitype = str
|
||||
|
||||
class ExceptionDump(object):
|
||||
"""This class represents a traceback and contains several useful methods
|
||||
for manipulating a traceback. In general, clients should not have to
|
||||
use this class. It is mainly for internal use.
|
||||
"""
|
||||
def __init__(self, exc_info, config_obj):
|
||||
"""Create a new ExceptionDump instance. Instance attributes:
|
||||
|
||||
:param exc_info: info about the exception provided by Python
|
||||
:type exc_info: an instance of the meh.ExceptionInfo class
|
||||
:param config_obj: configuration for python-meh
|
||||
:type config_obj: an instance of the meh.Config class
|
||||
"""
|
||||
|
||||
if inspect.istraceback(exc_info.stack):
|
||||
self.stack = inspect.getinnerframes(exc_info.stack)
|
||||
else:
|
||||
self.stack = exc_info.stack
|
||||
|
||||
self.conf = config_obj
|
||||
self.type = exc_info.type
|
||||
self.value = exc_info.value
|
||||
|
||||
self._dumpHash = {}
|
||||
|
||||
@property
|
||||
def desc(self):
|
||||
# The description is a single line of text that should be used anywhere
|
||||
# the bug needs to quickly be summarized. The most obvious example of
|
||||
# this is when saving to bugzilla. We can populate the UI with this
|
||||
# string so the user doesn't need to come up with one.
|
||||
if self.type and self.value:
|
||||
return traceback.format_exception_only(self.type, self.value)[0].strip()
|
||||
else:
|
||||
return ""
|
||||
|
||||
def _get_environment_info(self):
|
||||
"""
|
||||
Returns dictionary containing these items for a bugreport header
|
||||
|
||||
architecture
|
||||
cmdline
|
||||
component
|
||||
executable
|
||||
kernel
|
||||
package
|
||||
release
|
||||
other involved packages
|
||||
|
||||
:rtype: dict (string -> string)
|
||||
"""
|
||||
|
||||
RELEASE_NAME_FILE = "/etc/system-release"
|
||||
|
||||
class RPMinfoError(Exception):
|
||||
"""Exception for errors in rpm queries"""
|
||||
pass
|
||||
|
||||
def get_python_opts():
|
||||
"""
|
||||
Returns python's command line options
|
||||
|
||||
:return: list of python's command line options
|
||||
:rtype: list
|
||||
|
||||
"""
|
||||
|
||||
flags_to_opts = {
|
||||
"debug": "-d",
|
||||
"py3k_warning": "-3",
|
||||
"division_new": "-Qnew",
|
||||
"division_warning": "-Q",
|
||||
"inspect": "-i",
|
||||
"interactive": "-i",
|
||||
"optimize": "-O",
|
||||
"dont_write_bytecode": "-B",
|
||||
"no_user_site": "-s",
|
||||
"no_site": "-S",
|
||||
"ignore_environment": "-E",
|
||||
"tabcheck": "-t",
|
||||
"verbose": "-v",
|
||||
"unicode": "-u",
|
||||
"bytes_warning": "-b",
|
||||
"quiet": "-q",
|
||||
}
|
||||
|
||||
ret = set()
|
||||
for flag in flags_to_opts.keys():
|
||||
if getattr(sys.flags, flag, None):
|
||||
ret.add(flags_to_opts[flag])
|
||||
ret = list(ret)
|
||||
return ret
|
||||
|
||||
def get_package_and_component(file_=sys.argv[0]):
|
||||
"""
|
||||
Returns package and component names for file (by default for script itself).
|
||||
|
||||
:param file_: filename
|
||||
:type file_: string
|
||||
:return: tuple containing package info and component name for the file
|
||||
:rtype: (PackageInfo, str)
|
||||
:raise RPMinfoError: if package and component for the file cannot be found
|
||||
|
||||
"""
|
||||
|
||||
import rpm
|
||||
ts = rpm.TransactionSet()
|
||||
mi = ts.dbMatch("basenames", file_)
|
||||
try:
|
||||
header = next(mi)
|
||||
except StopIteration:
|
||||
raise RPMinfoError("Cannot get package and component for file "+
|
||||
"{0}".format(file_))
|
||||
pkg_info = PackageInfo(header["name"].decode("utf-8"), header["version"].decode("utf-8"),
|
||||
header["release"].decode("utf-8"),
|
||||
u"%d" % header["epoch"] if header["epoch"] else u"0",
|
||||
header["arch"].decode("utf-8"))
|
||||
|
||||
# cuts the name from the NVR format: foo-blah-2.8.8-2.fc17.src.rpm
|
||||
srpm_name = header["sourcerpm"].decode("utf-8")
|
||||
name_end = len(srpm_name)
|
||||
try:
|
||||
name_end = srpm_name.rindex('-')
|
||||
name_end = srpm_name[:name_end].rindex('-')
|
||||
except ValueError:
|
||||
# expected exception
|
||||
pass
|
||||
|
||||
component = srpm_name[:name_end]
|
||||
|
||||
return (pkg_info, component)
|
||||
|
||||
def get_release_version():
|
||||
"""Returns release version (according to RELEASE_NAME_FILE)"""
|
||||
try:
|
||||
with open(RELEASE_NAME_FILE, "r") as file_:
|
||||
return file_.readline().rstrip()
|
||||
except IOError:
|
||||
return "Cannot get release name."
|
||||
|
||||
def get_other_packages(self):
|
||||
"""
|
||||
Returns a set of additional packages whose files appear in
|
||||
traceback.
|
||||
|
||||
:rtype: set
|
||||
|
||||
"""
|
||||
packages = set()
|
||||
if not self.stack:
|
||||
return packages
|
||||
|
||||
for (_frame, fn, _lineno, _func, _ctx, _idx) in self.stack:
|
||||
try:
|
||||
pkg_info = get_package_and_component(fn)[0]
|
||||
package = "{0.name}-{0.version}-{0.release}.{0.arch}".format(
|
||||
pkg_info)
|
||||
packages.add(package)
|
||||
except RPMinfoError:
|
||||
continue
|
||||
|
||||
try:
|
||||
pkg_info = get_package_and_component()[0]
|
||||
package = "{0.name}-{0.version}-{0.release}.{0.arch}".format(
|
||||
pkg_info)
|
||||
packages.discard(package)
|
||||
except RPMinfoError:
|
||||
pass
|
||||
return packages
|
||||
|
||||
def get_environment_variables():
|
||||
"""
|
||||
Returns a list of strings containing defined environment
|
||||
variables and their values in the following format:
|
||||
|
||||
VARIABLE=VALUE
|
||||
|
||||
:rtype: list
|
||||
|
||||
"""
|
||||
|
||||
ret = list()
|
||||
for (key, value) in os.environ.items():
|
||||
ret.append("{0}={1}".format(key, value))
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
#--begining of the method _get_environment_info--
|
||||
try:
|
||||
pkg_info, component = get_package_and_component()
|
||||
except RPMinfoError:
|
||||
pkg_info = None
|
||||
component = None
|
||||
|
||||
other_packages = ", ".join(get_other_packages(self))
|
||||
|
||||
ret = dict()
|
||||
ret["architecture"] = os.uname()[4]
|
||||
ret["cmdline"] = "{0} {1} {2}".format(sys.executable,
|
||||
" ".join(get_python_opts()),
|
||||
" ".join(sys.argv))
|
||||
if component:
|
||||
ret["component"] = component
|
||||
ret["executable"] = sys.argv[0]
|
||||
ret["kernel"] = os.uname()[2]
|
||||
if pkg_info:
|
||||
ret["pkg_info"] = pkg_info
|
||||
ret["release"] = get_release_version()
|
||||
if other_packages:
|
||||
ret["other involved packages"] = other_packages
|
||||
ret["environ"] = "\n".join(get_environment_variables())
|
||||
|
||||
return ret
|
||||
|
||||
@property
|
||||
def environment_info(self):
|
||||
return self._get_environment_info()
|
||||
|
||||
def __str__(self):
|
||||
lst = self._format_stack()
|
||||
|
||||
lst.insert(0, "%s %s exception report\n" % (self.conf.programName, self.conf.programVersion))
|
||||
lst.insert(1, "Traceback (most recent call last):\n")
|
||||
|
||||
if self.type is not None and self.value is not None:
|
||||
lst.extend(traceback.format_exception_only(self.type, self.value))
|
||||
|
||||
return "".join(lst)
|
||||
|
||||
def _format_stack(self):
|
||||
if not self.stack:
|
||||
return []
|
||||
|
||||
frames = []
|
||||
for (_frame, fn, lineno, func, ctx, _idx) in self.stack:
|
||||
if isinstance(ctx, list):
|
||||
code = "".join(ctx)
|
||||
else:
|
||||
code = ctx
|
||||
|
||||
frames.append((fn, lineno, func, code))
|
||||
|
||||
return traceback.format_list(frames)
|
||||
|
||||
# Create a string representation of a class. This method will recursively
|
||||
# handle all attributes of the base given class.
|
||||
def _dumpClass(self, instance, level=0, parentkey="", skipList=None):
|
||||
# This is horribly cheesy, and bound to require maintainence in the
|
||||
# future. The problem is that anything subclassed from object fails
|
||||
# the types.InstanceType test we used to have which means those
|
||||
# objects never get dumped. However, most everything basic in
|
||||
# python is derived from object so we can't just check for the super
|
||||
# class. Any instances of the following types will just be printed
|
||||
# out, and everything else will be assumed to be something that
|
||||
# needs to be recursed on.
|
||||
def __isSimpleType(instance):
|
||||
return isinstance(instance, bool) or \
|
||||
isinstance(instance, complex) or \
|
||||
isinstance(instance, float) or \
|
||||
isinstance(instance, int) or \
|
||||
isinstance(instance, longtype) or \
|
||||
isinstance(instance, type(None)) or \
|
||||
isinstance(instance, bytes) or \
|
||||
isinstance(instance, str) or \
|
||||
isinstance(instance, unitype) or \
|
||||
not hasattr(instance, "__class__") or \
|
||||
not hasattr(instance, "__dict__")
|
||||
|
||||
ret = SafeStr()
|
||||
|
||||
if not skipList:
|
||||
skipList = []
|
||||
|
||||
# protect from loops
|
||||
try:
|
||||
# Store the id(), not the instance name to protect against
|
||||
# instances that cannot be hashed.
|
||||
if not id(instance) in self._dumpHash:
|
||||
self._dumpHash[id(instance)] = None
|
||||
else:
|
||||
ret += "Already dumped (%s instance)\n" % instance.__class__.__name__
|
||||
return ret
|
||||
except TypeError:
|
||||
ret += "Cannot dump object\n"
|
||||
return ret
|
||||
|
||||
if ("__str__" in instance.__class__.__dict__ or
|
||||
"__repr__" in instance.__class__.__dict__):
|
||||
try:
|
||||
ret += "%s\n" % (instance,)
|
||||
except:
|
||||
ret += "\n"
|
||||
|
||||
return ret
|
||||
|
||||
ret += "%s instance, containing members:\n" %\
|
||||
(instance.__class__.__name__)
|
||||
pad = ' ' * ((level) * 2)
|
||||
|
||||
for key, value in instance.__dict__.items():
|
||||
if key.startswith("_%s__" % instance.__class__.__name__):
|
||||
continue
|
||||
|
||||
if parentkey != "":
|
||||
curkey = parentkey + "." + key
|
||||
else:
|
||||
curkey = key
|
||||
|
||||
# Don't dump objects that are in our skip list, though ones that are
|
||||
# None are probably okay.
|
||||
if eval("instance.%s is not None" % key) and \
|
||||
eval("id(instance.%s)" % key) in skipList:
|
||||
ret += "%s%s: Skipped\n" % (pad, curkey)
|
||||
continue
|
||||
|
||||
if isinstance(value, list):
|
||||
ret += "%s%s: [" % (pad, curkey)
|
||||
first = 1
|
||||
for item in value:
|
||||
if not first:
|
||||
ret += ", "
|
||||
else:
|
||||
first = 0
|
||||
|
||||
if __isSimpleType(item):
|
||||
ret += "%s" % (item,)
|
||||
else:
|
||||
ret += self._dumpClass(item, level + 1, skipList=skipList)
|
||||
ret += "]\n"
|
||||
elif isinstance(value, dict):
|
||||
# append things one after another so that e.g. binary data is
|
||||
# replaced by hexa values separately
|
||||
ret += pad
|
||||
ret += curkey
|
||||
ret += ": {"
|
||||
first = 1
|
||||
for k, v in value.items():
|
||||
if not first:
|
||||
ret += ", "
|
||||
else:
|
||||
first = 0
|
||||
if isinstance(k, str) or isinstance(k, unitype):
|
||||
ret += "'"
|
||||
ret += k
|
||||
ret += "': "
|
||||
else:
|
||||
ret += "%s: " % (k,)
|
||||
|
||||
if __isSimpleType(v):
|
||||
ret += "%s" % (v,)
|
||||
else:
|
||||
ret += self._dumpClass(v, level + 1, parentkey = curkey, skipList=skipList)
|
||||
ret += "}\n"
|
||||
elif __isSimpleType(value):
|
||||
ret += "%s%s: " % (pad, curkey)
|
||||
ret += value
|
||||
ret += "\n"
|
||||
else:
|
||||
ret += "%s%s: " % (pad, curkey)
|
||||
ret += self._dumpClass(value, level + 1, parentkey=curkey, skipList=skipList)
|
||||
|
||||
return ret
|
||||
|
||||
def dump(self, obj):
|
||||
"""Dump the local variables and all attributes of a given object.
|
||||
The lists of files and attrs to ignore are all taken from a
|
||||
Config object instance provided when the ExceptionDump class was
|
||||
created.
|
||||
|
||||
obj -- Any Python object. This object will have all its attributes
|
||||
written out, except for those mentioned in the attrSkipList.
|
||||
"""
|
||||
idSkipList = []
|
||||
ret = SafeStr()
|
||||
|
||||
# We need to augment the environment eval() will run in with the
|
||||
# bindings that were local when the traceback happened so that the
|
||||
# idSkipList can be populated. However since we're not allowed to
|
||||
# modify the results of locals(), we'll have to make a copy first.
|
||||
localVars = copy.copy(locals())
|
||||
if self.stack:
|
||||
localVars.update(self.stack[-1][0].f_locals)
|
||||
|
||||
# Catch attributes that do not exist at the time we do the exception dump
|
||||
# and ignore them.
|
||||
for k in self.conf.attrSkipList:
|
||||
try:
|
||||
eval("idSkipList.append(id(obj.%s))" % k, None, localVars)
|
||||
except:
|
||||
pass
|
||||
|
||||
# Write local variables to the given file descriptor, ignoring any of
|
||||
# the local skips.
|
||||
if self.stack:
|
||||
frame = self.stack[-1][0]
|
||||
ret += "\nLocal variables in innermost frame:\n"
|
||||
try:
|
||||
for (key, value) in frame.f_locals.items():
|
||||
lowered_key = key.lower()
|
||||
if any(item.lower() in lowered_key
|
||||
for item in self.conf.localSkipList):
|
||||
continue
|
||||
|
||||
ret += "%s: %s\n" % (key, value)
|
||||
except:
|
||||
pass
|
||||
|
||||
# And now dump the object's attributes.
|
||||
try:
|
||||
ret += "\n\n"
|
||||
ret += self._dumpClass(obj, skipList=idSkipList)
|
||||
except:
|
||||
ret += "\nException occurred during state dump:\n"
|
||||
ret += traceback.format_exc(None)
|
||||
|
||||
# Filter out item names and callbacks that should appear
|
||||
# only as attachments
|
||||
items_callbacks = ((name, cb) for (name, (cb, attchmnt_only))
|
||||
in self.conf.callbackDict.items()
|
||||
if not attchmnt_only)
|
||||
|
||||
# And now add data returned by the registered callbacks
|
||||
ret += "\nRegistered callbacks:\n"
|
||||
for (item_name, callback) in items_callbacks:
|
||||
try:
|
||||
callback_ret = callback()
|
||||
if callback_ret:
|
||||
ret += "%s:\n%s\n" % (item_name, callback_ret)
|
||||
except Exception as exc:
|
||||
ret += "%s: Caused error: %s\n" % (item_name, exc)
|
||||
|
||||
# And finally, write a bunch of files into the dump too.
|
||||
for fname in self.conf.fileList:
|
||||
try:
|
||||
if six.PY2:
|
||||
with codecs.open(fname, "r", "utf-8", "ignore") as fobj:
|
||||
ret += "\n\n%s:\n" % (fname,)
|
||||
for line in fobj:
|
||||
ret += line.encode("utf-8")
|
||||
else:
|
||||
with open(fname, "rt", encoding="utf-8") as fobj:
|
||||
ret += "\n\n%s:\n" % (fname,)
|
||||
for line in fobj:
|
||||
ret += line
|
||||
except IOError:
|
||||
pass
|
||||
except:
|
||||
ret += "\nException occurred during %s file copy:\n" % (fname,)
|
||||
ret += traceback.format_exc(None)
|
||||
|
||||
return ret
|
||||
|
||||
@property
|
||||
def hash(self):
|
||||
"""Create a hash for this traceback object. This is most suitable for
|
||||
searching bug filing systems for duplicates. The hash is composed
|
||||
of the basename of each file in the stack, the method names, and
|
||||
the bit of code. Line numbers and the actual exception message
|
||||
itself are left out.
|
||||
"""
|
||||
import hashlib
|
||||
s = ""
|
||||
|
||||
if self.stack:
|
||||
for (file, _lineno, func, text) in [f[1:5] for f in self.stack]:
|
||||
if isinstance(text, list):
|
||||
text = "".join(text)
|
||||
s += "%s %s %s\n" % (os.path.basename(file), func, text)
|
||||
else:
|
||||
s = "%s %s" % (self.type, self.value)
|
||||
|
||||
return hashlib.sha256(s.encode("utf-8")).hexdigest()
|
||||
|
||||
def traceback_and_object_dump(self, obj):
|
||||
"""
|
||||
Return the traceback and a text representation of an object.
|
||||
|
||||
:param obj: Any Python object. This object will have all its attributes
|
||||
written out, except for those mentioned in the attrSkipList.
|
||||
|
||||
"""
|
||||
|
||||
ret = SafeStr(str(self))
|
||||
ret += self.dump(obj)
|
||||
|
||||
return ret
|
||||
|
||||
class ReverseExceptionDump(ExceptionDump):
|
||||
"""This class provides an alternate representation of an exception. In
|
||||
this representation, the traceback is printed with the most recent call
|
||||
at the top of the stack, and the most generic call at the bottom. Note
|
||||
that this order does not affect the hash at all.
|
||||
"""
|
||||
def __str__(self):
|
||||
lst = self._format_stack()
|
||||
lst.reverse()
|
||||
|
||||
lst.insert(0, "%s %s exception report\n" % (self.conf.programName, self.conf.programVersion))
|
||||
lst.insert(1, "Traceback (most recent call first):\n")
|
||||
|
||||
if self.type is not None and self.value is not None:
|
||||
lst.extend(traceback.format_exception_only(self.type, self.value))
|
||||
|
||||
return "".join(lst)
|
||||
@@ -0,0 +1,299 @@
|
||||
# Copyright (C) 2009 Red Hat, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# 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/>.
|
||||
#
|
||||
# Author(s): Chris Lumens <clumens@redhat.com>
|
||||
#
|
||||
from meh import MAIN_RESPONSE_DEBUG, MAIN_RESPONSE_SAVE, MAIN_RESPONSE_SHELL, MAIN_RESPONSE_QUIT, DumpInfo, ExceptionInfo
|
||||
import bdb
|
||||
import os
|
||||
import sys
|
||||
import report
|
||||
import traceback
|
||||
import subprocess
|
||||
|
||||
import gettext
|
||||
_ = lambda x: gettext.ldgettext("python-meh", x)
|
||||
|
||||
class NoNetwork(Exception):
|
||||
def __init__(self, msg=""):
|
||||
Exception.__init__(self)
|
||||
self.msg = msg
|
||||
|
||||
def __str__(self):
|
||||
return "No network is available"
|
||||
|
||||
class ExceptionHandler(object):
|
||||
def __init__(self, confObj, intfClass, exnClass):
|
||||
"""Create a new ExceptionHandler instance. Subclasses of this one may
|
||||
be created, provided they are careful to provide all the methods
|
||||
this one does. Instance attributes:
|
||||
|
||||
conf -- A filled in Config instance. At least the programName
|
||||
and programVersion are required.
|
||||
exnClass -- An instance of ExceptionDump or a subclass of it. This
|
||||
is required to know how to represent the Python
|
||||
exception internally.
|
||||
intfClass-- An instance of AbstractIntf. This is required to know
|
||||
what UI classes to use.
|
||||
"""
|
||||
self.conf = confObj
|
||||
self.exnClass = exnClass
|
||||
self.intf = intfClass
|
||||
|
||||
self._exitcode = 10
|
||||
self._exn = None
|
||||
self.exnFile = None
|
||||
self.exnText = ""
|
||||
|
||||
def _setExitCode(self, code):
|
||||
self._exitcode = code
|
||||
|
||||
exitcode = property(lambda s: s._exitcode,
|
||||
lambda s, v: s._setExitCode(v))
|
||||
|
||||
def _setExn(self, e):
|
||||
self._exn = e
|
||||
|
||||
exn = property(lambda s: s._exn,
|
||||
lambda s, v: s._setExn(v))
|
||||
|
||||
def handleException(self, dump_info):
|
||||
"""This is the main exception handling entry point. When Python
|
||||
gets an exception it doesn't know how to handle, this method will
|
||||
be called. It then saves the traceback and displays the main
|
||||
dialog asking the user what to do next. Once this method is
|
||||
called, there's no good way to go back to what you were doing
|
||||
before.
|
||||
|
||||
All arguments are passed in from the handler created by calling
|
||||
self.install(). This method should not usually be overridden by
|
||||
a subclass.
|
||||
|
||||
:type dump_info: an instance of the meh.DumpInfo class
|
||||
|
||||
"""
|
||||
|
||||
responseHash = { MAIN_RESPONSE_QUIT: self.runQuit,
|
||||
MAIN_RESPONSE_DEBUG: self.runDebug,
|
||||
MAIN_RESPONSE_SAVE: self.runSave,
|
||||
MAIN_RESPONSE_SHELL: self.runShell,
|
||||
}
|
||||
|
||||
# Quit if we got an exception when running pdb.
|
||||
if isinstance(dump_info.exc_info.value, bdb.BdbQuit):
|
||||
sys.exit(self.exitcode)
|
||||
|
||||
# Restore original exception handler.
|
||||
sys.excepthook = sys.__excepthook__
|
||||
|
||||
self.preWriteHook(dump_info)
|
||||
|
||||
# Save the exception to the filesystem first.
|
||||
self.exn = self.exnClass(dump_info.exc_info, self.conf)
|
||||
(fobj, self.exnFile) = self.openFile()
|
||||
self.exnText = self.exn.traceback_and_object_dump(dump_info.object)
|
||||
fobj.write(self.exnText)
|
||||
fobj.close()
|
||||
|
||||
self.postWriteHook(dump_info)
|
||||
|
||||
# Run initial UI screen, asking whether to save/debug/quit.
|
||||
while True:
|
||||
win = self.intf.mainExceptionWindow(str(self.exn), self.exnText)
|
||||
if not win:
|
||||
self.runQuit(dump_info.exc_info)
|
||||
|
||||
rc = win.run()
|
||||
win.destroy()
|
||||
|
||||
try:
|
||||
responseHash[rc](dump_info.exc_info)
|
||||
except KeyError:
|
||||
# This happens if (for example) the user hits Escape instead
|
||||
# of pressing a button.
|
||||
continue
|
||||
|
||||
win.destroy()
|
||||
|
||||
def preWriteHook(self, dump_info):
|
||||
"""Subclasses may supply a function with this name that will be
|
||||
called immediately before the traceback is written to disk in
|
||||
order to have any sort of special pre-write processing that needs
|
||||
to be done.
|
||||
|
||||
:type dump_info: an instance of the meh.DumpInfo class
|
||||
"""
|
||||
pass
|
||||
|
||||
def postWriteHook(self, dump_info):
|
||||
"""Subclasses may supply a function with this name that will be
|
||||
called immediately after the traceback is written to disk, but
|
||||
immediately before the UI is run. This is to provide a place for
|
||||
any special handling to happen once there is a file on disk.
|
||||
|
||||
:type dump_info: an instance of the meh.DumpInfo class
|
||||
"""
|
||||
pass
|
||||
|
||||
def install(self, obj):
|
||||
"""Install ourselves as the top level exception handler with Python.
|
||||
If this method is not called after an ExceptionHandler instance is
|
||||
created, none of the rest of this code will ever be called.
|
||||
|
||||
obj -- A Python object that may be dumped to a file when the
|
||||
exception is saved. This should be something like the top
|
||||
level object in a program.
|
||||
"""
|
||||
sys.excepthook = lambda ty, value, tb: \
|
||||
self.handleException(DumpInfo(ExceptionInfo(ty, value, tb), obj))
|
||||
|
||||
def openFile(self):
|
||||
"""Create a randomly named output file to write the exception dump to.
|
||||
This requires a programName be set in the Config instance. The
|
||||
return value is a (file descriptor, path) pair. The file must be
|
||||
closed by the caller when writing is done. Subclasses should not
|
||||
override this method unless they know what they're doing.
|
||||
"""
|
||||
import tempfile
|
||||
(fd, path) = tempfile.mkstemp("", "%s-tb-" % self.conf.programName, "/tmp")
|
||||
fo = os.fdopen(fd, "w")
|
||||
return (fo, path)
|
||||
|
||||
### Methods called by the primary exception handling dialog.
|
||||
|
||||
def runQuit(self, exc_info):
|
||||
"""This method is called when the "Exit" button is clicked. It may
|
||||
be overridden by a subclass, but the basic behavior of eventually
|
||||
quitting should be preserved.
|
||||
|
||||
:type exc_info: an instance of the meh.ExceptionInfo class
|
||||
"""
|
||||
sys.exit(self.exitcode)
|
||||
|
||||
def runDebug(self, exc_info):
|
||||
"""This method is called when the "Debug" button is clicked. It may
|
||||
be overridden by a subclass if specialized behavior is required to
|
||||
enter debug mode.
|
||||
|
||||
:type exc_info: an instance of the meh.ExceptionInfo class
|
||||
"""
|
||||
|
||||
print("")
|
||||
print(_("Use 'continue' command to quit the debugger and get back to "
|
||||
"the main menu"))
|
||||
import pdb
|
||||
pdb.post_mortem(exc_info.stack)
|
||||
#no need to quit here, let's just get back to the main dialog
|
||||
|
||||
def runShell(self, exc_info):
|
||||
"""This method is called when user requests to run a shell. It may
|
||||
be overridden by a subclass if specialized behavior is required to
|
||||
run shell (e.g. TTY switching).
|
||||
|
||||
:type exc_info: an instance of the meh.ExceptionInfo class
|
||||
|
||||
"""
|
||||
|
||||
print("")
|
||||
print(_("Exit the shell to get back to the main menu"))
|
||||
proc = subprocess.Popen(["bash", "--login"], shell=True, cwd="/")
|
||||
proc.wait()
|
||||
|
||||
def runSave(self, exc_info):
|
||||
"""This method is called when the "Save" button is clicked. It may
|
||||
be overridden by a subclass, but that's going to be a lot of work.
|
||||
|
||||
:type exc_info: an instance of the meh.ExceptionInfo class
|
||||
"""
|
||||
|
||||
params = dict()
|
||||
params.update(self.exn.environment_info)
|
||||
pkg_info = params.pop("pkg_info", None)
|
||||
|
||||
#if rpmdb queries fail (anaconda), use self.conf.* values
|
||||
if "component" not in params:
|
||||
params["component"] = self.conf.programName
|
||||
|
||||
if pkg_info:
|
||||
params["pkg_name"] = pkg_info.name
|
||||
params["pkg_version"] = pkg_info.version
|
||||
params["pkg_release"] = pkg_info.release
|
||||
params["pkg_epoch"] = pkg_info.epoch
|
||||
params["pkg_arch"] = pkg_info.arch
|
||||
params["package"] = "%s-%s-%s.%s" % (pkg_info.name, pkg_info.version,
|
||||
pkg_info.release, pkg_info.arch)
|
||||
else:
|
||||
params["pkg_name"] = self.conf.programName
|
||||
parts = self.conf.programVersion.rsplit("-", 1)
|
||||
if len(parts) == 2:
|
||||
version, release = parts
|
||||
else:
|
||||
version = parts[0]
|
||||
# not given, make something up
|
||||
release = "1"
|
||||
params["pkg_version"] = version
|
||||
params["pkg_release"] = release
|
||||
# we don't support specifying epoch in the config object and only
|
||||
# the anaconda which is not using epochs doesn't have the RPMdb to
|
||||
# query
|
||||
params["pkg_epoch"] = "0"
|
||||
params["pkg_arch"] = self.conf.programArch
|
||||
params["package"] = "{0.programName}-{0.programVersion}".format(
|
||||
self.conf)
|
||||
|
||||
params["hashmarkername"] = self.conf.programName
|
||||
params["duphash"] = self.exn.hash
|
||||
params["reason"] = self.exn.desc
|
||||
params["description"] = "The following was filed automatically by %s:\n%s" \
|
||||
% (self.conf.programName, str(self.exn))
|
||||
|
||||
tb_item_name = "%s-tb" % self.conf.programName
|
||||
params[tb_item_name] = self.exnText
|
||||
|
||||
# save data generated by callbacks
|
||||
for (item_name, (callback, _anc)) in self.conf.callbackDict.items():
|
||||
try:
|
||||
ret = callback()
|
||||
if ret:
|
||||
params[item_name] = ret
|
||||
except Exception as exc: # pylint: disable=broad-except
|
||||
params[item_name] = "Caused error: %s" % exc
|
||||
|
||||
for fpath in self.conf.fileList:
|
||||
try:
|
||||
with open(fpath, "r") as fobj:
|
||||
# would be better to use the full path here, but libreport
|
||||
# doesn't allow '/' characters in the item name
|
||||
filename = os.path.basename(fpath)
|
||||
if filename not in params:
|
||||
params[filename] = fobj.read()
|
||||
else:
|
||||
params[filename+"_file"] = fobj.read()
|
||||
except: # pylint: disable=bare-except
|
||||
#skip files we cannot read
|
||||
continue
|
||||
|
||||
# tell ABRT some more things it requires
|
||||
params["analyzer"] = "Python"
|
||||
params["backtrace"] = "".join(traceback.format_exception(exc_info.type,
|
||||
exc_info.value,
|
||||
exc_info.stack))
|
||||
|
||||
signature = report.createPythonUnhandledExceptionSignature(**params)
|
||||
|
||||
# We don't want to automatically quit here since the user may wish to
|
||||
# save somewhere else, debug, etc.
|
||||
self.intf.saveExceptionWindow(signature)
|
||||
@@ -0,0 +1,45 @@
|
||||
#
|
||||
# network.py - network configuration install data
|
||||
#
|
||||
# Copyright (C) 2008, 2009 Red Hat, Inc.
|
||||
#
|
||||
# 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/>.
|
||||
#
|
||||
# Author(s): David Cantrell <dcantrell@redhat.com>
|
||||
#
|
||||
import dbus
|
||||
|
||||
# This code was taken from anaconda, and slightly adapted to not rely
|
||||
# on isys.
|
||||
NM_SERVICE = "org.freedesktop.NetworkManager"
|
||||
NM_MANAGER_PATH = "/org/freedesktop/NetworkManager"
|
||||
|
||||
NM_STATE_CONNECTED = 3
|
||||
|
||||
DBUS_PROPS_IFACE = "org.freedesktop.DBus.Properties"
|
||||
|
||||
def hasActiveNetDev():
|
||||
"""Does the system have an enabled network interface?"""
|
||||
try:
|
||||
bus = dbus.SystemBus()
|
||||
nm = bus.get_object(NM_SERVICE, NM_MANAGER_PATH)
|
||||
props = dbus.Interface(nm, DBUS_PROPS_IFACE)
|
||||
state = props.Get(NM_SERVICE, "State")
|
||||
|
||||
if int(state) == NM_STATE_CONNECTED:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
except dbus.DBusException:
|
||||
return False
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
#
|
||||
# Copyright (C) 2013 Red Hat, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# 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/>.
|
||||
#
|
||||
# Author: Vratislav Podzimek <vpodzime@redhat.com>
|
||||
#
|
||||
#
|
||||
|
||||
import sys
|
||||
PY = int(sys.version.split('.')[0])
|
||||
|
||||
"""
|
||||
This module provides a SafeStr class.
|
||||
|
||||
@see: SafeStr
|
||||
|
||||
"""
|
||||
|
||||
class SafeStr(str):
|
||||
"""
|
||||
String class that has a modified __add__ method so that ascii strings,
|
||||
binary data represented as a byte string and unicode objects can be
|
||||
safely appended to it (not causing traceback). BINARY DATA IS OMITTED.
|
||||
|
||||
"""
|
||||
|
||||
def __add__(self, other):
|
||||
|
||||
if PY > 2:
|
||||
return SafeStr(str.__add__(self, str(other)))
|
||||
|
||||
if not (isinstance(other, str) or isinstance(other, unicode)): # pylint: disable=undefined-variable
|
||||
if hasattr(other, "__str__"):
|
||||
other = other.__str__()
|
||||
else:
|
||||
other = "OMITTED OBJECT WITHOUT __str__ METHOD"
|
||||
|
||||
if isinstance(other, unicode): # pylint: disable=undefined-variable
|
||||
ret = SafeStr(str.__add__(self, other.encode("utf-8")))
|
||||
else:
|
||||
try:
|
||||
# try to decode which doesn't cause traceback for utf-8 encoded
|
||||
# non-ascii string and ascii string
|
||||
other.decode("utf-8")
|
||||
ret = SafeStr(str.__add__(self, other))
|
||||
except UnicodeDecodeError:
|
||||
# binary data, get the representation used by Python for
|
||||
# non-ascii bytes
|
||||
|
||||
# hex(255) returns "0xff", we want "\xff"
|
||||
other_hexa = (hex(ord(char)) for char in other)
|
||||
other_backslashed = (hex_num.replace("0x", "\\x")
|
||||
for hex_num in other_hexa)
|
||||
other_repr = "".join(other_backslashed)
|
||||
|
||||
ret = SafeStr(str.__add__(self, other_repr))
|
||||
|
||||
return ret
|
||||
+181
@@ -0,0 +1,181 @@
|
||||
# Copyright (C) 2009 Red Hat, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# 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/>.
|
||||
#
|
||||
# Author(s): Chris Lumens <clumens@redhat.com>
|
||||
#
|
||||
|
||||
class AbstractIntf(object):
|
||||
"""The base class for Interfaces. This is an abstract class. It
|
||||
provides methods that create and run various kinds of windows.
|
||||
We provide a basic level of graphical and text oriented interfaces
|
||||
here, but it should be possible for things like anaconda to supply
|
||||
their own much more complicated ones with little effort.
|
||||
"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
"""Create a new AbstractInterface instance. This method need not
|
||||
be overridden by subclasses.
|
||||
"""
|
||||
pass
|
||||
|
||||
def enableNetwork(self, *args, **kwargs):
|
||||
"""Display and run a dialog that brings up the network, if it is
|
||||
currently disabled. This method must be provided by all subclasses,
|
||||
and should return False if unsuccessful.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def exitWindow(self, title, message, *args, **kwargs):
|
||||
"""Display and run a dialog that displays a message with the proper
|
||||
buttons and images for quitting afterwards. This method must be
|
||||
provided by all subclasses.
|
||||
|
||||
title -- The window's title.
|
||||
message -- The window's text.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def mainExceptionWindow(self, text, exnFile, *args, **kwargs):
|
||||
"""Create and return an instance of the initial execption handling
|
||||
dialog. This method must be provided by all subclasses.
|
||||
|
||||
text -- The short traceback (usually, just the stack trace).
|
||||
exnFile -- A file containing the output of ExceptionDump.write().
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def messageWindow(self, title, message, *args, **kwargs):
|
||||
"""Display a generic informational message. This can be an error,
|
||||
status update, and so forth. It must be provided by all subclasses.
|
||||
|
||||
title -- The window's title.
|
||||
message -- The window's text.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def saveExceptionWindow(self, exnFile, *args, **kwargs):
|
||||
"""Create and return an instance of the exception saving dialog. This
|
||||
method must be provided by all subclasses.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
class AbstractMainExceptionWindow(object):
|
||||
"""This abstract class describes the basic level of support required of
|
||||
any interface that supplies a main exception window. The main exception
|
||||
window is the initial dialog displayed by the exception handler that
|
||||
provides the debug/save/quit options.
|
||||
"""
|
||||
def __init__(self, shortTraceback=None, longTraceback=None, *args, **kwargs):
|
||||
"""Create a new MainExceptionWindow instance. This must handle
|
||||
creating the dialog and populating it with widgets, but must not
|
||||
run the dialog. A self.dialog attribute should be created that
|
||||
refers to the dialog itself.
|
||||
|
||||
shortTraceback -- The short traceback (usually, just the stack
|
||||
trace).
|
||||
longTraceback -- The long traceback (full traceback and the main
|
||||
object dump).
|
||||
"""
|
||||
pass
|
||||
|
||||
def destroy(self, *args, **kwargs):
|
||||
"""Destroy the current dialog. This method must be provided by all
|
||||
subclasses.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def run(self, *args, **kwargs):
|
||||
"""Run the window and set a return value. This method does everything
|
||||
after the interface has been set up, but does not destroy it. This
|
||||
method must be provided by all subclasses.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
class AbstractExitWindow(object):
|
||||
"""This abstract class describes the basic level of support required of
|
||||
a basic message dialog that should be displayed before the program
|
||||
exits. All interfaces must provide this class.
|
||||
"""
|
||||
def __init__(self, title, text, *args, **kwargs):
|
||||
"""Create a new ExitWindow instance. This must handle creating the
|
||||
dialog and putting the text into it, but must not run the dialog.
|
||||
This method must be provided by all subclasses.
|
||||
|
||||
title -- The window's title.
|
||||
text -- The window's text.
|
||||
"""
|
||||
pass
|
||||
|
||||
def destroy(self, *args, **kwargs):
|
||||
"""Destroy the current dialog. This method must be provided by all
|
||||
subclasses.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def run(self, *args, **kwargs):
|
||||
"""Run the window and set a return value. This method does everything
|
||||
after the interface has been set up but does not destroy it. This
|
||||
method must be provided by all subclasses.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
class AbstractMessageWindow(object):
|
||||
"""This abstract class describes the basic level of support required of
|
||||
a basic message dialog. All interfaces must provide this class.
|
||||
"""
|
||||
def __init__(self, title, text, *args, **kwargs):
|
||||
"""Create a new MessageWindow instance. This must handle creating the
|
||||
dialog and putting the text into it, but must not run the dialog.
|
||||
This method must be provided by all subclasses.
|
||||
|
||||
title -- The window's title.
|
||||
text -- The window's text.
|
||||
"""
|
||||
pass
|
||||
|
||||
def destroy(self, *args, **kwargs):
|
||||
"""Destroy the current dialog. This method must be provided by all
|
||||
subclasses.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def run(self, *args, **kwargs):
|
||||
"""Run the window and set a return value. This method does everything
|
||||
after the interface has been set up but does not destroy it. This
|
||||
method must be provided by all subclasses.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
class AbstractSaveExceptionWindow(object):
|
||||
"""This abstract class describes the basic level of support required of
|
||||
any interface that supplies an exception saving window. The exception
|
||||
saving window is the dialog displayed if the user clicks "save" on the
|
||||
initial dialog, and presents multiple options for how the traceback
|
||||
should be saved.
|
||||
"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
"""Create a new SaveExceptionWindow instance. This must handle
|
||||
creating the dialog and populating it with widgets, but must not
|
||||
run the dialog. A self.dialog attribute should be created that
|
||||
refers to the dialog itself.
|
||||
"""
|
||||
pass
|
||||
|
||||
def run(self, *args, **kwargs):
|
||||
"""Run the window and set a return value. This method does everything
|
||||
after the interface has been set up but does not destroy it. This
|
||||
method must be provided by all subclasses.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -0,0 +1,177 @@
|
||||
# Copyright (C) 2009 Red Hat, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# 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/>.
|
||||
#
|
||||
# Author(s): Chris Lumens <clumens@redhat.com>
|
||||
#
|
||||
from meh import MAIN_RESPONSE_DEBUG, MAIN_RESPONSE_NONE, MAIN_RESPONSE_QUIT, MAIN_RESPONSE_SAVE
|
||||
from meh.ui import AbstractIntf, AbstractSaveExceptionWindow, AbstractMainExceptionWindow, AbstractMessageWindow
|
||||
import os
|
||||
import sys
|
||||
import report
|
||||
|
||||
import gi
|
||||
gi.require_version("Gtk", "3.0")
|
||||
|
||||
from gi.repository import Gtk
|
||||
|
||||
import gettext
|
||||
_ = lambda x: gettext.ldgettext("python-meh", x)
|
||||
|
||||
def find_glade_file(file):
|
||||
path = os.environ.get("GLADEPATH", "./:ui/:/tmp/updates/:/tmp/updates/ui/:/usr/share/python-meh/")
|
||||
for d in path.split(":"):
|
||||
fn = d + file
|
||||
if os.access(fn, os.R_OK):
|
||||
return fn
|
||||
raise RuntimeError("Unable to find glade file %s" % file)
|
||||
|
||||
class GraphicalIntf(AbstractIntf):
|
||||
def __init__(self, *args, **kwargs):
|
||||
AbstractIntf.__init__(self, *args, **kwargs)
|
||||
|
||||
def enableNetwork(self, *args, **kwargs):
|
||||
"""Should be provided by the inheriting class."""
|
||||
|
||||
return False
|
||||
|
||||
def exitWindow(self, title, message, *args, **kwargs):
|
||||
win = ExitWindow(title, message, *args, **kwargs)
|
||||
win.run()
|
||||
win.destroy()
|
||||
|
||||
def mainExceptionWindow(self, text, exnFile, *args, **kwargs):
|
||||
win = MainExceptionWindow(text, exnFile, *args, **kwargs)
|
||||
return win
|
||||
|
||||
def messageWindow(self, title, message, *args, **kwargs):
|
||||
win = MessageWindow(title, message, *args, **kwargs)
|
||||
win.run()
|
||||
win.destroy()
|
||||
|
||||
def saveExceptionWindow(self, signature, *args, **kwargs):
|
||||
win = SaveExceptionWindow(signature)
|
||||
win.run()
|
||||
|
||||
class SaveExceptionWindow(AbstractSaveExceptionWindow):
|
||||
def __init__(self, signature, *args, **kwargs):
|
||||
AbstractSaveExceptionWindow.__init__(self, signature, *args, **kwargs)
|
||||
self.signature = signature
|
||||
|
||||
def run(self, *args, **kwargs):
|
||||
# Don't need to check the return value of report since it will
|
||||
# handle all the UI reporting for us.
|
||||
report.report_problem_in_memory(self.signature, report.LIBREPORT_WAIT)
|
||||
|
||||
class MainExceptionWindow(AbstractMainExceptionWindow):
|
||||
def __init__(self, shortTraceback=None, longTraceback=None, *args, **kwargs):
|
||||
AbstractMainExceptionWindow.__init__(self, shortTraceback, longTraceback,
|
||||
*args, **kwargs)
|
||||
|
||||
builder = Gtk.Builder()
|
||||
builder.set_translation_domain("python-meh")
|
||||
glade_file = find_glade_file("exception-dialog.glade")
|
||||
builder.add_from_file(glade_file)
|
||||
builder.connect_signals(self)
|
||||
|
||||
self._main_window = builder.get_object("exceptionWindow")
|
||||
|
||||
# this makes sure the Meh window remains active
|
||||
# even if the exception has been triggered in a dialog
|
||||
window_group = Gtk.WindowGroup()
|
||||
window_group.add_window(self._main_window)
|
||||
|
||||
self._traceback_buffer = builder.get_object("tracebackBuffer")
|
||||
|
||||
self._traceback_buffer.set_text(longTraceback)
|
||||
self._response = MAIN_RESPONSE_QUIT
|
||||
|
||||
self._debug_button = builder.get_object("debugButton")
|
||||
|
||||
allowDebug = kwargs.get("allowDebug", sys.stdout.isatty)
|
||||
|
||||
if allowDebug and not allowDebug():
|
||||
self._debug_button.set_sensitive(False)
|
||||
|
||||
@property
|
||||
def main_window(self):
|
||||
return self._main_window
|
||||
|
||||
def destroy(self, *args, **kwargs):
|
||||
self._main_window.destroy()
|
||||
|
||||
def run(self, *args, **kwargs):
|
||||
self._main_window.show_all()
|
||||
# keep our window above dialogs
|
||||
self._main_window.set_modal(True)
|
||||
self._main_window.set_keep_above(True)
|
||||
Gtk.main()
|
||||
self.destroy()
|
||||
return self._response
|
||||
|
||||
def on_report_clicked(self, button):
|
||||
# hide our window to not interfere with libreport window
|
||||
self._main_window.hide()
|
||||
self._response = MAIN_RESPONSE_SAVE
|
||||
Gtk.main_quit()
|
||||
|
||||
def on_quit_clicked(self, button):
|
||||
self._response = MAIN_RESPONSE_QUIT
|
||||
Gtk.main_quit()
|
||||
|
||||
def on_debug_clicked(self, button):
|
||||
self._response = MAIN_RESPONSE_DEBUG
|
||||
Gtk.main_quit()
|
||||
|
||||
def on_expander_activated(self, expander, *args):
|
||||
if not expander.get_expanded():
|
||||
self._main_window.resize(600, 400)
|
||||
else:
|
||||
#resize the window back to the default size when expander is
|
||||
#minimized
|
||||
self._main_window.resize(600, 1)
|
||||
|
||||
def on_main_window_deleted(self, *args):
|
||||
self._response = MAIN_RESPONSE_NONE
|
||||
self.destroy()
|
||||
Gtk.main_quit()
|
||||
|
||||
class MessageWindow(AbstractMessageWindow):
|
||||
def __init__(self, title, text, *args, **kwargs):
|
||||
AbstractMessageWindow.__init__(self, title, text, *args, **kwargs)
|
||||
self.rc = 0
|
||||
|
||||
self.dialog = Gtk.MessageDialog(buttons=Gtk.ButtonsType.OK,
|
||||
type=Gtk.MessageType.INFO,
|
||||
message_format=text)
|
||||
self.dialog.set_title(title)
|
||||
self.dialog.set_position(Gtk.WindowPosition.CENTER)
|
||||
|
||||
def destroy(self, *args, **kwargs):
|
||||
self.dialog.destroy()
|
||||
|
||||
def run(self, *args, **kwargs):
|
||||
self.dialog.show_all()
|
||||
self.rc = self.dialog.run()
|
||||
self.dialog.destroy()
|
||||
|
||||
class ExitWindow(MessageWindow):
|
||||
def __init__(self, title, text, *args, **kwargs): # pylint: disable=super-init-not-called
|
||||
self.dialog = Gtk.MessageDialog(buttons=Gtk.ButtonsType.NONE,
|
||||
type=Gtk.MessageType.INFO,
|
||||
message_format=text)
|
||||
self.dialog.set_title(title)
|
||||
self.dialog.add_button(_("_Exit"), 0)
|
||||
self.dialog.set_position(Gtk.WindowPosition.CENTER)
|
||||
@@ -0,0 +1,225 @@
|
||||
# Copyright (C) 2009, 2013 Red Hat, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# 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/>.
|
||||
#
|
||||
# Author(s): Chris Lumens <clumens@redhat.com>
|
||||
# Vratislav Podzimek <vpodzime@redhat.com>
|
||||
#
|
||||
from __future__ import print_function
|
||||
|
||||
from meh import MAIN_RESPONSE_DEBUG, MAIN_RESPONSE_SAVE, MAIN_RESPONSE_SHELL, MAIN_RESPONSE_QUIT
|
||||
from meh.ui import AbstractIntf, AbstractSaveExceptionWindow, AbstractMainExceptionWindow, AbstractMessageWindow
|
||||
import report
|
||||
import report.io.TextIO
|
||||
from report import LIBREPORT_WAIT, LIBREPORT_RUN_CLI
|
||||
|
||||
import os
|
||||
import sys
|
||||
if sys.version_info.major == 3:
|
||||
raw_input_fn = input
|
||||
else:
|
||||
raw_input_fn = raw_input # pylint: disable=undefined-variable
|
||||
|
||||
import gettext
|
||||
_ = lambda x: gettext.ldgettext("python-meh", x)
|
||||
|
||||
|
||||
class IOHandler(object):
|
||||
"""
|
||||
Class that provides methods for input and output. Its instance is expected
|
||||
to be passed to objects performing some I/O operations.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, in_func=raw_input_fn, out_func=print): # pylint: disable=used-before-assignment
|
||||
"""
|
||||
Constructor for the IOhandler class. Arguments can be used to override
|
||||
default I/O functions with the custom ones.
|
||||
|
||||
:param in_func: input function similar to standard raw_input
|
||||
:type in_func: str -> str
|
||||
:param out_func: output function similar to standard print
|
||||
:type out_func: str -> None
|
||||
|
||||
"""
|
||||
|
||||
self.in_func = in_func
|
||||
self.out_func = out_func
|
||||
|
||||
def print(self, msg=""):
|
||||
self.out_func(msg)
|
||||
|
||||
def raw_input(self, prompt):
|
||||
return self.in_func(prompt)
|
||||
|
||||
class TextWindow(object):
|
||||
"""Helper class providing some common methods needed by all text windows."""
|
||||
|
||||
def __init__(self, title, *args, **kwargs):
|
||||
self._io = kwargs.get("io_handler", IOHandler())
|
||||
self._title = title
|
||||
|
||||
# short (one-char) answer meaning "yes"
|
||||
self._yes_answer = _("y")
|
||||
|
||||
# short (one-char) answer meaning "no"
|
||||
self._no_answer = _("n")
|
||||
|
||||
@property
|
||||
def _usable_width(self):
|
||||
return os.environ.get("COLUMNS", 80) - 1
|
||||
|
||||
def _print_rule(self):
|
||||
rule = self._usable_width * "="
|
||||
self._io.print(rule)
|
||||
|
||||
def print_header(self):
|
||||
self._io.print()
|
||||
self._print_rule()
|
||||
self._io.print(self._title)
|
||||
self._print_rule()
|
||||
|
||||
def destroy(self):
|
||||
self._print_rule()
|
||||
self._print_rule()
|
||||
|
||||
class TextIntf(AbstractIntf):
|
||||
def __init__(self, *args, **kwargs):
|
||||
AbstractIntf.__init__(self, *args, **kwargs)
|
||||
self.screen = kwargs.get("screen", None)
|
||||
self._io = kwargs.get("io_handler", IOHandler())
|
||||
|
||||
def set_io_handler(self, handler):
|
||||
"""
|
||||
Set different IO handler.
|
||||
|
||||
:type handler: an instance of the IOHandler class
|
||||
|
||||
"""
|
||||
self._io = handler
|
||||
|
||||
def enableNetwork(self, *args, **kwargs):
|
||||
"""Should be provided by the inheriting class."""
|
||||
|
||||
return False
|
||||
|
||||
def exitWindow(self, title, message, *args, **kwargs):
|
||||
kwargs["io_handler"] = self._io
|
||||
win = ExitWindow(title, message, *args, **kwargs)
|
||||
win.run()
|
||||
win.destroy()
|
||||
|
||||
def mainExceptionWindow(self, text, exnFile, *args, **kwargs):
|
||||
kwargs["io_handler"] = self._io
|
||||
win = MainExceptionWindow(text, exnFile, *args, **kwargs)
|
||||
return win
|
||||
|
||||
def messageWindow(self, title, message, *args, **kwargs):
|
||||
kwargs["io_handler"] = self._io
|
||||
win = MessageWindow(title, message, *args, **kwargs)
|
||||
win.run()
|
||||
win.destroy()
|
||||
|
||||
def saveExceptionWindow(self, signature, *args, **kwargs):
|
||||
kwargs["io_handler"] = self._io
|
||||
win = SaveExceptionWindow(signature, *args, **kwargs)
|
||||
win.run()
|
||||
win.destroy()
|
||||
|
||||
class SaveExceptionWindow(TextWindow, AbstractSaveExceptionWindow):
|
||||
def __init__(self, signature, *args, **kwargs):
|
||||
AbstractSaveExceptionWindow.__init__(self, signature,
|
||||
*args, **kwargs)
|
||||
TextWindow.__init__(self, _("Save exception"), *args, **kwargs)
|
||||
self.signature = signature
|
||||
|
||||
def run(self, *args, **kwargs):
|
||||
# Don't need to check the return value of report since it will
|
||||
# handle all the UI reporting for us.
|
||||
report.report_problem_in_memory(self.signature,
|
||||
LIBREPORT_WAIT|LIBREPORT_RUN_CLI)
|
||||
|
||||
class MainExceptionWindow(TextWindow, AbstractMainExceptionWindow):
|
||||
def __init__(self, shortTraceback=None, longTraceback=None, *args, **kwargs):
|
||||
AbstractMainExceptionWindow.__init__(self, shortTraceback, longTraceback,
|
||||
*args, **kwargs)
|
||||
TextWindow.__init__(self, _("An unknown error has occurred"),
|
||||
*args, **kwargs)
|
||||
self._short_traceback = shortTraceback
|
||||
self._menu_items = [(_("Report Bug"), MAIN_RESPONSE_SAVE),
|
||||
(_("Run shell"), MAIN_RESPONSE_SHELL),
|
||||
(_("Quit"), MAIN_RESPONSE_QUIT)]
|
||||
|
||||
allowDebug = kwargs.get("allowDebug", sys.stdout.isatty)
|
||||
|
||||
if allowDebug and allowDebug():
|
||||
self._menu_items.insert(1, (_("Debug"), MAIN_RESPONSE_DEBUG))
|
||||
|
||||
def run(self, *args, **kwargs):
|
||||
self.print_header()
|
||||
self._io.print(self._short_traceback)
|
||||
self._io.print(_("What do you want to do now?"))
|
||||
for (idx, item) in enumerate(self._menu_items):
|
||||
self._io.print("%d) %s" % (idx + 1, item[0]))
|
||||
|
||||
ret = -1
|
||||
num_menu_items = len(self._menu_items)
|
||||
self._io.print()
|
||||
while not (0 < ret <= num_menu_items):
|
||||
ret = self._io.raw_input(_("Please make your choice from above: "))
|
||||
try:
|
||||
ret = int(ret)
|
||||
except ValueError:
|
||||
ret = -1
|
||||
|
||||
return self._menu_items[ret - 1][1]
|
||||
|
||||
class MessageWindow(TextWindow, AbstractMessageWindow):
|
||||
def __init__(self, title, text, *args, **kwargs):
|
||||
AbstractMessageWindow.__init__(self, title, text, *args, **kwargs)
|
||||
TextWindow.__init__(self, title, *args, **kwargs)
|
||||
self._text = text
|
||||
|
||||
def run(self, *args, **kwargs):
|
||||
self.print_header()
|
||||
self._io.print(self._text)
|
||||
self._io.print()
|
||||
self._io.raw_input(_("Hit ENTER to continue"))
|
||||
|
||||
class ExitWindow(MessageWindow):
|
||||
def __init__(self, title, text, *args, **kwargs):
|
||||
MessageWindow.__init__(self, title, text, *args, **kwargs)
|
||||
|
||||
def run(self, *args, **kwargs):
|
||||
self.print_header()
|
||||
self._io.print(self._text)
|
||||
self._io.print()
|
||||
|
||||
# self._no_answer may be non-ascii string (simple .upper() doesn't work)
|
||||
no_answer_upper = self._no_answer.decode("utf-8").upper().encode("utf-8")
|
||||
answer = self._io.raw_input(_(
|
||||
"Are you sure you want to exit? [%(yes)s/%(no)s]") %
|
||||
{ "yes": self._yes_answer,
|
||||
"no": no_answer_upper })
|
||||
|
||||
# no answer means accepting the default (self._no_answer) and the answer
|
||||
# is case insensitive (and may be non-ascii)
|
||||
lower_answer = answer.decode("utf-8").lower().encode("utf-8")
|
||||
answer = lower_answer or self._no_answer
|
||||
|
||||
if answer in (self._yes_answer, self._no_answer):
|
||||
return answer == self._yes_answer
|
||||
else:
|
||||
self.run(*args, **kwargs)
|
||||
@@ -0,0 +1,339 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
675 Mass Ave, Cambridge, MA 02139, USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
Appendix: How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) 19yy <name of author>
|
||||
|
||||
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, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
||||
@@ -0,0 +1,248 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<!-- interface-requires gtk+ 3.0 -->
|
||||
<object class="GtkWindow" id="exceptionWindow">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="window_position">center-always</property>
|
||||
<property name="default_width">600</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="urgency_hint">True</property>
|
||||
<signal name="delete-event" handler="on_main_window_deleted" swapped="no"/>
|
||||
<child>
|
||||
<object class="GtkBox" id="mainBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkBox" id="box1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="margin_left">20</property>
|
||||
<property name="margin_top">30</property>
|
||||
<child>
|
||||
<object class="GtkImage" id="image1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="stock">gtk-dialog-warning</property>
|
||||
<property name="icon-size">5</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">7</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="titleLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">An unknown error has occurred</property>
|
||||
<attributes>
|
||||
<attribute name="weight" value="bold"/>
|
||||
<attribute name="scale" value="1.1000000000000001"/>
|
||||
</attributes>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="explainLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="valign">start</property>
|
||||
<property name="margin_left">40</property>
|
||||
<property name="margin_right">40</property>
|
||||
<property name="label" translatable="yes">This program has encountered an unknown error. You may
|
||||
report the bug below or quit the program.</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">21</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButtonBox" id="buttonbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">start</property>
|
||||
<property name="margin_right">20</property>
|
||||
<property name="spacing">10</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="reportButton">
|
||||
<property name="label" translatable="yes">_Report Bug</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_underline">True</property>
|
||||
<signal name="clicked" handler="on_report_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="quitButton">
|
||||
<property name="label" translatable="yes">_Quit</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_underline">True</property>
|
||||
<signal name="clicked" handler="on_quit_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkExpander" id="expander">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="margin_left">10</property>
|
||||
<property name="margin_right">10</property>
|
||||
<property name="margin_bottom">10</property>
|
||||
<property name="use_underline">True</property>
|
||||
<signal name="activate" handler="on_expander_activated" swapped="no"/>
|
||||
<child>
|
||||
<object class="GtkBox" id="box2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="vexpand">True</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">6</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="commentLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="margin_left">2</property>
|
||||
<property name="xalign">0.10000000149011612</property>
|
||||
<property name="label" translatable="yes">The output below may help determine the cause of the error:</property>
|
||||
<attributes>
|
||||
<attribute name="style" value="italic"/>
|
||||
</attributes>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="tracebackScrolledWindow">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="vexpand">True</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<child>
|
||||
<object class="GtkTextView" id="tracebackView">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="vscroll_policy">natural</property>
|
||||
<property name="editable">False</property>
|
||||
<property name="cursor_visible">False</property>
|
||||
<property name="buffer">tracebackBuffer</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="bottomBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">6</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="warningLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="xalign">1</property>
|
||||
<property name="label" translatable="yes">'Debug' may take you to tty1.</property>
|
||||
<attributes>
|
||||
<attribute name="style" value="italic"/>
|
||||
<attribute name="scale" value="0.80000000000000004"/>
|
||||
</attributes>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="debugButton">
|
||||
<property name="label" translatable="yes">_Debug</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_underline">True</property>
|
||||
<signal name="clicked" handler="on_debug_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child type="label">
|
||||
<object class="GtkLabel" id="expanderLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">More _info...</property>
|
||||
<property name="use_underline">True</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkTextBuffer" id="tracebackBuffer">
|
||||
<property name="text" translatable="yes">No additional info available.</property>
|
||||
</object>
|
||||
</interface>
|
||||
Reference in New Issue
Block a user