Bug 577782: [Preferences] Improve PreferenceUtils.mergeNode

Follow-up-to: e77da8eb6b1bec0cd010ca6e1b4aebaf467a6cf7
Change-Id: Ibf13d26e93ad6bba14a623db91b60a87a42f0a11
diff --git a/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/ecommons/preferences/core/PreferenceUtils.java b/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/ecommons/preferences/core/PreferenceUtils.java
index a3ac241..bcdf720 100644
--- a/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/ecommons/preferences/core/PreferenceUtils.java
+++ b/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/ecommons/preferences/core/PreferenceUtils.java
@@ -135,12 +135,15 @@
 	}
 	
 	
-	public static boolean mergeNode(final String fromQualifier, final String toQualifier)
+	public static boolean mergeNode(final String fromQualifier, final String toQualifier,
+			final boolean deleteFinally)
 			throws BackingStoreException {
 		final IScopeContext scope= InstanceScope.INSTANCE;
 		if (scope.getNode("").nodeExists(fromQualifier)) { //$NON-NLS-1$
 			final var fromNode= scope.getNode(fromQualifier);
-			final var fromParent= nonNullAssert(fromNode.parent());
+			if (fromNode.getBoolean("migrated", false)) { //$NON-NLS-1$
+				return false;
+			}
 			final var toNode= scope.getNode(toQualifier);
 			for (final String key : fromNode.keys()) {
 				final String value= fromNode.get(key, null);
@@ -150,8 +153,16 @@
 			}
 			
 			toNode.flush();
-			fromNode.removeNode();
-			fromParent.flush();
+			
+			if (deleteFinally) {
+				final var parent= nonNullAssert(fromNode.parent());
+				fromNode.removeNode();
+				parent.flush();
+			}
+			else {
+				fromNode.putBoolean("migrated", true); //$NON-NLS-1$
+				fromNode.flush();
+			}
 			return true;
 		}
 		return false;