detectVersion static method

Future<String?> detectVersion(
  1. String appRoot
)

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);
}