Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

[duplicate-code] Duplicate Code: Memory allowed-extensions Parsing in cache_config.go and drive_memory_config.go

クローズ 初心者向け
#67,517 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
66/100
issue の種類
リファクタリング
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
go
領域
tooling

調査の方向性

parseCacheMemoryAllowedExtensions(pkg/workflow/cache_config.go)とparseDriveMemoryAllowedExtensions(pkg/workflow/drive_memory_config.go)から始めてください。どちらも重複したループを含んでいます。また、cache_config.go の isValidFileExtension を読んでください。[]string を返す共通のヘルパーを抽出し、両方の呼び出し元でその結果を代入してください。両方の呼び出し元がこれを使用し、エラーメッセージが変わらず、make test-unit で cache_memory と drive_memory のテストが通れば完了です。

索引モデルが issue の本文から書いたものです。

説明

automated-analysis code-quality cookie
🔍 Duplicate Code Detected: Memory allowed-extensions Parsing Loop

Analysis of commit 2b5c6d4b8fbf8480ec4c05dbc19fb349aef1f120 (#67506)

Assignee: @copilot

Summary

Two memory-subsystem config parsers — one for cache-memory and one for drive-memory — contain a near-identical loop that reads the allowed-extensions list, validates each entry with isValidFileExtension, and appends it to the entry's AllowedExtensions slice. The bodies differ only by the entry struct type (*CacheMemoryEntry vs *DriveMemoryEntry) and local variable names; the logic, validation, and error message are byte-for-byte identical.

Impact Analysis
  • Maintainability: Any change to extension validation (e.g. allowing a new character class, tightening the error message, or supporting a new config shape) must be made in two places, which is easy to miss.
  • Bug Risk: The two copies can silently drift — a fix applied to one memory type but not the other produces inconsistent validation behaviour for cache-memory vs drive-memory.
  • Code Bloat: ~22 lines are duplicated verbatim; repo-memory already uses a different helper (parseRepoMemoryStringList), so the codebase currently has three divergent approaches to the same concept.
Duplication Details
Pattern: allowed-extensions list parse + per-item validation
  • Severity: Medium
  • Occurrences: 2 (plus a third divergent variant in repo_memory.go)
  • Locations:
    • pkg/workflow/cache_config.go — parseCacheMemoryAllowedExtensions (lines 272–294)
    • pkg/workflow/drive_memory_config.go — parseDriveMemoryAllowedExtensions (lines 148–173)
  • Code Sample (cache_config.go):
    func parseCacheMemoryAllowedExtensions(cacheMap map[string]any, entry *CacheMemoryEntry) error {
        allowedExts, exists := cacheMap["allowed-extensions"]
        if !exists {
            return nil
        }
        extArray, ok := allowedExts.([]any)
        if !ok {
            return nil
        }
        entry.AllowedExtensions = make([]string, 0, len(extArray))
        for _, ext := range extArray {
            extStr, ok := ext.(string)
            if !ok {
                continue
            }
            if !isValidFileExtension(extStr) {
                return fmt.Errorf("invalid allowed-extension %q: must start with '.' followed by alphanumeric characters only (e.g. .json)", extStr)
            }
            entry.AllowedExtensions = append(entry.AllowedExtensions, extStr)
        }
        return nil
    }
    
  • Code Sample (drive_memory_config.go, functionally identical):
    func parseDriveMemoryAllowedExtensions(raw map[string]any, entry *DriveMemoryEntry) error {
        value, exists := raw["allowed-extensions"]
        if !exists {
            return nil
        }
        values, ok := value.([]any)
        if !ok {
            return nil
        }
        entry.AllowedExtensions = make([]string, 0, len(values))
        for _, value := range values {
            extension, ok := value.(string)
            if !ok {
                continue
            }
            if !isValidFileExtension(extension) {
                return fmt.Errorf("invalid allowed-extension %q: must start with '.' followed by alphanumeric characters only (e.g. .json)", extension)
            }
            entry.AllowedExtensions = append(entry.AllowedExtensions, extension)
        }
        return nil
    }
    
Refactoring Recommendations
  1. Extract a shared helper that returns the parsed slice

    • Add e.g. parseMemoryAllowedExtensions(configMap map[string]any) ([]string, error) (suggested home: pkg/workflow/memory_validation_config.go, alongside the other shared memory helpers, or cache_config.go since isValidFileExtension already lives there).
    • Have both callers assign the result: exts, err := parseMemoryAllowedExtensions(m); entry.AllowedExtensions = exts.
    • Returning the slice (rather than mutating a typed *Entry) avoids coupling the helper to either struct type and lets repo-memory adopt it too.
    • Estimated effort: ~1 hour (small, mechanical, well covered by existing cache_memory_*_test.go / drive_memory_test.go).
    • Benefits: single source of truth for extension validation and the shared error message; removes drift risk between memory types.
  2. (Optional) Converge repo-memory

    • Evaluate whether parseRepoMemoryStringList for allowed-extensions can route through the same helper so all three memory types validate extensions identically.
Implementation Checklist
  • Review duplication findings
  • Extract shared parseMemoryAllowedExtensions helper
  • Update cache_config.go and drive_memory_config.go to call it
  • (Optional) Converge repo_memory.go onto the helper
  • Run make fmt and make test-unit
  • Verify no functionality broken
Analysis Metadata
  • Analyzed Files: memory-subsystem source files under pkg/workflow/ (cache/drive/repo/comment/validation)
  • Detection Method: Serena semantic code analysis + pattern search
  • Commit: 2b5c6d4b8fbf8480ec4c05dbc19fb349aef1f120
  • Scope note: repository is a single squashed commit, so analysis focused on the commit's stated theme (memory schema contract + safe-output runtime)

Generated by 🔍 Duplicate Code Detector · pi · opus48 · 104.2 AIC · ⌖ 45.4 AIC · ⊞ 1.5K · ◷

  • expires on Oct 12, 2026, 1:56 PM UTC-08:00
主要言語
Go
スター
5.4k
フォーク
596
平均マージ
3時間 37分
マージ済み PR(30日)
833

環境構築

Codespaces で開く

このプロジェクトの開発コンテナを、あなたの GitHub アカウントでブラウザ上に起動します。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

github/gh-aw のほかの issue

github/gh-aw の issue をすべて見る

似ている issue

Go の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。