mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-25 18:05:33 +02:00
Bug 476432 - GDB version comparison fails for GDB 7.10
Move the new comparison method to LaunchUtils. Change-Id: I97e5ff61ba1173525a5d1060e1b07ba2136eb49e
This commit is contained in:
parent
377202feb1
commit
b5bdc32883
2 changed files with 67 additions and 64 deletions
|
@ -363,6 +363,70 @@ public class LaunchUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compares two version numbers.
|
||||||
|
* Returns -1, 0, or 1 if v1 is less than, equal to, or greater than v2 respectively
|
||||||
|
* @param v1 The first version
|
||||||
|
* @param v2 The second version
|
||||||
|
* @return -1, 0, or 1 if v1 is less than, equal to, or greater than v2 respectively
|
||||||
|
* @since 4.8
|
||||||
|
*/
|
||||||
|
public static int compareVersions(String v1, String v2) {
|
||||||
|
if (v1 == null || v2 == null) throw new NullPointerException();
|
||||||
|
|
||||||
|
String[] v1Parts = v1.split("\\."); //$NON-NLS-1$
|
||||||
|
String[] v2Parts = v2.split("\\."); //$NON-NLS-1$
|
||||||
|
for (int i = 0; i < v1Parts.length && i < v2Parts.length; i++) {
|
||||||
|
try {
|
||||||
|
int v1PartValue = Integer.parseInt(v1Parts[i]);
|
||||||
|
int v2PartValue = Integer.parseInt(v2Parts[i]);
|
||||||
|
|
||||||
|
if (v1PartValue > v2PartValue) {
|
||||||
|
return 1;
|
||||||
|
} else if (v1PartValue < v2PartValue) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
// Non-integer part, ignore it
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we get here is means the versions are still equal
|
||||||
|
// but there could be extra parts to examine
|
||||||
|
|
||||||
|
if (v1Parts.length < v2Parts.length) {
|
||||||
|
// v2 has extra parts, which implies v1 is a lower version (e.g., v1 = 7.9 v2 = 7.9.1)
|
||||||
|
// unless each extra part is 0, in which case the two versions are equal (e.g., v1 = 7.9 v2 = 7.9.0)
|
||||||
|
for (int i = v1Parts.length; i < v2Parts.length; i++) {
|
||||||
|
try {
|
||||||
|
if (Integer.parseInt(v2Parts[i]) != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
// Non-integer part, ignore it
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (v1Parts.length > v2Parts.length) {
|
||||||
|
// v1 has extra parts, which implies v1 is a higher version (e.g., v1 = 7.9.1 v2 = 7.9)
|
||||||
|
// unless each extra part is 0, in which case the two versions are equal (e.g., v1 = 7.9.0 v2 = 7.9)
|
||||||
|
for (int i = v2Parts.length; i < v1Parts.length; i++) {
|
||||||
|
try {
|
||||||
|
if (Integer.parseInt(v1Parts[i]) != 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
// Non-integer part, ignore it
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read from the specified stream and return what was read.
|
* Read from the specified stream and return what was read.
|
||||||
*
|
*
|
||||||
|
|
|
@ -38,6 +38,7 @@ import org.eclipse.cdt.dsf.debug.service.IStack;
|
||||||
import org.eclipse.cdt.dsf.debug.service.command.ICommandControl;
|
import org.eclipse.cdt.dsf.debug.service.command.ICommandControl;
|
||||||
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
|
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
|
||||||
import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch;
|
import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch;
|
||||||
|
import org.eclipse.cdt.dsf.gdb.launching.LaunchUtils;
|
||||||
import org.eclipse.cdt.dsf.gdb.service.command.CommandFactory_6_8;
|
import org.eclipse.cdt.dsf.gdb.service.command.CommandFactory_6_8;
|
||||||
import org.eclipse.cdt.dsf.gdb.service.command.GDBControl;
|
import org.eclipse.cdt.dsf.gdb.service.command.GDBControl;
|
||||||
import org.eclipse.cdt.dsf.gdb.service.command.GDBControl_7_0;
|
import org.eclipse.cdt.dsf.gdb.service.command.GDBControl_7_0;
|
||||||
|
@ -319,71 +320,9 @@ public class GdbDebugServicesFactory extends AbstractDsfDebugServicesFactory {
|
||||||
* @since 4.8
|
* @since 4.8
|
||||||
*/
|
*/
|
||||||
protected int compareVersionWith(String version) {
|
protected int compareVersionWith(String version) {
|
||||||
return compareVersions(getVersion(), version);
|
return LaunchUtils.compareVersions(getVersion(), version);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Compares two version numbers.
|
|
||||||
* Returns -1, 0, or 1 if v1 is less than, equal to, or greater than v2 respectively
|
|
||||||
* @param v1 The first version
|
|
||||||
* @param v2 The second version
|
|
||||||
* @return -1, 0, or 1 if v1 is less than, equal to, or greater than v2 respectively
|
|
||||||
*/
|
|
||||||
private static int compareVersions(String v1, String v2) {
|
|
||||||
if (v1 == null || v2 == null) throw new NullPointerException();
|
|
||||||
|
|
||||||
String[] v1Parts = v1.split("\\."); //$NON-NLS-1$
|
|
||||||
String[] v2Parts = v2.split("\\."); //$NON-NLS-1$
|
|
||||||
for (int i = 0; i < v1Parts.length && i < v2Parts.length; i++) {
|
|
||||||
try {
|
|
||||||
int v1PartValue = Integer.parseInt(v1Parts[i]);
|
|
||||||
int v2PartValue = Integer.parseInt(v2Parts[i]);
|
|
||||||
|
|
||||||
if (v1PartValue > v2PartValue) {
|
|
||||||
return 1;
|
|
||||||
} else if (v1PartValue < v2PartValue) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
// Non-integer part, ignore it
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we get here is means the versions are still equal
|
|
||||||
// but there could be extra parts to examine
|
|
||||||
|
|
||||||
if (v1Parts.length < v2Parts.length) {
|
|
||||||
// v2 has extra parts, which implies v1 is a lower version (e.g., v1 = 7.9 v2 = 7.9.1)
|
|
||||||
// unless each extra part is 0, in which case the two versions are equal (e.g., v1 = 7.9 v2 = 7.9.0)
|
|
||||||
for (int i = v1Parts.length; i < v2Parts.length; i++) {
|
|
||||||
try {
|
|
||||||
if (Integer.parseInt(v2Parts[i]) != 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
// Non-integer part, ignore it
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (v1Parts.length > v2Parts.length) {
|
|
||||||
// v1 has extra parts, which implies v1 is a higher version (e.g., v1 = 7.9.1 v2 = 7.9)
|
|
||||||
// unless each extra part is 0, in which case the two versions are equal (e.g., v1 = 7.9.0 v2 = 7.9)
|
|
||||||
for (int i = v2Parts.length; i < v1Parts.length; i++) {
|
|
||||||
try {
|
|
||||||
if (Integer.parseInt(v1Parts[i]) != 0) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
// Non-integer part, ignore it
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A static method that will compare the version of GDB for the specified session and
|
* A static method that will compare the version of GDB for the specified session and
|
||||||
|
@ -402,7 +341,7 @@ public class GdbDebugServicesFactory extends AbstractDsfDebugServicesFactory {
|
||||||
IDsfDebugServicesFactory servicesFactory = ((GdbLaunch)launch).getServiceFactory();
|
IDsfDebugServicesFactory servicesFactory = ((GdbLaunch)launch).getServiceFactory();
|
||||||
if (servicesFactory instanceof GdbDebugServicesFactory) {
|
if (servicesFactory instanceof GdbDebugServicesFactory) {
|
||||||
String version = ((GdbDebugServicesFactory)servicesFactory).getVersion();
|
String version = ((GdbDebugServicesFactory)servicesFactory).getVersion();
|
||||||
if (compareVersions(minVersion, version) > 0) {
|
if (LaunchUtils.compareVersions(minVersion, version) > 0) {
|
||||||
assert false;
|
assert false;
|
||||||
|
|
||||||
GdbPlugin.log(
|
GdbPlugin.log(
|
||||||
|
|
Loading…
Add table
Reference in a new issue