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

Duplicate keys in alpine DECLARED_TO_SPDX silently discard two license mappings

オープン 初心者向け
#5,312 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

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

@Daksha1611 がすでに取り組んでいます。

2026年9月11日 から。

  • #5313 @Daksha1611 による — オープン

評価

難易度
1/5
見積もり時間
1時間未満
初心者へのやさしさ
82/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
python
領域
tooling

調査の方向性

src/packagedcode/alpine.py を開き、DECLARED_TO_SPDX と、issue に示されている派生 DECLARED_TO_SPDX_SUBS 内包表記を調べます。指定された行にある重複キー 'as-is' と 'custom:tu-berlin-2.0' を確認し、曖昧さを追加せずに各キーが一度だけ現れるよう調整します。重複がなくなったことを確認するため、提供されている AST 重複キー検査(または同等のスクリプト)を変更前と変更後に実行します。重複キーの警告がなくなり、mapping の動作が意図された値に明示的に一致していれば完了です。

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

説明

Description

DECLARED_TO_SPDX in src/packagedcode/alpine.py has two duplicate keys. A dict literal keeps only the last value for a repeated key, so the earlier entry of each pair is dead at import time.

'as-is':

  • line 1619: 'as-is': 'licenseref-scancode-free-unknown',
  • line 1701: 'as-is': 'licenseref-scancode-unknown-license-reference',

'custom:tu-berlin-2.0':

  • line 1690: 'custom:tu-berlin-2.0': 'licenseref-scancode-unknown-license-reference',
  • line 1715: 'custom:tu-berlin-2.0': 'tu-berlin-2.0',

Each of the four entries carries its own comment, so the two pairs look like they were added independently without noticing the collision.

This mapping is turned straight into the substitution table applied to every Alpine package license expression:

DECLARED_TO_SPDX_SUBS = {
    licensing.parse(src, simple=True): licensing.parse(tgt, simple=True)
    for src, tgt in DECLARED_TO_SPDX.items()
}

So which value wins is decided by position in the file rather than by intent. For 'as-is' the surviving value is the less specific licenseref-scancode-unknown-license-reference, and the licenseref-scancode-free-unknown mapping never applies.

How To Reproduce
import ast, collections

src = open('src/packagedcode/alpine.py').read()
for node in ast.walk(ast.parse(src)):
    if isinstance(node, ast.Dict):
        counts = collections.Counter(
            k.value for k in node.keys
            if isinstance(k, ast.Constant) and isinstance(k.value, str)
        )
        for key, n in counts.items():
            if n > 1:
                print(f'line {node.lineno}: duplicate key {key!r} x{n}')
line 1568: duplicate key 'as-is' x2
line 1568: duplicate key 'custom:tu-berlin-2.0' x2
Suggested fix

Drop the dead lines so each key appears once. Which of the two values is actually wanted for each key needs a maintainer decision, since right now it is settled by line order — I have opened a PR that removes the unreachable entries and keeps the currently-winning values, so behaviour does not change.

System configuration
  • What OS are you running on? Linux (x86_64)
  • What version of scancode-toolkit was used? 33.0.0rc1, develop at 5ebebf2
  • What installation method was used to install/run scancode? source checkout
  • Python version: 3.x
主要言語
Python
スター
2.7k
フォーク
831
平均マージ
3日 4時間
マージ済み PR(30日)
7

環境構築

はじめの一歩

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

aboutcode-org/scancode-toolkit のほかの issue

aboutcode-org/scancode-toolkit の issue をすべて見る

似ている issue

Python の issue をもっと見る

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

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