Database merge confirmation dialog (#10173)

* Add Entry::calculateDifference()

This new function contains the logic that was previously in
EntryHistoryModel::calculateHistoryModifications().
It allows the re-use to display the differences in case of a merge.

* Introduce Database Merge Confirmation Dialog

Adds a dialog allowing a user to review the changes of a merge operation.
This dialog displays the changes and allows the user to abort the merge
without modifying the database.

Fixes #1152

* Added dry run option to Merger
* Changed behavior when actual merge differs from dry run to just output a warning to console
* Fixed KeeShare conflicting with merge operations in the middle of a merge

---------

Co-authored-by: Jonathan White <support@dmapps.us>
This commit is contained in:
Tamino Bauknecht
2025-09-14 18:02:22 +02:00
committed by GitHub
parent 9a40182a62
commit c0ea6f65f9
20 changed files with 952 additions and 276 deletions

View File

@@ -2670,14 +2670,6 @@ This is definitely a bug, please report it to the developers.</source>
<source>No source database, nothing to do.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Successfully merged the database files.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Database was not modified by merge operation.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Search Results (%1)</source>
<translation type="unfinished"></translation>
@@ -2774,14 +2766,6 @@ Disable safe saves and try again?</source>
<source>Remote sync &apos;%1&apos; completed successfully!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remote sync &apos;%1&apos; failed: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error while saving database %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloading...</source>
<translation type="unfinished"></translation>
@@ -2790,10 +2774,18 @@ Disable safe saves and try again?</source>
<source>Uploading...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remote sync &apos;%1&apos; failed: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Syncing...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Error while saving database %1: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove passkey from entry</source>
<translation type="unfinished"></translation>
@@ -2810,10 +2802,6 @@ Disable safe saves and try again?</source>
<source>Do you want to load the changes?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reload database</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reloading database</source>
<translation type="unfinished"></translation>
@@ -2838,6 +2826,10 @@ Disable safe saves and try again?</source>
<source>The database file &quot;%1&quot; was modified externally.&lt;br&gt;How would you like to proceed?&lt;br&gt;&lt;br&gt;Merge all changes then save&lt;br&gt;Overwrite the changes on disk&lt;br&gt;Discard unsaved changes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Reload database</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Database file overwritten.</source>
<translation type="unfinished"></translation>
@@ -2850,14 +2842,6 @@ Disable safe saves and try again?</source>
<source>Failed to save backup database: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save Database Backup</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Confirm Delete Group</source>
<translation type="unfinished"></translation>
@@ -2870,6 +2854,26 @@ Disable safe saves and try again?</source>
<source>Confirm Recycle Group</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save Database Backup</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Successfully merged the selected database.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No changes were made by the merge operation.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Merge canceled, no changes were made.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditEntryAttachmentsDialog</name>
@@ -3940,6 +3944,62 @@ This may cause the affected plugins to malfunction.</source>
%2</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Username</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>URL</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Notes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Custom Attributes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Icon</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Color</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>TOTP</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Custom Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attachments</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto-Type</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Tags</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EntryAttachments</name>
@@ -4144,62 +4204,6 @@ Would you like to overwrite the existing attachment?</source>
<source>Size</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Username</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>URL</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Notes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Custom Attributes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Icon</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Color</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expiration</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>TOTP</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Custom Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attachments</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto-Type</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Tags</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EntryModel</name>
@@ -6429,44 +6433,43 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MergeDialog</name>
<message>
<source>Database Merge Confirmation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Merge</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Group</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>UUID</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Details</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Merger</name>
<message>
<source>Creating missing %1 [%2]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Relocating %1 [%2]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Overwriting %1 [%2]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Synchronizing from newer source %1 [%2]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Synchronizing from older source %1 [%2]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Deleting child %1 [%2]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Deleting orphan %1 [%2]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Changed deleted objects</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adding missing icon %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Removed custom data %1 [%2]</source>
<translation type="unfinished"></translation>
@@ -6475,6 +6478,74 @@ Expect some bugs and minor issues, this version is meant for testing purposes.</
<source>Adding custom data %1 [%2]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Added</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Modified</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Moved</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Deleted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Previous location: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Number of entries in group: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Group name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Notes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Icon (UUID)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Icon (Number)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expiry time</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Modification time</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 (Add local modifications to new entry)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>%1 (Add new modifications to existing entry)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Explicit deletion</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Implicit deletion (e.g. removal of parent group)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Adding new icon %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewDatabaseWizard</name>