Skip to content

Duplicate Code: Marker-based close-older search/filter logic duplicated across issue and discussion handlers #26022

@github-actions

Description

@github-actions

Overview

The close_older_issues and close_older_discussions handlers implement near-identical marker-based query construction and exact-marker filtering logic, with only API transport differences (REST vs GraphQL) and entity-specific fields.

This creates a high-maintenance duplication hotspot: behavior changes to close-older matching now require parallel edits in two large files.

Critical Information

  • Severity: High
  • Duplication type: Structural duplication
  • Occurrences: 2 primary implementations
  • Estimated duplicated logic: >80 lines of equivalent control flow and filtering
  • Commit analyzed: d1c210e8581deb8ab71d26a678876a3e45065465

Duplication Details

Pattern

Marker-based close-older search and exact body-marker filtering are repeated with similar branching and logging:

  • Build searchQuery + exactMarker based on closeOlderKey vs workflow-id marker
  • Execute search call
  • Apply exclusion filters (excludeNumber, marker exact-match, additional entity-specific checks)
  • Emit similar filtering counters and logs

Locations

  • actions/setup/js/close_older_issues.cjs:34
  • actions/setup/js/close_older_issues.cjs:47
  • actions/setup/js/close_older_issues.cjs:78
  • actions/setup/js/close_older_discussions.cjs:37
  • actions/setup/js/close_older_discussions.cjs:50
  • actions/setup/js/close_older_discussions.cjs:99
Representative duplicated structure
  • Build query and marker:
    • if (closeOlderKey) { ... } else { ... }
  • Search execution:
    • REST (issuesAndPullRequests) vs GraphQL (search(type: DISCUSSION))
  • Filtering:
    • Exclude current/new entity
    • Exact body.includes(exactMarker) match
    • Counter instrumentation and summary logs

Impact Analysis

  • Maintainability: High friction; feature/security fixes to marker matching require duplicate implementation updates.
  • Bug risk: Divergence risk between issue and discussion behavior over time.
  • Code bloat: Large duplicated search/filter blocks obscure entity-specific differences.

Refactoring Recommendations

  1. Extract shared marker-query and exact-marker filtering policy
  • Suggested utility: actions/setup/js/close_older_search_helpers.cjs
  • Estimated effort: Medium (3-5 hours)
  • Benefits: Single source of truth for marker semantics and logging structure
  1. Keep transport adapters thin
  • Provide small adapters for REST/GraphQL result normalization to a shared intermediate format
  • Benefits: Reduces duplicated control flow while preserving API-specific code paths

Implementation Checklist

  • Introduce shared close-older marker/query helper(s)
  • Normalize issue/discussion search results into a common shape
  • Rewire both handlers to use shared filter pipeline
  • Add parity tests to ensure behavior remains equivalent
  • Validate no regressions in close-older matching

Analysis Metadata

  • Analyzed files: 939 changed non-test .go/.cjs files in latest commit scope
  • Detection method: Serena semantic analysis + targeted structural comparison
  • Analysis date: 2026-04-13

References:

Warning

⚠️ Firewall blocked 4 domains

The following domains were blocked by the firewall during workflow execution:

  • ab.chatgpt.com
  • api.github.com
  • chatgpt.com
  • github.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "ab.chatgpt.com"
    - "api.github.com"
    - "chatgpt.com"
    - "github.com"

See Network Configuration for more information.

Generated by Duplicate Code Detector ·

Metadata

Metadata

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions