Replace generated hook stubs with built hooks when hooks are declared
Metadata
Current evaluation
Closed unmerged; the generated-hook regression was fixed separately by commit 271462658 and released in Snapcraft 9.1.3.
Resolution: closed superseded
Reason: PR #6434 was closed without merging because issue #6433 was resolved separately. Commit 271462658 prevented premature hook-stub creation and was targeted for Snapcraft 9.1.3.
Evaluated by: mr-cal-bot
No scores available.
Issue body
When a snap declares a `hooks:` section, Snapcraft currently creates `meta/hooks/<name>` placeholder stubs early in metadata generation. If a part later produces the real hook at `snap/hooks/<name>`, the placeholder blocks it from being staged into the final snap, leaving snapd to execute `#!/bin/true` instead of the generated hook.
- **Hook provisioning**
- Treat the auto-generated `#!/bin/true` file in `meta/hooks` as a replaceable placeholder during `provision_hooks(..., overwrite=False)`.
- Preserve existing project hooks and other non-placeholder `meta/hooks/*` entries; only placeholder stubs are overwritten by part-generated hooks.
- **Regression coverage**
- Add a unit regression for `_materialize_extra_assets()` covering the failing case: a built hook in `snap/hooks/` plus an existing placeholder in `meta/hooks/`.
- Update the spread regression for generated hooks to reproduce the real trigger condition:
- a declared `hooks:` entry
- a part-generated `snap/hooks/configure`
- Assert that both `prime/meta/hooks/configure` and the packed snap contain the real generated hook payload, not the stub.
- **Behavioral intent**
- Keep the current precedence model intact:
- project hooks still override built hooks
- built hooks replace only Snapcraft-generated placeholders
```python
destination = hooks_meta_dir / hook.name
if (
destination.exists()
and not overwrite
and not _is_placeholder_hook(destination)
):
continue
```
<!-- START COPILOT CODING AGENT SUFFIX -->
- Fixes #6433
Evaluation history
| Date | Model | Scores | Action | Summary |
|---|---|---|---|---|
| stealth/space-bunny-alpha | — | closed superseded | Closed unmerged; the generated-hook regression was fixed separately by commit 271462658 and released in Snapcraft 9.1.3. | |
| stealth/space-bunny-alpha | — | closed superseded | Hook-stub replacement fix was closed unmerged; the regression was resolved separately in Snapcraft 9.1.3. | |
| qwen/qwen3.6-35b-a3b |
Impact:
55
Quick Win:
11
Complexity:
35
Confidence:
65
Actionability:
30
|
keep open | WIP PR fixing generated hooks not included in Snap (#6433); author checklist incomplete — validation, lint, and test steps not yet run; 0 reviewers, 0 comments, CLA passing |
Update history
| Date | Change |
|---|---|
| closed | |
| updated | |
| updated | |
| updated | |
| updated | |
| updated | |
| updated | |
| updated | |
| updated | |
| created |
Related work
-
Superseded By:
snapcraft#6433
(confidence 98%)
The linked bug was fixed independently by commit 271462658 after PR #6434 was closed unmerged.
Related issues
| Issue | Project | State | Summary | Similarity |
|---|---|---|---|---|
| #6433 Generated hooks are not included in the Snap | snapcraft | closed | Generated part hooks now replace stubs correctly; commit 271462658 prevents premature stub creation and was targeted for Snapcraft 9.1.3. | |
| #3386 meta: don't overwrite preconfigured hooks with stubs | snapcraft | merged | Hook stub generation now preserves existing primed meta/hooks scripts; merged in snapcraft#3386 via commit bb9525144, with added unit-test fixtures and coverage. | |
| #3296 meta: write stubs for command-chain using hooks when needed | snapcraft | merged | Merged #3296 in commit 95225991f, adding Snapcraft metadata generation of stub hooks for command-chain-based hooks. | |
| #6435 Provision built hooks before declared hook stubs | snapcraft | closed | Closed unmerged; the hook-ordering fix and regression tests passed CI, but the PR remained unreviewed and received no maintainer feedback. | |
| #3837 fix: hooks: process generated hooks | snapcraft | merged | Merged as commit c77e3a07a (CRAFT-1159): core22 now includes lifecycle-generated hooks in the snap via meta/hooks wrappers, with snap/hooks taking priority; adds spread tests for core18/20/22. |