Compare commits

...
Sign in to create a new pull request.

68 commits

Author SHA1 Message Date
Python Maint
2cf7d6ba3c Rebuilt for Python 3.14.0rc3 bytecode 2025-09-19 12:12:45 +02:00
Python Maint
282fd74e1d Rebuilt for Python 3.14.0rc2 bytecode 2025-08-15 12:43:30 +02:00
Fedora Release Engineering
a69d2f09d3 Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild 2025-07-23 18:56:21 +00:00
Python Maint
947da2b33b Rebuilt for Python 3.14 2025-06-17 22:26:10 +02:00
Fedora Release Engineering
f5e95a1bd4 Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild 2025-01-16 15:04:44 +00:00
Fedora Release Engineering
748ce9ae53 Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild 2024-07-17 20:23:01 +00:00
Python Maint
b8d438811e Rebuilt for Python 3.13 2024-06-09 12:02:39 +02:00
Fedora Release Engineering
845d642445 Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild 2024-01-24 08:43:20 +00:00
Fedora Release Engineering
92f89794c5 Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild 2024-01-19 16:31:55 +00:00
Miro Hrončok
7b40be3694 Avoid "KeyError: material_name" crash
- Fixes: rhbz#2252195
2023-12-14 12:56:37 +01:00
Miro Hrončok
990dc29856 Update to 5.4.0 2023-12-06 15:51:11 +01:00
Miro Hrončok
472bb26a71 Remove old cruft 2023-12-06 14:44:42 +01:00
Miro Hrončok
751a621772 Convert to %autorelease and %autochangelog
[skip changelog]
2023-12-06 14:43:08 +01:00
Fedora Release Engineering
b9c94a084f Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2023-07-19 16:48:36 +00:00
Miro Hrončok
bab1ae39f8 Fix asserts for called once in Python 3.12 2023-07-11 00:40:03 +02:00
Python Maint
3a37cfa140 Rebuilt for Python 3.12 2023-07-09 15:48:43 +02:00
Tom Callaway
dc054568d2 5.3.0 2023-03-09 13:00:42 -05:00
Fedora Release Engineering
ff0725122d Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2023-01-19 00:50:10 +00:00
Miro Hrončok
c76efbe7de Use the default flags for Python in the shebang of /usr/bin/cura
Fixes: https://bugzilla.redhat.com/2117729
2022-08-22 16:40:51 +02:00
Fedora Release Engineering
16f012aa4c Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2022-07-20 23:53:57 +00:00
Miro Hrončok
12e0239599 https://fedoraproject.org/wiki/Changes/EncourageI686LeafRemoval 2022-07-18 14:44:55 +02:00
Python Maint
07a31e1799 Rebuilt for Python 3.11 2022-06-17 13:42:01 +02:00
Gabriel Féron
09e47bc370 Remove SentryLogger plugin to avoid error on startup 2022-02-03 13:08:04 +01:00
Gabriel Féron
74ff62b3b2 Update to 4.13.1 2022-02-03 13:08:03 +01:00
Gabriel Féron
abdc2ce137 Add missing epoch in changelog entries 2022-02-03 13:07:49 +01:00
Gabriel Féron
4a6409ff14 Update to 4.13.0 2022-02-03 13:07:29 +01:00
Fedora Release Engineering
05ce9a5d34 - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2022-01-20 00:08:09 +00:00
Gabriel Féron
18391ffb3e Python 3.10 int/float fix, GitHub issue #10785 2022-01-02 20:04:20 +01:00
Gabriel Féron
e95f254b57 Update to 4.12.1 2022-01-01 22:14:15 +01:00
Gabriel Féron
ce07b1dbb0 Update to 4.11.0 2021-09-16 00:00:50 +02:00
Gabriel Féron
2993aeb449 Update to 4.10.0 2021-08-16 12:38:45 +02:00
Fedora Release Engineering
2abcdf63da - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2021-07-21 20:15:09 +00:00
Gabriel Féron
2430502506 Update to 4.9.1 2021-06-10 15:58:30 +02:00
Miro Hrončok
bb3276905b Explicitly add runtime deps as BuildRequires to ensure testability 2021-06-07 12:27:50 +02:00
Python Maint
1fa95c9832 Rebuilt for Python 3.10 2021-06-04 20:02:29 +02:00
Gabriel Féron
2cdec4003a Update to 4.9.0 2021-05-10 10:47:12 +02:00
Miro Hrončok
94bb33e933 Adapt to Python 3.9 API changes 2021-03-22 10:45:58 +01:00
Fedora Release Engineering
a5d74a1ca9 - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2021-01-26 02:50:58 +00:00
Miro Hrončok
3422eeee2d Recommend trimesh and certifi 2020-12-28 17:14:35 +01:00
Jan Pazdziora
6bc9a5feda Update to 4.8.0 2020-12-22 22:41:00 +01:00
Miro Hrončok
32a2491950 Update to 4.7.1 2020-09-03 18:31:08 +02:00
Gabriel Féron
6a42513b70 Update to 4.7.0
Signed-off-by: Gabriel Féron <feron.gabriel@gmail.com>
2020-08-31 21:02:07 +02:00
Fedora Release Engineering
fb7b271181 - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2020-07-27 14:52:15 +00:00
Miro Hrončok
647bdbf101 Remove old compatibility cruft 2020-07-26 15:42:40 +02:00
Miro Hrončok
abfc7ec73f https://fedoraproject.org/wiki/Changes/CMake_to_do_out-of-source_builds 2020-07-26 15:35:12 +02:00
Miro Hrončok
7cedc9e7b8 Rebuilt for Python 3.9 2020-05-26 02:43:38 +02:00
Gabriel
996e9a9754 Update to 4.6.1 2020-05-05 18:53:04 +02:00
Gabriel
be0898d37d Update to 4.6.0 2020-04-21 23:46:05 +02:00
Fedora Release Engineering
8f025c8172 - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2020-01-28 15:10:52 +00:00
Gabriel Féron
56acf3b9dd Update to 4.4.0
- Remove CURA_SDK_VERSION CMake variable
- Force to run with X11 to workaround invisible window on Wayland
2019-12-10 14:33:18 +01:00
Gabriel Féron
5d729bfdc8
Revert "Update to 4.3.0"
This reverts commit ef0e243750.
2019-11-05 16:56:08 +01:00
Gabriel Féron
ef0e243750
Update to 4.3.0 2019-11-05 16:49:24 +01:00
Gabriel Féron
eeea163061 Revert "Update to 4.3.0"
This reverts commit 64441ed38cfbaf37c6f45f11e3fb39fab380767a.
2019-11-04 21:42:46 +01:00
Gabriel Féron
db33179ba5 Update to 4.3.0 2019-11-04 21:40:00 +01:00
Miro Hrončok
3754ebea90 Rebuilt for Python 3.8.0rc1 (#1748018) 2019-10-03 13:52:09 +02:00
Miro Hrončok
138ec5e585 Rebuilt for Python 3.8 2019-08-19 10:12:24 +02:00
Fedora Release Engineering
0a7a16146f - Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2019-07-24 21:21:08 +00:00
Gabriel Féron
6afb99cbbf Update to 4.1.0
Signed-off-by: Gabriel Féron <feron.gabriel@gmail.com>
2019-07-08 13:23:44 +02:00
Gabriel Féron
b76b9ad67b Update to 4.0.0
Signed-off-by: Gabriel Féron <feron.gabriel@gmail.com>
2019-04-19 14:27:29 +02:00
Fedora Release Engineering
3ebe158fae - Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2019-01-31 16:36:12 +00:00
Gabriel Feron
c48d6d9548 Update to 3.6.0
Signed-off-by: Gabriel Feron <feron.gabriel@gmail.com>
2019-01-29 18:38:57 +01:00
Miro Hrončok
e66c0fe8cc Update to 3.5.1 (#1644323) 2018-11-12 11:36:29 +01:00
Miro Hrončok
bbbab147a4 Update to 3.4.1 2018-08-28 16:22:03 +02:00
Miro Hrončok
b40f3741c6 Fix BRs 2018-08-23 17:08:13 +02:00
Fedora Release Engineering
c560bb3d0e - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2018-07-12 22:27:51 +00:00
Miro Hrončok
320efc24da Rebuilt for Python 3.7 2018-06-19 10:41:43 +02:00
Miro Hrončok
b86e7c0177 Bytecompile the plugins explicitly 2018-06-17 16:23:43 +02:00
Miro Hrončok
a508659f97 Update to 3.3.0 2018-05-02 16:09:43 +02:00
15 changed files with 1008 additions and 185 deletions

16
.gitignore vendored
View file

@ -1,15 +1 @@
/Cura-13.03-linux-fedora.tar.gz
/Cura-13.04-linux-fedora.tar.gz
/Cura-13.10-fedora.tar.gz
/Cura-13.11.2-fedora.tar.gz
/Cura-14.06-fedora.tar.gz
/Cura-14.09-fedora.tar.gz
/Cura-14.12.1-fedora.tar.gz
/Cura-15.02.1-fedora.tar.gz
/Cura-95c2af21db7fdda8c4324a923fa004859f6c5b9c-fedora.tar.gz
/cura-2.5.0.tar.gz
/cura-2.6.1.tar.gz
/cura-2.7.0.tar.gz
/cura-3.0.3.tar.gz
/cura-3.1.0.tar.gz
/cura-3.2.1.tar.gz
/cura-*.tar.gz

35
028e7f7.patch Normal file
View file

@ -0,0 +1,35 @@
From 028e7f7c4e6a2d3c93d179f4701111713c34cef3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gabriel=20F=C3=A9ron?= <g@leirbag.net>
Date: Wed, 2 Feb 2022 22:43:23 +0100
Subject: [PATCH] Remove SentryLogger
---
cura/CuraApplication.py | 3 ---
plugins/Cura-OctoPrintPlugin | 1 +
2 files changed, 1 insertion(+), 3 deletions(-)
create mode 160000 plugins/Cura-OctoPrintPlugin
diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py
index bf60da374b..146db339c9 100755
--- a/cura/CuraApplication.py
+++ b/cura/CuraApplication.py
@@ -782,9 +782,6 @@ class CuraApplication(QtApplication):
self._plugin_registry.addPluginLocation(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..", "plugins"))
self._plugin_registry.preloaded_plugins.append("ConsoleLogger")
- # Since it's possible to get crashes in code before the sentrylogger is loaded, we want to start this plugin
- # as quickly as possible, as we might get unsolvable crash reports without it.
- self._plugin_registry.preloaded_plugins.append("SentryLogger")
self._plugin_registry.loadPlugins()
if self.getBackend() is None:
diff --git a/plugins/Cura-OctoPrintPlugin b/plugins/Cura-OctoPrintPlugin
new file mode 160000
index 0000000000..7bd73946fb
--- /dev/null
+++ b/plugins/Cura-OctoPrintPlugin
@@ -0,0 +1 @@
+Subproject commit 7bd73946fbf22d18337dc900a81a011ece26bee0
--
2.34.1

117
16103.patch Normal file
View file

@ -0,0 +1,117 @@
From 5c8341ac6ad25ee8ffdf57d685565faf46c7319e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
Date: Tue, 11 Jul 2023 00:03:59 +0200
Subject: [PATCH 1/2] Fix asserts for called once in Python 3.12
E AttributeError: 'called_with' is not a valid assertion. Use a spec for the mock if 'called_with' is meant to be an attribute.
FAILED tests/TestOAuth2.py::test_refreshAccessTokenSuccess - AttributeError: ...
FAILED tests/TestOAuth2.py::test_refreshAccessTokenFailed - AttributeError: '...
FAILED tests/API/TestAccount.py::test_errorLoginState - AttributeError: 'call...
FAILED tests/Settings/TestCuraStackBuilder.py::test_createMachineWithUnknownDefinition
---
tests/API/TestAccount.py | 4 ++--
tests/Settings/TestCuraStackBuilder.py | 2 +-
tests/TestOAuth2.py | 4 ++--
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/tests/API/TestAccount.py b/tests/API/TestAccount.py
index 9d62646eff5..26da8d04cd1 100644
--- a/tests/API/TestAccount.py
+++ b/tests/API/TestAccount.py
@@ -80,12 +80,12 @@ def test_errorLoginState(application):
with patch("UM.TaskManagement.HttpRequestManager.HttpRequestManager.getInstance"): # Don't want triggers for account information to actually make HTTP requests.
account._onLoginStateChanged(True, "BLARG!")
# Even though we said that the login worked, it had an error message, so the login failed.
- account.loginStateChanged.emit.called_with(False)
+ account.loginStateChanged.emit.assert_called_with(False)
with patch("UM.TaskManagement.HttpRequestManager.HttpRequestManager.getInstance"):
account._onLoginStateChanged(True)
account._onLoginStateChanged(False, "OMGZOMG!")
- account.loginStateChanged.emit.called_with(False)
+ account.loginStateChanged.emit.assert_called_with(False)
def test_sync_success():
account = Account(MagicMock())
diff --git a/tests/Settings/TestCuraStackBuilder.py b/tests/Settings/TestCuraStackBuilder.py
index 6bd19a0d30d..9c40a327e85 100644
--- a/tests/Settings/TestCuraStackBuilder.py
+++ b/tests/Settings/TestCuraStackBuilder.py
@@ -52,7 +52,7 @@ def test_createMachineWithUnknownDefinition(application, container_registry):
with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value=application)):
with patch("UM.ConfigurationErrorMessage.ConfigurationErrorMessage.getInstance") as mocked_config_error:
assert CuraStackBuilder.createMachine("Whatever", "NOPE") is None
- assert mocked_config_error.addFaultyContainers.called_with("NOPE")
+ mocked_config_error.addFaultyContainers.assert_called_with("NOPE")
def test_createMachine(application, container_registry, definition_container, global_variant, material_instance_container,
diff --git a/tests/TestOAuth2.py b/tests/TestOAuth2.py
index 09fa555af43..cd281794f11 100644
--- a/tests/TestOAuth2.py
+++ b/tests/TestOAuth2.py
@@ -81,7 +81,7 @@ def test_refreshAccessTokenSuccess():
with patch.object(AuthorizationHelpers, "getAccessTokenUsingRefreshToken", return_value=SUCCESSFUL_AUTH_RESPONSE):
authorization_service.refreshAccessToken()
- assert authorization_service.onAuthStateChanged.emit.called_with(True)
+ authorization_service.onAuthStateChanged.emit.assert_called_with(True)
def test__parseJWTNoRefreshToken():
"""
@@ -190,7 +190,7 @@ def mock_refresh(self, refresh_token, callback): # Refreshing gives a valid tok
authorization_service.onAuthStateChanged.emit = MagicMock()
with patch("cura.OAuth2.AuthorizationHelpers.AuthorizationHelpers.getAccessTokenUsingRefreshToken", mock_refresh):
authorization_service.refreshAccessToken()
- assert authorization_service.onAuthStateChanged.emit.called_with(False)
+ authorization_service.onAuthStateChanged.emit.assert_called_with(False)
def test_refreshAccesTokenWithoutData():
authorization_service = AuthorizationService(OAUTH_SETTINGS, Preferences())
From b22602cdf604c46d316b6e6fba5e324f443c7a31 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
Date: Tue, 11 Jul 2023 00:04:46 +0200
Subject: [PATCH 2/2] Comment out a failing asserts
---
tests/Settings/TestCuraStackBuilder.py | 2 +-
tests/TestOAuth2.py | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/tests/Settings/TestCuraStackBuilder.py b/tests/Settings/TestCuraStackBuilder.py
index 9c40a327e85..7e13f730c1f 100644
--- a/tests/Settings/TestCuraStackBuilder.py
+++ b/tests/Settings/TestCuraStackBuilder.py
@@ -52,7 +52,7 @@ def test_createMachineWithUnknownDefinition(application, container_registry):
with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value=application)):
with patch("UM.ConfigurationErrorMessage.ConfigurationErrorMessage.getInstance") as mocked_config_error:
assert CuraStackBuilder.createMachine("Whatever", "NOPE") is None
- mocked_config_error.addFaultyContainers.assert_called_with("NOPE")
+ # mocked_config_error.addFaultyContainers.assert_called_with("NOPE") # this fails
def test_createMachine(application, container_registry, definition_container, global_variant, material_instance_container,
diff --git a/tests/TestOAuth2.py b/tests/TestOAuth2.py
index cd281794f11..78d9aee3ff4 100644
--- a/tests/TestOAuth2.py
+++ b/tests/TestOAuth2.py
@@ -81,7 +81,7 @@ def test_refreshAccessTokenSuccess():
with patch.object(AuthorizationHelpers, "getAccessTokenUsingRefreshToken", return_value=SUCCESSFUL_AUTH_RESPONSE):
authorization_service.refreshAccessToken()
- authorization_service.onAuthStateChanged.emit.assert_called_with(True)
+ # authorization_service.onAuthStateChanged.emit.assert_called_with(True) # this fails
def test__parseJWTNoRefreshToken():
"""
@@ -190,7 +190,7 @@ def mock_refresh(self, refresh_token, callback): # Refreshing gives a valid tok
authorization_service.onAuthStateChanged.emit = MagicMock()
with patch("cura.OAuth2.AuthorizationHelpers.AuthorizationHelpers.getAccessTokenUsingRefreshToken", mock_refresh):
authorization_service.refreshAccessToken()
- authorization_service.onAuthStateChanged.emit.assert_called_with(False)
+ # authorization_service.onAuthStateChanged.emit.assert_called_with(False) # this fails
def test_refreshAccesTokenWithoutData():
authorization_service = AuthorizationService(OAUTH_SETTINGS, Preferences())

36
17642.patch Normal file
View file

@ -0,0 +1,36 @@
From 1941fbe90be65ea6fab393bdfeed6a8bf30dbab8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
Date: Thu, 14 Dec 2023 12:52:26 +0100
Subject: [PATCH] Avoid "KeyError: material_name" crash in Fedora
Traceback (most recent call last):
File "/usr/lib/python3.11/site-packages/UM/Qt/ListModel.py", line 54, in data
return self._items[index.row()][self._role_names[role].decode("utf-8")]
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
KeyError: 'material_name'
Downstream report: https://bugzilla.redhat.com/show_bug.cgi?id=2252195
Community: https://community.ultimaker.com/topic/44538-cura-53-crashs-at-startup/
For reasons unknown, this crash does not happen with the AppImage.
Nevertheless, in 2baada8a70b15dd87948a25855e17d15b0ece58c
material_name was added as a role, not material_label.
Reaming the field in the sentinel extruder makes the crash go away.
---
cura/Machines/Models/ExtrudersModel.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cura/Machines/Models/ExtrudersModel.py b/cura/Machines/Models/ExtrudersModel.py
index 2677894bff2..f31f7c87178 100644
--- a/cura/Machines/Models/ExtrudersModel.py
+++ b/cura/Machines/Models/ExtrudersModel.py
@@ -227,7 +227,7 @@ def __updateExtruders(self):
"material_brand": "",
"color_name": "",
"material_type": "",
- "material_label": ""
+ "material_name": ""
}
items.append(item)
if self._items != items:

103
CMakeLists.txt Normal file
View file

@ -0,0 +1,103 @@
project(cura)
cmake_minimum_required(VERSION 3.6)
include(GNUInstallDirs)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
set(URANIUM_DIR "${CMAKE_SOURCE_DIR}/../Uranium" CACHE PATH "The location of the Uranium repository")
set(URANIUM_SCRIPTS_DIR "${URANIUM_DIR}/scripts" CACHE PATH "The location of the scripts directory of the Uranium repository")
# Tests
include(CuraTests)
option(CURA_DEBUGMODE "Enable debug dialog and other debug features" OFF)
if(CURA_DEBUGMODE)
set(_cura_debugmode "ON")
endif()
option(GENERATE_TRANSLATIONS "Should the translations be generated?" ON)
set(CURA_APP_NAME "cura" CACHE STRING "Short name of Cura, used for configuration folder")
set(CURA_APP_DISPLAY_NAME "Ultimaker Cura" CACHE STRING "Display name of Cura")
set(CURA_VERSION "master" CACHE STRING "Version name of Cura")
set(CURA_BUILDTYPE "" CACHE STRING "Build type of Cura, eg. 'PPA'")
set(CURA_CLOUD_API_ROOT "" CACHE STRING "Alternative Cura cloud API root")
set(CURA_CLOUD_API_VERSION "" CACHE STRING "Alternative Cura cloud API version")
set(CURA_CLOUD_ACCOUNT_API_ROOT "" CACHE STRING "Alternative Cura cloud account API version")
set(CURA_MARKETPLACE_ROOT "" CACHE STRING "Alternative Marketplace location")
set(CURA_DIGITAL_FACTORY_URL "" CACHE STRING "Alternative Digital Factory location")
configure_file(${CMAKE_SOURCE_DIR}/com.ultimaker.cura.desktop.in ${CMAKE_BINARY_DIR}/com.ultimaker.cura.desktop @ONLY)
configure_file(cura/CuraVersion.py.in CuraVersion.py @ONLY)
# FIXME: The new FindPython3 finds the system's Python3.6 rather than the Python3.5 that we built for Cura's environment.
# So we're using the old method here, with FindPythonInterp for now.
find_package(PythonInterp 3 REQUIRED)
set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE})
set(Python3_VERSION ${PYTHON_VERSION_STRING})
set(Python3_VERSION_MAJOR ${PYTHON_VERSION_MAJOR})
set(Python3_VERSION_MINOR ${PYTHON_VERSION_MINOR})
set(Python3_VERSION_PATCH ${PYTHON_VERSION_PATCH})
if(NOT ${URANIUM_DIR} STREQUAL "")
set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${URANIUM_DIR}/cmake")
endif()
if(NOT ${URANIUM_SCRIPTS_DIR} STREQUAL "")
list(APPEND CMAKE_MODULE_PATH ${URANIUM_DIR}/cmake)
include(UraniumTranslationTools)
# Extract Strings
add_custom_target(extract-messages ${URANIUM_SCRIPTS_DIR}/extract-messages ${CMAKE_SOURCE_DIR} cura)
# Build Translations
if(${GENERATE_TRANSLATIONS})
CREATE_TRANSLATION_TARGETS()
endif()
endif()
install(DIRECTORY resources
DESTINATION ${CMAKE_INSTALL_DATADIR}/cura)
include(CuraPluginInstall)
if(NOT APPLE AND NOT WIN32)
install(FILES cura_app.py
DESTINATION ${CMAKE_INSTALL_BINDIR}
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
RENAME cura)
if(EXISTS /etc/debian_version)
install(DIRECTORY cura
DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}/dist-packages
FILES_MATCHING PATTERN *.py)
install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py
DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}/dist-packages/cura)
else()
install(DIRECTORY cura
DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}/site-packages
FILES_MATCHING PATTERN *.py)
install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py
DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}/site-packages/cura)
endif()
install(FILES ${CMAKE_BINARY_DIR}/com.ultimaker.cura.desktop
DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
install(FILES ${CMAKE_SOURCE_DIR}/resources/images/cura-icon.png
DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/128x128/apps/)
install(FILES com.ultimaker.cura.appdata.xml
DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo)
install(FILES cura.sharedmimeinfo
DESTINATION ${CMAKE_INSTALL_DATADIR}/mime/packages/
RENAME cura.xml )
else()
install(FILES cura_app.py
DESTINATION ${CMAKE_INSTALL_BINDIR}
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
install(DIRECTORY cura
DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}/site-packages
FILES_MATCHING PATTERN *.py)
install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py
DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}/site-packages/cura)
endif()

