@@ -927,7 +927,7 @@ func CompleteWorkflow(ctx context.Context, db gorp.SqlExecutor, w *sdk.Workflow,
927
927
if err := checkProjectIntegration (proj , w , n ); err != nil {
928
928
return err
929
929
}
930
- if err := checkHooks (db , w , n ); err != nil {
930
+ if err := checkHooks (ctx , db , w , n ); err != nil {
931
931
return err
932
932
}
933
933
if err := checkOutGoingHook (db , w , n ); err != nil {
@@ -1026,7 +1026,8 @@ func checkOutGoingHook(db gorp.SqlExecutor, w *sdk.Workflow, n *sdk.Node) error
1026
1026
return nil
1027
1027
}
1028
1028
1029
- func checkHooks (db gorp.SqlExecutor , w * sdk.Workflow , n * sdk.Node ) error {
1029
+ func checkHooks (ctx context.Context , db gorp.SqlExecutor , w * sdk.Workflow , n * sdk.Node ) error {
1030
+ var duplicateHookIdx []int64
1030
1031
for i := range n .Hooks {
1031
1032
h := & n .Hooks [i ]
1032
1033
if h .HookModelID != 0 {
@@ -1083,11 +1084,23 @@ func checkHooks(db gorp.SqlExecutor, w *sdk.Workflow, n *sdk.Node) error {
1083
1084
for j := range n .Hooks {
1084
1085
h2 := n .Hooks [j ]
1085
1086
if i != j && h .Ref () == h2 .Ref () {
1086
- return sdk .NewErrorFrom (sdk .ErrWrongRequest , "invalid workflow: duplicate hook %s" , model .Name )
1087
+ log .ErrorWithStackTrace (ctx , sdk .NewErrorFrom (sdk .ErrWrongRequest , "invalid workflow: duplicate hook %s" , model .Name ))
1088
+ if ! sdk .IsInInt64Array (int64 (i ), duplicateHookIdx ) && ! sdk .IsInInt64Array (int64 (i ), duplicateHookIdx ) {
1089
+ duplicateHookIdx = append (duplicateHookIdx , int64 (j ))
1090
+ }
1087
1091
}
1088
1092
}
1089
1093
}
1090
1094
1095
+ // Remove duplicate hooks
1096
+ var newHooks = make ([]sdk.NodeHook , 0 , len (n .Hooks ))
1097
+ for i := range n .Hooks {
1098
+ if ! sdk .IsInInt64Array (int64 (i ), duplicateHookIdx ) {
1099
+ newHooks = append (newHooks , n .Hooks [i ])
1100
+ }
1101
+ }
1102
+ n .Hooks = newHooks
1103
+
1091
1104
return nil
1092
1105
}
1093
1106
0 commit comments