Skip to content

Commit 4ac683f

Browse files
committed
wip
1 parent ed899fa commit 4ac683f

5 files changed

Lines changed: 491 additions & 69 deletions

File tree

‎internal/doctor/diagnose.go‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,12 +193,20 @@ func diagnoseOneWorkflow(path string, r *resolver.Resolver) WorkflowReport {
193193
}
194194
if !strings.EqualFold(existing.SHA, live.SHA) {
195195
liveCopy := live
196+
parts := strings.SplitN(existing.NWO, "/", 3)
197+
var compareHint string
198+
if len(parts) >= 2 {
199+
compareHint = fmt.Sprintf(
200+
"\n → Compare: https://github.com/%s/%s/compare/%s...%s\n → Releases: https://github.com/%s/%s/releases\n → If unexpected, reach out to the action maintainer",
201+
parts[0], parts[1], existing.SHA, live.SHA,
202+
parts[0], parts[1])
203+
}
196204
wr.Findings = append(wr.Findings, Finding{
197205
WorkflowPath: path,
198206
Category: CategoryTampered,
199207
Severity: SeverityError,
200208
Dependency: &existing,
201-
Detail: fmt.Sprintf("pinned %s but ref now resolves to %s", existing.SHA[:12], live.SHA[:12]),
209+
Detail: fmt.Sprintf("pinned %s but ref now resolves to %s%s", existing.SHA[:12], live.SHA[:12], compareHint),
202210
Remediation: fmt.Sprintf("update to %s with `gh actions-pin upgrade`", liveCopy.SHA[:12]),
203211
})
204212
}

‎internal/doctor/is_upgrade_test.go‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,27 @@ fmt.Printf("✓ %-20s → %-30s upgrade=%v\n", tc.current, tc.latest, got)
3333
}
3434
}
3535
}
36+
37+
func TestIsNarrowedVersion(t *testing.T) {
38+
cases := []struct {
39+
mutable, narrowed string
40+
want bool
41+
}{
42+
{"v4", "v4.1.0", true},
43+
{"v4", "v4.0.0", true},
44+
{"v4.2", "v4.2.1", true},
45+
{"v4.2", "v4.2.0", true},
46+
{"v4", "v5.0.0", false}, // different major
47+
{"v4.2", "v4.3.0", false}, // different minor
48+
{"v4.1.0", "v4.1.0", true}, // identity (full semver is its own narrowing)
49+
{"v4", "v4", false}, // mutable→mutable, not narrowed
50+
{"main", "v4.1.0", false}, // non-version
51+
{"v4", "v4.1.0-beta", false}, // pre-release
52+
}
53+
for _, tc := range cases {
54+
got := IsNarrowedVersion(tc.mutable, tc.narrowed)
55+
if got != tc.want {
56+
t.Errorf("IsNarrowedVersion(%q, %q) = %v, want %v", tc.mutable, tc.narrowed, got, tc.want)
57+
}
58+
}
59+
}

0 commit comments

Comments
 (0)