diff --git a/.gitignore b/.gitignore index 778191d..6acbd49 100644 --- a/.gitignore +++ b/.gitignore @@ -113,3 +113,4 @@ /anaconda-27.19.tar.bz2 /anaconda-27.20.tar.bz2 /anaconda-27.20.1.tar.bz2 +/anaconda-27.20.2.tar.bz2 diff --git a/0001-Fix-catch-TUI-not-main-thread-exceptions.patch b/0001-Fix-catch-TUI-not-main-thread-exceptions.patch deleted file mode 100644 index 498a31c..0000000 --- a/0001-Fix-catch-TUI-not-main-thread-exceptions.patch +++ /dev/null @@ -1,176 +0,0 @@ -From 9271503c339b08b4cdb45e048bf73b75f6255752 Mon Sep 17 00:00:00 2001 -From: Jiri Konecny -Date: Fri, 1 Sep 2017 13:14:56 +0200 -Subject: [PATCH] Fix catch TUI not main thread exceptions - -Exception which are not in a main thread was passed to the hubQ which is -not used anymore in Simpleline. To resolve this issue, exceptions are -now enqueued as ExceptionSignal. ---- - anaconda.spec.in | 2 +- - pyanaconda/exception.py | 55 +++++++++++++++++++++++++++------------ - pyanaconda/ui/tui/hubs/summary.py | 2 +- - 3 files changed, 40 insertions(+), 19 deletions(-) - -diff --git a/anaconda.spec.in b/anaconda.spec.in -index 8d2048f95..9690c32a5 100644 ---- a/anaconda.spec.in -+++ b/anaconda.spec.in -@@ -40,7 +40,7 @@ Source0: %{name}-%{version}.tar.bz2 - %define pykickstartver 2.36-1 - %define pypartedver 2.5-2 - %define rpmver 4.10.0 --%define simplelinever 0.4-1 -+%define simplelinever 0.5-1 - %define utillinuxver 2.15.1 - - BuildRequires: audit-libs-devel -diff --git a/pyanaconda/exception.py b/pyanaconda/exception.py -index cf1f0b762..212ee7414 100644 ---- a/pyanaconda/exception.py -+++ b/pyanaconda/exception.py -@@ -17,28 +17,34 @@ - # You should have received a copy of the GNU General Public License - # along with this program. If not, see . - # --from meh import Config --from meh.handler import ExceptionHandler --from meh.dump import ReverseExceptionDump --from pyanaconda import iutil, kickstart --import sys -+import errno -+import glob -+import gi - import os -+import re - import shutil -+import sys - import time --import re --import errno --import glob - import traceback -+ - import blivet.errors --from pyanaconda.errors import NonInteractiveError --from pyanaconda.ui.communication import hubQ --from pyanaconda.constants import THREAD_EXCEPTION_HANDLING_TEST, IPMI_FAILED --from pyanaconda.threading import threadMgr --from pyanaconda.i18n import _ -+ -+from meh import Config -+from meh.dump import ReverseExceptionDump -+from meh.handler import ExceptionHandler -+ - from pyanaconda import flags -+from pyanaconda import iutil, kickstart - from pyanaconda import startup_utils -+from pyanaconda.constants import THREAD_EXCEPTION_HANDLING_TEST, IPMI_FAILED -+from pyanaconda.errors import NonInteractiveError -+from pyanaconda.i18n import _ -+from pyanaconda.threading import threadMgr -+from pyanaconda.ui.communication import hubQ -+ -+from simpleline import App -+from simpleline.event_loop.signals import ExceptionSignal - --import gi - gi.require_version("GLib", "2.0") - - from gi.repository import GLib -@@ -46,6 +52,7 @@ from gi.repository import GLib - from pyanaconda.anaconda_loggers import get_module_logger - log = get_module_logger(__name__) - -+ - class AnacondaReverseExceptionDump(ReverseExceptionDump): - - @property -@@ -70,6 +77,7 @@ class AnacondaReverseExceptionDump(ReverseExceptionDump): - else: - return "" - -+ - class AnacondaExceptionHandler(ExceptionHandler): - - def __init__(self, confObj, intfClass, exnClass, tty_num, gui_lock, interactive): -@@ -190,9 +198,16 @@ class AnacondaExceptionHandler(ExceptionHandler): - # data and let message handler run the exception handler in - # the main thread - exc_info = dump_info.exc_info -- hubQ.send_exception((exc_info.type, -- exc_info.value, -- exc_info.stack)) -+ # new Simpleline package is now used in TUI. Look if Simpleline is -+ # initialized or if this is some fallback from GTK or other stuff. -+ if App.is_initialized(): -+ # if Simpleline is initialized enqueue exception there -+ loop = App.get_event_loop() -+ loop.enqueue_signal(ExceptionSignal(App.get_scheduler(), exception_info=exc_info)) -+ else: -+ hubQ.send_exception((exc_info.type, -+ exc_info.value, -+ exc_info.stack)) - - def postWriteHook(self, dump_info): - anaconda = dump_info.object -@@ -243,6 +258,7 @@ class AnacondaExceptionHandler(ExceptionHandler): - and self._intf_tty_num != 1: - iutil.vtActivate(self._intf_tty_num) - -+ - def initExceptionHandling(anaconda): - file_list = ["/tmp/anaconda.log", "/tmp/packaging.log", - "/tmp/program.log", "/tmp/storage.log", "/tmp/ifcfg.log", -@@ -298,16 +314,19 @@ def initExceptionHandling(anaconda): - - return conf - -+ - def lsblk_callback(): - """Callback to get info about block devices.""" - - return iutil.execWithCapture("lsblk", ["--perms", "--fs", "--bytes"]) - -+ - def nmcli_dev_list_callback(): - """Callback to get info about network devices.""" - - return iutil.execWithCapture("nmcli", ["device", "show"]) - -+ - def journalctl_callback(): - """Callback to get logs from journalctl.""" - -@@ -322,6 +341,7 @@ def journalctl_callback(): - - return ret - -+ - def list_addons_callback(): - """ - Callback to get info about the addons potentially affecting Anaconda's -@@ -333,6 +353,7 @@ def list_addons_callback(): - addon_pkgs = glob.glob("/usr/share/anaconda/addons/*") - return ", ".join(addon.rsplit("/", 1)[1] for addon in addon_pkgs) - -+ - def test_exception_handling(): - """ - Function that can be used for testing exception handling in anaconda. It -diff --git a/pyanaconda/ui/tui/hubs/summary.py b/pyanaconda/ui/tui/hubs/summary.py -index 65459e043..1d8036439 100644 ---- a/pyanaconda/ui/tui/hubs/summary.py -+++ b/pyanaconda/ui/tui/hubs/summary.py -@@ -61,7 +61,7 @@ class SummaryHub(TUIHub): - sys.stdout.flush() - spokes = self._spokes.values() - while not all(spoke.ready for spoke in spokes): -- # Catch any asyncronous events (like storage crashing) -+ # Catch any asynchronous events (like storage crashing) - loop = App.get_event_loop() - loop.process_signals() - sys.stdout.write('.') --- -2.13.5 - diff --git a/0002-Make-EFIGRUB._efi_binary-a-property-not-a-method.patch b/0002-Make-EFIGRUB._efi_binary-a-property-not-a-method.patch deleted file mode 100644 index 0cc94cd..0000000 --- a/0002-Make-EFIGRUB._efi_binary-a-property-not-a-method.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 9325942789d69b0ec6876a93868d5a90b1893825 Mon Sep 17 00:00:00 2001 -From: Adam Williamson -Date: Wed, 6 Sep 2017 11:25:42 -0700 -Subject: [PATCH] Make EFIGRUB._efi_binary a property, not a method - -This was previously a class attribute and still is one for the -other classes, and the code that uses it treats it as such. So -for EFIGRUB we need to make it a property. Without this fix, -UEFI installs crash with "TypeError: must be str, not method". - -Signed-off-by: Adam Williamson ---- - pyanaconda/bootloader.py | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py -index 28b6cf9b2..e24dda11c 100644 ---- a/pyanaconda/bootloader.py -+++ b/pyanaconda/bootloader.py -@@ -1846,6 +1846,7 @@ class EFIGRUB(EFIBase, GRUB2): - if value == '32': - self._is_32bit_firmware = True - -+ @property - def _efi_binary(self): - if self._is_32bit_firmware: - return "\\shimia32.efi" --- -2.13.5 - diff --git a/0003-Don-t-setup-the-hub-twice-1491333.patch b/0003-Don-t-setup-the-hub-twice-1491333.patch deleted file mode 100644 index 4590fd1..0000000 --- a/0003-Don-t-setup-the-hub-twice-1491333.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 8e62087392d0bdfe3d119d07df5fea42a419edfb Mon Sep 17 00:00:00 2001 -From: Vendula Poncova -Date: Thu, 14 Sep 2017 13:40:54 +0200 -Subject: [PATCH] Don't setup the hub twice (#1491333) - -We need to make sure, that the simpleline's setup is called as well, -so simpleline will remember that the setup was already done. - -Resolves: rhbz#1491333 ---- - pyanaconda/ui/tui/hubs/__init__.py | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/pyanaconda/ui/tui/hubs/__init__.py b/pyanaconda/ui/tui/hubs/__init__.py -index 616b40bf6..90af386c3 100644 ---- a/pyanaconda/ui/tui/hubs/__init__.py -+++ b/pyanaconda/ui/tui/hubs/__init__.py -@@ -62,6 +62,7 @@ class TUIHub(TUIObject, common.Hub): - self.input_required = True - - def setup(self, args="anaconda"): -+ TUIObject.setup(self, args) - environment = args - cats_and_spokes = self._collectCategoriesAndSpokes() - categories = cats_and_spokes.keys() --- -2.13.5 - diff --git a/0004-Rename-processingDone-to-processing_done-variable.patch b/0004-Rename-processingDone-to-processing_done-variable.patch deleted file mode 100644 index c14aee4..0000000 --- a/0004-Rename-processingDone-to-processing_done-variable.patch +++ /dev/null @@ -1,33 +0,0 @@ -From f3b3a6ff6281c5cffd5c7a2b6b1d2bde0740999a Mon Sep 17 00:00:00 2001 -From: Jiri Konecny -Date: Thu, 21 Sep 2017 12:33:15 +0200 -Subject: [PATCH 1/3] Rename processingDone to processing_done variable - -Rename variable to move closer to pep8. ---- - pyanaconda/ui/tui/spokes/software_selection.py | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/pyanaconda/ui/tui/spokes/software_selection.py b/pyanaconda/ui/tui/spokes/software_selection.py -index 4fb30bba3..bb78b7560 100644 ---- a/pyanaconda/ui/tui/spokes/software_selection.py -+++ b/pyanaconda/ui/tui/spokes/software_selection.py -@@ -174,12 +174,12 @@ class SoftwareSpoke(NormalTUISpoke): - if the spoke starts a thread. It should make sure it doesn't access - things until they are completely setup. - """ -- processingDone = self.ready and not self.errors and self.txid_valid -+ processing_done = self.ready and not self.errors and self.txid_valid - - if flags.automatedInstall or self._kickstarted: -- return processingDone and self.payload.baseRepo and self.data.packages.seen -+ return processing_done and self.payload.baseRepo and self.data.packages.seen - else: -- return processingDone and self.payload.baseRepo and self.environment is not None -+ return processing_done and self.payload.baseRepo and self.environment is not None - - def refresh(self, args=None): - """ Refresh screen. """ --- -2.13.5 - diff --git a/0005-Fix-test-for-unset-TUI-software-environment-1491119.patch b/0005-Fix-test-for-unset-TUI-software-environment-1491119.patch deleted file mode 100644 index 3ed7771..0000000 --- a/0005-Fix-test-for-unset-TUI-software-environment-1491119.patch +++ /dev/null @@ -1,30 +0,0 @@ -From a31e9a41b3e48a325970933f0abddb5fc2021ee0 Mon Sep 17 00:00:00 2001 -From: Jiri Konecny -Date: Thu, 21 Sep 2017 18:10:53 +0200 -Subject: [PATCH 2/3] Fix test for unset TUI software environment (#1491119) - -The check was done as `if env:` problem is that `env` is a number. If -environment with index 0 was selected this condition went as no environment -selected. - -Related: rhbz#1491119 ---- - pyanaconda/ui/tui/spokes/software_selection.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/pyanaconda/ui/tui/spokes/software_selection.py b/pyanaconda/ui/tui/spokes/software_selection.py -index bb78b7560..90de9e3a1 100644 ---- a/pyanaconda/ui/tui/spokes/software_selection.py -+++ b/pyanaconda/ui/tui/spokes/software_selection.py -@@ -288,7 +288,7 @@ class SoftwareSpoke(NormalTUISpoke): - self.environment = self._selected_environment - self.addons = self._addons_selection if self.environment is not None else set() - -- if not self.environment: -+ if self.environment is None: - return - - changed = False --- -2.13.5 - diff --git a/0006-Fix-missing-id-to-name-environment-transition-149111.patch b/0006-Fix-missing-id-to-name-environment-transition-149111.patch deleted file mode 100644 index a123fd5..0000000 --- a/0006-Fix-missing-id-to-name-environment-transition-149111.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 6783da7587ec42687a21696bacd21b808df60f50 Mon Sep 17 00:00:00 2001 -From: Jiri Konecny -Date: Thu, 21 Sep 2017 13:14:46 +0200 -Subject: [PATCH 3/3] Fix missing id to name environment transition (#1491119) - -Regression from Anaconda to Simpleline migration. Return method for -transition environment id to name which was removed during migration. - -Resolves: rhbz#1491119 ---- - pyanaconda/ui/tui/spokes/software_selection.py | 19 ++++++++++++++----- - 1 file changed, 14 insertions(+), 5 deletions(-) - -diff --git a/pyanaconda/ui/tui/spokes/software_selection.py b/pyanaconda/ui/tui/spokes/software_selection.py -index 90de9e3a1..9d3aad0ce 100644 ---- a/pyanaconda/ui/tui/spokes/software_selection.py -+++ b/pyanaconda/ui/tui/spokes/software_selection.py -@@ -117,7 +117,16 @@ class SoftwareSpoke(NormalTUISpoke): - def _payload_error(self): - self.errors = [payloadMgr.error] - -- def _get_environment_id(self, environment): -+ def _translate_env_selection_to_name(self, selection): -+ """ Return the selected environment name or None. -+ Selection can be None during kickstart installation. -+ """ -+ if selection is not None: -+ return self.payload.environments[selection] -+ else: -+ return None -+ -+ def _translate_env_name_to_id(self, environment): - """ Return the id of the selected environment or None. """ - if environment is None: - return None -@@ -250,8 +259,8 @@ class SoftwareSpoke(NormalTUISpoke): - # The environment was selected, switch screen - elif args is None: - # Get addons for the selected environment -- environment = self._selected_environment -- environment_id = self._get_environment_id(environment) -+ environment = self._translate_env_selection_to_name(self._selected_environment) -+ environment_id = self._translate_env_name_to_id(environment) - addons = self._get_available_addons(environment_id) - - # Switch the screen -@@ -285,7 +294,7 @@ class SoftwareSpoke(NormalTUISpoke): - - def _apply(self): - """ Private apply. """ -- self.environment = self._selected_environment -+ self.environment = self._translate_env_selection_to_name(self._selected_environment) - self.addons = self._addons_selection if self.environment is not None else set() - - if self.environment is None: -@@ -305,7 +314,7 @@ class SoftwareSpoke(NormalTUISpoke): - self.data.packages.groupList = [] - self.payload.selectEnvironment(self.environment) - -- environment_id = self._get_environment_id(self.environment) -+ environment_id = self._translate_env_name_to_id(self.environment) - available_addons = self._get_available_addons(environment_id) - - for addon_id in available_addons: --- -2.13.5 - diff --git a/0007-Use-name-instead-of-index-in-TUI-env-selection-14952.patch b/0007-Use-name-instead-of-index-in-TUI-env-selection-14952.patch deleted file mode 100644 index eb7a6a0..0000000 --- a/0007-Use-name-instead-of-index-in-TUI-env-selection-14952.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 7406b1bfd8597a4320ba06791dea5bd1dc4261f4 Mon Sep 17 00:00:00 2001 -From: Jiri Konecny -Date: Tue, 26 Sep 2017 10:06:00 +0200 -Subject: [PATCH] Use name instead of index in TUI env selection (#1495204) - -The environment selection in TUI was in indexes and then converted -back. Remove this converting back and forth. - -Resolves: rhbz#1495204 ---- - pyanaconda/ui/tui/spokes/software_selection.py | 17 ++++------------- - 1 file changed, 4 insertions(+), 13 deletions(-) - -diff --git a/pyanaconda/ui/tui/spokes/software_selection.py b/pyanaconda/ui/tui/spokes/software_selection.py -index 9d3aad0ce..ae35838d0 100644 ---- a/pyanaconda/ui/tui/spokes/software_selection.py -+++ b/pyanaconda/ui/tui/spokes/software_selection.py -@@ -88,9 +88,9 @@ class SoftwareSpoke(NormalTUISpoke): - - if instclass and instclass.defaultPackageEnvironment and \ - instclass.defaultPackageEnvironment in environments: -- self._selected_environment = environments.index(instclass.defaultPackageEnvironment) -+ self._selected_environment = instclass.defaultPackageEnvironment - else: -- self._selected_environment = 0 -+ self._selected_environment = environments[0] - - # Apply the initial selection - self._apply() -@@ -117,15 +117,6 @@ class SoftwareSpoke(NormalTUISpoke): - def _payload_error(self): - self.errors = [payloadMgr.error] - -- def _translate_env_selection_to_name(self, selection): -- """ Return the selected environment name or None. -- Selection can be None during kickstart installation. -- """ -- if selection is not None: -- return self.payload.environments[selection] -- else: -- return None -- - def _translate_env_name_to_id(self, environment): - """ Return the id of the selected environment or None. """ - if environment is None: -@@ -259,7 +250,7 @@ class SoftwareSpoke(NormalTUISpoke): - # The environment was selected, switch screen - elif args is None: - # Get addons for the selected environment -- environment = self._translate_env_selection_to_name(self._selected_environment) -+ environment = self._selected_environment - environment_id = self._translate_env_name_to_id(environment) - addons = self._get_available_addons(environment_id) - -@@ -294,7 +285,7 @@ class SoftwareSpoke(NormalTUISpoke): - - def _apply(self): - """ Private apply. """ -- self.environment = self._translate_env_selection_to_name(self._selected_environment) -+ self.environment = self._selected_environment - self.addons = self._addons_selection if self.environment is not None else set() - - if self.environment is None: --- -2.13.5 - diff --git a/anaconda.spec b/anaconda.spec index 3be9032..b2dc973 100644 --- a/anaconda.spec +++ b/anaconda.spec @@ -2,8 +2,8 @@ Summary: Graphical system installer Name: anaconda -Version: 27.20.1 -Release: 6%{?dist} +Version: 27.20.2 +Release: 1%{?dist} License: GPLv2+ and MIT Group: Applications/System URL: http://fedoraproject.org/wiki/Anaconda @@ -15,23 +15,6 @@ URL: http://fedoraproject.org/wiki/Anaconda # make dist Source0: %{name}-%{version}.tar.bz2 -# Fix catch TUI not main thread exceptions (Fedora 27 Beta hotfix) -Patch0: 0001-Fix-catch-TUI-not-main-thread-exceptions.patch - -# Another UEFI booting fix (#1489144) -Patch1: 0002-Make-EFIGRUB._efi_binary-a-property-not-a-method.patch - -# Fix automatic installation issues (#1491333) -Patch2: 0003-Don-t-setup-the-hub-twice-1491333.patch - -# Fix missing environment translation (#1491119) -Patch3: 0004-Rename-processingDone-to-processing_done-variable.patch -Patch4: 0005-Fix-test-for-unset-TUI-software-environment-1491119.patch -Patch5: 0006-Fix-missing-id-to-name-environment-transition-149111.patch - -# Fix TUI environment selection -Patch6: 0007-Use-name-instead-of-index-in-TUI-env-selection-14952.patch - # Versions of required components (done so we make sure the buildrequires # match the requires versions of things). @@ -54,10 +37,10 @@ Patch6: 0007-Use-name-instead-of-index-in-TUI-env-selection-14952.patch %define mehver 0.23-1 %define nmver 1.0 %define partedver 1.8.1 -%define pykickstartver 2.36-1 +%define pykickstartver 2.39-1 %define pypartedver 2.5-2 %define rpmver 4.10.0 -%define simplelinever 0.5-1 +%define simplelinever 0.6-1 %define utillinuxver 2.15.1 BuildRequires: audit-libs-devel @@ -256,13 +239,6 @@ runtime on NFS/HTTP/FTP servers or local disks. %prep %setup -q -%patch0 -p1 -%patch1 -p1 -%patch2 -p1 -%patch3 -p1 -%patch4 -p1 -%patch5 -p1 -%patch6 -p1 %build %configure @@ -356,20 +332,46 @@ update-desktop-database &> /dev/null || : %{_prefix}/libexec/anaconda/dd_* %changelog -* Wed Sep 27 2017 Martin Kolman - 27.20.1-6 -- Use name instead of index in TUI env selection (#1495204) - -* Thu Sep 21 2017 Martin Kolman - 27.20.1-5 -- Fix missing enviromnent translation (#1491119) (jkonecny) - -* Mon Sep 18 2017 Martin Kolman - 27.20.1-4 +* Fri Sep 29 2017 Martin Kolman - 27.20.2-1 +- Use name instead of index in TUI env selection (#1495204) (jkonecny) +- Fix missing container in TUI source spoke (#1494801) (jkonecny) +- Add MOCK_EXTRA_ARGS to Makefile (jkonecny) +- tui source spoke: initialize nfs values when switching to nfs (rvykydal) +- Deselect encryption when switching to blivet-gui partitioning (vtrefny) +- Fix missing id to name environment transition (#1491119) (jkonecny) +- Fix test for unset TUI software environment (#1491119) (jkonecny) +- Rename processingDone to processing_done variable (jkonecny) +- network: add support for kickstart --bindto=mac for virtual devices + (#1328576) (rvykydal) +- network: support mac bound network settings as first class (#1328576) + (rvykydal) +- network: add support for kickstart --bindto=mac for wired devices (#1328576) + (rvykydal) - Don't setup the hub twice (#1491333) (vponcova) - -* Thu Sep 07 2017 Martin Kolman - 27.20.1-3 -- Make EFIGRUB._efi_binary a property, not a method (adamw) - -* Mon Sep 04 2017 Martin Kolman - 27.20.1-2 +- rpmostreepayload: Substitute ${basearch} in ostreesetup ref (walters) +- Bump Simpleline version (jkonecny) +- Perform repo checks only when there are checks available. (rvykydal) +- Add support for repo --metalink (GUI) (#1464843) (rvykydal) +- Add support for repo --metalink (kickstart, tui) (#1464843) (rvykydal) +- Make EFIGRUB._efi_binary a property, not a method (awilliam) +- Better storing logs from build and tests (jkonecny) +- Provide a default install class. (vponcova) +- Do not use hidden install classes. (vponcova) +- Make geolocation with kickstart possible (#1358331) (mkolman) +- Run python-meh as modal in TUI (jkonecny) +- Use GLib event loop in the simpleline (jkonecny) +- TUI progress reporting is handled by show_all (jkonecny) - Fix catch TUI not main thread exceptions (jkonecny) +- Add efi_dir to the BaseInstallClass (#1412391) (vponcova) +- Document Anaconda branching workflow (mkolman) +- Use constants for version number bumps and additions (mkolman) +- Fix closest mirror now needs network (jkonecny) +- Fix restart payload thread in Network spoke GUI (#1478970) (jkonecny) +- Network spoke freeze when testing availability (#1478970) (jkonecny) +- Add support for adding version numbers to makebumpver (mkolman) +- Add support for major version bump to makebumpver (mkolman) +- Fix proxy settings badly used when testing repos (#1478970) (jkonecny) +- Add inst.notmux option (dusty) * Tue Aug 29 2017 Martin Kolman - 27.20.1-1 - Remove the metacity theme. (vponcova) diff --git a/sources b/sources index ee70d5e..260b33a 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (anaconda-27.20.1.tar.bz2) = e25e1b6d15048926821e11ce334d24d832aef62468804e747beee56830cdf93cce026c3d8a3fd32f3a824cbbe6f09221dd6c0adde9e449f1e78c7c8605e45b78 +SHA512 (anaconda-27.20.2.tar.bz2) = 4b6136070f6d61839285b2baa50412826e561cb13f764a29432f9a481dc13770a32a57646f475290413d00a1b4d9efea32320e9e17690b72032cc2e7750fabc8