Skip to content

Releases: nigelhorne/App-GHGen

v10

Choose a tag to compare

@nigelhorne nigelhorne released this 29 Aug 18:37
[ Bug Fixes ]
- Added --verbose to the --installdeps stage to prevent timeout on
  GitHub actions
[ Enhancements ]
- Install DB_File on Linux
- Latest ATG dashboard

Release 0.09

Choose a tag to compare

@nigelhorne nigelhorne released this 11 Aug 00:31

0.09 Mon Aug 10 08:26:23 PM EDT 2026
[ Bug Fixes ]
- Fixed Detector::detect_project_type returning (undef) — a one-element list
— in list context when no project type is detected. return undef unless @detections returns the scalar undef in list context, which Perl wraps in a
list. Changed to return unless @detections (bare return), which correctly
returns () in list context and undef in scalar context, matching the POD spec.

[ Enhancements ]
- Update to shogo82148/actions-setup-perl@v1.43.1
- Added t/mutant_killers.t: 25 subtests that kill all surviving mutants from
  xt/mutant_20260810_160920.t.  Covers CostEstimator (estimate_savings
  total_minutes > 0 boundary; estimate_duration sequential-vs-parallel branch
  and max-accumulation comparison), Detector (file-count > 0 boundary for all
  8 language detectors: perl pm, perl t, python, go, ruby, php, java, cpp),
  Fixer::add_caching (checkout-detection condition), Interactive::prompt_choice
  (marker == default; answer >= 1 and <= @choices bounds), and Reporter
  (generate_markdown_report and generate_github_comment savings-cost > 0).
  Documents the >= variant of the estimate_duration max-accumulation mutant as
  a semantically equivalent mutant (not distinguishable by semantic tests).
- Added t/path.t: 34 path-coverage subtests targeting execution paths not
  covered by existing test files.  Covers Analyzer (broad-trigger scalar
  push, falsy push, paths-only filter, unpinned/outdated cap), Fixer
  (setup-node/python via uses, add_caching insertion at position 0,
  unrecognised project type, no-runs-on guard, trigger-filter HASH paths),
  CostEstimator (zero-saving branches, proportional percentage, free-tier
  boundary, matrix scalar value), and Detector (scalar/list context empty
  result, get_project_indicators all three branches).

Release 0.08

Choose a tag to compare

@nigelhorne nigelhorne released this 07 Aug 17:37
[ Enhancements ]
- Update to shogo82148/actions-setup-perl@v1.42.0

[ Bug Fixes ]
- Fixed false-positive in Analyzer::has_outdated_runners: the unanchored
  alternation /ubuntu-18.04|ubuntu-16.04|macos-10\.15/ matched any runner
  name that contained those strings as a substring (e.g. a self-hosted runner
  named "my-ubuntu-18.04-builder" was incorrectly flagged as outdated).
  Anchored with \A...\z so only exact GitHub-hosted runner labels are matched.
- Changed greedy (.+) to non-greedy (.+?) in Fixer::fix_unpinned_actions
  /^(.+?)\@(?:master|main)$/.  Both forms produce identical captures when
  @master or @main appears only once (the common case), because the `$`
  anchor forces both to find the same split point.  Non-greedy is preferred
  because it reaches a match with fewer backtrack steps on short strings.

[ Internal ]
- Replaced all unnecessary capturing groups with non-capturing (?:...) across
  Analyzer.pm, Fixer.pm, CostEstimator.pm, Detector.pm, Interactive.pm, and
  bin/ghgen.  Affected patterns: (master|main), (install|ci), (build|test),
  (node|python|go|ruby), (npm|pytest|cargo|go), (cpp|cc|cxx|hpp|hxx|h),
  y(es)?, n(o)?.  No behaviour change; removes pointless capture-register
  allocation on every match.
- Eliminated DRY violation in action-version knowledge: the %updates hash
  that was defined identically as a local my %updates in both
  Analyzer::find_outdated_actions and Fixer::update_actions is now a single
  our %ACTION_UPDATES declared in Fixer.pm and exported/imported by
  Analyzer.pm.  Detection and fix capability are now provably in sync: every
  action flagged by the Analyzer can be fixed by the Fixer, and vice versa.
- Replaced the 8-branch elsif chain in Fixer::apply_fixes with a file-scope
  dispatch table @_APPLY_RULES.  Each entry is a three-element array
  [type, compiled-pattern, handler].  Cyclomatic complexity drops from 8
  to 1; adding a new fix type requires appending a single row rather than
  editing a conditional chain.  Anonymous delegate wrappers (sub($wf){...})
  around each handler ensure symbol-table mocks work correctly in tests.

0.07

Choose a tag to compare

@nigelhorne nigelhorne released this 27 Jul 19:35
[ Bug Fixes ]
- Added matrix exclusion for windows-latest + perl 5.40.  The
  shogo82148/build-perl perl-5.40.4-thr-win32-x64.zip ships a perl.exe
  and a libperl540.a from two different builds: any XS module compiled
  against that libperl540.a (handshake key 0x12c00080) mismatches the
  running perl.exe (needs 0x12d00080).  Even Win32::Process — a core
  Windows XS module bundled in the zip and loaded by IPC::System::Simple
  — fails to load, so no XS-using test can pass on this combination.
  The previous workaround (cpanm --reinstall YAML::XS) cannot help
  because the compilation itself uses the broken libperl540.a.
  Exclusion is emitted only when both 'windows-latest' and '5.40' are
  in the matrix; custom OS or Perl lists that omit either are unaffected.
  See https://github.com/shogo82148/actions-setup-perl/issues/2310 for further information.
