processMatch handles a single regex match from the expression extraction regex. It applies content transformations, emits any deprecation warnings, registers the primary mapping, and expands compound expressions into sub-expression mappings. It is a no-op for empty content or already-seen expression
(originalExpr, rawContent string)
| 105 | // the primary mapping, and expands compound expressions into sub-expression |
| 106 | // mappings. It is a no-op for empty content or already-seen expressions. |
| 107 | func (e *ExpressionExtractor) processMatch(originalExpr, rawContent string) { |
| 108 | content := strings.TrimSpace(rawContent) |
| 109 | if content == "" { |
| 110 | expressionExtractionLog.Printf("Skipping empty expression: %s", originalExpr) |
| 111 | return |
| 112 | } |
| 113 | |
| 114 | originalContent := content |
| 115 | content = applyContentTransformers(content, defaultContentTransformers) |
| 116 | |
| 117 | // Skip if we've already seen this expression (also prevents duplicate deprecation warnings) |
| 118 | if _, exists := e.mappings[originalExpr]; exists { |
| 119 | return |
| 120 | } |
| 121 | |
| 122 | // Emit deprecation warning once per unique deprecated activation-output expression |
| 123 | if content != originalContent && strings.HasPrefix(content, "steps.sanitized.outputs.") { |
| 124 | fmt.Fprintln(os.Stderr, console.FormatWarningMessage( |
| 125 | fmt.Sprintf("Deprecated expression ${{ %s }}: use ${{ %s }} instead.", originalContent, content), |
| 126 | )) |
| 127 | } |
| 128 | |
| 129 | e.mappings[originalExpr] = &ExpressionMapping{ |
| 130 | Original: originalExpr, |
| 131 | EnvVar: e.generateEnvVarName(content), |
| 132 | Content: content, |
| 133 | } |
| 134 | |
| 135 | e.addSubExpressionMappings(content) |
| 136 | } |
| 137 | |
| 138 | // ExtractExpressions extracts all ${{ ... }} expressions from the markdown content |
| 139 | // and creates environment variable mappings for each unique expression. |
no test coverage detected