105
CuraPluginInstall.cmake Normal file
View file

@ -0,0 +1,105 @@
# Copyright (c) 2019 Ultimaker B.V.
# CuraPluginInstall.cmake is released under the terms of the LGPLv3 or higher.
#
# This module detects all plugins that need to be installed and adds them using the CMake install() command.
# It detects all plugin folder in the path "plugins/*" where there's a "plugin.json" in it.
#
# Plugins can be configured to NOT BE INSTALLED via the variable "CURA_NO_INSTALL_PLUGINS" as a list of string in the
# form of "a;b;c" or "a,b,c". By default all plugins will be installed.
#
option(PRINT_PLUGIN_LIST "Should the list of plugins that are installed be printed?" ON)
# FIXME: Remove the code for CMake <3.12 once we have switched over completely.
# FindPython3 is a new module since CMake 3.12. It deprecates FindPythonInterp and FindPythonLibs. The FindPython3
# module is copied from the CMake repository here so in CMake <3.12 we can still use it.
if(${CMAKE_VERSION} VERSION_LESS 3.12)
# Use FindPythonInterp and FindPythonLibs for CMake <3.12
find_package(PythonInterp 3 REQUIRED)
set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE})
else()
# Use FindPython3 for CMake >=3.12
find_package(Python3 REQUIRED COMPONENTS Interpreter)
endif()
# Options or configuration variables
set(CURA_NO_INSTALL_PLUGINS "" CACHE STRING "A list of plugins that should not be installed, separated with ';' or ','.")
file(GLOB_RECURSE _plugin_json_list ${CMAKE_SOURCE_DIR}/plugins/*/plugin.json)
list(LENGTH _plugin_json_list _plugin_json_list_len)
# Sort the lists alphabetically so we can handle cases like this:
# - plugins/my_plugin/plugin.json
# - plugins/my_plugin/my_module/plugin.json
# In this case, only "plugins/my_plugin" should be added via install().
set(_no_install_plugin_list ${CURA_NO_INSTALL_PLUGINS})
# Sanitize the string so the comparison will be case-insensitive.
string(STRIP "${_no_install_plugin_list}" _no_install_plugin_list)
string(TOLOWER "${_no_install_plugin_list}" _no_install_plugin_list)
# WORKAROUND counterpart of what's in cura-build.
string(REPLACE "," ";" _no_install_plugin_list "${_no_install_plugin_list}")
list(LENGTH _no_install_plugin_list _no_install_plugin_list_len)
if(_no_install_plugin_list_len GREATER 0)
list(SORT _no_install_plugin_list)
endif()
if(_plugin_json_list_len GREATER 0)
list(SORT _plugin_json_list)
endif()
# Check all plugin directories and add them via install() if needed.
set(_install_plugin_list "")
foreach(_plugin_json_path ${_plugin_json_list})
get_filename_component(_plugin_dir ${_plugin_json_path} DIRECTORY)
file(RELATIVE_PATH _rel_plugin_dir ${CMAKE_CURRENT_SOURCE_DIR} ${_plugin_dir})
get_filename_component(_plugin_dir_name ${_plugin_dir} NAME)
# Make plugin name comparison case-insensitive
string(TOLOWER "${_plugin_dir_name}" _plugin_dir_name_lowercase)
# Check if this plugin needs to be skipped for installation
set(_add_plugin ON) # Indicates if this plugin should be added to the build or not.
set(_is_no_install_plugin OFF) # If this plugin will not be added, this indicates if it's because the plugin is
# specified in the NO_INSTALL_PLUGINS list.
if(_no_install_plugin_list)
if("${_plugin_dir_name_lowercase}" IN_LIST _no_install_plugin_list)
set(_add_plugin OFF)
set(_is_no_install_plugin ON)
endif()
endif()
# Make sure this is not a subdirectory in a plugin that's already in the install list
if(_add_plugin)
foreach(_known_install_plugin_dir ${_install_plugin_list})
if(_plugin_dir MATCHES "${_known_install_plugin_dir}.+")
set(_add_plugin OFF)
break()
endif()
endforeach()
endif()
if(_add_plugin)
if(${PRINT_PLUGIN_LIST})
message(STATUS "[+] PLUGIN TO INSTALL: ${_rel_plugin_dir}")
endif()
get_filename_component(_rel_plugin_parent_dir ${_rel_plugin_dir} DIRECTORY)
install(DIRECTORY ${_rel_plugin_dir}
DESTINATION lib${LIB_SUFFIX}/cura/${_rel_plugin_parent_dir}
PATTERN "__pycache__" EXCLUDE
PATTERN "*.qmlc" EXCLUDE
)
list(APPEND _install_plugin_list ${_plugin_dir})
elseif(_is_no_install_plugin)
if(${PRINT_PLUGIN_LIST})
message(STATUS "[-] PLUGIN TO REMOVE : ${_rel_plugin_dir}")
endif()
execute_process(COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/mod_bundled_packages_json.py
-d ${CMAKE_CURRENT_SOURCE_DIR}/resources/bundled_packages
${_plugin_dir_name}
RESULT_VARIABLE _mod_json_result)
endif()
endforeach()

83
CuraTests.cmake Normal file
View file

@ -0,0 +1,83 @@
# Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
include(CTest)
include(CMakeParseArguments)
# FIXME: The new FindPython3 finds the system's Python3.6 rather than the Python3.5 that we built for Cura's environment.
# So we're using the old method here, with FindPythonInterp for now.
find_package(PythonInterp 3 REQUIRED)
set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE})
add_custom_target(test-verbose COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
function(cura_add_test)
set(_single_args NAME DIRECTORY PYTHONPATH)
cmake_parse_arguments("" "" "${_single_args}" "" ${ARGN})
if(NOT _NAME)
message(FATAL_ERROR "cura_add_test requires a test name argument")
endif()
if(NOT _DIRECTORY)
message(FATAL_ERROR "cura_add_test requires a directory to test")
endif()
if(NOT _PYTHONPATH)
set(_PYTHONPATH ${_DIRECTORY})
endif()
if(WIN32)
string(REPLACE "|" "\\;" _PYTHONPATH ${_PYTHONPATH})
set(_PYTHONPATH "${_PYTHONPATH}\\;$ENV{PYTHONPATH}")
else()
string(REPLACE "|" ":" _PYTHONPATH ${_PYTHONPATH})
set(_PYTHONPATH "${_PYTHONPATH}:$ENV{PYTHONPATH}")
endif()
get_test_property(${_NAME} ENVIRONMENT test_exists) #Find out if the test exists by getting a property from it that always exists (such as ENVIRONMENT because we set that ourselves).
if (NOT ${test_exists})
add_test(
NAME ${_NAME}
COMMAND ${Python3_EXECUTABLE} -m pytest --junitxml=${CMAKE_BINARY_DIR}/junit-${_NAME}.xml ${_DIRECTORY}
)
set_tests_properties(${_NAME} PROPERTIES ENVIRONMENT LANG=C)
set_tests_properties(${_NAME} PROPERTIES ENVIRONMENT "PYTHONPATH=${_PYTHONPATH}")
else()
message(WARNING "Duplicate test ${_NAME}!")
endif()
endfunction()
#Add code style test.
add_test(
NAME "code-style"
COMMAND ${Python3_EXECUTABLE} run_mypy.py
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)
#Add test for import statements which are not compatible with all builds
add_test(
NAME "invalid-imports"
COMMAND ${Python3_EXECUTABLE} scripts/check_invalid_imports.py
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)
cura_add_test(NAME pytest-main DIRECTORY ${CMAKE_SOURCE_DIR}/tests PYTHONPATH "${CMAKE_SOURCE_DIR}|${URANIUM_DIR}")
file(GLOB_RECURSE _plugins plugins/*/__init__.py)
foreach(_plugin ${_plugins})
get_filename_component(_plugin_directory ${_plugin} DIRECTORY)
if(EXISTS ${_plugin_directory}/tests)
get_filename_component(_plugin_name ${_plugin_directory} NAME)
cura_add_test(NAME pytest-${_plugin_name} DIRECTORY ${_plugin_directory} PYTHONPATH "${_plugin_directory}|${CMAKE_SOURCE_DIR}|${URANIUM_DIR}")
endif()
endforeach()
#Add test for whether the shortcut alt-keys are unique in every translation.
add_test(
NAME "shortcut-keys"
COMMAND ${Python3_EXECUTABLE} scripts/check_shortcut_keys.py
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)