- Added defensive Windows step "Reinstall YAML::XS against current Perl"
  (`cpanm --notest --reinstall YAML::XS`) to ensure a freshly compiled
  YAML::XS.dll lands in site/lib (which precedes the bundled lib in @INC)
  for cases where the shogo82148 Perl zip bundles a stale XS DLL and the
  toolchain (perl.exe + libperl.a) is internally consistent.
- Removed .github/workflows/perl-ci.yml from the cache key. Including the workflow file
  hash caused unnecessary full cache invalidation on every comment or whitespace edit to
  the workflow; it provided no meaningful safety guarantee beyond the cpanfile hash.
- Strengthened the cache key further: a dedicated cross-platform step (shell: perl {0})
  fingerprints the actual Perl binary files using unpack('%32C*',...) + read() so no
  extra CPAN modules are needed. On Windows the Perl runtime DLL (e.g. perl540.dll) is
  also read alongside perl.exe. The checksum combined with $Config{archname} is appended
  to $Config{version} to form the final cache key.
  Rationale: Strawberry Perl occasionally re-releases the same Perl version (e.g. 5.40.0)
  with a recompiled DLL that changes the XS handshake key but leaves $Config{version}
  unchanged. Reading the binary detects any such change without requiring Digest::MD5.
  (An earlier Digest::MD5->addfile approach failed on some runners with "Can't use an
  undefined value as filehandle reference"; read + unpack avoids that entirely.)

Version 6

Choose a tag to compare

@nigelhorne nigelhorne released this 17 Jul 15:34
[ Bug Fixes ]
- Approved https://github.com/nigelhorne/App-GHGen/pull/6
  Missing unescaped $ failed to interpolate variable into double-quoted string
  Thanks to https://github.com/chromatic
- Fixed enable_linter_unused having no effect when set to 1 via the non-interactive code
  path. The POD Params::Validate block (default => 0) is documentation only; the actual
  runtime default was the // 0 on the assignment line (line 286). Changed to // 1.

[ New Features ]
- Added Perl syntax linting step to generated workflows (enable_linter, default: on)
  Uses shell: perl {0} so it runs cross-platform without OS-specific branching.
  Searches lib/ and bin/, uses do $file with a stub @INC handler for every .pm file,
  and covers every matrix cell (all OS × Perl version combinations).
  No extra CPAN dependencies required.
- Added unused-variable check (enable_linter_unused, default: on). The check is embedded
  inside the lint step and runs PERL5OPT=-Mwarnings::unused prove -lr t/ so variable
  lifetimes are exercised at runtime (perl -c is compile-only and cannot detect unused
  vars). Gated on RUNNER_OS == Linux and continue-on-error: true.
- Added import-hygiene check (enable_perlimports, default: on). Installs App::perlimports
  and runs perlimports --lint across all .pm files under lib/. Scoped to latest Perl +
  ubuntu-latest; continue-on-error: true so it is advisory rather than blocking.
- Both enable_linter_unused and enable_perlimports are exposed in the interactive
  --customize prompt for Perl workflows under the "Code Quality Tools" heading.
- Regression test added in t/pull_6.t for the PR #6 cost-display bug fix.
- Tests added/extended in t/linter.t covering presence/absence, ordering, and
  platform-gating of all lint-stage steps.
- Added t/extended_tests.t: 99 branch-coverage tests targeting uncovered paths across all
  8 modules (Analyzer, CostEstimator, Detector, Fixer, Generator, Interactive,
  PerlCustomizer, Reporter). Flags Analyzer::has_deployment_steps as dead code (defined
  but not exported and not called from analyze_workflow).

[ CI Matrix ]
- Default Perl matrix is now 5.36, 5.38, 5.40, 5.42 (max_perl_version bumped from
  5.40 to 5.42). Perl::Critic, perlimports, and coverage steps are now gated on
  5.42 (always the latest version in the matrix).
- Perl 5.44 added to the known-versions table as an opt-in. Projects wanting to test
  against 5.44 before it becomes the default can pass max_perl_version => '5.44' to
  generate_custom_perl_workflow, or set perl_versions explicitly. No code change
  needed on the caller's side.
- POD for generate_custom_perl_workflow updated: max_perl_version default corrected to
  5.42, opt-in examples for 5.44 added under the max_perl_version item.

Release 0.05

Choose a tag to compare

@nigelhorne nigelhorne released this 19 Mar 14:40

Fix tabs that had crept in

App::GHGen V4

Choose a tag to compare

@nigelhorne nigelhorne released this 18 Mar 15:54
- Bump maximum Perl version.
- Show debug on fail.
- Understand C.
- Fail better if the project type can't be determined automatically.
- Added analyzer and auto-fix support for missing timeout-minutes in workflow jobs.

v3

Choose a tag to compare

@nigelhorne nigelhorne released this 29 Jan 01:23

Action.yml was broken, 'shell' isn't recognised

v2

Choose a tag to compare

@nigelhorne nigelhorne released this 28 Jan 13:35
Update v2 to latest

Comprehensive GitHub Actions workflow generator, analyzer, and optimizer

Choose a tag to compare

@nigelhorne nigelhorne released this 14 Jan 13:17

App::GHGen is a comprehensive toolkit for creating, analyzing, and optimizing GitHub Actions workflows.
It combines intelligent project detection, workflow generation, security analysis, cost optimization,
and automatic fixing into a single powerful tool.