copy static method

ClientEnvCopyResult copy({
  1. required String source,
  2. required String from,
  3. required String to,
  4. Map<String, String> overrides = const {},
})

Implementation

static ClientEnvCopyResult copy({
  required String source,
  required String from,
  required String to,
  Map<String, String> overrides = const {},
}) {
  final sourceValues = ConfigService.parseEnvContent(source);
  final overridden = <String>[];
  final pathsRewritten = <String>[];
  final dropped = <String>[];
  final values = <String, String>{};
  final out = <String>[
    '# Started from "$from" by udara_cli setup --from. Keys that belong to',
    '# $from (ids, API keys, tenant) were copied as they are: check them.',
    '',
  ];

  for (final line in source.split('\n')) {
    final m = _line.firstMatch(line);
    if (m == null) {
      out.add(line);
      continue;
    }
    final key = m.group(2)!;
    if (key.startsWith('RELEASE_')) {
      dropped.add(key);
      continue;
    }
    if (overrides.containsKey(key)) {
      overridden.add(key);
      values[key] = overrides[key]!;
      out.add('${m.group(1)}$key${m.group(3)}${_quote(overrides[key]!)}');
      continue;
    }
    final raw = m.group(4)!;
    final rewritten = _rewritePaths(raw, from, to);
    if (rewritten != raw) pathsRewritten.add(key);
    values[key] = ConfigService.parseEnvContent('$key=$rewritten')[key] ?? '';
    out.add('${m.group(1)}$key${m.group(3)}$rewritten');
  }

  final added = [
    for (final key in overrides.keys)
      if (!overridden.contains(key) && !key.startsWith('RELEASE_')) key,
  ];
  if (added.isNotEmpty) {
    while (out.isNotEmpty && out.last.trim().isEmpty) {
      out.removeLast();
    }
    out
      ..add('')
      ..add('# From BRANDING.md');
    for (final key in added) {
      values[key] = overrides[key]!;
      out.add('$key=${_quote(overrides[key]!)}');
    }
  }

  var text = out.join('\n');
  if (!text.endsWith('\n')) text += '\n';
  return ClientEnvCopyResult(
    text: text,
    overridden: overridden,
    added: added,
    pathsRewritten: pathsRewritten,
    dropped: dropped,
    sameAsSource: [
      for (final key in identityKeys)
        if (sourceValues.containsKey(key) &&
            values[key] == sourceValues[key] &&
            (values[key] ?? '').isNotEmpty)
          key,
    ],
  );
}