14
CuraVersion.py.in Normal file
View file

@ -0,0 +1,14 @@
# Copyright (c) 2022 Ultimaker
# Cura is released under the terms of the LGPLv3 or higher.
CuraAppName = "@CURA_APP_NAME@"
CuraAppDisplayName = "@CURA_APP_DISPLAY_NAME@"
CuraVersion = "@CURA_VERSION@"
CuraBuildType = "@CURA_BUILDTYPE@"
CuraDebugMode = True if "@_cura_debugmode@" == "ON" else False
CuraCloudAPIRoot = "@CURA_CLOUD_API_ROOT@"
CuraCloudAPIVersion = "@CURA_CLOUD_API_VERSION@"
CuraCloudAccountAPIRoot = "@CURA_CLOUD_ACCOUNT_API_ROOT@"
CuraMarketplaceRoot = "@CURA_MARKETPLACE_ROOT@"
CuraDigitalFactoryURL = "@CURA_DIGITAL_FACTORY_URL@"
CuraLatestURL = "@CURA_LATEST_URL@"

22
aad4180.patch Normal file
View file

@ -0,0 +1,22 @@
From aad41807c365ccef001b787407d7dc756e11de02 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gabriel=20F=C3=A9ron?= <g@leirbag.net>
Date: Tue, 11 Jan 2022 20:28:41 +0100
Subject: [PATCH] Remove unused import of sentry_sdk
---
cura/CrashHandler.py | 2 --
1 file changed, 2 deletions(-)
diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py
index c911a423504..35e9aa832be 100644
--- a/cura/CrashHandler.py
+++ b/cura/CrashHandler.py
@@ -12,8 +12,6 @@
import locale
from typing import cast, Any
-import sentry_sdk
-
try:
from sentry_sdk.hub import Hub
from sentry_sdk.utils import event_from_exception

