-
Notifications
You must be signed in to change notification settings - Fork 32
Closed
Description
🔍 Duplicate Code Detected: Close entity safe-output parsing/builders
Analysis of commit 1733516
Assignee: @copilot
Summary
The safe-output handling for closing issues, pull requests, and discussions repeats the same config parsing and job construction logic across three files. Each implementation differs only by entity-specific strings and permissions, leading to duplicated validation, env var setup, outputs, and conditional checks.
Duplication Details
Pattern: Close entity safe-output jobs
- Severity: Medium
- Occurrences: 3
- Locations:
pkg/workflow/close_issue.go:18-101pkg/workflow/close_pull_request.go:18-101pkg/workflow/close_discussion.go:18-107
- Code Sample:
if data.SafeOutputs == nil || data.SafeOutputs.CloseIssues == nil {
return nil, fmt.Errorf("safe-outputs.close-issue configuration is required")
}
cfg := data.SafeOutputs.CloseIssues
closeJobConfig := CloseJobConfig{SafeOutputTargetConfig: cfg.SafeOutputTargetConfig, SafeOutputFilterConfig: cfg.SafeOutputFilterConfig}
customEnvVars := BuildCloseJobEnvVars("GH_AW_CLOSE_ISSUE", closeJobConfig)
customEnvVars = append(customEnvVars, c.buildStandardSafeOutputEnvVars(data, cfg.TargetRepoSlug)...)
outputs := map[string]string{...}
jobCondition := BuildSafeOutputType("close_issue")
if cfg.Target == "" || cfg.Target == "triggering" {
eventCondition := buildOr(...)
jobCondition = buildAnd(jobCondition, eventCondition)
}
return c.buildSafeOutputJob(...)Same structure appears in the PR and discussion variants with only identifiers/permissions changed.
Impact Analysis
- Maintainability: Three separate copies increase effort to update validation, conditions, or env vars consistently.
- Bug Risk: Fixes (e.g., target handling, permission tweaks) may be applied to one entity but missed in the others, causing inconsistent behavior.
- Code Bloat: ~50+ lines repeated across three files.
Refactoring Recommendations
- Extract a shared helper for close-entity safe-output jobs
- Move common parsing/build logic into a single function (e.g.,
buildCloseEntityJob(entityType, cfg, permissions, script, outputs, eventAccessors)), and call it from issue/PR/discussion wrappers. - Estimated effort: Medium (1-2h) to centralize logic and adjust call sites.
- Benefits: Single source for validation/conditions/env vars; reduces risk of divergence.
- Move common parsing/build logic into a single function (e.g.,
- Deduplicate parse helpers
- Introduce a shared parser for
close-issue/close-pull-requestthat reusesParseCloseJobConfigand base config defaults, parameterized by defaults and required fields. - Estimated effort: Low (<1h) if combined with the builder refactor.
- Introduce a shared parser for
Implementation Checklist
- Review duplication findings
- Prioritize refactoring tasks
- Create refactoring plan
- Implement changes
- Update tests
- Verify no functionality broken
Analysis Metadata
- Analyzed Files: 3
- Detection Method: Serena semantic code analysis
- Commit: 1733516
- Analysis Date: 2025-12-06
AI generated by Duplicate Code Detector
Copilot