Hello community, here is the log from the commit of package libSavitar for openSUSE:Factory checked in at 2020-06-07 21:55:54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libSavitar (Old) and /work/SRC/openSUSE:Factory/.libSavitar.new.3606 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libSavitar" Sun Jun 7 21:55:54 2020 rev:6 rq:812284 version:4.6.1 Changes: -------- --- /work/SRC/openSUSE:Factory/libSavitar/libSavitar.changes 2020-01-03 17:36:52.943292524 +0100 +++ /work/SRC/openSUSE:Factory/.libSavitar.new.3606/libSavitar.changes 2020-06-07 21:55:56.680794487 +0200 @@ -1,0 +2,8 @@ +Sun Jun 7 17:55:54 UTC 2020 - Stefan BrĂ¼ns <stefan.bru...@rwth-aachen.de> + +- update to version 4.6.1 + * mostly internal changes +- Fix Savitar python import error with current PyQt5, add + libSavitar-3.5.1-PyQt5.sip.patch + +------------------------------------------------------------------- Old: ---- libSavitar-4.4.1.obscpio New: ---- libSavitar-3.5.1-PyQt5.sip.patch libSavitar-4.6.1.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libSavitar.spec ++++++ --- /var/tmp/diff_new_pack.xPInCN/_old 2020-06-07 21:55:57.948798478 +0200 +++ /var/tmp/diff_new_pack.xPInCN/_new 2020-06-07 21:55:57.952798491 +0200 @@ -1,7 +1,7 @@ # # spec file for package libSavitar # -# Copyright (c) 2020 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %define sover 0 Name: libSavitar -Version: 4.4.1 +Version: 4.6.1 Release: 0 Summary: C++ implementation of 3mf loading with SIP python bindings License: LGPL-3.0-only @@ -27,6 +27,8 @@ Source0: %{name}-%{version}.tar.xz # PATCH-FIX-OPENSUSE -- Use system libraries instead of embedded ones. Patch0: use-system-libs.patch +# PATCH-FIX-OPENSUSE - use Qt5 sip import name, taken from Fedora +Patch1: libSavitar-3.5.1-PyQt5.sip.patch BuildRequires: cmake >= 2.8.12 BuildRequires: gmock BuildRequires: gtest ++++++ _service ++++++ --- /var/tmp/diff_new_pack.xPInCN/_old 2020-06-07 21:55:57.980798579 +0200 +++ /var/tmp/diff_new_pack.xPInCN/_new 2020-06-07 21:55:57.980798579 +0200 @@ -2,8 +2,8 @@ <service name="obs_scm" mode="disabled"> <param name="url">git://github.com/Ultimaker/libSavitar.git</param> <param name="scm">git</param> - <param name="revision">v4.4.1</param> - <param name="version">4.4.1</param> + <param name="revision">4.6.1</param> + <param name="version">4.6.1</param> </service> <service mode="disabled" name="set_version" /> ++++++ libSavitar-3.5.1-PyQt5.sip.patch ++++++ diff --git a/CMakeLists.txt b/CMakeLists.txt index b190c15..6aa9963 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,7 +75,7 @@ endif() if(BUILD_PYTHON) set(SIP_EXTRA_FILES_DEPEND python/Types.sip python/MeshData.sip python/SceneNode.sip python/Scene.sip) #set(SIP_EXTRA_SOURCE_FILES python/Types.cpp) - set(SIP_EXTRA_OPTIONS -g) # -g means always release the GIL before calling C++ methods. + set(SIP_EXTRA_OPTIONS -g -n PyQt5.sip) # -g means always release the GIL before calling C++ methods. add_sip_python_module(Savitar python/ThreeMFParser.sip Savitar) endif() ++++++ libSavitar-4.4.1.obscpio -> libSavitar-4.6.1.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-4.4.1/.github/workflows/cicd.yml new/libSavitar-4.6.1/.github/workflows/cicd.yml --- old/libSavitar-4.4.1/.github/workflows/cicd.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/libSavitar-4.6.1/.github/workflows/cicd.yml 2020-04-16 14:54:12.000000000 +0200 @@ -0,0 +1,13 @@ +--- +name: CI/CD +on: [push, pull_request] +jobs: + build: + name: Build and test + runs-on: ubuntu-latest + container: ultimaker/cura-build-environment + steps: + - name: Checkout master + uses: actions/checkout@v1.2.0 + - name: Build and test + run: docker/build.sh diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-4.4.1/.gitlab-ci.yml new/libSavitar-4.6.1/.gitlab-ci.yml --- old/libSavitar-4.4.1/.gitlab-ci.yml 2019-09-17 11:34:47.000000000 +0200 +++ new/libSavitar-4.6.1/.gitlab-ci.yml 1970-01-01 01:00:00.000000000 +0100 @@ -1,16 +0,0 @@ -image: registry.gitlab.com/ultimaker/cura/cura-build-environment:centos7 - -stages: - - build - -build and test linux: - stage: build - tags: - - cura - - docker - - linux - script: - - docker/build.sh - artifacts: - paths: - - build diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-4.4.1/CMakeLists.txt new/libSavitar-4.6.1/CMakeLists.txt --- old/libSavitar-4.4.1/CMakeLists.txt 2019-09-17 11:34:47.000000000 +0200 +++ new/libSavitar-4.6.1/CMakeLists.txt 2020-04-16 14:54:12.000000000 +0200 @@ -46,6 +46,7 @@ endif() set(savitar_SRCS + src/Namespace.cpp src/ThreeMFParser.cpp src/SceneNode.cpp src/Scene.cpp @@ -55,6 +56,7 @@ ) set(savitar_HDRS + src/Namespace.h src/ThreeMFParser.h src/Types.h src/SceneNode.h @@ -140,6 +142,7 @@ set(savitar_TEST ThreeMFParserTest MeshDataTest + NamespaceTest ) # Compiling the test environment. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-4.4.1/docker/build.sh new/libSavitar-4.6.1/docker/build.sh --- old/libSavitar-4.4.1/docker/build.sh 2019-09-17 11:34:47.000000000 +0200 +++ new/libSavitar-4.6.1/docker/build.sh 2020-04-16 14:54:12.000000000 +0200 @@ -18,6 +18,7 @@ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_PREFIX_PATH="${CURA_BUILD_ENV_PATH}" \ -DBUILD_TESTS=ON \ + -DBUILD_STATIC=ON \ .. make ctest3 --output-on-failure -T Test diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-4.4.1/python/SceneNode.sip new/libSavitar-4.6.1/python/SceneNode.sip --- old/libSavitar-4.4.1/python/SceneNode.sip 2019-09-17 11:34:47.000000000 +0200 +++ new/libSavitar-4.6.1/python/SceneNode.sip 2020-04-16 14:54:12.000000000 +0200 @@ -31,6 +31,12 @@ std::string getTransformation(); void setTransformation(std::string); + + std::string getName(); + void setName(std::string name); + + std::string getId(); + void setId(std::string id); std::map<std::string, std::string> getSettings(); void setSetting(std::string key, std::string value); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-4.4.1/src/Namespace.cpp new/libSavitar-4.6.1/src/Namespace.cpp --- old/libSavitar-4.4.1/src/Namespace.cpp 1970-01-01 01:00:00.000000000 +0100 +++ new/libSavitar-4.6.1/src/Namespace.cpp 2020-04-16 14:54:12.000000000 +0200 @@ -0,0 +1,55 @@ +//Copyright (c) 2020 Ultimaker B.V. +//libSavitar is released under the terms of the AGPLv3 or higher. + +#include "Namespace.h" + +#include "../pugixml/src/pugixml.hpp" + +namespace xml_namespace +{ + std::string getCuraUri() { return std::string("http://software.ultimaker.com/xml/cura/3mf/2015/10"); } + std::string getDefaultUri() { return std::string("http://schemas.microsoft.com/3dmanufacturing/core/2015/02"); } + + void appendNamespaceAttributes(xmlns_map_t& map, std::set<std::string>& namespace_names, const pugi::xml_node& xml_node) + { + for (const pugi::xml_attribute& attribute : xml_node.attributes()) + { + const std::string name = attribute.name(); + const std::string name_start = name.substr(0, name.size() >= 5 ? 5 : std::string::npos); + if (name_start.compare("xmlns") != 0) + { + continue; + } + + const std::string namespace_name = name.size() <= 5 ? "" : name.substr(6); + const std::string namespace_glob = attribute.value(); + if (namespace_names.count(namespace_name) > 0) // <-- check for overwrites + { + continue; // <-- since it's going up the tree from the node, not down from the parent + } + if (map.count(namespace_glob) < 1) + { + map[namespace_glob] = std::set<std::string>(); + } + map[namespace_glob].insert(namespace_name); + namespace_names.insert(namespace_name); + } + } + + xmlns_map_t getAncestralNamespaces(const pugi::xml_node& xml_node) + { + xmlns_map_t result; + std::set<std::string> namespace_names; + for (pugi::xml_node current_node = xml_node; current_node; current_node = current_node.parent()) + { + appendNamespaceAttributes(result, namespace_names, current_node); + } + return result; + } + + std::set<std::string> getNamesFor(const xmlns_map_t& map, const std::string& uri) + { + return (map.count(uri) > 0) ? map.at(uri) : std::set<std::string>(); + } + +} //namespace xml_namespace diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-4.4.1/src/Namespace.h new/libSavitar-4.6.1/src/Namespace.h --- old/libSavitar-4.4.1/src/Namespace.h 1970-01-01 01:00:00.000000000 +0100 +++ new/libSavitar-4.6.1/src/Namespace.h 2020-04-16 14:54:12.000000000 +0200 @@ -0,0 +1,29 @@ +//Copyright (c) 2020 Ultimaker B.V. +//libSavitar is released under the terms of the AGPLv3 or higher. + +#ifndef NAMESPACE_H +#define NAMESPACE_H + +#include "SavitarExport.h" +#include <map> +#include <set> +#include <string> + +// Forward declaration +namespace pugi +{ + class xml_node; +} + +namespace xml_namespace +{ + typedef std::map<std::string, std::set<std::string>> xmlns_map_t; + + std::string getCuraUri(); + std::string getDefaultUri(); + + xmlns_map_t SAVITAR_EXPORT getAncestralNamespaces(const pugi::xml_node& xml_node); + std::set<std::string> SAVITAR_EXPORT getNamesFor(const xmlns_map_t& map, const std::string& uri); +} //namespace xml_namespace + +#endif \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-4.4.1/src/SceneNode.cpp new/libSavitar-4.6.1/src/SceneNode.cpp --- old/libSavitar-4.4.1/src/SceneNode.cpp 2019-09-17 11:34:47.000000000 +0200 +++ new/libSavitar-4.6.1/src/SceneNode.cpp 2020-04-16 14:54:12.000000000 +0200 @@ -17,6 +17,7 @@ */ #include "SceneNode.h" +#include "Namespace.h" #include "../pugixml/src/pugixml.hpp" #include <iostream> using namespace Savitar; @@ -70,6 +71,7 @@ { settings.clear(); id = xml_node.attribute("id").as_string(); + name = xml_node.attribute("name").as_string(); if(xml_node.child("mesh")) { @@ -95,11 +97,17 @@ { for (pugi::xml_node setting = metadatagroup_node.child("metadata"); setting; setting = setting.next_sibling("metadata")) { + // NOTE: In theory this could be slow, since we look up the entire ancestry tree for each setting. + // In practice it's expected to be negligible compared to the parsing of the mesh. + const xml_namespace::xmlns_map_t namespaces = xml_namespace::getAncestralNamespaces(setting); + std::set<std::string> cura_equivalent_namespaces = xml_namespace::getNamesFor(namespaces, xml_namespace::getCuraUri()); + cura_equivalent_namespaces.insert("cura"); // <- Just to be sure: If there was ever a version out that uses 'cura' without the specification of the xmlns-id. + std::string key = setting.attribute("name").as_string(); const size_t pos = key.find_first_of(':'); - // Other namespaces can be in the metadata, not just Cura's, don't load those: - if (key.substr(0, pos).compare("cura") != 0) + // Only accept namespaces cura and implied 'default': + if (pos != std::string::npos && cura_equivalent_namespaces.count(key.substr(0, pos)) < 1) { continue; } @@ -121,6 +129,16 @@ this->id = id; } +std::string SceneNode::getName() +{ + return this->name; +} + +void SceneNode::setName(std::string name) +{ + this->name = name; +} + std::map< std::string, std::string > SceneNode::getSettings() { return settings; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-4.4.1/src/SceneNode.h new/libSavitar-4.6.1/src/SceneNode.h --- old/libSavitar-4.4.1/src/SceneNode.h 2019-09-17 11:34:47.000000000 +0200 +++ new/libSavitar-4.6.1/src/SceneNode.h 2020-04-16 14:54:12.000000000 +0200 @@ -62,6 +62,13 @@ void setId(std::string id); /** + * Get the (non-unique) display name of the node. + */ + std::string getName(); + + void setName(std::string name); + + /** * Get the (per-object) settings attached to this SceneNode. * Note that this is part of the Cura Extension and not 3mf Core. */ @@ -75,6 +82,7 @@ MeshData mesh_data; std::map<std::string, std::string> settings; std::string id; + std::string name; }; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-4.4.1/src/ThreeMFParser.cpp new/libSavitar-4.6.1/src/ThreeMFParser.cpp --- old/libSavitar-4.4.1/src/ThreeMFParser.cpp 2019-09-17 11:34:47.000000000 +0200 +++ new/libSavitar-4.6.1/src/ThreeMFParser.cpp 2020-04-16 14:54:12.000000000 +0200 @@ -17,6 +17,7 @@ */ #include "ThreeMFParser.h" +#include "Namespace.h" #include "Scene.h" #include <iostream> #include <sstream> @@ -55,8 +56,8 @@ pugi::xml_node build_node = model_node.append_child("build"); model_node.append_attribute("unit") = scene.getUnit().c_str(); - model_node.append_attribute("xmlns") = "http://schemas.microsoft.com/3dmanufacturing/core/2015/02"; - model_node.append_attribute("xmlns:cura") = "http://software.ultimaker.com/xml/cura/3mf/2015/10"; + model_node.append_attribute("xmlns") = xml_namespace::getCuraUri().c_str(); + model_node.append_attribute("xmlns:cura") = xml_namespace::getDefaultUri().c_str(); model_node.append_attribute("xml:lang") ="en-US"; for(int i = 0; i < scene.getAllSceneNodes().size(); i++) @@ -70,6 +71,10 @@ // Create item pugi::xml_node object = resources_node.append_child("object"); object.append_attribute("id") = scene_node->getId().c_str(); + if(!scene_node->getName().empty()) + { + object.append_attribute("name") = scene_node->getName().c_str(); + } object.append_attribute("type") = "model"; if(scene_node->getMeshData().getVertices().size() != 0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-4.4.1/tests/NamespaceTest.cpp new/libSavitar-4.6.1/tests/NamespaceTest.cpp --- old/libSavitar-4.4.1/tests/NamespaceTest.cpp 1970-01-01 01:00:00.000000000 +0100 +++ new/libSavitar-4.6.1/tests/NamespaceTest.cpp 2020-04-16 14:54:12.000000000 +0200 @@ -0,0 +1,115 @@ +//Copyright (c) 2020 Ultimaker B.V. +//libSavitar is released under the terms of the AGPLv3 or higher. + +#include "../src/Namespace.h" + +#include <fstream> +#include <gtest/gtest.h> +#include <iostream> +#include <string> +#include "../pugixml/src/pugixml.hpp" + +namespace xml_namespace +{ + class NamespaceTest : public testing::Test + { + public: + pugi::xml_document document; + pugi::xml_node main_xml_node; + + void SetUp() + { + std::ifstream test_model_file("../tests/namespaces.xml"); + if (test_model_file.is_open()) + { + const std::string xml_string(std::istreambuf_iterator<char>{test_model_file}, {}); + + pugi::xml_parse_result result = document.load_string(xml_string.c_str()); + main_xml_node = document.child("main"); + } + } + }; + + TEST_F(NamespaceTest, getAncestralNamespaces) + { + ASSERT_TRUE(main_xml_node); + + pugi::xml_node node; + xml_namespace::xmlns_map_t result; + + node = main_xml_node.child("simple"); + result = xml_namespace::getAncestralNamespaces(node); + ASSERT_EQ(result.size(), 2); // <-- including default namespace + ASSERT_EQ(result["_a_"].size(), 1); + ASSERT_EQ(result["_a_"].count("a"), 1); + + node = main_xml_node.child("multiple"); + result = xml_namespace::getAncestralNamespaces(node); + ASSERT_EQ(result["_a_"].count("a"), 1); + ASSERT_EQ(result["_b_"].count("b"), 1); + ASSERT_EQ(result["_c_"].count("c"), 1); + + node = main_xml_node.child("overwrite"); // _before_ overwrite + result = xml_namespace::getAncestralNamespaces(node); + ASSERT_EQ(result.size(), 2); + ASSERT_EQ(result["_b_"].size(), 1); + ASSERT_EQ(result["_b_"].count("b"), 1); + + node = main_xml_node.child("overwrite").child("sub"); // _after_ overwrite + result = xml_namespace::getAncestralNamespaces(node); + ASSERT_EQ(result.size(), 2); + ASSERT_EQ(result.count("_b_"), 0); + ASSERT_EQ(result["_c_"].size(), 1); + ASSERT_EQ(result["_c_"].count("b"), 1); + + node = main_xml_node.child("combine").child("sub"); + result = xml_namespace::getAncestralNamespaces(node); + ASSERT_EQ(result.size(), 2); + ASSERT_EQ(result["_s_"].size(), 2); + ASSERT_EQ(result["_s_"].count("s"), 1); + ASSERT_EQ(result["_s_"].count("n"), 1); + + node = main_xml_node.child("deep").child("sub"); + result = xml_namespace::getAncestralNamespaces(node); + ASSERT_EQ(result.size(), 3); + ASSERT_EQ(result.count("_w_"), 0); + ASSERT_EQ(result.count("_x_"), 1); + + node = main_xml_node.child("deep").child("sub").child("subber").child("subbest"); + result = xml_namespace::getAncestralNamespaces(node); + ASSERT_EQ(result.size(), 6); + ASSERT_EQ(result.count("_w_"), 1); + ASSERT_EQ(result.count("_x_"), 1); + + node = main_xml_node.child("multideep").child("sub").child("subber").child("subbest"); + result = xml_namespace::getAncestralNamespaces(node); + ASSERT_EQ(result.size(), 6); + ASSERT_EQ(result.count("_w_"), 1); + ASSERT_EQ(result.count("_x_"), 1); + + node = main_xml_node.child("multideep").child("subber").child("subbest"); + result = xml_namespace::getAncestralNamespaces(node); + ASSERT_EQ(result.size(), 5); + ASSERT_EQ(result.count("_w_"), 0); + ASSERT_EQ(result.count("_e_"), 1); + ASSERT_EQ(result.count("_q_"), 1); + ASSERT_EQ(result.count("_r_"), 1); + + node = main_xml_node.child("multideep").child("subbest"); + result = xml_namespace::getAncestralNamespaces(node); + ASSERT_EQ(result.size(), 3); + ASSERT_EQ(result.count("_e_"), 0); + ASSERT_EQ(result.count("_q_"), 1); + } + + // std::set<std::string> getNamesFor(const xmlns_map_t& map, const std::string& uri); + TEST_F(NamespaceTest, getNamesFor) + { + ASSERT_TRUE(main_xml_node); + pugi::xml_node node = main_xml_node.child("multideep").child("sub").child("subber").child("subbest"); + xml_namespace::xmlns_map_t map = xml_namespace::getAncestralNamespaces(node); + ASSERT_EQ(xml_namespace::getNamesFor(map, "_w_").count("w"), 1); + ASSERT_EQ(xml_namespace::getNamesFor(map, "_p_").size(), 0); + } + +} // namespace xml_namespace diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-4.4.1/tests/ThreeMFParserTest.cpp new/libSavitar-4.6.1/tests/ThreeMFParserTest.cpp --- old/libSavitar-4.4.1/tests/ThreeMFParserTest.cpp 2019-09-17 11:34:47.000000000 +0200 +++ new/libSavitar-4.6.1/tests/ThreeMFParserTest.cpp 2020-04-16 14:54:12.000000000 +0200 @@ -5,6 +5,7 @@ #include "../src/SceneNode.h" #include "../src/ThreeMFParser.h" +#include <array> #include <fstream> #include <gtest/gtest.h> #include <iostream> @@ -99,6 +100,8 @@ EXPECT_NE(settings.find("infill_pattern"), settings.end()); EXPECT_EQ(settings["infill_pattern"].compare("concentric"), 0); + EXPECT_EQ(nodes[0]->getName().compare("test_object"), 0); + EXPECT_EQ(nodes[1]->getName().compare(""), 0); EXPECT_EQ(nodes[1]->getId().compare("2"), 0); EXPECT_FALSE(nodes[1]->getTransformation().empty()); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-4.4.1/tests/namespaces.xml new/libSavitar-4.6.1/tests/namespaces.xml --- old/libSavitar-4.4.1/tests/namespaces.xml 1970-01-01 01:00:00.000000000 +0100 +++ new/libSavitar-4.6.1/tests/namespaces.xml 2020-04-16 14:54:12.000000000 +0200 @@ -0,0 +1,40 @@ +<?xml version="1.0"?> +<main unit="millimeter" xmlns="http://schemas.microsoft.com/3dmanufacturing/core/2015/02" xml:lang="en-US"> + + <simple xmlns:a="_a_"/> + + <multiple xmlns:a="_a_" xmlns:b="_b_" xmlns:c="_c_"/> + + <overwrite xmlns:b="_b_"> + <sub xmlns:b="_c_"/> + </overwrite> + + <combine xmlns:s="_s_"> + <sub xmlns:n="_s_"/> + </combine> + + <deep xmlns:x="_x_"> + <sub xmlns:y="_y_"> + <subber xmlns:z="_z_" xmlns:e="_e_"> + <subbest xmlns:w="_w_"> + </subbest> + </subber> + </sub> + </deep> + + <multideep xmlns:x="_x_"> + <sub xmlns:y="_y_"> + <subber xmlns:z="_z_" xmlns:e="_e_"> + <subbest xmlns:w="_w_"> + </subbest> + </subber> + </sub> + <subber xmlns:z="_q_" xmlns:e="_e_"> + <subbest xmlns:w="_r_"> + </subbest> + </subber> + <subbest xmlns:w="_q_"> + </subbest> + </multideep> + +</main> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-4.4.1/tests/test_model.xml new/libSavitar-4.6.1/tests/test_model.xml --- old/libSavitar-4.4.1/tests/test_model.xml 2019-09-17 11:34:47.000000000 +0200 +++ new/libSavitar-4.6.1/tests/test_model.xml 2020-04-16 14:54:12.000000000 +0200 @@ -1,7 +1,7 @@ <?xml version="1.0"?> <model unit="millimeter" xmlns="http://schemas.microsoft.com/3dmanufacturing/core/2015/02" xml:lang="en-US"> <resources> - <object id="1" type="model"> + <object id="1" name="test_object" type="model"> <!-- normal mesh with 3 unique vert-refs per triangle --> <mesh> <vertices> ++++++ libSavitar.obsinfo ++++++ --- /var/tmp/diff_new_pack.xPInCN/_old 2020-06-07 21:55:58.092798932 +0200 +++ /var/tmp/diff_new_pack.xPInCN/_new 2020-06-07 21:55:58.096798944 +0200 @@ -1,5 +1,5 @@ name: libSavitar -version: 4.4.1 -mtime: 1568712887 -commit: 4e0baf3207943b0459268dd60c88888dea44f0a3 +version: 4.6.1 +mtime: 1587041652 +commit: 9ce623d9479aad18416aa18119c78b8fb831f4f6