Unverified Commit 7cc2d38f authored by Grimmauld's avatar Grimmauld
Browse files

freecad: 1.0.0 -> 1.0.1

Upstream release notes: https://github.com/FreeCAD/FreeCAD/releases/tag/1.0.1
Upstream diff: https://github.com/FreeCAD/FreeCAD/compare/1.0.0...1.0.1

The previously vendored patch didn't apply anymore.
However, the upstream PR was merged to main [1], so we can fetch that instead.

[1] https://github.com/FreeCAD/FreeCAD/pull/17660/commits/45056377f4bc575801f36a128c47100d618c9fc7
parent 1b8c7393
Loading
Loading
Loading
Loading
+0 −149
Original line number Diff line number Diff line
From 23ddb6ff148ec5c27da050ba0eb7a2e449b8450b Mon Sep 17 00:00:00 2001
From: Yury Shvedov <yury.shvedov@kaspersky.com>
Date: Mon, 4 Nov 2024 14:22:22 +0300
Subject: [PATCH] Gui: take in account module-path argument

Use paths passed with `--module-path` argument to search for preference
packs

Change-Id: If168dbd99a826757290ee6b918f5b712305fe2bb
---
 src/Gui/DlgPreferencePackManagementImp.cpp | 16 +++++----
 src/Gui/PreferencePackManager.cpp          | 39 +++++++++++++++++-----
 src/Gui/PreferencePackManager.h            |  5 +++
 3 files changed, 44 insertions(+), 16 deletions(-)

diff --git a/src/Gui/DlgPreferencePackManagementImp.cpp b/src/Gui/DlgPreferencePackManagementImp.cpp
index a1a0dad41a..50f3982f21 100644
--- a/src/Gui/DlgPreferencePackManagementImp.cpp
+++ b/src/Gui/DlgPreferencePackManagementImp.cpp
@@ -54,7 +54,7 @@ void DlgPreferencePackManagementImp::showEvent(QShowEvent* event)
     // but can only disable individual installed packs (though we can completely uninstall the pack's
     // containing Addon by redirecting to the Addon Manager).
     auto savedPreferencePacksDirectory = fs::path(App::Application::getUserAppDataDir()) / "SavedPreferencePacks";
-    auto modDirectory = fs::path(App::Application::getUserAppDataDir()) / "Mod";
+    auto modDirectories = Application::Instance->prefPackManager()->modPaths();
     auto resourcePath = fs::path(App::Application::getResourceDir()) / "Gui" / "PreferencePacks";
 
     // The displayed tree has two levels: at the toplevel is either "User-Saved Packs" or the name
@@ -66,12 +66,14 @@ void DlgPreferencePackManagementImp::showEvent(QShowEvent* event)
     auto builtinPacks = getPacksFromDirectory(resourcePath);
 
     std::map<std::string, std::vector<std::string>> installedPacks;
