Now we output merging warnings on status panel #7357

This commit is contained in:
kifir23917 2025-02-06 18:24:00 +03:00 committed by rusefillc
parent 73d262c5a8
commit 554e766bcc
2 changed files with 122 additions and 87 deletions

View File

@ -138,7 +138,8 @@ public class CalibrationsHelper {
prevIniFile, prevIniFile,
prevMsq.getConstantsAsMap(), prevMsq.getConstantsAsMap(),
newIniFile, newIniFile,
newMsq.getConstantsAsMap() newMsq.getConstantsAsMap(),
callbacks
); );
if (!valuesToUpdate.isEmpty()) { if (!valuesToUpdate.isEmpty()) {
final ConfigurationImage mergedImage = newCalibrations.getImage().getConfigurationImage().clone(); final ConfigurationImage mergedImage = newCalibrations.getImage().getConfigurationImage().clone();

View File

@ -4,6 +4,7 @@ import com.devexperts.logging.Logging;
import com.opensr5.ini.IniFileModel; import com.opensr5.ini.IniFileModel;
import com.opensr5.ini.field.*; import com.opensr5.ini.field.*;
import com.rusefi.core.Pair; import com.rusefi.core.Pair;
import com.rusefi.io.UpdateOperationCallbacks;
import com.rusefi.tune.xml.Constant; import com.rusefi.tune.xml.Constant;
import java.util.*; import java.util.*;
@ -19,7 +20,8 @@ public class IniFieldsAnalizer {
final IniFileModel prevIni, final IniFileModel prevIni,
final Map<String, Constant> prevValues, final Map<String, Constant> prevValues,
final IniFileModel newIni, final IniFileModel newIni,
final Map<String, Constant> newValues final Map<String, Constant> newValues,
final UpdateOperationCallbacks callbacks
) { ) {
final List<Pair<IniField, Constant>> result = new ArrayList<>(); final List<Pair<IniField, Constant>> result = new ArrayList<>();
final Map<String, IniField> prevIniFields = prevIni.getAllIniFields(); final Map<String, IniField> prevIniFields = prevIni.getAllIniFields();
@ -33,51 +35,56 @@ public class IniFieldsAnalizer {
if (prevValue != null && newValue != null) { if (prevValue != null && newValue != null) {
if (!Objects.equals(prevValue.getValue(), newValue.getValue())) { if (!Objects.equals(prevValue.getValue(), newValue.getValue())) {
if (!Objects.equals(prevValue.getName(), newValue.getName())) { if (!Objects.equals(prevValue.getName(), newValue.getName())) {
log.warn(String.format( callbacks.logLine(String.format(
"Field `%s` cannot be updated because its name is updated: %s -> %s", "WARNING! Field `%s` cannot be updated because its name is updated: `%s` -> `%s`",
prevFieldName, prevFieldName,
prevValue, prevValue.getName(),
newValue newValue.getName()
)); ));
} else if (!Objects.equals(prevValue.getUnits(), newValue.getUnits())) { } else if (!Objects.equals(prevValue.getUnits(), newValue.getUnits())) {
log.warn(String.format( callbacks.logLine(String.format(
"Field `%s` cannot be updated because its units are updated: %s -> %s", "WARNING! Field `%s` cannot be updated because its units are updated: `%s` -> `%s`",
prevFieldName, prevFieldName,
prevValue, prevValue.getUnits(),
newValue newValue.getUnits()
)); ));
} else if (!Objects.equals(prevValue.getDigits(), newValue.getDigits())) { } else if (!Objects.equals(prevValue.getDigits(), newValue.getDigits())) {
log.warn(String.format( callbacks.logLine(String.format(
"Field `%s` cannot be updated because its digits are updated: %s -> %s", "WARNING! Field `%s` cannot be updated because its digits are updated: `%s` -> `%s`",
prevFieldName, prevFieldName,
prevValue, prevValue.getDigits(),
newValue newValue.getDigits()
)); ));
} else if (!Objects.equals(prevValue.getCols(), newValue.getCols())) { } else if (!Objects.equals(prevValue.getCols(), newValue.getCols())) {
log.warn(String.format( callbacks.logLine(String.format(
"Field `%s` cannot be updated because its column count is updated: %s -> %s", "WARNING! Field `%s` cannot be updated because its column count is updated: `%s` -> `%s`",
prevFieldName, prevFieldName,
prevValue, prevValue.getCols(),
newValue newValue.getCols()
)); ));
} else if (!Objects.equals(prevValue.getRows(), newValue.getRows())) { } else if (!Objects.equals(prevValue.getRows(), newValue.getRows())) {
log.warn(String.format( callbacks.logLine(String.format(
"Field `%s` cannot be updated because its column count is updated: %s -> %s", "WARNING! Field `%s` cannot be updated because its row count is updated: `%s` -> `%s`",
prevFieldName, prevFieldName,
prevValue, prevValue.getRows(),
newValue newValue.getRows()
)); ));
} else if (canValueBeMigrated(prevFieldEntry.getValue(), newField, prevValue.getValue())) { } else if (canValueBeMigrated(
prevFieldEntry.getValue(),
newField,
prevValue.getValue(),
callbacks
)) {
log.info(String.format( log.info(String.format(
"Field `%s` will be updated: %s -> %s", "Field `%s` is going to be restored: `%s` -> `%s`",
prevFieldName, prevFieldName,
prevValue, prevValue.getValue(),
newValue newValue.getValue()
)); ));
result.add(new Pair<>(newField, prevValue)); result.add(new Pair<>(newField, prevValue));
} else { } else {
log.warn(String.format( log.warn(String.format(
"Field `%s` cannot be updated: %s -> %s", "Field `%s` cannot be updated: `%s` -> `%s`",
prevFieldName, prevFieldName,
prevFieldEntry.getValue(), prevFieldEntry.getValue(),
newField newField
@ -95,53 +102,51 @@ public class IniFieldsAnalizer {
private static boolean canValueBeMigrated( private static boolean canValueBeMigrated(
final IniField prevField, final IniField prevField,
final IniField newField, final IniField newField,
final String prevValue final String prevValue,
final UpdateOperationCallbacks callbacks
) { ) {
boolean result = false; boolean result = false;
final String prevFieldName = prevField.getName(); final String prevFieldName = prevField.getName();
if (!INI_FIELDS_TO_IGNORE.contains(prevFieldName)) { if (!INI_FIELDS_TO_IGNORE.contains(prevFieldName)) {
if (prevField instanceof ScalarIniField) { if (prevField instanceof ScalarIniField) {
if (newField instanceof ScalarIniField) { if (newField instanceof ScalarIniField) {
result = canScalarValueBeMigrated((ScalarIniField) prevField, (ScalarIniField) newField); result = canScalarValueBeMigrated((ScalarIniField) prevField, (ScalarIniField) newField, callbacks);
} else { } else {
log.warn(String.format( callbacks.logLine(String.format(
"Field `%s` cannot be migrated because it is no is no longer scalar in new .ini file: %s -> %s", "WARNING! Field `%s` cannot be migrated because it is no is no longer scalar in new .ini file",
prevFieldName, prevFieldName
prevField,
newField
)); ));
} }
} else if (prevField instanceof StringIniField) { } else if (prevField instanceof StringIniField) {
if (newField instanceof StringIniField) { if (newField instanceof StringIniField) {
result = true; result = true;
} else { } else {
log.warn(String.format( callbacks.logLine(String.format(
"Field `%s` cannot be migrated because it is no longer string in new .ini file: %s -> %s", "WARNING! Field `%s` cannot be migrated because it is no longer string in new .ini file",
prevFieldName, prevFieldName
prevField,
newField
)); ));
} }
} else if (prevField instanceof EnumIniField) { } else if (prevField instanceof EnumIniField) {
if (newField instanceof EnumIniField) { if (newField instanceof EnumIniField) {
result = canEnumValueBeMigrated((EnumIniField) prevField, (EnumIniField) newField, prevValue); result = canEnumValueBeMigrated(
(EnumIniField) prevField,
(EnumIniField) newField,
prevValue,
callbacks
);
} else { } else {
log.warn(String.format( callbacks.logLine(String.format(
"Field `%s` cannot be migrated because it is no longer enum in new .ini file: %s -> %s", "WARNING! `%s` cannot be migrated because it is no longer enum in new .ini file",
prevFieldName, prevFieldName
prevField,
newField
)); ));
} }
} else if (prevField instanceof ArrayIniField) { } else if (prevField instanceof ArrayIniField) {
if (newField instanceof ArrayIniField) { if (newField instanceof ArrayIniField) {
result = canArrayValueBeMigrated((ArrayIniField) prevField, (ArrayIniField) newField); result = canArrayValueBeMigrated((ArrayIniField) prevField, (ArrayIniField) newField, callbacks);
} else { } else {
log.warn(String.format( callbacks.logLine(String.format(
"Field `%s` cannot be migrated because it is no longer array in new .ini file: %s -> %s", "WARNING! Field `%s` cannot be migrated because it is no longer array in new .ini file",
prevFieldName, prevFieldName
prevField,
newField
)); ));
} }
} else { } else {
@ -151,19 +156,30 @@ public class IniFieldsAnalizer {
return result; return result;
} }
private static boolean canScalarValueBeMigrated(final ScalarIniField prevField, final ScalarIniField newField) { private static boolean canScalarValueBeMigrated(
final ScalarIniField prevField,
final ScalarIniField newField,
final UpdateOperationCallbacks callbacks
) {
boolean result = false; boolean result = false;
if (!Objects.equals(prevField.getUnits(), newField.getUnits())) { if (!Objects.equals(prevField.getUnits(), newField.getUnits())) {
log.warn(String.format( callbacks.logLine(String.format(
"Field cannot be migrated because units are updated: %s -> %s", "WARNING! Field `%s` cannot be migrated because units are updated: `%s` -> `%s`",
prevField.getName(),
prevField, prevField,
newField newField
)); ));
} else if (!Objects.equals(prevField.getType(), newField.getType())) { } else if (!Objects.equals(prevField.getType(), newField.getType())) {
log.warn(String.format("Field cannot be migrated because type is updated: %s -> %s", prevField, newField)); callbacks.logLine(String.format(
"WARNING! Field `%s` cannot be migrated because type is updated: `%s` -> `%s`",
prevField.getName(),
prevField,
newField
));
} else if (!Objects.equals(prevField.getDigits(), newField.getDigits())) { } else if (!Objects.equals(prevField.getDigits(), newField.getDigits())) {
log.warn(String.format( callbacks.logLine(String.format(
"Field cannot be migrated because digits are updated: %s -> %s", "WARNING! Field `%s` cannot be migrated because digits are updated: `%s` -> `%s`",
prevField.getName(),
prevField, prevField,
newField newField
)); ));
@ -176,30 +192,36 @@ public class IniFieldsAnalizer {
private static boolean canEnumValueBeMigrated( private static boolean canEnumValueBeMigrated(
final EnumIniField prevField, final EnumIniField prevField,
final EnumIniField newField, final EnumIniField newField,
final String prevValue final String prevValue,
final UpdateOperationCallbacks callbacks
) { ) {
boolean result = false; boolean result = false;
//TODO: Should we check if `enums` map is updated?
if (!Objects.equals(prevField.getType(), newField.getType())) { if (!Objects.equals(prevField.getType(), newField.getType())) {
log.warn(String.format("Field cannot be migrated because type is updated: %s -> %s", prevField, newField)); callbacks.logLine(String.format(
"WARNING! Field `%s` cannot be migrated because type is updated: `%s` -> `%s`",
prevField.getName(),
prevField.getType(),
newField.getType()
));
} else if (!Objects.equals(prevField.getBitPosition(), newField.getBitPosition())) { } else if (!Objects.equals(prevField.getBitPosition(), newField.getBitPosition())) {
log.warn(String.format( callbacks.logLine(String.format(
"Field cannot be migrated because bit position is updated: %s -> %s", "WARNING! Field `%s` cannot be migrated because bit position is updated: `%s` -> `%s`",
prevField, prevField.getName(),
newField prevField.getBitPosition(),
newField.getBitPosition()
)); ));
} else if (!Objects.equals(prevField.getBitSize0(), newField.getBitSize0())) { } else if (!Objects.equals(prevField.getBitSize0(), newField.getBitSize0())) {
log.warn(String.format( callbacks.logLine(String.format(
"Field cannot be migrated because bit size 0 is updated: %s -> %s", "WARNING! Field `%s` cannot be migrated because bit size 0 is updated: `%s` -> `%s`",
prevField, prevField.getName(),
newField prevField.getBitSize0(),
newField.getBitSize0()
)); ));
} else if (newField.getEnums().indexOf(prevValue) == -1) { } else if (newField.getEnums().indexOf(prevValue) == -1) {
log.warn(String.format( callbacks.logLine(String.format(
"Field cannot be migrated because previous value `%s` disappeared: %s -> %s", "WARNING! Field `%s` cannot be migrated because value `%s` has disappeared",
prevValue, prevField.getName(),
prevField, prevValue
newField
)); ));
} else { } else {
result = true; result = true;
@ -207,27 +229,39 @@ public class IniFieldsAnalizer {
return result; return result;
} }
private static boolean canArrayValueBeMigrated(final ArrayIniField prevField, final ArrayIniField newField) { private static boolean canArrayValueBeMigrated(
final ArrayIniField prevField,
final ArrayIniField newField,
final UpdateOperationCallbacks callbacks
) {
boolean result = false; boolean result = false;
if (!Objects.equals(prevField.getType(), newField.getType())) { if (!Objects.equals(prevField.getType(), newField.getType())) {
log.warn(String.format("Field cannot be migrated because type is updated: %s -> %s", prevField, newField)); callbacks.logLine(String.format(
"WARNING! Field `%s` cannot be migrated because type is updated: `%s` -> `%s`",
prevField.getName(),
prevField.getType(),
newField.getType()
));
} else if (!Objects.equals(prevField.getCols(), newField.getCols())) { } else if (!Objects.equals(prevField.getCols(), newField.getCols())) {
log.warn(String.format( callbacks.logLine(String.format(
"Field cannot be migrated because column count is updated: %s -> %s", "WARNING! Field `%s` cannot be migrated because column count is updated: `%s` -> `%s`",
prevField, prevField.getName(),
newField prevField.getCols(),
newField.getCols()
)); ));
} else if (!Objects.equals(prevField.getRows(), newField.getRows())) { } else if (!Objects.equals(prevField.getRows(), newField.getRows())) {
log.warn(String.format( callbacks.logLine(String.format(
"Field cannot be migrated because row count is updated: %s -> %s", "WARNING! Field `%s` cannot be migrated because row count is updated: `%s` -> `%s`",
prevField, prevField.getName(),
newField prevField.getRows(),
newField.getRows()
)); ));
} else if (!Objects.equals(prevField.getDigits(), newField.getDigits())) { } else if (!Objects.equals(prevField.getDigits(), newField.getDigits())) {
log.warn(String.format( callbacks.logLine(String.format(
"Field cannot be migrated because digits are updated: %s -> %s", "WARNING! Field `%s` cannot be migrated because digits are updated: `%s` -> `%s`",
prevField, prevField.getName(),
newField prevField.getDigits(),
newField.getDigits()
)); ));
} else { } else {
result = true; result = true;