oto/lib/oto/core/data_composer.dart
2024-12-31 08:29:29 +09:00

127 lines
4.1 KiB
Dart

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:dart_framework/platform/process.dart';
import 'package:dart_framework/utils/system_util.dart';
import 'package:oto_cli/cli/cli.dart';
import 'package:oto_cli/oto/application.dart';
import 'package:oto_cli/oto/data/jenkins_data.dart';
import 'package:oto_cli/oto/core/defined_data.dart';
abstract class DataComposer {
DataCommon? commonData;
String buildYaml = '';
Future compose(String? yaml, Future Function(String, Color?) printer) async {
return simpleFuture;
}
}
class DataComposerTest extends DataComposer {
@override
Future compose(String? yaml, Future Function(String, Color?) printer) async {
commonData = DataCommon.fromJson(TestData.jenkinsMap!);
buildYaml = TestData.buildYaml;
return simpleFuture;
}
}
class DataComposerFile extends DataComposer {
@override
Future compose(String? yaml, Future Function(String, Color?) printer) async {
commonData = DataCommon.fromJson(FileData.jenkinsMap!);
buildYaml = yaml ?? '---';
return simpleFuture;
}
}
class DataComposerJenkins extends DataComposer {
@override
Future compose(String? yaml, Future Function(String, Color?) printer) async {
Map<String, dynamic>? jenkinsMap;
String os = Platform.operatingSystem;
var enable = true;
Application.log('Current OS: $os');
Application.log('Start build...');
String jsonStr = '';
if (Platform.isMacOS || Platform.isLinux) {
var shellExe = Platform.isMacOS ? 'zsh' : 'bash';
await Process.run(shellExe, [
'${Directory.current.path}/assets/script/shell/jenkins_env_params.sh'
]).then((ProcessResult result) => jsonStr = result.stdout);
jenkinsMap = getMapFromJson(jsonStr)!;
var shell = StringBuffer('printf "%s\n" "\${BuildData}"');
var process = await ProcessExecutor.start(shell);
await process.waitForExit();
print(process.stdout.toString());
} else if (Platform.isWindows) {
await Process.run('cmd', [
'/C',
'${Directory.current.path}/assets/script/batch/jenkins_env_params.bat'
]).then((ProcessResult result) => jsonStr = result.stdout);
jsonStr = jsonStr.substring(jsonStr.indexOf('{'));
jsonStr = jsonStr.replaceAll('\\', '/');
jenkinsMap = getMapFromJson(jsonStr);
} else {
enable = false;
printer(
'is not Mac/Windows/Linux. build must be execute in Mac/Windows os system',
Color.redStrong);
}
if (enable) {
await printer('Jenkins Variables', Color.green);
Application.log(jsonStr);
}
commonData = DataCommon.fromJson(jenkinsMap!);
buildYaml = await getBuildData();
return simpleFuture;
}
Future<String> getBuildData() async {
var c = Completer<String>();
var file = File('${commonData!.workspace}/build_data.conf');
var content = '';
if (Platform.isWindows) {
content = file.readAsStringSync(encoding: utf8).replaceAll('\\', '/');
var index = content.indexOf('=');
content = content.substring(index + 1);
var regEx = RegExp(r'(%)([a-zA-Z0-9]+)(%)');
var list = regEx.allMatches(content);
var params = <String>[];
for (var match in list) {
var param = match.group(2);
if (!params.contains(param)) {
params.add(param!);
}
}
var temp = File('${commonData!.workspace}/param_temp.bat');
var bat = '';
for (var param in params) {
bat += '@echo %$param%\n';
}
temp.writeAsStringSync(bat);
var resultParam = '';
await Process.run('cmd', ['/C', temp.path])
.then((ProcessResult result) => resultParam = result.stdout);
var values = resultParam.split('\n');
var length = params.length;
for (var i = 0; i < length; ++i) {
var value = values[i]
.toString()
.replaceAll('\\', '/')
.replaceAll(RegExp('\r|\n'), '');
content = content.replaceAll('%${params[i]}%', value);
}
temp.deleteSync();
} else {
content = await file.readAsString();
}
c.complete(content);
return c.future;
}
}