-    if (fs::exists(modDirectory) && fs::is_directory(modDirectory)) {
-        for (const auto& mod : fs::directory_iterator(modDirectory)) {
-            auto packs = getPacksFromDirectory(mod);
-            if (!packs.empty()) {
-                auto modName = mod.path().filename().string();
-                installedPacks.emplace(modName, packs);
+    for (const auto& modDirectory : modDirectories) {
+        if (fs::exists(modDirectory) && fs::is_directory(modDirectory)) {
+            for (const auto& mod : fs::directory_iterator(modDirectory)) {
+                auto packs = getPacksFromDirectory(mod);
+                if (!packs.empty()) {
+                    auto modName = mod.path().filename().string();
+                    installedPacks.emplace(modName, packs);
+                }
             }
         }
     }
diff --git a/src/Gui/PreferencePackManager.cpp b/src/Gui/PreferencePackManager.cpp
index dfc54240c0..83e32fa05e 100644
--- a/src/Gui/PreferencePackManager.cpp
+++ b/src/Gui/PreferencePackManager.cpp
@@ -30,6 +30,7 @@
 #endif
 
 #include <boost/filesystem.hpp>
+#include <boost/algorithm/string.hpp>
 #include <QDir>
 
 #include "PreferencePackManager.h"
@@ -134,12 +135,11 @@ void PreferencePack::applyConfigChanges() const
 }
 
 PreferencePackManager::PreferencePackManager()
+    : _preferencePackPaths(modPaths())
 {
-    auto modPath = fs::path(App::Application::getUserAppDataDir()) / "Mod";
     auto savedPath = fs::path(App::Application::getUserAppDataDir()) / "SavedPreferencePacks";
     auto resourcePath = fs::path(App::Application::getResourceDir()) / "Gui" / "PreferencePacks";
-    _preferencePackPaths.push_back(resourcePath);
-    _preferencePackPaths.push_back(modPath);
+    _preferencePackPaths.insert(_preferencePackPaths.begin(), resourcePath);
     _preferencePackPaths.push_back(savedPath);
     rescan();
 
@@ -232,6 +232,26 @@ void Gui::PreferencePackManager::importConfig(const std::string& packName,
     rescan();
 }
 
+// TODO(Shvedov): Is this suitable place for this method? It is more generic,
+// and maybe more suitable place at Application?
+std::vector<boost::filesystem::path> Gui::PreferencePackManager::modPaths() const
+{
+    auto userModPath = fs::path(App::Application::getUserAppDataDir()) / "Mod";
+
+    auto& config = App::Application::Config();
+    auto additionalModules = config.find("AdditionalModulePaths");
+    std::vector<boost::filesystem::path> result;
+
+    if (additionalModules != config.end()) {
+        boost::split(result,
+                     additionalModules->second,
+                     boost::is_any_of(";"),
+                     boost::token_compress_on);
+    }
+    result.emplace_back(userModPath);
+    return result;
+}
+
 void Gui::PreferencePackManager::FindPreferencePacksInPackage(const fs::path &mod)
 {
     try {
@@ -528,7 +548,6 @@ std::vector<PreferencePackManager::TemplateFile> PreferencePackManager::template
     // (alternate spellings are provided for packages using CamelCase and snake_case, and both major English dialects)
 
     auto resourcePath = fs::path(App::Application::getResourceDir()) / "Gui";
-    auto modPath = fs::path(App::Application::getUserAppDataDir()) / "Mod";
 
     std::string group = "Built-In";
     if (fs::exists(resourcePath) && fs::is_directory(resourcePath)) {
@@ -536,11 +555,13 @@ std::vector<PreferencePackManager::TemplateFile> PreferencePackManager::template
         std::copy(localFiles.begin(), localFiles.end(), std::back_inserter(_templateFiles));
     }
 
-    if (fs::exists(modPath) && fs::is_directory(modPath)) {
-        for (const auto& mod : fs::directory_iterator(modPath)) {
-            group = mod.path().filename().string();
-            const auto localFiles = scanForTemplateFiles(group, mod);
-            std::copy(localFiles.begin(), localFiles.end(), std::back_inserter(_templateFiles));
+    for (const auto& modPath : modPaths()) {
+        if (fs::exists(modPath) && fs::is_directory(modPath)) {
+            for (const auto& mod : fs::directory_iterator(modPath)) {
+                group = mod.path().filename().string();
+                const auto localFiles = scanForTemplateFiles(group, mod);
+                std::copy(localFiles.begin(), localFiles.end(), std::back_inserter(_templateFiles));
+            }
         }
     }
 
diff --git a/src/Gui/PreferencePackManager.h b/src/Gui/PreferencePackManager.h
index 301e160df2..e5776e47a0 100644
--- a/src/Gui/PreferencePackManager.h
+++ b/src/Gui/PreferencePackManager.h
@@ -191,6 +191,11 @@ namespace Gui {
          */
         void importConfig(const std::string &packName, const boost::filesystem::path &path);
 
+        /**
+         * Get a list of all mod directories.
+         */
+        std::vector<boost::filesystem::path> modPaths() const;
+
     private:
 
         void FindPreferencePacksInPackage(const boost::filesystem::path& mod);
-- 
2.44.1
+7 −3
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@
  doxygen,
  eigen,
  fetchFromGitHub,
  fetchpatch,
  fmt,
  gfortran,
  gts,
@@ -64,13 +65,13 @@ in
freecad-utils.makeCustomizable (
  stdenv.mkDerivation (finalAttrs: {
    pname = "freecad";
    version = "1.0.0";
    version = "1.0.1";

    src = fetchFromGitHub {
      owner = "FreeCAD";
      repo = "FreeCAD";
      rev = finalAttrs.version;
      hash = "sha256-u7RYSImUMAgKaAQSAGCFha++RufpZ/QuHAirbSFOUCI=";
      hash = "sha256-VFTNawXxu2ofjj2Frg4OfVhiMKFywBhm7lZunP85ZEQ=";
      fetchSubmodules = true;
    };

@@ -151,7 +152,10 @@ freecad-utils.makeCustomizable (
    patches = [
      ./0001-NIXOS-don-t-ignore-PYTHONPATH.patch
      ./0002-FreeCad-OndselSolver-pkgconfig.patch
      ./0003-Gui-take-in-account-module-path-argument.patch
      (fetchpatch {
        url = "https://github.com/FreeCAD/FreeCAD/commit/8e04c0a3dd9435df0c2dec813b17d02f7b723b19.patch?full_index=1";
        hash = "sha256-H6WbJFTY5/IqEdoi5N+7D4A6pVAmZR4D+SqDglwS18c=";
      })
    ];

    cmakeFlags =