Skip to content

fix(cli): validate --repo filter on gitt issues list (#1061) - #1112

Closed
RUNECTZ33 wants to merge 9 commits into
entrius:mainfrom
RUNECTZ33:fix/issues-list-repo-filter-validation
Closed

fix(cli): validate --repo filter on gitt issues list (#1061)#1112
RUNECTZ33 wants to merge 9 commits into
entrius:mainfrom
RUNECTZ33:fix/issues-list-repo-filter-validation

Conversation

@RUNECTZ33

Copy link
Copy Markdown

Fixes #1061.

Problem

--repo <owner/name> on gitt issues list (added in #910) compares raw user input directly against repository_full_name:

issues = [
    i for i in issues
    if i.get('repository_full_name', '').lower() == repo_filter.lower()
]

So:

  • Malformed inputs like ownerrepo or owner//repo are silently accepted and quietly match nothing (no error feedback).
  • Whitespace-padded valid inputs like ' entrius/gittensor ' fail to match real entries because the comparison string still contains the surrounding spaces.

Fix

Reuse the existing validate_repository(verify_exists=False) helper before any contract read. It already:

  • strips whitespace,
  • enforces the owner/repo regex,
  • raises click.BadParameter with param_hint='--repo' on bad input.

Surface that exception through the existing handle_exception path so JSON consumers get a structured bad_parameter error and human callers exit non-zero — same shape used by --id validation a few lines above.

The same validator is already used by mutating commands (gitt issues register/cancel in mutations.py), so the read-side --repo filter now matches the documented contract enforced everywhere else in the CLI.

Tests added

6 new tests in tests/cli/test_issues_list_json.py:

  • Malformed filters rejected with structured bad_parameter error in JSON mode (parametrized over ownerrepo, owner//repo, owner/, /repo, owner repo).
  • Malformed filters exit non-zero in human mode.
  • Whitespace-padded valid filter ' owner/repo ' correctly matches contract entries.
  • Mixed-case filter OWNER/REPO still matches (preserves existing case-insensitive behavior).
  • Valid non-matching filter returns empty list, not all issues.

All tests pass; read_issues_from_contract is asserted not-called for invalid input so we never burn a contract read on bad parameters.

tests/cli/test_issues_list_json.py ... 19 passed in 0.09s

Diff size

  • gittensor/cli/issue_commands/view.py: +12 lines (1 import + 8-line validation block + 1-line comment)
  • tests/cli/test_issues_list_json.py: +95 lines (6 new tests)

bitloi and others added 9 commits May 6, 2026 15:57
Co-authored-by: Ander <61125407+anderdc@users.noreply.github.com>
Co-authored-by: mkdev11 <MkDev11@users.noreply.github.com>
… paths (entrius#897)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Ander <61125407+anderdc@users.noreply.github.com>
…nt event loop starvation (entrius#945)

Co-authored-by: Ander <61125407+anderdc@users.noreply.github.com>
…ig (entrius#935)

Co-authored-by: shadeform <shadeform@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
The `--repo <owner/name>` filter added in entrius#910 compares raw user input
directly against `repository_full_name`, so:

- malformed inputs like `ownerrepo` or `owner//repo` are silently accepted
  and quietly match nothing (no error to the user);
- whitespace-padded valid inputs like `' entrius/gittensor '` fail to
  match real entries because the comparison string still contains the
  surrounding spaces.

Fix by reusing the existing `validate_repository(verify_exists=False)`
helper before any contract read, normalizing `repo_filter` to a clean
`owner/repo` string and surfacing `click.BadParameter` through the
existing `handle_exception` path so JSON consumers get a structured
`bad_parameter` error and human callers exit non-zero.

This is the same validator already used by `gitt issues register/cancel`
mutating commands, so the read-side `--repo` filter now matches the
documented contract enforced everywhere else.

## Tests

- Malformed filters (`ownerrepo`, `owner//repo`, `owner/`, `/repo`,
  `owner repo`) rejected with structured `bad_parameter` error in JSON
  mode and non-zero exit in human mode, before any contract read.
- Whitespace-padded valid filter `'  owner/repo  '` correctly matches
  the contract entry and returns the issue.
- Mixed-case filter `OWNER/REPO` still matches (preserves existing
  case-insensitive behavior).
- Valid non-matching filter returns empty list rather than all issues.

Closes entrius#1061
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants