Stop using QDomDocument::toString to avoid QHash random reordering #46
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR fixes a random reordering of keys in the xml output file that happens each time the file is saved from a new Groot process, even if no changes were made to the tree.
The issue can be replicated by creating a tree description xml file that has nodes with multiple input or output ports (the
test_data/test_xml_key_reordering_issue.xml
included in this PR, for instance). Open Groot, load the file and save a copy of it. Close and start Groot again, open the file again a save a second copy. Then compare the original with both copies usingdiff
; there should be differences in the ordering of xml attributes.This becomes an issue when the xml file is stored in a version control system such as git.
The random reordering happens because newer versions of the
QDomDocument
usesQHash
, which in newer versions of the Qt library uses randomness to prevent certain types of DoS attacks.There are provisions to prevent the random reordering from within the Qt library, but they are not the same in all versions of Qt.
This PR is based on an alternative solution posted here, which generates the xml contents recursively generating elements for each node.
This patch also adds a test for this fix.