detectVersion static method
Detects one stable version name from conventional project files.
A literal Gradle versionName takes precedence over Flutter's generated
flutter.versionName value in android/local.properties.
Implementation
static Future<String?> detectVersion(String appRoot) async {
final androidDirectory = p.join(appRoot, 'android');
final gradleVersions = <String>{};
for (final path in <String>[
p.join(androidDirectory, 'app', 'build.gradle.kts'),
p.join(androidDirectory, 'app', 'build.gradle'),
]) {
final file = File(path);
if (!(await file.exists())) continue;
final source = await file.readAsString();
gradleVersions.addAll(
_stableVersions(
RegExp(
r'''^\s*versionName\s*(?:=\s*)?["']([^"'$]+)["']\s*$''',
multiLine: true,
).allMatches(source).map((match) => match.group(1)),
),
);
}
if (gradleVersions.isNotEmpty) {
return _oneVersion(gradleVersions);
}
final localProperties = File(
p.join(androidDirectory, 'local.properties'),
);
if (!(await localProperties.exists())) return null;
final source = await localProperties.readAsString();
final versions = _stableVersions(
RegExp(
r'^\s*flutter\.versionName\s*=\s*(\S+)\s*$',
multiLine: true,
).allMatches(source).map((match) => match.group(1)),
);
return versions.isEmpty ? null : _oneVersion(versions);
}