Unverified Commit 99efd1b5 authored by Piotr FLEURY's avatar Piotr FLEURY Committed by GitHub

Fix .env regex constants (#130072)

Set `.env` regex list as constants.

This pull request fixes the nit related in this comment: https://github.com/flutter/flutter/pull/128668#discussion_r1253377454
parent 3c2cd015
...@@ -34,6 +34,31 @@ import 'target_devices.dart'; ...@@ -34,6 +34,31 @@ import 'target_devices.dart';
export '../cache.dart' show DevelopmentArtifact; export '../cache.dart' show DevelopmentArtifact;
abstract class DotEnvRegex {
// Dot env multi-line block value regex
static final RegExp multiLineBlock = RegExp(r'^\s*([a-zA-Z_]+[a-zA-Z0-9_]*)\s*=\s*"""\s*(.*)$');
// Dot env full line value regex (eg FOO=bar)
// Entire line will be matched including key and value
static final RegExp keyValue = RegExp(r'^\s*([a-zA-Z_]+[a-zA-Z0-9_]*)\s*=\s*(.*)?$');
// Dot env value wrapped in double quotes regex (eg FOO="bar")
// Value between double quotes will be matched (eg only bar in "bar")
static final RegExp doubleQuotedValue = RegExp(r'^"(.*)"\s*(\#\s*.*)?$');
// Dot env value wrapped in single quotes regex (eg FOO='bar')
// Value between single quotes will be matched (eg only bar in 'bar')
static final RegExp singleQuotedValue = RegExp(r"^'(.*)'\s*(\#\s*.*)?$");
// Dot env value wrapped in back quotes regex (eg FOO=`bar`)
// Value between back quotes will be matched (eg only bar in `bar`)
static final RegExp backQuotedValue = RegExp(r'^`(.*)`\s*(\#\s*.*)?$');
// Dot env value without quotes regex (eg FOO=bar)
// Value without quotes will be matched (eg full value after the equals sign)
static final RegExp unquotedValue = RegExp(r'^([^#\n\s]*)\s*(?:\s*#\s*(.*))?$');
}
enum ExitStatus { enum ExitStatus {
success, success,
warning, warning,
...@@ -1390,45 +1415,39 @@ abstract class FlutterCommand extends Command<void> { ...@@ -1390,45 +1415,39 @@ abstract class FlutterCommand extends Command<void> {
/// ///
/// Returns a record of key and value as strings. /// Returns a record of key and value as strings.
MapEntry<String, String> _parseProperty(String line) { MapEntry<String, String> _parseProperty(String line) {
final RegExp blockRegExp = RegExp(r'^\s*([a-zA-Z_]+[a-zA-Z0-9_]*)\s*=\s*"""\s*(.*)$'); if (DotEnvRegex.multiLineBlock.hasMatch(line)) {
if (blockRegExp.hasMatch(line)) {
throwToolExit('Multi-line value is not supported: $line'); throwToolExit('Multi-line value is not supported: $line');
} }
final RegExp propertyRegExp = RegExp(r'^\s*([a-zA-Z_]+[a-zA-Z0-9_]*)\s*=\s*(.*)?$'); final Match? keyValueMatch = DotEnvRegex.keyValue.firstMatch(line);
final Match? match = propertyRegExp.firstMatch(line); if (keyValueMatch == null) {
if (match == null) {
throwToolExit('Unable to parse file provided for ' throwToolExit('Unable to parse file provided for '
'--${FlutterOptions.kDartDefineFromFileOption}.\n' '--${FlutterOptions.kDartDefineFromFileOption}.\n'
'Invalid property line: $line'); 'Invalid property line: $line');
} }
final String key = match.group(1)!; final String key = keyValueMatch.group(1)!;
final String value = match.group(2) ?? ''; final String value = keyValueMatch.group(2) ?? '';
// Remove wrapping quotes and trailing line comment. // Remove wrapping quotes and trailing line comment.
final RegExp doubleQuoteValueRegExp = RegExp(r'^"(.*)"\s*(\#\s*.*)?$'); final Match? doubleQuotedValueMatch = DotEnvRegex.doubleQuotedValue.firstMatch(value);
final Match? doubleQuoteValue = doubleQuoteValueRegExp.firstMatch(value); if (doubleQuotedValueMatch != null) {
if (doubleQuoteValue != null) { return MapEntry<String, String>(key, doubleQuotedValueMatch.group(1)!);
return MapEntry<String, String>(key, doubleQuoteValue.group(1)!);
} }
final RegExp quoteValueRegExp = RegExp(r"^'(.*)'\s*(\#\s*.*)?$"); final Match? singleQuotedValueMatch = DotEnvRegex.singleQuotedValue.firstMatch(value);
final Match? quoteValue = quoteValueRegExp.firstMatch(value); if (singleQuotedValueMatch != null) {
if (quoteValue != null) { return MapEntry<String, String>(key, singleQuotedValueMatch.group(1)!);
return MapEntry<String, String>(key, quoteValue.group(1)!);
} }
final RegExp backQuoteValueRegExp = RegExp(r'^`(.*)`\s*(\#\s*.*)?$'); final Match? backQuotedValueMatch = DotEnvRegex.backQuotedValue.firstMatch(value);
final Match? backQuoteValue = backQuoteValueRegExp.firstMatch(value); if (backQuotedValueMatch != null) {
if (backQuoteValue != null) { return MapEntry<String, String>(key, backQuotedValueMatch.group(1)!);
return MapEntry<String, String>(key, backQuoteValue.group(1)!);
} }
final RegExp noQuoteValueRegExp = RegExp(r'^([^#\n\s]*)\s*(?:\s*#\s*(.*))?$'); final Match? unquotedValueMatch = DotEnvRegex.unquotedValue.firstMatch(value);
final Match? noQuoteValue = noQuoteValueRegExp.firstMatch(value); if (unquotedValueMatch != null) {
if (noQuoteValue != null) { return MapEntry<String, String>(key, unquotedValueMatch.group(1)!);
return MapEntry<String, String>(key, noQuoteValue.group(1)!);
} }
return MapEntry<String, String>(key, value); return MapEntry<String, String>(key, value);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment