|
 |
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 |
|