Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
227 commits
Select commit Hold shift + click to select a range
2c6de06
merge stable - 1.5.10.2253 into dev
fog-workflows[bot] Aug 11, 2026
4a656be
Reissue the web leaf when the signing CA changes, not just the names
mastacontrola Aug 11, 2026
21636d1
Add fog-mint-web-ca and document unifying a multi-server fleet
mastacontrola Aug 11, 2026
ac3e262
Port the bundle transfer steps, and stop naming flags this line does …
mastacontrola Aug 11, 2026
d419f97
Fix #1036: resolve the mac encoding inside getHostItem
mastacontrola Aug 14, 2026
93c1da4
Merge pull request #1037 from FOGProject/fix-1036-mac-decode-dev
mastacontrola Aug 14, 2026
18c0f6a
Catch FOG_VERSION drift at push time instead of predicting it at commit
mastacontrola Aug 14, 2026
8edfbf3
Fix #1039: validate the Kea config as the account that can read it
mastacontrola Aug 14, 2026
9aaf059
Merge pull request #1040 from FOGProject/fix-1039-kea-apparmor-dev
mastacontrola Aug 14, 2026
e2a1fce
Version Sync: Increment version from 1.5.10.2262 to 1.5.10.2265 for P…
fog-workflows[bot] Aug 14, 2026
6f58fff
Stop a user PUT locking that account out permanently
mastacontrola Aug 16, 2026
a74d588
Merge pull request #1092 from FOGProject/fix-user-rehash-dev
mastacontrola Aug 16, 2026
b458ca0
Drop deprecated "${var}" interpolation
mastacontrola Aug 16, 2026
7a69469
Merge pull request #1106 from FOGProject/fix-deprecated-interpolation
mastacontrola Aug 16, 2026
8faee64
Fix untranslatable, misspelled copy on the pending-MAC report (#1108)
mastacontrola Aug 16, 2026
bca0dd1
Sweep gettext msgids that were built at runtime, and gate it (#1110)
mastacontrola Aug 16, 2026
1f9df5a
Make the iPXE advanced menu actually check the login it asks for (#1112)
mastacontrola Aug 16, 2026
3b33200
Stop handing a session to entry points that cannot carry a cookie
mastacontrola Aug 17, 2026
ea24e5c
Merge pull request #1115 from FOGProject/port-session-guard-dev
mastacontrola Aug 17, 2026
a3fb735
Say 7.4 in the docblocks, which is what FOG has enforced for years
mastacontrola Aug 17, 2026
9bd1bbb
Merge pull request #1127 from FOGProject/docs-php-floor-74-dev
mastacontrola Aug 17, 2026
f5cea92
Version Sync: Increment version from 1.5.10.2265 to 1.5.10.2277 for P…
fog-workflows[bot] Aug 17, 2026
e3ba277
Verify TLS on outbound requests, and keep the session off third-party…
mastacontrola Aug 17, 2026
88a3f69
Run the test suite on pull requests (#1140)
mastacontrola Aug 17, 2026
97be8b1
Ask the database whether there is a database to back up
mastacontrola Aug 17, 2026
f8141bb
Back up the web tree the symlink pointed at, not the symlink
mastacontrola Aug 17, 2026
b73ee56
Sync the version on merge, not just on the daily sweep
darksidemilk Aug 17, 2026
c891974
Merge pull request #1161 from FOGProject/ci-sync-on-merge-dev
darksidemilk Aug 17, 2026
01ac2c7
Bound every installer network fetch (port of #1159)
mastacontrola Aug 18, 2026
e7593d1
Merge pull request #1168 from FOGProject/inet-check-dev
mastacontrola Aug 18, 2026
eff3f5f
Port: string identifiers read as foreign keys, and php-fpm error log …
mastacontrola Aug 18, 2026
c786d8f
Port: verify TLS on the installer's downloads and its calls to itself…
mastacontrola Aug 18, 2026
d634bdf
Trigger the merge sync from an event that actually reaches this file
darksidemilk Aug 18, 2026
17b3f43
Merge pull request #1172 from FOGProject/ci-sync-on-merge-fix-trigger…
darksidemilk Aug 18, 2026
1130094
Version Sync: Increment version from 1.5.10.2281 to 1.5.10.2290 for P…
fog-workflows[bot] Aug 18, 2026
a49fb96
Pin iPXE to v2.0.0-fog.7 (#1188)
mastacontrola Aug 18, 2026
636f2cb
Stop register()'s error handler being fatal (#1196)
mastacontrola Aug 19, 2026
cf54b2f
Fix four hook/event defects that cannot change which listener runs (#…
mastacontrola Aug 19, 2026
af958bc
Version Sync: Increment version from 1.5.10.2290 to 1.5.10.2294 for P…
fog-workflows[bot] Aug 19, 2026
2624732
Let 1.5 record what FOS tells it: taskLog gets a type and a body (sch…
mastacontrola Aug 19, 2026
f794530
Give a task the host died on a state of its own (schema 281) (#1212)
mastacontrola Aug 19, 2026
d6fef1e
Type the taskLog rows that were landing empty (schema 282) (#1214)
mastacontrola Aug 19, 2026
02eee9d
Make the cancel route refuse what it cannot cancel (#1216)
mastacontrola Aug 19, 2026
af02d67
Let a stored FOS report be longer than the notification it triggers (…
mastacontrola Aug 19, 2026
59616e7
Keep the line breaks in a stored FOS report (#1224)
mastacontrola Aug 19, 2026
b7b748d
Say why imaging failed, not just that it did (#1226)
mastacontrola Aug 19, 2026
bcbcecf
Apply the site boundary to the API, not just to the management pages
darksidemilk Aug 19, 2026
d000ecf
Merge pull request #1229 from FOGProject/site-api-scope
mastacontrola Aug 19, 2026
0b41dfb
Push the API object boundary into the query, keeping the id list as f…
darksidemilk Aug 20, 2026
ee9bb20
Merge pull request #1233 from FOGProject/site-api-scope-subquery
mastacontrola Aug 20, 2026
73916a4
fix(orm): keep a host with no primary MAC loadable, and self-heal it
darksidemilk Aug 20, 2026
36f6f28
Merge pull request #1234 from FOGProject/macless-host-join
mastacontrola Aug 20, 2026
d04ec2d
Version Sync: Increment version from 1.5.10.2301 to 1.5.10.2308 for P…
fog-workflows[bot] Aug 20, 2026
1169c84
fix(tasklog): keep a FOS report readable after its task is gone
darksidemilk Aug 20, 2026
77dfb2c
Merge pull request #1237 from FOGProject/tasklog-retention-15
mastacontrola Aug 20, 2026
a80cfe4
Version Sync: Increment version from 1.5.10.2308 to 1.5.10.2311 for P…
fog-workflows[bot] Aug 20, 2026
097a528
fix(db): run under the server's own sql_mode (#1245)
darksidemilk Aug 20, 2026
0b561c3
Merge pull request #1252 from FOGProject/feature-1245-strict-sql-mode
mastacontrola Aug 20, 2026
674079e
Version Sync: Increment version from 1245.0-feature.2312 to 1.5.10.23…
fog-workflows[bot] Aug 20, 2026
f41aede
fix(replication): report a refused FTP login as a login failure (#1254)
darksidemilk Aug 20, 2026
5b30cca
Merge pull request #1256 from FOGProject/fix-1254-ftp-login-vs-connec…
mastacontrola Aug 20, 2026
9b288fc
Version Sync: Increment version from 1.5.10.2314 to 1.5.10.2317 for P…
fog-workflows[bot] Aug 20, 2026
0a17a3a
fix(core): report and record database operations that fail on machine…
darksidemilk Aug 21, 2026
eb3c705
fix(db): record a failed FETCH, and check for it after the fetch not …
darksidemilk Aug 21, 2026
d46095c
Merge pull request #1258 from FOGProject/port-db-failure-recorded
mastacontrola Aug 21, 2026
d96d9f0
Version Sync: Increment version from 1.5.10.2317 to 1.5.10.2321 for P…
fog-workflows[bot] Aug 21, 2026
e24b8e6
test: pin FOGManagerController::find()'s failure check
darksidemilk Aug 21, 2026
4438cc3
Merge pull request #1260 from FOGProject/test-db-failure-find-coverage
mastacontrola Aug 21, 2026
c12ae8c
Version Sync: Increment version from 1.5.10.2321 to 1.5.10.2324 for P…
fog-workflows[bot] Aug 21, 2026
29bf14b
fix(security): keep the failed statement's bound values out of the fa…
mastacontrola Aug 21, 2026
9dc847e
Version Sync: Increment version from 1.5.10.2324 to 1.5.10.2326 for P…
fog-workflows[bot] Aug 21, 2026
9ecda28
fix(installer): create the fault log directory 0750, not 0755 (#1264)
mastacontrola Aug 21, 2026
3530e23
Version Sync: Increment version from 1.5.10.2326 to 1.5.10.2328 for P…
fog-workflows[bot] Aug 21, 2026
6eda421
fix(db): insertBatch must name every column a strict server requires
darksidemilk Aug 22, 2026
587f65f
Merge pull request #1270 from FOGProject/fix-insertbatch-strict-1364
mastacontrola Aug 22, 2026
db7d2bd
Version Sync: Increment version from 1.5.10.2328 to 1.5.10.2331 for P…
fog-workflows[bot] Aug 22, 2026
1446dba
Schema step 286: give FOG's optional columns a real default
darksidemilk Aug 22, 2026
f10afb0
Merge pull request #1273 from FOGProject/schema-286-optional-column-d…
mastacontrola Aug 22, 2026
427e245
Version Sync: Increment version from 1.5.10.2331 to 1.5.10.2334 for P…
fog-workflows[bot] Aug 22, 2026
1596198
Give plugin tables real column defaults, and stop createTable droppin…
darksidemilk Aug 22, 2026
60bcf11
Merge pull request #1274 from FOGProject/plugin-table-column-defaults
mastacontrola Aug 22, 2026
813f0da
Version Sync: Increment version from 1.5.10.2334 to 1.5.10.2337 for P…
fog-workflows[bot] Aug 22, 2026
15b9446
fix(installer): report "Skipped" when no web backup was written
darksidemilk Aug 22, 2026
c9b8ca7
Merge pull request #1282 from FOGProject/installer-web-backup-report-15
mastacontrola Aug 22, 2026
7e4a8b7
Version Sync: Increment version from 1.5.10.2337 to 1.5.10.2340 for P…
fog-workflows[bot] Aug 22, 2026
f814a64
fix(tasking): stop the first check-in of every task fataling on a nul…
darksidemilk Aug 22, 2026
67d904e
test: pin that a task with no check-in time can still check in
darksidemilk Aug 22, 2026
6899b9f
Merge pull request #1283 from FOGProject/fix-task-checkin-null-devbranch
mastacontrola Aug 22, 2026
3e2ba94
Version Sync: Increment version from 1.5.10.2340 to 1.5.10.2344 for P…
fog-workflows[bot] Aug 22, 2026
0c41d53
Close two blind gates in the API object-scope tests
darksidemilk Aug 23, 2026
2fb4cb1
Merge pull request #1291 from FOGProject/harden-site-scope-gates
mastacontrola Aug 23, 2026
5aad9e6
Version Sync: Increment version from 1.5.10.2344 to 1.5.10.2347 for P…
fog-workflows[bot] Aug 23, 2026
4ca3ad4
Say why _scopeWhere() carries no reentrancy guard
darksidemilk Aug 23, 2026
0d42813
Merge pull request #1294 from FOGProject/document-no-reentrancy-guard
mastacontrola Aug 23, 2026
bc34310
Version Sync: Increment version from 1.5.10.2347 to 1.5.10.2350 for P…
fog-workflows[bot] Aug 23, 2026
6027fbe
fix(installer): don't reject every directory when the distro config i…
darksidemilk Aug 23, 2026
299805f
Merge pull request #1299 from FOGProject/fix-installdir-guard-empty-g…
mastacontrola Aug 23, 2026
81630e8
Version Sync: Increment version from 1.5.10.2350 to 1.5.10.2353 for P…
fog-workflows[bot] Aug 23, 2026
ac4bd48
fix(multicast): make a kill answer whether the sender is actually gone
darksidemilk Aug 23, 2026
cefb990
test(multicast): settle on a cmdline that is ours, not merely non-empty
darksidemilk Aug 23, 2026
14504e1
Merge pull request #1301 from FOGProject/fix-multicast-kill-contract-…
mastacontrola Aug 23, 2026
62ea1b3
Version Sync: Increment version from 1.5.10.2353 to 1.5.10.2357 for P…
fog-workflows[bot] Aug 23, 2026
9f5488f
fix(pki): keep the imported root when regenerating the web CA chain
darksidemilk Aug 23, 2026
2122b62
fix(snapinhash): stop saving a hash for a file that is not there
darksidemilk Aug 23, 2026
ea59f10
Merge pull request #1304 from FOGProject/fix-snapinhash-missing-file-…
mastacontrola Aug 23, 2026
921bf43
Version Sync: Increment version from 1.5.10.2357 to 1.5.10.2360 for P…
fog-workflows[bot] Aug 23, 2026
0e8b51c
fix(pki): anchor the installer's self-calls on the chain, not the loc…
darksidemilk Aug 23, 2026
e91060a
fix(multicast): give the first partition its own max-wait (GH-536)
darksidemilk Aug 23, 2026
fcc5511
Merge pull request #1305 from FOGProject/port-per-partition-maxwait-d…
mastacontrola Aug 23, 2026
5a275e9
Version Sync: Increment version from 1.5.10.2360 to 1.5.10.2363 for P…
fog-workflows[bot] Aug 23, 2026
f606aa9
test(installer): pin the resolved anchor, not $rootCAPem
darksidemilk Aug 23, 2026
d322bfe
Merge pull request #1303 from FOGProject/fix-external-web-ca-chain-cl…
mastacontrola Aug 23, 2026
9f07d73
Version Sync: Increment version from 1.5.10.2363 to 1.5.10.2368 for P…
fog-workflows[bot] Aug 23, 2026
e843906
fix(session): give FOG its own PHP session store so GC stops reaping …
darksidemilk Aug 23, 2026
1d99adf
Merge pull request #1307 from FOGProject/fix-php-session-gc-reaps-fog…
mastacontrola Aug 23, 2026
70bb103
Version Sync: Increment version from 1.5.10.2368 to 1.5.10.2371 for P…
fog-workflows[bot] Aug 23, 2026
3c18752
fix(session): stop an empty session cookie minting a throwaway session
darksidemilk Aug 23, 2026
1ff8741
test(url-requests): re-pin the cookie gate, and gate the session guar…
darksidemilk Aug 23, 2026
db4d120
Merge pull request #1309 from FOGProject/fix-empty-session-cookie-min…
mastacontrola Aug 23, 2026
3cf3252
Version Sync: Increment version from 1.5.10.2371 to 1.5.10.2375 for P…
fog-workflows[bot] Aug 23, 2026
599dbf9
fix(auth): let FOG's own components authenticate without a session (1…
darksidemilk Aug 23, 2026
90a27b0
Merge pull request #1314 from FOGProject/feat-node-hmac-auth-15
mastacontrola Aug 23, 2026
27753fd
Version Sync: Increment version from 1.5.10.2375 to 1.5.10.2378 for P…
fog-workflows[bot] Aug 23, 2026
e6150e9
fix(api): stop returning credential setting values over REST
darksidemilk Aug 23, 2026
4ea721c
Merge pull request #1315 from FOGProject/fix-15-setting-value-disclosure
mastacontrola Aug 23, 2026
58a39f4
Version Sync: Increment version from 1.5.10.2378 to 1.5.10.2381 for P…
fog-workflows[bot] Aug 23, 2026
6abf4c4
feat(nodes): give a peer FOG server its own signing key
darksidemilk Aug 23, 2026
b00192c
Merge pull request #1318 from FOGProject/feat-per-node-signing-key-de…
mastacontrola Aug 23, 2026
0693679
Version Sync: Increment version from 1.5.10.2381 to 1.5.10.2384 for P…
fog-workflows[bot] Aug 23, 2026
9675169
feat(nodes): give a peer a way to be handed its signing key
darksidemilk Aug 23, 2026
e9a8385
Merge pull request #1319 from FOGProject/feat-node-key-cli-devbranch
mastacontrola Aug 23, 2026
e596c22
Version Sync: Increment version from 1.5.10.2384 to 1.5.10.2387 for P…
fog-workflows[bot] Aug 23, 2026
f2cb3ed
fix(service): let cleanupProcList actually empty the process lists
darksidemilk Aug 23, 2026
5e5d826
Merge pull request #1322 from FOGProject/fix-proclist-cleanup-temporary
mastacontrola Aug 23, 2026
722e312
Version Sync: Increment version from 1.5.10.2387 to 1.5.10.2390 for P…
fog-workflows[bot] Aug 23, 2026
533bdb1
test(schema): pin FOG_SCHEMA to the real step count on this branch too
mastacontrola Aug 24, 2026
4a50b53
Merge pull request #1343 from FOGProject/test-upgrade-replay-gate-dev
mastacontrola Aug 24, 2026
7e4932b
Version Sync: Increment version from 1.5.10.2390 to 1.5.10.2393 for P…
fog-workflows[bot] Aug 24, 2026
87b17cd
fix(boot): resolve the boot kernel by architecture, not by hope
mastacontrola Aug 24, 2026
6bd5d42
Merge pull request #1350 from FOGProject/fix-bootmenu-arch-devbranch
mastacontrola Aug 24, 2026
63dfca6
Version Sync: Increment version from 1.5.10.2393 to 1.5.10.2396 for P…
fog-workflows[bot] Aug 24, 2026
295a253
Port BootMenu dead-code removal and hook-argument fixes from working-1.6
claude Aug 25, 2026
994cdb7
Merge pull request #1354 from FOGProject/claude/bootmenu-screen-ipxe-…
mastacontrola Aug 25, 2026
3fce2ee
Version Sync: Increment version from 1.5.10.2396 to 1.5.10.2399 for P…
fog-workflows[bot] Aug 25, 2026
c015ea7
Store a PHP boolean as '0'/'1', never as ''
mastacontrola Aug 25, 2026
0abd592
Merge pull request #1362 from FOGProject/port-boolean-column-writes-1…
mastacontrola Aug 25, 2026
1f57bfc
Version Sync: Increment version from 1.5.10.2399 to 1.5.10.2402 for P…
fog-workflows[bot] Aug 25, 2026
180f7a9
feat: support multiple NICs with iPXE net0 inactive
MrLego8-9 Aug 26, 2026
692d97f
Use iPXE's netX alias for setmacto instead of nesting ifname
mastacontrola Aug 26, 2026
2fa8665
Regenerate the bootmenu golden for the setmacto change
mastacontrola Aug 26, 2026
b2c4979
Merge pull request #1383 from MrLego8-9/dev-branch
mastacontrola Aug 26, 2026
a92d061
Fix FOGUpdater: GitHub as the update source, https enforced end to end
mastacontrola Aug 26, 2026
a17ca75
Merge pull request #1386 from FOGProject/fogupdater-github-source-15
mastacontrola Aug 26, 2026
0b4fb32
Version Sync: Increment version from 1.5.10.2402 to 1.5.10.2409 for P…
fog-workflows[bot] Aug 26, 2026
ba92027
Record the real manufacturer, stop blanking the boot log, and look pa…
mastacontrola Aug 26, 2026
a0c9226
Merge pull request #1388 from FOGProject/ipxe-params-widen-dev
mastacontrola Aug 26, 2026
4509b80
Version Sync: Increment version from 1.5.10.2409 to 1.5.10.2412 for P…
fog-workflows[bot] Aug 26, 2026
139b469
fix(tasking): stop a task ever pointing at nothing, and free the ones…
mastacontrola Aug 26, 2026
72d9a80
fix(db): let find() ask for a column that holds nothing
mastacontrola Aug 26, 2026
3d9a1aa
fix(tasking): reap the tasks that can never run, and say why
mastacontrola Aug 26, 2026
7ec8df2
Merge pull request #1391 from FOGProject/null-task-18228-dev
mastacontrola Aug 26, 2026
48a91fe
Merge pull request #1394 from FOGProject/null-task-reaper-dev
mastacontrola Aug 26, 2026
3583673
Version Sync: Increment version from 1.5.10.2412 to 1.5.10.2418 for P…
fog-workflows[bot] Aug 26, 2026
c651c49
fix(registration): stop HTML-escaping the password before checking it
mastacontrola Aug 26, 2026
80b7ccf
Merge pull request #1398 from FOGProject/registration-credential-esca…
mastacontrola Aug 26, 2026
5c56886
Version Sync: Increment version from 1.5.10.2418 to 1.5.10.2421 for P…
fog-workflows[bot] Aug 26, 2026
7cc4c98
Say which store fog-enroll-mok.sh actually checked
mastacontrola Aug 26, 2026
56322ec
Merge pull request #1401 from FOGProject/secureboot-enrolment-diagnos…
mastacontrola Aug 26, 2026
57aefe6
Version Sync: Increment version from 1.5.10.2421 to 1.5.10.2424 for P…
fog-workflows[bot] Aug 26, 2026
a729455
Point the iPXE build failure at its own log
mastacontrola Aug 26, 2026
7bc4d6d
Merge pull request #1406 from FOGProject/ipxe-build-failure-diagnosti…
mastacontrola Aug 26, 2026
4dd6fd5
Version Sync: Increment version from 1.5.10.2424 to 1.5.10.2427 for P…
fog-workflows[bot] Aug 26, 2026
3da2c03
Stop shipping the generated config world-readable
mastacontrola Aug 27, 2026
fdc4b8a
Merge pull request #1433 from FOGProject/config-mode-0640-dev
mastacontrola Aug 27, 2026
1d43dad
Version Sync: Increment version from 1.5.10.2427 to 1.5.10.2430 for P…
fog-workflows[bot] Aug 27, 2026
98ae6bb
Stop the config step printing OK twice
mastacontrola Aug 28, 2026
3e5263b
Merge pull request #1436 from FOGProject/config-mode-double-ok-dev
mastacontrola Aug 28, 2026
9da71a3
Version Sync: Increment version from 1.5.10.2430 to 1.5.10.2433 for P…
fog-workflows[bot] Aug 28, 2026
5daf4eb
Pin iPXE to v2.0.0-fog.7.1, which ships the pre-DHCP sleep
mastacontrola Aug 29, 2026
f72702c
Merge pull request #1468 from FOGProject/ipxe-pin-fog7-1
mastacontrola Aug 29, 2026
123a39f
Version Sync: Increment version from 1.5.10.2433 to 1.5.10.2436 for P…
fog-workflows[bot] Aug 29, 2026
e481219
Stop writing FOG_VERSION on a branch, so open PRs stop conflicting
mastacontrola Aug 30, 2026
446b118
Merge pull request #1511 from FOGProject/version-off-pr-branches-dev
mastacontrola Aug 30, 2026
14138df
Version Sync: Increment version from 1.5.10.2436 to 1.5.10.2439 for P…
fog-workflows[bot] Aug 30, 2026
4a65865
Report a node registration POST that did not land (GH-575)
mastacontrola Aug 31, 2026
f05985d
Merge pull request #1560 from FOGProject/fix/gh-575-node-credential-p…
mastacontrola Aug 31, 2026
6816c38
Version Sync: Increment version from 1.5.10.2439 to 1.5.10.2442 for P…
fog-workflows[bot] Aug 31, 2026
3fc7e64
Stop forcing the netboot path to HTTPS (GH-978)
mastacontrola Aug 31, 2026
32f4a30
Merge pull request #1562 from FOGProject/fix/gh-978-netboot-redirect-…
mastacontrola Aug 31, 2026
7421031
Version Sync: Increment version from 1.5.10.2442 to 1.5.10.2445 for P…
fog-workflows[bot] Aug 31, 2026
a96f215
Make the node sub-menu labels whole translatable phrases
mastacontrola Aug 31, 2026
16f8737
Merge pull request #1571 from FOGProject/fix/gh-435-per-node-menu-str…
mastacontrola Aug 31, 2026
523eaed
Version Sync: Increment version from 1.5.10.2445 to 1.5.10.2448 for P…
fog-workflows[bot] Aug 31, 2026
ac42736
Read the tasking form's account as a string, not as NULL
mastacontrola Aug 31, 2026
26398ac
Merge pull request #1573 from FOGProject/fix/group-multicast-null-pas…
mastacontrola Aug 31, 2026
6f67966
Version Sync: Increment version from 1.5.10.2448 to 1.5.10.2451 for P…
fog-workflows[bot] Aug 31, 2026
1bf021f
Cast request input before handing it to a string function
mastacontrola Aug 31, 2026
df20a8a
Merge pull request #1575 from FOGProject/chore/cast-filter-input-befo…
mastacontrola Aug 31, 2026
d828777
Version Sync: Increment version from 1.5.10.2451 to 1.5.10.2454 for P…
fog-workflows[bot] Aug 31, 2026
878fd6c
Let the pre-commit hook exit 0 when an optional tool is missing (GH-1…
darksidemilk Sep 1, 2026
a3727ac
Add bin/updatefog.sh for the 1.5 -> 1.6 crossing, and retire fogupdat…
darksidemilk Sep 1, 2026
826e3a1
Merge pull request #1588 from FOGProject/fix/gh-1581-pre-commit-exit-…
mastacontrola Sep 1, 2026
cc4ddfc
Version Sync: Increment version from 1.5.10.2454 to 1.5.10.2457 for P…
fog-workflows[bot] Sep 1, 2026
a239759
Anchor rcBranch at refs/heads/, and cover it with a real remote
mastacontrola Sep 1, 2026
d17fe64
Merge pull request #1589 from FOGProject/feat/updatefog-1.5-to-1.6
mastacontrola Sep 1, 2026
58ff0a0
Version Sync: Increment version from 1.5.10.2457 to 1.5.10.2461 for P…
fog-workflows[bot] Sep 1, 2026
a059c7d
Copy from the resolved path, and refuse a headless run before moving …
darksidemilk Sep 1, 2026
1d40a1e
Merge pull request #1605 from FOGProject/fix/updatefog-1.5-selfcopy-a…
mastacontrola Sep 1, 2026
a8f7218
Version Sync: Increment version from 1.5.10.2461 to 1.5.10.2464 for P…
fog-workflows[bot] Sep 1, 2026
05b4082
Detach rather than move a branch ref, and do not read EOF as a decision
darksidemilk Sep 1, 2026
3733ddb
Merge pull request #1637 from FOGProject/fix/updatefog-1.5-detach-and…
darksidemilk Sep 2, 2026
025711a
Version Sync: Increment version from 1.5.10.2464 to 1.5.10.2467 for P…
fog-workflows[bot] Sep 2, 2026
3e2f693
Give Group::createImagePackage() a capture arm so a group capture wri…
mastacontrola Sep 2, 2026
10fe167
Merge pull request #1680 from FOGProject/claude/1677-group-capture-ta…
mastacontrola Sep 2, 2026
6c23c2b
Version Sync: Increment version from 1.5.10.2467 to 1.5.10.2470 for P…
fog-workflows[bot] Sep 2, 2026
24fb75b
Boot Memtest86+ 8.10 directly so the memory test runs on UEFI as well…
mastacontrola Sep 2, 2026
a0d3b1c
Merge pull request #1698 from FOGProject/claude/321-memtest-uefi-dev
mastacontrola Sep 2, 2026
62cd973
Version Sync: Increment version from 1.5.10.2470 to 1.5.10.2473 for P…
fog-workflows[bot] Sep 2, 2026
9ba8b1b
Bind the gettext domain's output codeset to UTF-8
mastacontrola Sep 8, 2026
05df664
Merge pull request #1723 from FOGProject/fix/gettext-output-codeset-u…
mastacontrola Sep 8, 2026
bd80f13
Keep the Kea config path on an installer re-run (GH-1747)
mastacontrola Sep 10, 2026
e677e23
Merge pull request #1751 from FOGProject/fix/1747-kea-rerun-dev
mastacontrola Sep 10, 2026
93f4594
Derive the DHCP subnet from the FOG address, not the interface (GH-1747)
mastacontrola Sep 10, 2026
a7c16bd
Merge pull request #1753 from FOGProject/fix/1747-subnet-dev
mastacontrola Sep 10, 2026
7548b49
Take the version base from a release tag only
mastacontrola Sep 10, 2026
5ef6ee1
Merge pull request #1757 from FOGProject/fix/version-ignores-archive-…
mastacontrola Sep 10, 2026
b959754
Version Sync: Increment version from 1.5.10.2473 to 1.5.10.2482 for P…
fog-workflows[bot] Sep 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
46 changes: 39 additions & 7 deletions .githooks/lib/fog-version.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,31 @@
# (locally or in CI) without leaving a dirty working tree behind. Pair with
# apply-fog-version.sh to actually write the result somewhere.
#
# Usage: fog-version.sh [branch-name]
# Usage: fog-version.sh [branch-name] [mode]
# branch-name defaults to the currently checked out branch.
# mode 0 (default) report honestly; if drifted, print the version the
# next commit should carry.
# 1 a commit is being written right now - always print the
# version that commit should carry. Used by pre-commit.
# head print what the commit that ALREADY EXISTS should carry, with
# no +1 - i.e. verify rather than write.
#
# No local hook calls this any more: FOG_VERSION is written only on a base
# branch, after a merge, by CI. See the header of .githooks/pre-commit.

set -e

project_dir=$(git rev-parse --show-toplevel)
system_file="$project_dir/packages/web/lib/fog/system.class.php"

gitbranch="${1:-$(git branch --show-current)}"
local="${2:-0}"
mode="${2:-0}"

gitcom=$(git rev-list --tags --no-walk --max-count=1)
# Release tags only. A release tag is the version string itself (1.5.10.2253),
# so it starts with a digit. Any other tag -- archive/feature-fog2-gui, pushed
# on 2026-09-06 -- would otherwise become the base version whenever it is the
# newest tag, and its slash then breaks the sed in apply-fog-version.sh.
gitcom=$(git rev-list --tags='[0-9]*' --no-walk --max-count=1)

git fetch origin master:master 2>/dev/null || true
gitcount=$(git rev-list master..HEAD --count)
Expand All @@ -46,13 +59,13 @@ compute_version() {

case "$branchon" in
dev)
tagversion=$(git describe --tags "$gitcom")
tagversion=$(git describe --tags --match '[0-9]*' "$gitcom")
baseversion=${tagversion%.*}
trunkversion="${baseversion}.${count}"
channel="Patches"
;;
stable)
tagversion=$(git describe --tags "$gitcom")
tagversion=$(git describe --tags --match '[0-9]*' "$gitcom")
baseversion=${tagversion%.*}
count=$(git rev-list master..dev-branch --count) # Get the gitcount from dev-branch instead
trunkversion="${baseversion}.${count}"
Expand Down Expand Up @@ -85,6 +98,16 @@ compute_version() {
# new commit right now.
compute_version "$gitcount"

# rc is the one branch type with no count-verifiable answer: it increments
# off whatever suffix is already committed rather than off a commit count,
# so the pass above always returns "one more than what is there". For the
# modes that are about to write a commit that is exactly right. For head
# mode, which asks whether the committed value is already correct, it would
# be a permanent false positive - so there, the committed value stands.
if [ "$mode" = "head" ] && [ "$branchon" = "rc" ]; then
trunkversion="$current_version"
fi

drifted=false
[ "$trunkversion" != "$current_version" ] && drifted=true
# dev-branch and stable deliberately carry no FOG_CHANNEL line at all (a
Expand All @@ -94,17 +117,26 @@ drifted=false
if { [ -n "$current_channel" ] && [ "$channel" != "$current_channel" ]; }; then
drifted=true
fi
if [ "$local" -eq 1 ]; then
if [ "$mode" = "1" ]; then
drifted=true
fi

if [ "$drifted" = true ] || [ "$local" -eq 1 ]; then
# head mode stops here. Every other mode answers "what should the NEXT
# commit say"; head answers "what should the commit that already exists
# say", so adding 1 for a commit nobody is writing would defeat the whole
# point of it.
if [ "$mode" != "head" ] && [ "$drifted" = true ]; then
# What's committed disagrees, so whatever calls this script is about
# to add one more real commit to this branch to fix it. Recompute with
# gitcount+1 - the count that will actually be true once that commit
# exists - so the fix is correct the instant it lands instead of being
# wrong by exactly the commit that made it. Without this, the very next
# check finds "drift" again and fixes it again, forever.
#
# This is also why mode=1 lands one too high on an --amend: an amend
# REPLACES HEAD rather than extending it, so the +1 counts a commit that
# will never exist. That was the standing hazard of stamping a version
# from a local hook, and is one of the reasons no local hook does it now.
compute_version "$((gitcount + 1))"
fi

Expand Down
62 changes: 44 additions & 18 deletions .githooks/pre-commit
Original file line number Diff line number Diff line change
Expand Up @@ -57,22 +57,48 @@ updateLanguage
psrfix


# FOG_VERSION IS NOT STAMPED HERE ANY MORE. That is deliberate.
#
# The version is `git rev-list master..HEAD --count` put through
# .githooks/lib/fog-version.sh -- a function of the commit graph. Stamping it
# into a tracked line of packages/web/lib/fog/system.class.php on every commit
# meant that any two branches open at once wrote DIFFERENT values to the SAME
# line, so merging the base back into either one conflicted, every time, by
# construction. Not a race: there is no ordering of commits that avoids it.
#
# It is also what left a dangling staged system.class.php bump behind after a
# commit, which this branch's CLAUDE.md used to have to warn about.
#
# The version is now written in exactly one place -- on the base branch, after
# a merge, by .github/workflows/sync-generated-files.yml -- where there is only
# ever one writer and so nothing to conflict with. fog-workflows' daily sweep
# still covers direct pushes and rc-*/feature-* branches.
#
# The consequence, stated so it is not rediscovered as a bug: a commit made
# locally leaves FOG_VERSION reading whatever the last merge into the base
# branch set. It is BEHIND on a feature branch, on purpose. Do not "fix" that
# by putting the stamp back; a version that is a few commits stale costs a
# wrong number in a build string, and stamping it per-commit costs a
# hand-resolved conflict on every open pull request every time anything
# merges.
#
# .githooks/pre-push, which refused a push whose committed version disagreed
# with the branch, was removed in the same change: with nothing stamping a
# version there is nothing for it to guard, and it would have blocked every
# push instead.
#
# Ported from working-1.6 (GH-1510), where the bug was diagnosed.

# Define the path to the system file
system_file="$project_dir/packages/web/lib/fog/system.class.php"

# Recompute FOG_VERSION/FOG_CHANNEL for the current branch. The formula is
# shared with fog-workflows' CI check (see .githooks/lib/fog-version.sh) so
# a local commit and CI's periodic sweep never compute two different
# answers for the same branch state.
gitbranch=$(git branch --show-current)
fog_version=$(sh "$project_dir/.githooks/lib/fog-version.sh" $gitbranch 1)
if [ "$(printf '%s\n' "$fog_version" | sed -n '3p')" = "true" ]; then
sh "$project_dir/.githooks/lib/apply-fog-version.sh" \
"$(printf '%s\n' "$fog_version" | sed -n '1p')" \
"$(printf '%s\n' "$fog_version" | sed -n '2p')"

# Add the modified system file to the staging area
git add "$system_file"
fi

# GH-1581: the hook's exit status is the status of the last command, which was
# psrfix -- and psrfix returns 1 when php-cs-fixer is not installed, via
# require_tools. So a machine without the optional tools printed "the commit
# will proceed WITHOUT those changes" and then blocked the commit, with git
# exiting 1 and saying nothing.
#
# Every step above is deliberately advisory: require_tools exists so a missing
# formatter is a skip, not a failure, and CI regenerates all of it. Nothing in
# this hook is a gate. Say so explicitly rather than leaving the status to
# whichever helper happens to run last -- post-commit already ends this way.
#
# Ported from working-1.6, where it was diagnosed and fixed first.
exit 0
94 changes: 94 additions & 0 deletions .github/workflows/sync-generated-files.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
name: Sync generated files and version

# Merge-triggered trigger stub. All the logic lives in FOGProject/fog-workflows'
# update-lang-fix-psr-and-sync-version.yml; this file exists only because GitHub
# Actions has no cross-repo merge trigger, so something has to live here to react
# to a merge.
#
# THIS IS THE ONLY THING THAT WRITES FOG_VERSION ON A MERGE, and since GH-1510
# it is the only thing that writes it on this branch at all outside the daily
# sweep. .githooks/pre-commit used to stamp a version on every local commit;
# that made every branch open at the same time hold a different value on the
# same tracked line, so each merge left the others with a hand-resolved
# conflict on system.class.php. Its header has the full reasoning.
#
# A client-side hook could not have covered this case anyway: a PR merged
# through GitHub's web UI (squash, merge commit or rebase) runs no local hook,
# so FOG_VERSION would go stale until the daily sweep fires at 10:10 UTC. This
# closes that window.
#
# WHY `pull_request`, AND NOT `pull_request_target`
#
# `pull_request_target` looks like the right answer -- it is the variant that
# gets secrets on fork PRs -- and the first version of this file used it. It
# never fired once. GitHub reads a `pull_request_target` workflow from the
# repository's DEFAULT branch (`stable` here), not from the PR's base branch, so
# a copy living on working-1.6 and dev-branch is simply never consulted: the
# workflow did not even appear in the Actions list, and four PRs merged into
# working-1.6 without it running.
#
# `pull_request` is read from the base branch instead, so this file works where
# it actually lives. Do not "fix" it back to `pull_request_target` without also
# putting the file on `stable` -- and note that then only stable's copy would
# execute, which makes editing the version on this branch a no-op.
#
# WHY NOT `push`
#
# That distinction is the whole safety argument, not caution. The sweep pushes
# its fixup commit straight to the branch, and a direct push is not a PR merge,
# so it cannot re-fire this stub. The 2026-07-28 runaway that put ~30 commits on
# dev-branch in about 20 minutes was a push-triggered stub doing exactly that.
# The schedule in fog-workflows stays exactly as it is, and remains the backstop
# for direct pushes and for rc-*/feature-* branches.
#
# WHY THE SAME-REPO GUARD
#
# `pull_request` withholds secrets from fork PRs, and the reusable workflow needs
# FOG_WORKFLOWS_PRIVATE_KEY to mint its App token -- so on a fork PR it would
# fail rather than work. Skipping is right: a merged fork PR is picked up by the
# daily sweep, exactly as a direct push already is. Better a gap the schedule
# already covers than a red X on every external contribution.
#
# One file, identical on every branch that carries it, for the same reason
# tests.yml is: fixing it should not mean editing it on three branches. Each
# branch's copy only ever acts on merges into that branch, and the allowlist
# below is what scopes it.

on:
pull_request:
types: [closed]

concurrency:
group: fog-sync-on-merge-${{ github.event.pull_request.base.ref }}
cancel-in-progress: false

jobs:
sync:
# An allowlist, not "not stable". Branches cut from working-1.6 inherit this
# file, and an rc-*/feature-* branch must NOT be merge-synced: fog-version.sh
# reports drift on every run for rc (it increments off the committed suffix
# rather than a commit count), so a per-merge sync would bump the RC suffix
# on every merge. Those stay on the daily sweep. stable is excluded because
# its version is owned entirely by fog-workflows' stable-releases.yml.
#
# `closed` fires on abandoned PRs too, hence the merged check -- and the
# reusable workflow uses its `branch` input verbatim, with no validation
# against its own watched list, so constraining it is this file's job.
if: >-
github.event.pull_request.merged == true
&& github.event.pull_request.head.repo.full_name == github.repository
&& contains(fromJson('["working-1.6", "dev-branch"]'), github.event.pull_request.base.ref)

# Least privilege, stated rather than inherited. Everything the reusable
# workflow writes -- the commit, the push, and the version badge -- uses a
# GitHub App token, so nothing on this path needs a writable GITHUB_TOKEN. A
# called workflow can never hold more permission than its caller, so leaving
# this to the repo-wide default would make the effective permission whatever
# that happens to be. See fos' create_release.yml for the same reasoning.
permissions:
contents: read

uses: FOGProject/fog-workflows/.github/workflows/update-lang-fix-psr-and-sync-version.yml@main
with:
branch: ${{ github.event.pull_request.base.ref }}
secrets: inherit
23 changes: 23 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Tests

# A pull_request trigger can only fire from the repository the PR is opened
# against, so this stub has to live here even though every other fogproject
# workflow lives in FOGProject/fog-workflows. It is deliberately six lines:
# all of the logic is in the reusable workflow, so fixing the runner does not
# mean editing this file on three branches.
#
# For pull_request events GitHub reads workflows from the merge of head into
# base, so one copy on each BASE branch (working-1.6, dev-branch, stable)
# covers every PR opened against it -- the contributor's branch needs
# nothing.
#
# Not a push trigger, and not because of caution: the runaway that put ~30
# commits on dev-branch in 20 minutes happened because the triggered
# workflow pushed a commit back here. This one only reads.

on:
pull_request:

jobs:
suite:
uses: FOGProject/fog-workflows/.github/workflows/fogproject-tests.yml@main
22 changes: 20 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -204,11 +204,29 @@ self::$HookManager->processEvent('EVENT_NAME', array('data' => &$data));

## Pre-commit hook (IMPORTANT — explains "files I didn't touch" in commits)

`core.hooksPath` is `.githooks/`, so `.githooks/pre-commit` runs on **every** `git commit` (and `pre-merge-commit` delegates to it). It auto-modifies and `git add`s files beyond what you staged — this is expected, not a bug. Do **not** revert these. It does three things:
`core.hooksPath` is `.githooks/`, so `.githooks/pre-commit` runs on **every** `git commit` (and `pre-merge-commit` delegates to it). It auto-modifies and `git add`s files beyond what you staged — this is expected, not a bug. Do **not** revert these. It does two things:

1. **`updateLanguage()`** — regenerates `management/languages/messages.pot` via `xgettext`, sorts with `msgcat`, then `msgmerge`-updates every `.po`. Adds the whole `languages/` dir. Skipped if those tools aren't installed.
2. **`psrfix()`** — runs `php-cs-fixer fix packages/web --rules=@PSR2` and **`git add packages/web`** unconditionally. Two consequences: your code may be auto-reformatted to PSR-2, and **any other dirty file under `packages/web/` gets swept into your commit** regardless of what you staged. Commit files outside `packages/web/` (like this `CLAUDE.md`) separately if you need them isolated.
3. **Version bump** — derives a version from the branch name + commit count and rewrites `FOG_VERSION`/`FOG_CHANNEL` in `packages/web/lib/fog/system.class.php`. On `dev`/`stable` branches the channel is `Patches`. This step also tends to leave a **dangling staged `system.class.php`** bump after the commit; discard it with `git checkout -- packages/web/lib/fog/system.class.php` if you don't want it in the next commit.
It used to do a third — a **version bump**, rewriting `FOG_VERSION`/`FOG_CHANNEL` in `packages/web/lib/fog/system.class.php` from the branch name and the commit count, which is also what left a **dangling staged `system.class.php`** behind after every commit. That was removed, along with `.githooks/pre-push` (which existed only to refuse a push whose committed version had drifted).

### Why `FOG_VERSION` is not written on a branch

`FOG_VERSION` is `git rev-list master..HEAD --count` — a property of the commit
graph — but it is *stored* on a single tracked line of
`packages/web/lib/fog/system.class.php`. Writing it per-commit made every branch
open at the same time hold a **different value on the same line**, so each merge
left the others with a hand-resolved conflict on `system.class.php` before they
could be updated and re-tested. That is structural, not a race.

The version now has exactly one writer: `.github/workflows/sync-generated-files.yml`,
on the base branch, after a merge — plus fog-workflows' daily sweep for direct
pushes and `rc-*`/`feature-*` branches. A feature branch's `FOG_VERSION` is
*behind* while it is open, on purpose. The channel is `Patches` on
`dev`/`stable`.

Diagnosed on `working-1.6` in GH-1510; this branch has the same defect and takes
the same fix.

---

Expand Down
Loading