From 33a75680eeadd155b962158a547684a3c259d2e9 Mon Sep 17 00:00:00 2001 From: "leedongmyung[desktop]" Date: Sun, 26 Nov 2023 12:34:20 +0900 Subject: [PATCH] add wait until syntax --- assets/pipeline-test.yaml | 2 ++ lib/oto/application.dart | 7 ++++++ lib/oto/commands/command.dart | 11 +++++++++ lib/oto/pipeline/pipeline.dart | 7 ++++-- lib/oto/pipeline/pipeline_condition.dart | 9 +++---- lib/oto/pipeline/pipeline_exe.dart | 19 ++++++++++---- lib/oto/pipeline/pipeline_wait_until.dart | 30 +++++++++++++++++++++++ 7 files changed, 73 insertions(+), 12 deletions(-) create mode 100644 lib/oto/pipeline/pipeline_wait_until.dart diff --git a/assets/pipeline-test.yaml b/assets/pipeline-test.yaml index aedef2b..397fdd1 100644 --- a/assets/pipeline-test.yaml +++ b/assets/pipeline-test.yaml @@ -18,6 +18,8 @@ pipeline: - async: git-count + - wait-until-string: != complete + - while: condition-int: == null on-do: diff --git a/lib/oto/application.dart b/lib/oto/application.dart index 186fcdc..b255209 100644 --- a/lib/oto/application.dart +++ b/lib/oto/application.dart @@ -15,6 +15,8 @@ import 'package:yaml/yaml.dart'; enum BuildType { jenkins, test, file } +enum CommandState { ready, progress, complete } + class Application { Application._privateConstructor(); static final Application _instance = Application._privateConstructor(); @@ -28,6 +30,7 @@ class Application { DataJenkins? jenkinsData; Map property = {}; + Map commandStates = {}; Map dataCommandMap = {}; late Pipeline pipeline; @@ -111,6 +114,10 @@ class Application { return map; } + void updateCommandState(String target, CommandState state) { + commandStates[target] = state; + } + Future printBuildStep(String name, Color? color) async { var message = '''************************************************************************************ diff --git a/lib/oto/commands/command.dart b/lib/oto/commands/command.dart index 88b2bda..dc5b4b1 100644 --- a/lib/oto/commands/command.dart +++ b/lib/oto/commands/command.dart @@ -114,6 +114,17 @@ abstract class Command { } } + if (value.startsWith('state.')) { + var map = Application.instance.commandStates; + var param = value.replaceFirst('state.', ''); + if (map.containsKey(param)) { + data = map[param].toString().replaceAll('CommandState.', ''); + } else { + data = null; + } + setted = true; + } + if (!setted) { throw Exception( 'Command.getTagValue: "$value" is not defined in property.'); diff --git a/lib/oto/pipeline/pipeline.dart b/lib/oto/pipeline/pipeline.dart index 3944295..a614658 100644 --- a/lib/oto/pipeline/pipeline.dart +++ b/lib/oto/pipeline/pipeline.dart @@ -1,6 +1,7 @@ import 'package:dart_framework/utils/system_util.dart'; import 'package:oto_cli/oto/pipeline/pipeline_exe.dart'; import 'package:oto_cli/oto/pipeline/pipeline_if.dart'; +import 'package:oto_cli/oto/pipeline/pipeline_wait_until.dart'; import 'package:oto_cli/oto/pipeline/pipeline_while.dart'; class Pipeline { @@ -9,8 +10,10 @@ class Pipeline { 'async': () => PipelineAsync(), 'if': () => PipelineIf(), 'while': () => PipelineWhile(), - /*'wait-until': () => PipelineWaitUntil(), - 'switch': () => PipelineSwitch(),*/ + 'wait-until-int': () => PipelineWaitUntil('int'), + 'wait-until-double': () => PipelineWaitUntil('double'), + 'wait-until-string': () => PipelineWaitUntil('string'), + /*'switch': () => PipelineSwitch(),*/ }; //pipeline validate & initialize diff --git a/lib/oto/pipeline/pipeline_condition.dart b/lib/oto/pipeline/pipeline_condition.dart index 9a9bb2c..d0712a9 100644 --- a/lib/oto/pipeline/pipeline_condition.dart +++ b/lib/oto/pipeline/pipeline_condition.dart @@ -40,11 +40,10 @@ abstract class PiplineCondition extends PipelineExecutor { Future printCondition(String syntax, String condition, String postfix, ConditionCheckResult result) async { - var quotesPre = Platform.isWindows ? '^"' : ''; - var quotesLast = Platform.isWindows ? '"' : ''; - var printStr = - '$quotesPre[$syntax] ($condition) / (${result.conditionValue}) : ${result.result} ===> $postfix$quotesLast'; - await CLI.println(printStr, color: Color.magentaStrong); + await CLI.println('[Pipeline-$syntax]', color: Color.magentaStrong); + print( + ' - Condition: ($condition)\n - Values: (${result.conditionValue})\n - Result: ${result.result} ===> $postfix'); + return simpleFuture; } diff --git a/lib/oto/pipeline/pipeline_exe.dart b/lib/oto/pipeline/pipeline_exe.dart index 1847db6..f4fb5ed 100644 --- a/lib/oto/pipeline/pipeline_exe.dart +++ b/lib/oto/pipeline/pipeline_exe.dart @@ -20,21 +20,22 @@ abstract class PipelineExecutor { } class PipelineExe extends PipelineExecutor { - late String targetCommandID; + late String commandID; @override PipelineValidateResult initialize(Map set) { var result = PipelineValidateResult(); - targetCommandID = set.values.first as String; - if (!Application.instance.dataCommandMap.containsKey(targetCommandID)) { + commandID = set.values.first as String; + if (!Application.instance.dataCommandMap.containsKey(commandID)) { result.enable = false; result.message = - 'The "$targetCommandID" command does not exist in the command list.'; + 'The "$commandID" command does not exist in the command list.'; } + updateState(CommandState.ready); return result; } Future get commandData async { - var commandData = Application.instance.dataCommandMap[targetCommandID]!; + var commandData = Application.instance.dataCommandMap[commandID]!; await Application.instance .printBuildStep('Phase Start: ${commandData.name}', Color.green); return dataFutrue(commandData); @@ -46,20 +47,28 @@ class PipelineExe extends PipelineExecutor { // var time = // '${now.minute.toString().padLeft(2)}:${now.second.toString().padLeft(2)}:${now.millisecond.toString().padLeft(2)}'; // print('==================> [$time] Execute: $targetCommandID'); + updateState(CommandState.progress); var data = await commandData; await Command.byType(data.command).execute(data); + updateState(CommandState.complete); return simpleFuture; } + + void updateState(CommandState state) { + Application.instance.updateCommandState(commandID, state); + } } class PipelineAsync extends PipelineExe { @override Future execute() async { + updateState(CommandState.progress); executeAsync(await commandData); return simpleFuture; } void executeAsync(DataCommand data) async { await Command.byType(data.command).execute(data); + updateState(CommandState.complete); } } diff --git a/lib/oto/pipeline/pipeline_wait_until.dart b/lib/oto/pipeline/pipeline_wait_until.dart new file mode 100644 index 0000000..e649c08 --- /dev/null +++ b/lib/oto/pipeline/pipeline_wait_until.dart @@ -0,0 +1,30 @@ +import 'package:dart_framework/utils/system_util.dart'; +import 'package:oto_cli/oto/data/pipeline_data.dart'; +import 'package:oto_cli/oto/pipeline/pipeline.dart'; +import 'package:oto_cli/oto/pipeline/pipeline_condition.dart'; + +class PipelineWaitUntil extends PiplineCondition { + PipelineWaitUntil(String type) { + data = DataCondition(); + data.type = type; + } + + @override + PipelineValidateResult initialize(Map set) { + data.condition = set.values.first as String; + return super.initialize(set); + } + + @override + Future execute() async { + var condition = data.condition!; + var result = checkCondition(condition); + await printCondition('Wait-Unint', condition, 'Start wait.', result); + while (result.result) { + await Future.delayed(const Duration(milliseconds: 500)); + result = checkCondition(data.condition!); + } + await printCondition('Wait-Unint', condition, 'Loop escape.', result); + return simpleFuture; + } +}