Skip to content

hotfix(ci): never auto-merge Dependabot PRs into main (beta) - #59

Merged
PhillyUrbs merged 17 commits into
betafrom
hotfix/no-automerge-main-beta
May 11, 2026
Merged

hotfix(ci): never auto-merge Dependabot PRs into main (beta)#59
PhillyUrbs merged 17 commits into
betafrom
hotfix/no-automerge-main-beta

Conversation

@PhillyUrbs

Copy link
Copy Markdown
Owner

Re-open of #57 with the source branch renamed ci/...hotfix/... so the promotion-guard workflow accepts it (PRs into beta must be from dev, hotfix/*, or release-please--*).

Cherry-pick of #56 (already merged to main). Companion PR #58 covers dev.

PhillyUrbs and others added 17 commits May 7, 2026 21:44
- Matrix includes 3.11/3.12/3.13 (3.13 is what ships on the Pi).
- ci-required aggregates matrix results so branch protection can require
  a single stable check name.
- promotion-guard enforces dev->beta and beta->main promotion paths
  (hotfix/* allowed direct into either).
* ci: add py3.13, ci-required aggregate, promotion-guard

- Matrix includes 3.11/3.12/3.13 (3.13 is what ships on the Pi).
- ci-required aggregates matrix results so branch protection can require
  a single stable check name.
- promotion-guard enforces dev->beta and beta->main promotion paths
  (hotfix/* allowed direct into either).

* Promote dev: upgrade-path tests (#9)

* ci: add py3.13, ci-required aggregate, promotion-guard

- Matrix includes 3.11/3.12/3.13 (3.13 is what ships on the Pi).
- ci-required aggregates matrix results so branch protection can require
  a single stable check name.
- promotion-guard enforces dev->beta and beta->main promotion paths
  (hotfix/* allowed direct into either).

* feat(ui): graceful restart overlay during updates

- New /api/health endpoint reports {ok, version}.
- waitForRestartAndReload polls health every 1s up to 120s; reloads as
  soon as the server responds (and, for updates, as soon as the version
  changes). Replaces blind setTimeout reloads that hit chromium's
  can't-connect page mid-restart.
- Restart overlay gets a CSS spinner and supports a sub-message line.
- Both update-install and remote-toggle restart paths use the new helper.

* feat(updates): dev-only Force reinstall button

Reinstalls the current dev branch HEAD without requiring an update to
be available. Useful for testing the restart/health-poll flow on the
same commit. Visible only when channel == dev.

* feat(updates): dev-only ref selector for force install

- updater.perform_update gains target_ref override
- updater.list_refs returns recent tags + last 20 dev commits
- updater.is_valid_ref restricts user input to safe git ref characters
- New GET /api/update/refs (dev-channel only)
- POST /api/update/install accepts {ref}; gated to dev channel and
  validated with is_valid_ref before being passed to git
- Settings UI: Updates section shows a dev-only panel with a populated
  select (Tags / recent dev commits) plus a free-form input for any
  arbitrary ref

* fix(updates): replace native select with inline scrollable ref list

Native select on kiosk Chromium opens a system overlay that doesn't
respect our drag-scroll. The dev-only build picker is now an inline
listbox with grouped sections (Tags, Recent dev commits), 44px touch
targets, orange selected state, and data-drag-scroll so the existing
pointer-event handler also works inside it.

drag-scroll.js: refactored to a per-element attach() + MutationObserver
so async-rendered scrollers (like the ref list) get hooked up.

* fix(updates): wait for server-down-then-up before redirecting

Previous logic accepted the very first /api/health 200 after kicking
off the install, which was almost always served by the still-running
old process. The dashboard would then load against a server that was
about to shut down and immediately show 'Network error. Will retry.'

waitForRestartAndReload now requires either:
  - reported version differs from snapshot (normal upgrade), or
  - at least one failed health check observed first (force reinstall
    of same version)
before redirecting.

* fix(updates): use git HEAD sha as restart fingerprint

__version__ doesn't bump on every dev push, so version-based detection
of 'new build is up' would never fire and the spinner sat forever.

/api/health now returns {version, sha} (short git HEAD), and the JS
restart watcher compares the combined fingerprint. Falls back to
sawDown-then-up gating when no prior fingerprint is available.

* test: cross-version upgrade-path coverage

For each supported historical tag (v0.1.3 -> v0.4.0):

- test_old_config_loads_and_revalidates: fetches that tag's
  config.example.yaml via 'git show', injects a valid child + location,
  then asserts current load_config + validate_config + save_config
  round-trip cleanly. Catches schema drift and channel-alias migration
  bugs.

- test_app_boots_with_old_config: spins up the current Flask app
  against the migrated config and asserts /api/health and /api/settings
  respond and expose every current top-level section.

CI checkout switched to fetch-depth: 0 so the tags are available.
Hotfix: corrects the extra-files schema and adds the version marker so
release-please can parse outfitpi/__init__.py.
Hotfix so the auto-generated release-please PRs (#18, #19, future ones)
pass the promotion-guard check.
🤖 I have created a release *beep* *boop*
---


##
[0.4.1](v0.4.0...v0.4.1)
(2026-05-08)


### Bug Fixes

* **ci:** release-please extra-files config
([#17](#17))
([b5a8748](b5a8748))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Promote security automation workflows to stable.
Lands docs infrastructure on main so the build-docs check exists. Pages
will deploy on merge.
Lands versioned-docs infra on main.
🤖 I have created a release *beep* *boop*
---


##
[0.4.2](v0.4.1...v0.4.2)
(2026-05-08)


### Documentation

* mkdocs site + screenshot capture
([#31](#31))
([bfc9fd8](bfc9fd8))
* versioned (mike) + placeholder image macro
([#35](#35))
([e648365](e648365))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Hotfix branch off main, picks the runtime + workflow changes from beta.
Skips release-please artifacts (main has its own at 0.4.2).
Closes Dependabot alert #1; lands stack-trace scrubbing, ZIP validation,
XSS DOM-construction fixes.
Hotfix promoting the auto-resolve workflow.
# Conflicts:
#	.github/copilot-instructions.md
#	.github/workflows/docs.yml
#	.github/workflows/release-please.yml
#	.gitignore
#	.release-please-manifest.json
#	CHANGELOG.md
#	app.py
#	outfitpi/__init__.py
#	outfitpi/weather.py
#	static/css/style.css
#	static/js/drag-scroll.js
#	static/js/settings.js
#	templates/settings.html
Add a base.ref guard so the Dependabot auto-merge workflow only
fires for PRs targeting non-main branches. Anything landing on
main (the production channel) goes through manual review even
when it's a low-risk patch-level security bump.

Hotfix targets main directly so the policy is in effect before
the next dependabot PR opens.
@PhillyUrbs
PhillyUrbs merged commit f2638c1 into beta May 11, 2026
24 of 25 checks passed
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.

1 participant