[Libreoffice-commits] .: Branch 'libreoffice-3-5' - configmgr/source

Caolán McNamara caolan at kemper.freedesktop.org
Tue Feb 28 04:06:50 PST 2012


 configmgr/source/partial.cxx |   15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

New commits:
commit af8895270658bec676303da2154b903a78c6fbe6
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Fri Feb 24 17:19:32 2012 +0100

    Resolves fdo#46074: Fix Partial::contains for paths that go past a leaf node
    
    Paths that already "failed" at the root node were not reported as CONTAINS_NOT,
    so that they were erroneously migrated, but with broken content (values of set
    member properties were nil).
    (cherry picked from commit f3f79cc9e6c265baf48955d53f7e888205e0b3e0)
    
    Signed-off-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/configmgr/source/partial.cxx b/configmgr/source/partial.cxx
index 7922e2c..088de36 100644
--- a/configmgr/source/partial.cxx
+++ b/configmgr/source/partial.cxx
@@ -76,6 +76,12 @@ Partial::Partial(
     std::set< rtl::OUString > const & includedPaths,
     std::set< rtl::OUString > const & excludedPaths)
 {
+    // The Partial::Node tree built up here encodes the following information:
+    // * Inner node, startInclude: an include starts here that contains excluded
+    //   sub-trees
+    // * Inner node, !startInclude: contains in-/excluded sub-trees
+    // * Leaf node, startInclude: an include starts here
+    // * Leaf node, !startInclude: an exclude starts here
     for (std::set< rtl::OUString >::const_iterator i(includedPaths.begin());
          i != includedPaths.end(); ++i)
     {
@@ -119,12 +125,19 @@ Partial::~Partial() {}
 Partial::Containment Partial::contains(Path const & path) const {
     //TODO: For set elements, the segment names recorded in the node tree need
     // not match the corresponding path segments, so this function can fail.
+
+    // * If path ends at a leaf node or goes past a leaf node:
+    // ** If that leaf node is startInclude: => CONTAINS_NODE
+    // ** If that leaf node is !startInclude: => CONTAINS_NOT
+    // * If path ends at inner node:
+    // ** If there is some startInclude along its trace: => CONTAINS_NODE
+    // ** If there is no startInclude along its trace: => CONTAINS_SUBNODES
     Node const * p = &root_;
     bool includes = false;
     for (Path::const_iterator i(path.begin()); i != path.end(); ++i) {
         Node::Children::const_iterator j(p->children.find(*i));
         if (j == p->children.end()) {
-            break;
+            return p->startInclude ? CONTAINS_NODE : CONTAINS_NOT;
         }
         p = &j->second;
         includes |= p->startInclude;


More information about the Libreoffice-commits mailing list