272
changelog Normal file
View file

@ -0,0 +1,272 @@
* Wed Jul 19 2023 Fedora Release Engineering <releng@fedoraproject.org> - 1:5.3.0-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Sun Jul 09 2023 Python Maint <python-maint@redhat.com> - 1:5.3.0-2
- Rebuilt for Python 3.12
* Thu Mar 9 2023 Tom Callaway <spot@fedoraproject.org> - 1:5.3.0-1
- update to 5.3.0
* Thu Jan 19 2023 Fedora Release Engineering <releng@fedoraproject.org> - 1:4.13.1-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
* Mon Aug 22 2022 Miro Hrončok <mhroncok@redhat.com> - 1:4.13.1-5
- Use the default flags for Python in the shebang of /usr/bin/cura
- Fixes: rhbz#2117729
* Wed Jul 20 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1:4.13.1-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
* Fri Jun 17 2022 Python Maint <python-maint@redhat.com> - 1:4.13.1-3
- Rebuilt for Python 3.11
* Wed Feb 02 2022 Gabriel Féron <feron.gabriel@gmail.com> - 1:4.13.1-2
- Fix error loading SentryLogger plugin
* Tue Feb 01 2022 Gabriel Féron <feron.gabriel@gmail.com> - 1:4.13.1-1
- Update to 4.13.1
* Thu Jan 20 2022 Gabriel Féron <feron.gabriel@gmail.com> - 1:4.13.0-1
- Update to 4.13.0
* Thu Jan 20 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1:4.12.1-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
* Sun Jan 02 2022 Gabriel Féron <feron.gabriel@gmail.com> - 1:4.12.1-2
- Backport fix for Python 3.10
* Mon Dec 13 2021 Gabriel Féron <feron.gabriel@gmail.com> - 1:4.12.1-1
- Update to 4.12.1
* Mon Aug 16 2021 Gabriel Féron <feron.gabriel@gmail.com> - 1:4.10.0-1
- Update to 4.10.0
* Wed Jul 21 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1:4.9.1-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
* Thu Jun 10 2021 Gabriel Féron <feron.gabriel@gmail.com> - 1:4.9.1-1
- Update to 4.9.1
* Fri Jun 04 2021 Python Maint <python-maint@redhat.com> - 1:4.9.0-2
- Rebuilt for Python 3.10
* Mon Apr 26 2021 Gabriel Féron <feron.gabriel@gmail.com> - 1:4.9.0-1
- Update to 4.9.0
* Mon Mar 22 2021 Miro Hrončok <mhroncok@redhat.com> - 1:4.8.0-3
- Adapt to Python 3.9 API changes
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1:4.8.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Tue Dec 22 2020 Jan Pazdziora <jpazdziora@redhat.com> - 1:4.8.0-1
- Update to 4.8.0
- Recommend trimesh and certifi
* Thu Sep 03 2020 Miro Hrončok <mhroncok@redhat.com> - 1:4.7.1-1
- Update to 4.7.1
* Mon Aug 31 2020 Gabriel Féron <feron.gabriel@gmail.com> - 1:4.7.0-1
- Update to 4.7.0
* Mon Jul 27 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1:4.6.1-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Tue May 26 2020 Miro Hrončok <mhroncok@redhat.com> - 1:4.6.1-2
- Rebuilt for Python 3.9
* Tue May 5 2020 Gabriel Féron <feron.gabriel@gmail.com> - 1:4.6.0-1
- Update to 4.6.1
* Tue Apr 21 2020 Gabriel Féron <feron.gabriel@gmail.com> - 1:4.6.0-1
- Update to 4.6.0
* Tue Jan 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1:4.4.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
* Thu Nov 21 2019 Gabriel Féron <feron.gabriel@gmail.com> - 1:4.4.0-1
- Update to 4.4.0
- Force X11 to workaround invisible window on Wayland
* Thu Oct 03 2019 Miro Hrončok <mhroncok@redhat.com> - 1:4.1.0-4
- Rebuilt for Python 3.8.0rc1 (#1748018)
* Mon Aug 19 2019 Miro Hrončok <mhroncok@redhat.com> - 1:4.1.0-3
- Rebuilt for Python 3.8
* Wed Jul 24 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1:4.1.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Tue Jun 18 2019 Gabriel Féron <feron.gabriel@gmail.com> - 1:4.1.0-1
- Update to 4.1.0
* Thu Apr 04 2019 Gabriel Féron <feron.gabriel@gmail.com> - 1:4.0.0-1
- Update to 4.0.0
* Thu Jan 31 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.6.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
* Sat Jan 26 2019 Gabriel Féron <feron.gabriel@gmail.com> - 1:3.6.0-1
- Update to 3.6.0
* Mon Nov 12 2018 Miro Hrončok <mhroncok@redhat.com> - 1:3.5.1-1
- Update to 3.5.1 (#1644323)
* Tue Aug 28 2018 Miro Hrončok <mhroncok@redhat.com> - 1:3.4.1-1
- Update to 3.4.1
* Thu Jul 12 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.3.0-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
* Tue Jun 19 2018 Miro Hrončok <mhroncok@redhat.com> - 1:3.3.0-3
- Rebuilt for Python 3.7
* Sun Jun 17 2018 Miro Hrončok <mhroncok@redhat.com> - 1:3.3.0-2
- Bytecompile the plugins explicitly
* Wed May 02 2018 Miro Hrončok <mhroncok@redhat.com> - 1:3.3.0-1
- Update to 3.3.0
- Enable test_getPropertyFallThrough again
* Wed Mar 21 2018 Miro Hrončok <mhroncok@redhat.com> - 1:3.2.1-2
- Require qt5-qtquickcontrols2 in addition to qt5-qtquickcontrols
* Tue Mar 20 2018 Miro Hrončok <mhroncok@redhat.com> - 1:3.2.1-1
- Update to 3.2.1
- Force install to /usr/lib and keep this noarch
- Change the set of skipped tests
* Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.1.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
* Sun Dec 10 2017 Miro Hrončok <mhroncok@redhat.com> - 1:3.1.0-1
- Update to 3.1.0
- Disable most of the tests
- No longer needs to sed out dist-packages
- Move appdata to metainfo
* Mon Dec 04 2017 Miro Hrončok <mhroncok@redhat.com> - 1:3.0.3-5
- Mark the package with correct license
* Sun Dec 03 2017 Miro Hrončok <mhroncok@redhat.com> - 1:3.0.3-4
- Also apply the nvidia driver workaround on Fedora (#1520138)
* Tue Nov 21 2017 Miro Hrončok <mhroncok@redhat.com> - 1:3.0.3-3
- Require libglvnd-devel as a workaround for #1494278
* Fri Oct 27 2017 Miro Hrončok <mhroncok@redhat.com> - 1:3.0.3-2
- Add upstream commit to fix tests
* Mon Oct 23 2017 Miro Hrončok <mhroncok@redhat.com> - 1:3.0.3-1
- Update to 3.0.3
- Remove locale and desktop file changes (fixed upstream)
* Wed Aug 30 2017 Miro Hrončok <mhroncok@redhat.com> - 1:2.7.0-2
- Relocate Japanese locale to ja
* Wed Aug 30 2017 Miro Hrončok <mhroncok@redhat.com> - 1:2.7.0-1
- Update to 2.7.0
* Wed Jul 26 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.6.1-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
* Thu Jul 20 2017 Miro Hrončok <mhroncok@redhat.com> - 1:2.6.1-2
- Require cura-fdm-materials
* Wed Jun 28 2017 Miro Hrončok <mhroncok@redhat.com> - 1:2.6.1-1
- Updated to 2.6.1
* Wed May 10 2017 Miro Hrončok <mhroncok@redhat.com> - 1:2.5.0-2
- Require qt5-qtquickcontrols
* Wed May 03 2017 Miro Hrončok <mhroncok@redhat.com> - 1:2.5.0-1
- Update to modern Cura 2.x (introduce Epoch) (#1393176)
* Fri Feb 10 2017 Fedora Release Engineering <releng@fedoraproject.org> - 15.04.4-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
* Thu Nov 03 2016 Miro Hrončok <mhroncok@redhat.com> - 15.04.4-5
- Explicitly run cura on X11 GDK backend (#1388953)
* Tue Jul 19 2016 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 15.04.4-4
- https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_Packages
* Fri Mar 25 2016 Miro Hrončok <mhroncok@redhat.com> - 15.04.4-3
- Require 3dprinter-udev-rules
* Wed Feb 03 2016 Fedora Release Engineering <releng@fedoraproject.org> - 15.04.4-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
* Sat Jan 30 2016 Miro Hrončok <mhroncok@redhat.com> - 15.04.4-1
- New version
* Wed Jul 08 2015 Miro Hrončok <mhroncok@redhat.com> - 15.02.1-4
- No longer depend on pypy
- Simplify the launcher
* Mon Jul 06 2015 Miro Hrončok <mhroncok@redhat.com> - 15.02.1-3
- Patch for #1230281
* Mon Jul 06 2015 Miro Hrončok <mhroncok@redhat.com> - 15.02.1-2
- Require latest CuraEngine
* Mon Jul 06 2015 Miro Hrončok <mhroncok@redhat.com> - 15.02.1-1
- Update to 15.02.1
* Wed Jun 17 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 14.12.1-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
* Fri May 29 2015 Miro Hrončok <mhroncok@redhat.com> - 14.12.1-4
- Patch: Open directories with xdg-open (#1217961)
* Mon Apr 20 2015 Miro Hrončok <mhroncok@redhat.com> - 14.12.1-3
- Handle files from the command line (#1213220)
* Mon Mar 30 2015 Miro Hrončok <mhroncok@redhat.com> - 14.12.1-2
- Update the no firmware patch according to communication with Cura upstream
* Mon Dec 29 2014 Miro Hrončok <mhroncok@redhat.com> - 14.12.1-1
- Updated to 14.12.1
- No longer depend on firmware
* Sat Oct 25 2014 Miro Hrončok <mhroncok@redhat.com> - 14.09-1
- New version 14.09
* Tue Jun 24 2014 Miro Hrončok <mhroncok@redhat.com> - 14.06-2
- Require at least the firmware version originally bundled in git
* Mon Jun 23 2014 Miro Hrončok <mhroncok@redhat.com> - 14.06-1
- New version 14.06
* Sat Jun 07 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 13.11.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
* Sat Dec 14 2013 Miro Hrončok <mhroncok@redhat.com> - 13.11.2-1
- New version 13.11.2
* Wed Oct 16 2013 Miro Hrončok <mhroncok@redhat.com> - 13.10-1
- New upstream release with CuraEngine
* Sat Aug 03 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 13.04-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
* Tue May 07 2013 Miro Hrončok <mhroncok@redhat.com> - 13.04-2
- Remove resources directory before trying to create a symlink there
* Sat May 04 2013 Miro Hrončok <mhroncok@redhat.com> - 13.04-1
- New upstream release
- Fixed missing slice module
* Sat Apr 20 2013 Miro Hrončok <mhroncok@redhat.com> - 13.03-1
- New upstream release
* Tue Feb 19 2013 Miro Hrončok <mhroncok@redhat.com> - 12.12-3
- chmod 755 cura-stripper.sh
- Use firmware from ultimaker-marlin-firmware package
- removed bundling note
* Sun Jan 20 2013 Miro Hrončok <mhroncok@redhat.com> - 12.12-2
- Launcher is in Python now
* Sun Jan 13 2013 Miro Hrončok <mhroncok@redhat.com> - 12.12-1
- First version

View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2016 Richard Hughes <richard@hughsie.com> -->
<component type="desktop">
<id>com.ultimaker.cura.desktop</id>
<metadata_license>CC0-1.0</metadata_license>
<project_license>LGPL-3.0 and CC-BY-SA-4.0</project_license>
<name>Cura</name>
<summary>The world's most advanced 3d printer software</summary>
<description>
<p>
Cura creates a seamless integration between hardware, software and
materials for the best 3D printing experience around.
Cura supports the 3MF, OBJ and STL file formats and is available on
Windows, Mac and Linux.
</p>
<ul>
<li>Novices can start printing right away</li>
<li>Experts are able to customize 300 settings to achieve the best results</li>
<li>Optimized profiles for Ultimaker materials</li>
<li>Supported by a global network of Ultimaker certified service partners</li>
<li>Print multiple objects at once with different settings for each object</li>
<li>Cura supports STL, 3MF and OBJ file formats</li>
<li>Open source and completely free</li>
</ul>
</description>
<screenshots>
<screenshot type="default">
<image>https://raw.githubusercontent.com/Ultimaker/Cura/master/screenshot.png</image>
</screenshot>
</screenshots>
<url type="homepage">https://ultimaker.com/software/ultimaker-cura?utm_source=cura&amp;utm_medium=software&amp;utm_campaign=cura-update-linux</url>
<translation type="gettext">Cura</translation>
</component>

View file

@ -0,0 +1,19 @@
[Desktop Entry]
Name=Ultimaker Cura
Name[de]=Ultimaker Cura
Name[nl]=Ultimaker Cura
GenericName=3D Printing Software
GenericName[de]=3D-Druck-Software
GenericName[nl]=3D-printsoftware
Comment=Cura converts 3D models into paths for a 3D printer. It prepares your print for maximum accuracy, minimum printing time and good reliability with many extra features that make your print come out great.
Comment[de]=Cura wandelt 3D-Modelle in Pfade für einen 3D-Drucker um. Es bereitet Ihren Druck für maximale Genauigkeit, minimale Druckzeit und guter Zuverlässigkeit mit vielen zusätzlichen Funktionen vor, damit Ihr Druck großartig wird.
Comment[nl]=Cura converteert 3D-modellen naar paden voor een 3D printer. Het bereidt je print voor om zeer precies, snel en betrouwbaar te kunnen printen, met veel extra functionaliteit om je print er goed uit te laten komen.
Exec=@CMAKE_INSTALL_FULL_BINDIR@/cura %F
TryExec=@CMAKE_INSTALL_FULL_BINDIR@/cura
Icon=cura-icon
Terminal=false
Type=Application
MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;image/bmp;image/gif;image/jpeg;image/png;text/x-gcode;application/x-amf;application/x-ply;application/x-ctm;model/vnd.collada+xml;model/gltf-binary;model/gltf+json;model/vnd.collada+xml+zip;
Categories=Graphics;
Keywords=3D;Printing;Slicer;
StartupWMClass=cura.real

263
cura.spec
View file

@ -1,39 +1,74 @@
%global major_minor_version 5.4
%global patch_version 0
Name: cura
Epoch: 1
Version: 3.2.1
Release: 2%{?dist}
Summary: 3D printer control software
Version: %{major_minor_version}.%{patch_version}
Release: %autorelease
Summary: 3D printer / slicing GUI
# https://lists.fedoraproject.org/archives/list/legal@lists.fedoraproject.org/thread/MOUNX6I3POCDMYWBNJ7JPLLIKVYWVRBJ/
License: LGPLv3+
License: LGPL-3.0-or-later
URL: https://ultimaker.com/en/products/cura-software
Source0: https://github.com/Ultimaker/Cura/archive/%{version}.tar.gz#/%{name}-%{version}.tar.gz
# Cmake bits taken from 4.13.1, before upstream went nuts with conan
Source2: mod_bundled_packages_json.py
Source3: CuraPluginInstall.cmake
Source4: CuraTests.cmake
Source5: com.ultimaker.cura.desktop.in
Source6: CMakeLists.txt
Source7: CuraVersion.py.in
Source8: com.ultimaker.cura.appdata.xml
# Skip forced loading SentryLogger to avoid an error on startup
Patch: 028e7f7.patch
# Fix asserts for called once in Python 3.12
Patch: https://github.com/Ultimaker/Cura/pull/16103.patch
# Avoid "KeyError: material_name" crash
Patch: https://github.com/Ultimaker/Cura/pull/17642.patch
BuildArch: noarch
# There are Python plugins in /usr/lib/cura
# We need to byte-compile it with Python 3
%global __python %{__python3}
# https://fedoraproject.org/wiki/Changes/EncourageI686LeafRemoval
ExcludeArch: %{ix86}
BuildRequires: cmake
BuildRequires: gcc
BuildRequires: gcc-c++
BuildRequires: desktop-file-utils
BuildRequires: dos2unix
BuildRequires: gettext
BuildRequires: git
BuildRequires: git-core
BuildRequires: python3-devel
BuildRequires: python3-pip
BuildRequires: python3-pytest
BuildRequires: python3-uranium == %{version}
BuildRequires: python3-keyring
BuildRequires: python3-pyserial
BuildRequires: python3-pynest2d
BuildRequires: python3-requests
BuildRequires: python3-savitar >= 5.3.0
BuildRequires: python3-uranium >= 5.4.0
BuildRequires: python3-zeroconf
Requires: open-sans-fonts
Requires: python3-certifi
Requires: python3-keyring
Requires: python3-numpy-stl
Requires: python3-pyserial
Requires: python3-savitar == %{version}
Requires: python3-uranium == %{version}
Requires: python3-pynest2d
Requires: python3-requests
Requires: python3-savitar >= 5.3.0
Requires: python3-trimesh
Requires: python3-uranium >= 5.4.0
Requires: python3-zeroconf
Requires: qt5-qtquickcontrols
Requires: qt5-qtquickcontrols2
# Requires: qt5-qtquickcontrols
# Requires: qt5-qtquickcontrols2
Requires: CuraEngine == %{epoch}:%{version}
Requires: cura-fdm-materials == %{version}
Requires: cura-fdm-materials >= %{major_minor_version}
# Workaround for https://bugzilla.redhat.com/show_bug.cgi?id=1494278
Requires: libglvnd-devel
@ -41,6 +76,10 @@ Requires: libglvnd-devel
# So that it just works
Requires: 3dprinter-udev-rules
# For various plugins
Recommends: python3-trimesh
Recommends: python3-certifi
%description
Cura is a project which aims to be an single software solution for 3D printing.
While it is developed to be used with the Ultimaker 3D printer, it can be used
@ -50,22 +89,37 @@ Cura prepares your model for 3D printing. For novices, it makes it easy to get
great results. For experts, there are over 200 settings to adjust to your
needs. As it's open source, our community helps enrich it even more.
# see: https://github.com/Ultimaker/Cura/issues/5142
%define cura_cloud_api_root https://api.ultimaker.com
%define cura_cloud_api_version 1
%define cura_cloud_account_api_root https://account.ultimaker.com
%define reverse_dns_name com.ultimaker.%{name}
%prep
%autosetup -p1 -S git -n Cura-%{version}
# The setup.py is only useful for py2exe, remove it, so noone is tempted to use it
rm setup.py
mkdir cmake
cp -a %{SOURCE2} %{SOURCE3} %{SOURCE4} cmake
rm -rf CMakeLists.txt
cp -a %{SOURCE5} %{SOURCE6} %{SOURCE8} .
cp -a %{SOURCE7} cura
# Wrong end of line encoding
dos2unix docs/How_to_use_the_flame_graph_profiler.md
# Wrong shebang
sed -i '1s=^#!/usr/bin/\(python\|env python\)3*=#!%{__python3}=' cura_app.py
sed -i '1s=^#!/usr/bin/\(python\|env python\)3*=#!%{python3}=' cura_app.py
%build
%{cmake} -DCURA_VERSION:STRING=%{version} -DLIB_SUFFIX:STR= .
make %{?_smp_mflags}
%cmake \
-DCURA_VERSION:STRING=%{version} \
-DCURA_BUILDTYPE="RPM %{version}"\
-DCURA_CLOUD_API_ROOT:STRING=%{cura_cloud_api_root} \
-DCURA_CLOUD_API_VERSION:STRING=%{cura_cloud_api_version} \
-DCURA_CLOUD_ACCOUNT_API_ROOT:STRING=%{cura_cloud_account_api_root} \
-DLIB_SUFFIX:STR=
%cmake_build
# rebuild locales
cd resources/i18n
@ -81,7 +135,11 @@ cd -
%install
make install DESTDIR=%{buildroot}
%cmake_install
mkdir -p %{buildroot}%{_datadir}/%{name}/resources/images/whats_new
mkdir -p %{buildroot}%{_datadir}/%{name}/resources/texts/whats_new
mkdir -p %{buildroot}%{_datadir}/%{name}/resources/scripts
# Sanitize the location of locale files
pushd %{buildroot}%{_datadir}
@ -94,16 +152,25 @@ popd
rm -rf %{buildroot}%{_datadir}/%{name}/resources/themes/cura-light/fonts/
ln -s %{_datadir}/fonts/open-sans/ %{buildroot}%{_datadir}/%{name}/resources/themes/cura-light/fonts
# Remove failing plugins
rm -r %{buildroot}%{_prefix}/lib/cura/plugins/{SentryLogger,UFPReader,UFPWriter}
# Bytecompile the plugins
%py_byte_compile %{python3} %{buildroot}%{_prefix}/lib/cura
# Use the default flags in the shebang
%py3_shebang_fix %{buildroot}%{_bindir}/*
%find_lang cura
%find_lang fdmextruder.def.json
%find_lang fdmprinter.def.json
%check
%{__python3} -m pip freeze
%{__python3} -m pytest -v -k "not test_getPropertyFallThrough"
%{python3} -m pip freeze
%{python3} -m pytest -v
desktop-file-validate %{buildroot}%{_datadir}/applications/%{name}.desktop
desktop-file-validate %{buildroot}%{_datadir}/applications/%{reverse_dns_name}.desktop
%files -f cura.lang -f fdmextruder.def.json.lang -f fdmprinter.def.json.lang
@ -113,154 +180,12 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/%{name}.desktop
# things in docs are developer oriented
%{python3_sitelib}/%{name}
%{_datadir}/%{name}
%{_datadir}/applications/%{name}.desktop
%{_datadir}/metainfo/%{name}.appdata.xml
%{_datadir}/applications/%{reverse_dns_name}.desktop
%{_datadir}/metainfo/%{reverse_dns_name}.appdata.xml
%{_datadir}/icons/hicolor/128x128/apps/%{name}-icon.png
%{_datadir}/mime/packages/%{name}.xml
%{_bindir}/%{name}
%{_prefix}/lib/%{name}
%changelog
* Wed Mar 21 2018 Miro Hrončok <mhroncok@redhat.com> - 1:3.2.1-2
- Require qt5-qtquickcontrols2 in addition to qt5-qtquickcontrols
* Tue Mar 20 2018 Miro Hrončok <mhroncok@redhat.com> - 1:3.2.1-1
- Update to 3.2.1
- Force install to /usr/lib and keep this noarch
- Change the set of skipped tests
* Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.1.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
* Sun Dec 10 2017 Miro Hrončok <mhroncok@redhat.com> - 1:3.1.0-1
- Update to 3.1.0
- Disable most of the tests
- No longer needs to sed out dist-packages
- Move appdata to metainfo
* Mon Dec 04 2017 Miro Hrončok <mhroncok@redhat.com> - 1:3.0.3-5
- Mark the package with correct license
* Sun Dec 03 2017 Miro Hrončok <mhroncok@redhat.com> - 1:3.0.3-4
- Also apply the nvidia driver workaround on Fedora (#1520138)
* Tue Nov 21 2017 Miro Hrončok <mhroncok@redhat.com> - 1:3.0.3-3
- Require libglvnd-devel as a workaround for #1494278
* Fri Oct 27 2017 Miro Hrončok <mhroncok@redhat.com> - 1:3.0.3-2
- Add upstream commit to fix tests
* Mon Oct 23 2017 Miro Hrončok <mhroncok@redhat.com> - 1:3.0.3-1
- Update to 3.0.3
- Remove locale and desktop file changes (fixed upstream)
* Wed Aug 30 2017 Miro Hrončok <mhroncok@redhat.com> - 1:2.7.0-2
- Relocate Japanese locale to ja
* Wed Aug 30 2017 Miro Hrončok <mhroncok@redhat.com> - 1:2.7.0-1
- Update to 2.7.0
* Wed Jul 26 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1:2.6.1-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
* Thu Jul 20 2017 Miro Hrončok <mhroncok@redhat.com> - 1:2.6.1-2
- Require cura-fdm-materials
* Wed Jun 28 2017 Miro Hrončok <mhroncok@redhat.com> - 1:2.6.1-1
- Updated to 2.6.1
* Wed May 10 2017 Miro Hrončok <mhroncok@redhat.com> - 1:2.5.0-2
- Require qt5-qtquickcontrols
* Wed May 03 2017 Miro Hrončok <mhroncok@redhat.com> - 1:2.5.0-1
- Update to modern Cura 2.x (introduce Epoch) (#1393176)
* Fri Feb 10 2017 Fedora Release Engineering <releng@fedoraproject.org> - 15.04.4-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
* Thu Nov 03 2016 Miro Hrončok <mhroncok@redhat.com> - 15.04.4-5
- Explicitly run cura on X11 GDK backend (#1388953)
* Tue Jul 19 2016 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 15.04.4-4
- https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_Packages
* Fri Mar 25 2016 Miro Hrončok <mhroncok@redhat.com> - 15.04.4-3
- Require 3dprinter-udev-rules
* Wed Feb 03 2016 Fedora Release Engineering <releng@fedoraproject.org> - 15.04.4-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
* Sat Jan 30 2016 Miro Hrončok <mhroncok@redhat.com> - 15.04.4-1
- New version
* Wed Jul 08 2015 Miro Hrončok <mhroncok@redhat.com> - 15.02.1-4
- No longer depend on pypy
- Simplify the launcher
* Mon Jul 06 2015 Miro Hrončok <mhroncok@redhat.com> - 15.02.1-3
- Patch for #1230281
* Mon Jul 06 2015 Miro Hrončok <mhroncok@redhat.com> - 15.02.1-2
- Require latest CuraEngine
* Mon Jul 06 2015 Miro Hrončok <mhroncok@redhat.com> - 15.02.1-1
- Update to 15.02.1
* Wed Jun 17 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 14.12.1-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
* Fri May 29 2015 Miro Hrončok <mhroncok@redhat.com> - 14.12.1-4
- Patch: Open directories with xdg-open (#1217961)
* Mon Apr 20 2015 Miro Hrončok <mhroncok@redhat.com> - 14.12.1-3
- Handle files from the command line (#1213220)
* Mon Mar 30 2015 Miro Hrončok <mhroncok@redhat.com> - 14.12.1-2
- Update the no firmware patch according to communication with Cura upstream
* Mon Dec 29 2014 Miro Hrončok <mhroncok@redhat.com> - 14.12.1-1
- Updated to 14.12.1
- No longer depend on firmware
* Sat Oct 25 2014 Miro Hrončok <mhroncok@redhat.com> - 14.09-1
- New version 14.09
* Tue Jun 24 2014 Miro Hrončok <mhroncok@redhat.com> - 14.06-2
- Require at least the firmware version originally bundled in git
* Mon Jun 23 2014 Miro Hrončok <mhroncok@redhat.com> - 14.06-1
- New version 14.06
* Sat Jun 07 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 13.11.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
* Sat Dec 14 2013 Miro Hrončok <mhroncok@redhat.com> - 13.11.2-1
- New version 13.11.2
* Wed Oct 16 2013 Miro Hrončok <mhroncok@redhat.com> - 13.10-1
- New upstream release with CuraEngine
* Sat Aug 03 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 13.04-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
* Tue May 07 2013 Miro Hrončok <mhroncok@redhat.com> - 13.04-2
- Remove resources directory before trying to create a symlink there
* Sat May 04 2013 Miro Hrončok <mhroncok@redhat.com> - 13.04-1
- New upstream release
- Fixed missing slice module
* Sat Apr 20 2013 Miro Hrončok <mhroncok@redhat.com> - 13.03-1
- New upstream release
* Tue Feb 19 2013 Miro Hrončok <mhroncok@redhat.com> - 12.12-3
- chmod 755 cura-stripper.sh
- Use firmware from ultimaker-marlin-firmware package
- removed bundling note
* Sun Jan 20 2013 Miro Hrončok <mhroncok@redhat.com> - 12.12-2
- Launcher is in Python now
* Sun Jan 13 2013 Miro Hrončok <mhroncok@redhat.com> - 12.12-1
- First version
%autochangelog

73
mod_bundled_packages_json.py Executable file
View file

@ -0,0 +1,73 @@
#!/usr/bin/env python3
#
# This script removes the given package entries in the bundled_packages JSON files. This is used by the PluginInstall
# CMake module.
#
import argparse
import collections
import json
import os
import sys
def find_json_files(work_dir: str) -> list:
"""Finds all JSON files in the given directory recursively and returns a list of those files in absolute paths.
:param work_dir: The directory to look for JSON files recursively.
:return: A list of JSON files in absolute paths that are found in the given directory.
"""
json_file_list = []
for root, dir_names, file_names in os.walk(work_dir):
for file_name in file_names:
abs_path = os.path.abspath(os.path.join(root, file_name))
json_file_list.append(abs_path)
return json_file_list
def remove_entries_from_json_file(file_path: str, entries: list) -> None:
"""Removes the given entries from the given JSON file. The file will modified in-place.
:param file_path: The JSON file to modify.
:param entries: A list of strings as entries to remove.
:return: None
"""
try:
with open(file_path, "r", encoding = "utf-8") as f:
package_dict = json.load(f, object_hook = collections.OrderedDict)
except Exception as e:
msg = "Failed to load '{file_path}' as a JSON file. This file will be ignored Exception: {e}"\
.format(file_path = file_path, e = e)
sys.stderr.write(msg + os.linesep)
return
for entry in entries:
if entry in package_dict:
del package_dict[entry]
print("[INFO] Remove entry [{entry}] from [{file_path}]".format(file_path = file_path, entry = entry))
try:
with open(file_path, "w", encoding = "utf-8", newline = "\n") as f:
json.dump(package_dict, f, indent = 4)
except Exception as e:
msg = "Failed to write '{file_path}' as a JSON file. Exception: {e}".format(file_path = file_path, e = e)
raise IOError(msg)
def main() -> None:
parser = argparse.ArgumentParser("mod_bundled_packages_json")
parser.add_argument("-d", "--dir", dest = "work_dir",
help = "The directory to look for bundled packages JSON files, recursively.")
parser.add_argument("entries", metavar = "ENTRIES", type = str, nargs = "+")
args = parser.parse_args()
json_file_list = find_json_files(args.work_dir)
for json_file_path in json_file_list:
remove_entries_from_json_file(json_file_path, args.entries)
if __name__ == "__main__":
main()

View file

@ -1 +1 @@
SHA512 (cura-3.2.1.tar.gz) = 4f11aa7ebd890476ab764aec2fcdbbbe4ed873400c9fcc11ad389cd00d7c0f5f5fb160065ccfc33311a3bf05d8c4fa55ae2c8067b78eb3d308c026191e59dbbe
SHA512 (cura-5.4.0.tar.gz) = 8b4ff703a0a8ab400b7d76d38c4422f77453082e093398bedc6ccf2fa7ab2ac0539f3f35a46c667bed5603c81dfb55679c29d01384a40bfdad8969913e3af8c2