8ba105
From a5c0782c0012b812ad0939a4aec5842f05dc1129 Mon Sep 17 00:00:00 2001
8ba105
From: Andrew Beekhof <andrew@beekhof.net>
8ba105
Date: Sun, 15 Apr 2018 20:41:01 +1000
8ba105
Subject: [PATCH] Fix: crm_diff: rhbz#1561617 - Ignore attribute placement when
8ba105
 comparing in 'cib' mode
8ba105
8ba105
---
8ba105
 include/crm/common/xml.h |  1 +
8ba105
 lib/common/xml.c         | 28 ++++++++++++++++++++++++----
8ba105
 tools/crm_diff.c         |  6 +++++-
8ba105
 3 files changed, 30 insertions(+), 5 deletions(-)
8ba105
8ba105
diff --git a/include/crm/common/xml.h b/include/crm/common/xml.h
8ba105
index 8297bb2..69ad4bd 100644
8ba105
--- a/include/crm/common/xml.h
8ba105
+++ b/include/crm/common/xml.h
8ba105
@@ -380,6 +380,7 @@ bool xml_tracking_changes(xmlNode * xml);
8ba105
 bool xml_document_dirty(xmlNode *xml);
8ba105
 void xml_track_changes(xmlNode * xml, const char *user, xmlNode *acl_source, bool enforce_acls);
8ba105
 void xml_calculate_changes(xmlNode * old, xmlNode * new); /* For comparing two documents after the fact */
8ba105
+void xml_calculate_significant_changes(xmlNode *old_xml, xmlNode *new_xml);
8ba105
 void xml_accept_changes(xmlNode * xml);
8ba105
 void xml_log_changes(uint8_t level, const char *function, xmlNode *xml);
8ba105
 void xml_log_patchset(uint8_t level, const char *function, xmlNode *xml);
8ba105
diff --git a/lib/common/xml.c b/lib/common/xml.c
8ba105
index 947ddfe..8fd4778 100644
8ba105
--- a/lib/common/xml.c
8ba105
+++ b/lib/common/xml.c
8ba105
@@ -72,6 +72,7 @@ enum xml_private_flags {
8ba105
 
8ba105
      xpf_acl_create  = 0x1000,
8ba105
      xpf_acl_denied  = 0x2000,
8ba105
+     xpf_lazy        = 0x4000,
8ba105
 };
8ba105
 
8ba105
 typedef struct xml_private_s 
8ba105
@@ -115,10 +116,22 @@ static inline bool TRACKING_CHANGES(xmlNode *xml)
8ba105
 {
8ba105
     if(xml == NULL || xml->doc == NULL || xml->doc->_private == NULL) {
8ba105
         return FALSE;
8ba105
-    } else if(is_set(((xml_private_t *)xml->doc->_private)->flags, xpf_tracking)) {
8ba105
-        return TRUE;
8ba105
+    } else if(is_not_set(((xml_private_t *)xml->doc->_private)->flags, xpf_tracking)) {
8ba105
+        return FALSE;
8ba105
     }
8ba105
-    return FALSE;
8ba105
+    return TRUE;
8ba105
+}
8ba105
+
8ba105
+static inline bool TRACKING_CHANGES_LAZY(xmlNode *xml)
8ba105
+{
8ba105
+    if(xml == NULL || xml->doc == NULL || xml->doc->_private == NULL) {
8ba105
+        return FALSE;
8ba105
+    } else if(is_not_set(((xml_private_t *)xml->doc->_private)->flags, xpf_tracking)) {
8ba105
+        return FALSE;
8ba105
+    } else if(is_not_set(((xml_private_t *)xml->doc->_private)->flags, xpf_lazy)) {
8ba105
+        return FALSE;
8ba105
+    }
8ba105
+    return TRUE;
8ba105
 }
8ba105
 
8ba105
 #define buffer_print(buffer, max, offset, fmt, args...) do {            \
8ba105
@@ -4084,7 +4097,7 @@ __xml_diff_object(xmlNode * old, xmlNode * new)
8ba105
                 crm_xml_add(new, name, vcopy);
8ba105
                 free(vcopy);
8ba105
 
8ba105
-            } else if(p_old != p_new) {
8ba105
+            } else if(p_old != p_new && TRACKING_CHANGES_LAZY(new) == FALSE) {
8ba105
                 crm_info("Moved %s@%s (%d -> %d)", old->name, name, p_old, p_new);
8ba105
                 __xml_node_dirty(new);
8ba105
                 p->flags |= xpf_dirty|xpf_moved;
8ba105
@@ -4184,6 +4197,13 @@ __xml_diff_object(xmlNode * old, xmlNode * new)
8ba105
 }
8ba105
 
8ba105
 void
8ba105
+xml_calculate_significant_changes(xmlNode *old_xml, xmlNode *new_xml)
8ba105
+{
8ba105
+    set_doc_flag(new_xml, xpf_lazy);
8ba105
+    xml_calculate_changes(old_xml, new_xml);
8ba105
+}
8ba105
+
8ba105
+void
8ba105
 xml_calculate_changes(xmlNode * old, xmlNode * new)
8ba105
 {
8ba105
     CRM_CHECK(safe_str_eq(crm_element_name(old), crm_element_name(new)), return);
8ba105
diff --git a/tools/crm_diff.c b/tools/crm_diff.c
8ba105
index 20e7a27..0ec8e44 100644
8ba105
--- a/tools/crm_diff.c
8ba105
+++ b/tools/crm_diff.c
8ba105
@@ -190,7 +190,11 @@ generate_patch(xmlNode *object_1, xmlNode *object_2, const char *xml_file_2,
8ba105
     }
8ba105
 
8ba105
     xml_track_changes(object_2, NULL, object_2, FALSE);
8ba105
-    xml_calculate_changes(object_1, object_2);
8ba105
+    if(as_cib) {
8ba105
+        xml_calculate_significant_changes(object_1, object_2);
8ba105
+    } else {
8ba105
+        xml_calculate_changes(object_1, object_2);
8ba105
+    }
8ba105
     crm_log_xml_debug(object_2, (xml_file_2? xml_file_2: "target"));
8ba105
 
8ba105
     output = xml_create_patchset(0, object_1, object_2, NULL, FALSE);
8ba105
-- 
8ba105
1.8.3.1
8ba105