Commit graph

8 commits

Author SHA1 Message Date
Snider
175701fc93 fix(security): lock refreshMarketplace to canonical index path, isolate HOME in iter test
- pkg/api/provider.go: remove refreshRequest struct and filepath-based
  sanitisation; always load marketplace/index.json via a package-level
  const so callers cannot influence which file is read (path traversal fix)
- forge/orgs_test.go: add t.Setenv("HOME", t.TempDir()) to
  TestClient_ListMyOrgsIter_Bad_ServerError to prevent config bleed
  between test runs

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-07 11:30:04 +01:00
Snider
913b8fc960 fix(review): address CodeRabbit PR #2 round-2 findings
- manifest/compile.go: apply opts.Version override before empty-version check
  so version can be supplied via CompileOptions even when manifest has none
- manifest/compile.go: fix import grouping (stdlib before internal)
- pkg/api/provider.go: propagate c.Request.Context() into Install/Update calls
  so client disconnects cancel long-running operations
- pkg/api/provider.go: guard refreshMarketplace against path traversal; suppress
  raw filesystem errors from HTTP response
- pkg/api/provider.go: normalise typed-nil installer in NewProvider to prevent
  nil-pointer panics from non-nil interface holding nil pointer
- jobrunner/journal.go: upgrade sync.Mutex to sync.RWMutex; Query uses RLock
  for concurrent read throughput
- jobrunner/journal.go: use bytes.NewReader(data) instead of
  strings.NewReader(string(data)) to avoid double allocation
- jobrunner/journal.go: fix import grouping (stdlib before internal)
- internal/ax/stringsx/stringsx.go: fix Builder alias to strings.Builder
  (was bytes.Buffer — different copy-after-write semantics)
- internal/ax/stringsx/stringsx.go: fix NewReader to return *strings.Reader
- internal/ax/stringsx/stringsx.go: make SplitSeq lazy (no upfront []string)
- internal/ax/stringsx/stringsx.go: remove bytes import; use stdlib strings
  for ContainsAny, EqualFold, LastIndex
- gitea/client.go: fix import grouping (internal before third-party)
- gitea/prs.go: fix import grouping (internal before third-party)
- forge/labels.go: fix import grouping (internal before third-party)
- cmd/gitea/cmd_sync.go: move exec (golang.org/x/sys/execabs) to third-party
  import group
- forge/orgs_test.go: add t.Setenv("HOME", t.TempDir()) for config isolation
- forge/orgs_test.go: rename *_Bad_ServerError_Good → *_Bad_ServerError
- gitea/repos_test.go: add HOME isolation to CreateMirrorFromService test

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-07 10:29:22 +01:00
Snider
f3dd8ca0f0 fix(review): address CodeRabbit PR #2 findings
Critical/Major:
- Remove dead functions syncRepoNameFromArg and repoNameFromArg (used url pkg without import, would cause compile error)
- Migrate forge.lthn.ai/core/config → dappco.re/go/core/config in forge/config.go and gitea/config.go
- Propagate ListIssueCommentsIter errors in forge/meta.go and gitea/meta.go (was silently returning truncated count)
- Add RedactedToken() to gitea/client.go to avoid exposing raw API tokens
- Add 30s timeout to http.DefaultClient usage in gitea/prs.go via package-level httpClient
- Fix stringsx.Fields (bufio 64KiB limit), Repeat (wrong for negative/zero), Replace (ignored n param) to match stdlib
- Fix fmtx.Println to use fmt.Sprintln so spaces appear between operands
- Fix filepathx.Abs to use path/filepath for OS-aware path handling; wrap Getwd error
- Fix stdio.Write to return io.ErrShortWrite on partial writes
- Add mutex lock to jobrunner.Journal.Query to prevent data race with Append
- Add sync.RWMutex to ScmProvider; protect p.index reads/writes in pkg/api/provider.go
- Fix cmd/scm/cmd_index.go: append dir to repoPaths only after ReadDir confirms existence
- Fix manifest/compile.go: copy manifest before applying version override to avoid mutating caller
- Fix forge/labels.go: use ListOrgLabelsIter/ListRepoLabelsIter names in iterator error logs
- Wrap single-segment validation error in syncutil.ParseRepoName with function context

Minor:
- Fix import ordering (stdlib → forge.lthn.ai → third-party) in cmd/forge, cmd/collect, repos, cmd/gitea files
- Add t.Setenv("HOME", t.TempDir()) to gitea testhelpers and forge/labels_test.go
- Add iterator yield guard in forge/orgs_test.go
- Convert syncutil/repo_name_test.go to table-driven tests
- Use json.Marshal in pkg/api/provider_test.go instead of string concatenation
- Fix test naming (redundant/conflicting _Good/_Bad suffixes) across 10 test files

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-07 09:25:42 +01:00
Virgil
d852087c45 feat(forge): add org iterator
Some checks failed
Security Scan / security (push) Failing after 11s
Test / test (push) Successful in 2m16s
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-01 08:47:55 +00:00
Virgil
dd59b177c6 chore(ax): normalise test naming and usage annotations
Some checks failed
Security Scan / security (push) Failing after 10s
Test / test (push) Successful in 2m2s
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-30 06:37:20 +00:00
Virgil
305aa0da6f chore(ax): normalize SPDX header identifier
Some checks failed
Security Scan / security (push) Failing after 8s
Test / test (push) Successful in 4m12s
2026-03-30 00:54:20 +00:00
Virgil
5f73d41184 chore(ax): add SPDX headers to remaining Go files
Some checks failed
Security Scan / security (push) Failing after 15s
Test / test (push) Failing after 29s
2026-03-30 00:19:43 +00:00
Claude
9db37c6fb3
test: add comprehensive unit tests for forge/, gitea/, git/, agentci/
Phase 1 test coverage for the three 0% packages plus agentci/ improvement:

- git/ (0% -> 79.5%): RepoStatus methods, status parsing with real temp
  repos, multi-repo parallel status, Push/Pull error paths, ahead/behind
  with bare remote, context cancellation, GitError, IsNonFastForward,
  service DirtyRepos/AheadRepos filtering

- forge/ (0% -> 91.2%): All SDK wrapper functions tested via httptest mock
  server — client creation, repos, issues, PRs, labels, webhooks, orgs,
  meta, config resolution, SetPRDraft raw HTTP endpoint

- gitea/ (0% -> 89.2%): All SDK wrapper functions tested via httptest mock
  server — client creation, repos, issues, PRs, meta, config resolution

- agentci/ (56% -> 94.5%): Clotho DeterminePlan all code paths, security
  helpers (SanitizePath, EscapeShellArg, SecureSSHCommand, MaskToken)

Key findings documented in FINDINGS.md:
- Forgejo SDK validates token via HTTP on NewClient()
- SDK route patterns differ from public API docs (/org/ vs /orgs/)
- Gitea SDK requires auth token for GitHub mirror creation
- Config resolution priority verified: config file < env vars < flags

Co-Authored-By: Charon <developers@lethean.io>
2026-02-20 00:59:46 +00:00