Commit Graph
100 Commits
Author SHA1 Message Date
Axel Uhl 418c8e5634 bug6288: protect live races during landscape operations
Add shared live-content conflict reporting, REST and GWT preflight support, operation-time guards, selective force handling, and landscape tests.

Assisted-By: GPT-5.6-sol
2026-09-14 23:30:19 +02:00
Axel Uhl c141c89c51 release notes for extended EXPORT check 2026-09-14 22:58:22 +02:00
Axel Uhl 4fbedbdb7a check EXPORT permission on more REST API calls 2026-09-14 22:58:14 +02:00
Axel Uhl ccaba4e1c9 show gh pr command 2026-09-14 22:58:04 +02:00
Axel Uhl 6f89dcebb4 Merge remote-tracking branch 'eclipse/bug6302' into eclipse-main 2026-09-12 19:07:07 +02:00
Axel Uhl aededd169e fixing UserGroupApiTest by introducing proper wait for checkbox selection;
especially with the new Selenium driver, sending the click() event may
not wait synchronously until all event handlers on the element clicked
have fired and run to completion. This way, the "updating" DOM attribute
used to synchronize in this case may not have been touched. Now we wait
for the checkbox to really be ticked before continuing. Then we can be
sure that the "updating" flag has also been set.

Assisted-By: Opus 4.8
2026-09-12 15:12:57 +02:00
Axel Uhl a9ff6f354e bug6302: moved new methods for RaceTracker callback handling closer to their caller (addRace) 2026-09-12 14:44:26 +02:00
Axel Uhl 26519a8bb7 bug6302: comment formatting 2026-09-12 14:42:34 +02:00
Axel Uhl ec320f9fef bug6302: fix RacingEventService deadlock in new-race-tracker path
Two related fixes for the permanent hang where a request thread held the
raceTrackersByRegatta write lock while parked in Object.wait(), timing out all
subsequent requests to the service.

TrackedRaceImpl.waitForAllRaceLogsAttached(): the wait guard re-evaluates the
live attached-race-log count inside the synchronized(latchForRaceLogs) block
instead of a stale local captured before entering the monitor. The stale local
could never change, so a notifyAll() that fired between the initial read and
entering wait() was lost, parking the thread forever (classic lost-wakeup).

RacingEventServiceImpl.addRace(...): split the register-or-notify handshake so
that only *claiming* (removing) the callbacks for the new tracker happens under
the raceTrackersByRegatta write lock, atomically with publishing the tracker;
the callbacks are then *invoked* after the lock is released. A callback may
block during tracker startup (waiting for race logs to attach), and previously
that wait ran while holding the global write lock, turning a single stalled
tracker into a service-wide outage. The read-locked find-or-enqueue in
getRaceTrackerByRegattaAndRaceIdentifier(...) still races atomically against the
claim, so no callback can be lost.

Assisted-By: Claude Opus 4.8
2026-09-12 14:41:49 +02:00
Axel Uhl 18a35f30f8 improved CLAUDE.md file regarding serialVersionUID 2026-09-12 13:37:04 +02:00
Axel Uhl 1c020b6f83 Merge remote-tracking branch 'eclipse/bug6301' into eclipse-main 2026-09-11 20:07:53 +02:00
Axel Uhl 6345980616 bug6301: admin release notes updated 2026-09-11 16:38:06 +02:00
Axel Uhl aeba3e5822 bug6301: failing test plus fix for updating competitor's nationality only from TracTrac 2026-09-11 16:20:42 +02:00
Axel Uhl 30cd390311 updated background image for Github Pages 2026-09-09 22:33:55 +02:00
Axel Uhl bce63b173c add container image tag to README.md
Link the badge to the upstream repository's GHCR package page.

Assisted-By: GPT-5.6-sol
2026-09-09 16:11:03 +02:00
Axel Uhl 803467b9b7 fixed tags in README.md 2026-09-09 14:30:29 +02:00
Axel Uhl 972abfb0de added more tags to the README.md 2026-09-09 14:28:26 +02:00
Axel Uhl e3493a5057 Merge branch 'eclipse-main' into bug6299 2026-09-08 17:08:13 +02:00
Axel Uhl e2fecc9f9f Wait for Media tab content after navigation
The Media tab replaces the event activity asynchronously, so wait for the new tab content before constructing its page object.

Assisted-By: GPT-5.6-sol
2026-09-08 17:05:36 +02:00
Axel Uhl b1442b9cb0 Merge branch 'eclipse-main' into bug6299 2026-09-08 14:52:10 +02:00
Axel Uhl db2cdd7d01 Stabilize asynchronous admin workflows
Wait for lazily loaded tab content instead of failing on transient absence, and sequence and track event, regatta, and leaderboard creation callbacks so dependent dialogs see persisted state.

Assisted-By: GPT-5.6-sol
2026-09-08 14:51:48 +02:00
Axel Uhl 39bbd61089 bug6299: synchronize animated inputs and expected login alerts
Extract a reusable interactability wait so media URL entry waits for the animated dialog to settle before clearing the input. Track public-server configuration requests and explicitly handle the expected tenant warning during the affected login test.

Assisted-By: GPT-5.6-sol
2026-09-07 23:50:59 +02:00
Axel Uhl bfd21494f8 bug6299: more robust check for whether element is clickable;
this is intended to help with animated elements such as the race map
settings, or an animated error dialog's buttons.

Assisted-By: Claude Code + GPT 5.6 Sol
2026-09-07 18:36:07 +02:00
Axel Uhl 6fea91d86e bug6299: un-pin Firefox for Selenium tests, default to latest
Now that the Selenium suite is on 4.13.0 (#6298) and speaks the W3C WebDriver
protocol, the Firefox 140 pin is no longer needed: the pin was a symptom of
Selenium 3's JSON Wire Protocol drifting from modern geckodriver/Firefox.
Default the firefox_version workflow_dispatch input to "latest" (both the input
default and the empty-input fallback) so CI tracks the current Firefox; the
setup-firefox action pairs a matching geckodriver automatically. The input is
kept so a specific version can still be pinned at dispatch time if a future
Firefox release regresses.

Assisted-By: Claude (claude-4.8-opus)
2026-09-07 14:12:36 +02:00
Axel Uhl 44e10ffcd7 bug6298: vendor commons-exec 1.3 required by selenium-os DriverService
Selenium 4's selenium-os module (org.openqa.selenium.os.CommandLine, used by
DriverService.start() to launch the driver binary) depends on Apache Commons
Exec 1.3. Selenium 3's fat client-combined jar bundled it; the modular
Selenium 4 needs it as a separate transitive. Its absence caused a runtime
NoClassDefFoundError: org/apache/commons/exec/ExecuteWatchdog on the first
driver session start. Added commons-exec-1.3.jar (the version pinned by
selenium-os 4.13.0) to lib/ and wired it into Bundle-ClassPath, build.properties
and .classpath. Not re-exported, as only selenium-os references it internally.

Assisted-By: Claude (claude-4.8-opus)
2026-09-07 13:31:41 +02:00
Axel Uhl fa56d3774c Merge branch 'bug6298' of github.com:eclipse-sailing-analytics/sailing-analytics into bug6298 2026-09-07 13:21:43 +02:00
Axel Uhl ffddbaa58f bug6298: re-export guava base/collect packages consumed directly by the test bundle
The Selenium 4 wrapper rewrite dropped the com.google.common.base and
com.google.common.collect exports that the Selenium 3 bundle provided. The
test bundle uses Guava directly (Objects, Function, ImmutableList) via
Require-Bundle, so Tycho's PDE compiler rejected those references with
"Access restriction: ... is not API". Plain javac did not catch this because
it ignores OSGi Export-Package/Require-Bundle API boundaries. Re-exporting the
two packages restores API access, matching the Selenium 3 behavior.

Assisted-By: Claude (claude-4.8-opus)
2026-09-07 13:20:24 +02:00
Axel Uhl 82e75cbf30 Merge branch 'eclipse-main' into bug6298 2026-09-07 13:13:16 +02:00
Axel Uhl 467266f595 bug6298: migrate Selenium test suite from 3.141.59 to 4.13.0
Selenium 3.x only speaks the legacy JSON Wire Protocol, which forces us to
pin old browser versions. Selenium 4 brings the W3C WebDriver protocol.
Since the reactor still runs on Java 8 and Selenium 4.14+ requires Java 11,
4.13.0 is the migration target: the last Java-8-compatible release.

org.openqa.selenium.osgi wrapper bundle:
- Drop the Selenium-3 client-combined fat jar and its transitives.
- Add the 12 Selenium 4.13.0 modules + selenium-chromium-driver and the
  required transitive runtime deps (Netty async HTTP client, OpenTelemetry).
- Keep the legacy org.json jar (still consumed by the test bundle and
  previously re-exported here); DevTools/CDP jars intentionally omitted
  (the suite uses no CDP).
- Re-scope Export-Package to the 4.13.0 package layout; keep
  Bundle-RequiredExecutionEnvironment JavaSE-1.8. Bump bundle to 4.13.0
  and mirror the jar list in .classpath, build.properties and pom.xml.

com.sap.sailing.selenium.test source fixes:
- WebDriverWait(WebDriver, long) -> WebDriverWait(WebDriver, java.time.Duration).
- org.openqa.selenium.internal.WrapsElement -> org.openqa.selenium.WrapsElement.
- ElementNotSelectableException (removed) -> ElementNotInteractableException.
- Bump wrapper-bundle dependency to 4.13.0.

The full test bundle compiles cleanly against the new wrapper on Java 8.

Assisted-By: Claude (claude-4.8-opus)
2026-09-07 10:33:40 +02:00
Axel Uhl f8d38b972f bug6279: harmonizing MPC listener thread creation;
this now sets the listenerThreadStarted flag consistently across the two
different call paths
2026-09-04 18:40:09 +02:00
Axel Uhl 81e892e7dd added REUSE token to upstream README.md 2026-09-04 15:29:18 +02:00
Axel Uhl 3ae98059eb Merge remote-tracking branch 'eclipse/main' into eclipse-main 2026-09-04 13:30:36 +02:00
Axel Uhl e31081d40a Merge branch 'translation' into eclipse-main 2026-09-04 13:30:17 +02:00
Axel Uhl 9fed29bbd3 Merge branch 'eclipse-main' into translation 2026-09-03 21:53:33 +02:00
Axel Uhl 7ee6be8951 added creating-ec2-image-for-hudson-from-scratch link to wiki home 2026-09-03 09:19:37 +02:00
Axel Uhl 561c50f84e don't use Set.of; it's not there in Java8 2026-09-02 20:43:53 +02:00
Axel Uhl 118c8deb3f Accept multiple .tar.gz content types when locating release archive asset
Prepare consumers for the release producer switching from an explicit
application/x-tar content type to the extension-inferred application/gzip.
All sites that locate the release tarball by asset content_type now accept
the set application/x-tar, application/gzip, application/x-gzip and
application/x-compressed-tar (the types commonly seen in the wild for a
gzip-compressed tar), instead of matching application/x-tar exactly.

This is behavior-preserving for existing application/x-tar releases and
forward-compatible with application/gzip releases, enabling a later,
risk-free switch of the release workflow to action-gh-release's files: input.

Consumers updated:
- GithubReleasesRepository.java (Set membership instead of String.equals)
- refreshInstance.sh (both jq selectors)
- github-download-release-assets.sh (both jq selectors)

Assisted-By: Claude (claude-4.8-opus)
2026-09-02 18:27:35 +02:00
Axel Uhl 9853617efd Restore explicit application/x-tar content type for release tarball asset
Folding the tar.gz upload into softprops/action-gh-release's files: input
(commit f6143d18) broke production installs: that action derives the asset
content type via the mime-types library, which maps .tar.gz to
application/gzip. Production installers (refreshInstance.sh,
github-download-release-assets.sh) select the tarball with
select(.content_type=="application/x-tar"), so nothing matched and installs
could not find the release.

Revert to the two explicit actions/upload-release-asset@v1 steps that set
asset_content_type: application/x-tar and text/plain, and add a comment
warning against folding them back in.

Assisted-By: Claude (claude-4.8-opus)
2026-09-02 17:49:28 +02:00
Axel Uhl a42c6c1587 Raise telemetry metric_frequency to 30s to fix broken CPU/memory charts
The workflow-telemetry action renders CPU/memory charts as mermaid
xychart blocks with every sample inlined as text (see src/graphing.ts);
there is no downsampling. GitHub renders mermaid with a fixed
maxTextSize of 50000 chars that the diagram author cannot raise, so on
our ~3h+ builds the default 5s sampling (~2300+ samples) blew past the
limit and the charts failed to render ("Maximum text size in diagram
exceeded").

Sampling every 30s yields ~390 points over a 3h15m run (~10k chars of
mermaid source), well under the limit with headroom for longer runs,
while keeping enough resolution to read CPU/memory trends.

Assisted-By: Claude (claude-4.8-opus)
2026-09-02 15:14:40 +02:00
Axel Uhl 53df2ecc1f try to get CPU/memory metrics build output working again by lowering time resolution 2026-09-02 15:13:04 +02:00
Axel Uhl d3d9f100f0 removed branch bug6269 from the triggers for build-sailing-base-p2.yml workflow 2026-09-01 21:42:17 +02:00
Axel Uhl 72e5efbf16 cap the telemetry capturing to keep charts displayable 2026-09-01 18:38:51 +02:00
Axel Uhl e3137b5558 Merge branch 'eclipse-main' into sap-eclipse-main 2026-09-01 18:12:01 +02:00
Axel Uhl f9e2b8e181 follow-up to PR #6292: removing redundant JUnit bundle dependencies 2026-09-01 18:08:07 +02:00
Axel Uhl f6143d189c release: upload release assets via action-gh-release files:
Fold the tar.gz and release-notes.txt uploads into the single
softprops/action-gh-release step using its files: input, and drop the
two actions/upload-release-asset@v1 steps. Those steps still emitted the
deprecated ::set-output workflow command; action-gh-release infers each
asset's content type from its file extension.

Assisted-By: Claude (claude-4.8-opus)
2026-09-01 17:53:46 +02:00
Axel Uhl 4f9a4d9d50 upgraded softprops/action-gh-release to newer release for Node 24 2026-09-01 17:20:05 +02:00
Axel Uhl e024fca545 Skip paths-filter on workflow_dispatch to avoid missing-'before' warning
On workflow_dispatch there is no 'before' field in the event payload, so
dorny/paths-filter cannot compute a meaningful diff and warns, falling back
to a last-commit-only diff. A manual dispatch is an explicit request to build,
so skip the filter step on that event and force the 'changes' job's should_run
output to true. push/PR events are unchanged and still gated by the filter's
'code' output. This also keeps the changes job in agreement with the build
job's if-condition, which already forces the build on workflow_dispatch.

Assisted-By: Claude Opus 4.8
2026-09-01 11:10:05 +02:00
Axel Uhl a4450f1861 Replace catchpoint workflow-telemetry-action with Node 24 fork
The upstream catchpoint/workflow-telemetry-action v2.0.0 (its latest
release) still declares the node20 runtime in action.yml, so GitHub
force-runs it on Node 24 and emits a deprecation warning. There is no
upstream release that resolves this.

Switch to ycfreeman/workflow-telemetry-action@v3.0.2, a maintained fork
upgraded to node24 whose inputs are a superset of upstream (comment_on_pr
is unchanged). Pinned to the specific commit SHA to avoid mutable-tag
risk, with the version noted in a comment.

Assisted-By: Claude (claude-4.8-opus)
2026-09-01 10:55:17 +02:00
Axel Uhl 225d64af02 Merge remote-tracking branch 'eclipse/main' into eclipse-main 2026-09-01 10:43:49 +02:00
Axel Uhl 43caa7a8cc updated setup-firefox and setup-android actions in release.yml;
they are now compliant with Node 24, the basis for Github Actions
runners. workflow-telemetry-action still requests Node 20. We'll see if
there is still a maintainer around who may be willing to upgrade this to
Node 24.
2026-09-01 10:42:38 +02:00
Axel Uhl 38714ae2be Merge branch 'bug6279' into eclipse-main 2026-08-31 23:41:49 +02:00
Axel Uhl 20b8572a1e Revert "trying without a secret additional access token for fetching the repo history when merging main into docker-25"
This reverts commit a8ab29f809.
2026-08-31 23:28:51 +02:00
Axel Uhl d6e1593619 bug6279: new Candidate.getTimePointAsMillis() to accelerate mass-comparisons in large TreeMaps 2026-08-31 14:52:44 +02:00
Axel Uhl 294b7e8f8d using newer checkout action 2026-08-30 23:49:22 +02:00
Axel Uhl a8ab29f809 trying without a secret additional access token for fetching the repo history when merging main into docker-25 2026-08-30 23:45:38 +02:00
Axel Uhl cd915f2ccb added configuration/approve-pr-for-build as a convenience script for PR handling, especially downstream 2026-08-29 23:48:03 +02:00
Axel Uhl 7bb4dc9c70 after having restored the REUSE.toml, removed .reuse/dep5 2026-08-29 23:22:26 +02:00
Axel Uhl 5c359dde2f Revert "removed REUSE.toml as we habe .reuse/dep5"
This reverts commit f36199ad97.
2026-08-29 23:22:09 +02:00
Axel Uhl 1d37d3e699 Merge remote-tracking branch 'eclipse/main' into eclipse-main 2026-08-29 09:05:45 +02:00
Axel Uhl f36199ad97 removed REUSE.toml as we habe .reuse/dep5 2026-08-29 08:53:19 +02:00
Axel Uhl 08b7205d6d bug53: don't post build-gate on a cancelled trusted build
A cancelled build is indeterminate — the tests might have passed had the
run not been interrupted — so posting build-gate=failure would be
misleading. Restrict the failure post to build.result==failure (a real
tested failure); a cancelled trusted build now posts NOTHING, leaving the
build-gate context absent so the PR stays blocked at "Expected" with no
red X. Re-run to obtain a real verdict.

Assisted-By: Claude Opus 4.8
2026-08-29 00:24:27 +02:00
Axel Uhl 137ffc0df6 bug53: make build-gate a posted commit status, not a skippable job
The previous build-gate was a JOB, and GitHub Actions auto-creates a
check-run for every job whose conclusion is filled from the job's fate —
including "skipped" when the job's if: is false. Branch protection /
rulesets treat a skipped required check as SATISFIED (mergeable), so a
compile-only fork PR reported build-gate=skipped=passed and became
mergeable without tests (PRs #53/#54; #53 merged this way). No job can
represent "absent": a skipped job still materializes a skipped check-run.
The earlier attempt to make it exit 1 (red) worked but was ugly and, on a
failed build, still mis-reported skipped in practice.

A commit status (legacy Statuses API) is created only if we explicitly
POST it, and a skipped STEP posts nothing (steps are not check-runs). The
ruleset matches the required context "build-gate" by NAME across both the
Checks and Statuses APIs, so a posted commit status with context=build-gate
satisfies it exactly as the old check-run did — the ruleset needs no change.

Change: remove the build-gate job; add job post-build-gate-status (named so
its own auto check-run carries a context the ruleset ignores) whose single
step POSTs a commit status context=build-gate:
  - state=success when the change was trivial (build skipped, no relevant
    changes) OR a full build ran WITH tests and succeeded;
  - state=failure when a full build ran WITH tests and failed/cancelled
    (loud red X for a committer's own broken build);
  - NOTHING for any compile-only run (fork PR, *-reviewed-for-compile,
    workflow_dispatch skip_tests), succeeded or failed — so the build-gate
    context stays absent and the PR is blocked at "Expected" with no red X.
The status is posted against the PR HEAD sha on pull_request events
(github.sha there is the ephemeral refs/pull/N/merge commit the ruleset
does not evaluate) and github.sha otherwise. Merge qualification for fork
code still comes only from a maintainer pushing a *-reviewed-for-build tag
(full trusted build with tests), which posts the success status.
compile-gate (advisory) is unchanged.

Assisted-By: Claude Opus 4.8
2026-08-29 00:20:25 +02:00
Axel Uhl 9ced74e0d5 bug53: fix build-gate letting compile-only fork PRs merge
A required status check whose job is skipped by its own if: still
materializes a check run with conclusion "skipped", which GitHub branch
protection / rulesets treat as SATISFIED (mergeable). The prior design
assumed an if:-false job would leave the required check "pending" and
block merge without a red X; that pending state does not exist for a job
that is part of a triggered workflow. As a result, a successful
compile-only fork pull_request build reported build-gate as "skipped"
= passed, and PRs #53/#54 became mergeable WITHOUT the secret-bearing
test build ever running (#53 was merged this way).

Fix: build-gate now runs unconditionally (if: always()) and, for a
successful compile-only run (build success AND skip_tests==true), exits 1
instead of skipping, so the required check goes red and the PR stays
un-mergeable. Only a genuine full build with tests, or a legitimate
trivial-change skip, satisfies the gate. Merge qualification for fork
code still comes solely from a maintainer pushing a *-reviewed-for-build
tag. compile-gate (advisory) is unchanged and still shows the compile
succeeded.

Assisted-By: Claude Opus 4.8
2026-08-28 23:39:30 +02:00
Axel Uhl f9a67614c5 Merge branch 'bug6279' into eclipse-main 2026-08-28 22:08:34 +02:00
Axel Uhl 434093cedc removed extra empty line from README.md 2026-08-28 21:33:09 +02:00
Axel Uhl b5218fa611 bash completion: list all options on a bare Tab after the command
Previously the option-name branch was guarded by `$cur == -*`, so a Tab
in option position with an empty current word produced nothing. Drop the
guard: compgen -W filters by $cur anyway, so an empty cur now lists every
option while a partial still narrows. Value completion is unaffected —
those cases return earlier in the function.

Assisted-By: Claude Opus 4.8
2026-08-28 21:03:45 +02:00
Axel Uhl 732be09a2d Add bash completion for merge-upstream-to-downstream.sh
Tab-completes the script's named options and, intelligently, their
values against the git repo containing the CWD:
  - remote-name options complete against 'git remote';
  - remote-branch options (--upstream/downstream/fork-branch) complete
    against the branches OF THE RESOLVED REMOTE, resolving each role to
    a remote with the same precedence the script uses (explicit
    --*-remote on the line > MERGE_U2D_* env var > built-in default);
  - --local-*-branch options complete against local branches.

Install by sourcing from ~/.bashrc or symlinking into a
bash-completion completions dir under the command's basename.

Assisted-By: Claude Opus 4.8
2026-08-28 21:00:24 +02:00
Axel Uhl 15486910e2 merge-upstream-to-downstream.sh: env-var defaults and step-7 PR-lookup fix
Add MERGE_U2D_* environment variables that seed the default for every
command-line option, with precedence CLI option > env var > built-in
default. This lets the script run with no arguments when e.g.
MERGE_U2D_FORK_REMOTE is exported from .bashrc; -h shows the live
resolved defaults.

Also fix the step-7 fallback so that when 'gh pr create' refuses because
an open PR already exists for the fork head (the older-head path, where
the push already updated it in place), the existing PR is found and its
URL reported instead of erroring. 'gh pr list --head' filters by branch
name only, so match on the bare fork branch plus a headRepositoryOwner
filter, mirroring the early idempotency check.

Assisted-By: Claude Opus 4.8
2026-08-28 20:54:52 +02:00
Axel Uhl 612690569e added configuration/merge-upstream-to-downstream.sh for automated PR generation 2026-08-28 20:46:48 +02:00
Axel Uhl 5fe998c19d removed extra empty line 2026-08-28 19:46:14 +02:00
Axel Uhl bb946937fa release.yml: restore always() on build-gate so a failed build goes red
A regression: replacing 'if: always()' with the bare content guard
'if: ${{ !(needs.build.result == '\''success'\'' && ... skip_tests == '\''true'\'') }}'
lost always() semantics. Because 'build' is in needs:, a FAILED build then
cascade-skips build-gate (GitHub's default: a dependent job is skipped when a
needs: dependency fails unless the if: contains always()/!cancelled()). That
left the REQUIRED build-gate check quietly pending on a real build failure
instead of going red (observed on run 33162860634, a push to main with a
failing build).

Restore always() so the gate runs for every build outcome and the narrow guard
alone decides the sole non-run case (a *successful* compile-only build, which
must stay pending/blocked, not red). A real build failure now runs the gate and
it exits 1 -> red. Documented why always() is required in the comment.

Assisted-By: Claude Opus 4.8
2026-08-28 18:17:02 +02:00
Axel Uhl e6ac76f0fa bug6279: use Supplier<String> for logs and changed from info to fine 2026-08-28 16:00:47 +02:00
Axel Uhl b01257f126 bug6279: use Util.size instead of force-looping; O(1) now for typical collections 2026-08-28 15:33:02 +02:00
Axel Uhl 5b637a2624 Merge branch 'eclipse-main' into bug6279 2026-08-28 15:06:36 +02:00
Axel Uhl 593b65368c Merge remote-tracking branch 'eclipse/main' into eclipse-main 2026-08-28 12:11:58 +02:00
Axel Uhl 51403fbe1f Skip build-gate on successful compile-only runs so they show pending (not red) while staying merge-blocked
A successful compile-only run (fork pull_request, *-reviewed-for-compile tag,
or workflow_dispatch with skip_tests=true) previously made build-gate exit 1:
the required check went red AND the whole Actions run showed as failed, even
though compilation succeeded. That reads as breakage when nothing broke.

Fork pull_request runs get a read-only GITHUB_TOKEN (permissions: is capped to
read-only regardless of what the workflow requests), so the Commit Statuses and
Checks APIs both 403 there — a posted 'neutral'/status cannot mark the check.
And neutral would not block merge anyway (GitHub treats neutral/skipped/success
as passing for required checks). The only state that is both non-red and still
merge-blocking is a required check that is never reported: it sits 'Expected —
waiting' (pending).

So build-gate is now SKIPPED via a job-level if: for exactly the successful
compile-only case. A required check whose job never starts stays pending, so the
PR remains un-mergeable without a red X and the run is not marked failed. This
must be a job-level skip (job never starts): a job that runs and reports
conclusion 'skipped' counts as PASSED and would let the PR merge.

The guard is deliberately narrow — !(build.result == success && skip_tests ==
true) — so a compile-only build that FAILED still runs the gate and goes red,
and the trivial-change skip still runs and goes green (docs-only PRs are not
left pending forever). The now-unreachable compile-only branch in the gate body
is removed. Merge qualification for fork code continues to come from a
maintainer pushing a *-reviewed-for-build tag (full trusted build with tests).
compile-gate (advisory) still runs and goes green, giving a clear positive
compile signal beside the pending build-gate.

Assisted-By: Claude Opus 4.8
2026-08-28 12:08:59 +02:00
Axel Uhl e0679de32d Upgrade actions/checkout, setup-java, upload-artifact to node24 releases (pinned by SHA)
actions/checkout@v4, setup-java@v4 and upload-artifact@v4 run on the node20
runtime, which is EOL (Node 20 reached end-of-life on 2026-03-24) and emits a
deprecation warning on every run. Bump each to its current release, all of
which run on node24, and pin by full commit SHA (matching how the third-party
actions in this workflow are pinned):

- actions/checkout    v4 -> v7.0.1 (3d3c42e5aac5ba805825da76410c181273ba90b1)
- actions/setup-java  v4 -> v6.0.0 (dd06d9cba3e5552c54d9f8ea23572deb30010f7c)
- actions/upload-artifact v4 -> v7.0.1 (043fb46d1a93c77aae656e7c1c64a875d1fc6a0a)

checkout v5+ requires Actions Runner >= v2.327.1, which GitHub-hosted
ubuntu-latest satisfies. setup-java v6 is unaffected for the Temurin 8/17/25
toolchains used here. actions/upload-release-asset@v1 is intentionally left as
is: it is archived with no maintained successor and belongs to a separate
change, not this node20 sweep.

Assisted-By: Claude Opus 4.8
2026-08-27 20:19:15 +02:00
Axel Uhl dfc113c19f Auto-build submitted PRs (same-repo: full build with tests+secrets; fork: compile-only, no secrets)
A submitted PR now triggers a build automatically, split by trust:

- Same-repo PR (branch pushed by a committer): full build with tests and
  secrets — same trust level as a direct branch push, which already builds
  with secrets. build-gate can go green with no manual tag.
- Fork PR: compile-only with NO secrets. GitHub withholds secrets from fork
  pull_request runs at the event level, and a compile-only build needs none,
  so this is both automatic and safe. build-gate stays red; the secret-bearing
  full build of fork code remains gated behind a maintainer pushing a
  *-reviewed-for-build tag.

Uses pull_request (not pull_request_target), so fork runs get a read-only
token and no secrets; with the secret env values already resolving to '' when
tests are skipped, fork code never meets a secret.

- pull_request trigger: types [opened, synchronize, reopened, ready_for_review]
  with the same paths-ignore as push; no branches: filter (targets PRs into any
  base branch).
- build job if:: draft PRs are excluded (build only once marked ready).
- Determine build mode: a fork pull_request (head.repo.full_name != the base
  repo) sets skip_tests=true; same-repo PRs run the full build.

The conditional secret env, -t flag, Test Reports guard, and both gate jobs
already key on the computed skip_tests flag, so they need no change.

Assisted-By: Claude Opus 4.8
2026-08-27 18:26:01 +02:00
Axel Uhl 180b05e065 Add two-stage reviewed-tag build flow (compile-only without secrets, full build with secrets)
A maintainer reviews a fork PR's exact SHA, then pushes a tag at that SHA:
'*-reviewed-for-compile' runs a compile-only build with NO secrets (cheap
sanity check), '*-reviewed-for-build' runs the full build with tests and
secrets. A tag push is a trusted push event in the base repo, so it receives
secrets — the only way to run secret-bearing validation on fork-authored code.

- push trigger: keep branches: ['**'] (required so the new tags: filter does
  not silently disable branch triggers) and add the two reviewed-tag families.
- build job: a 'Determine build mode' step computes skip_tests (true for a
  -for-compile tag or a workflow_dispatch skip_tests=true) and exposes it as a
  job output. The five test-runtime secrets resolve to '' when skip_tests is
  true, so their values never enter the environment on a compile-only run; -t
  is passed on the same flag. Test Reports step is skipped when tests are.
- build-gate (required check): green only for a genuine full build with tests,
  or a trivial-change skip; a compile-only success fails it. This also fixes a
  pre-existing bug where a skip_tests=true dispatch satisfied the gate.
- compile-gate (new, advisory): green whenever the build compiled, regardless
  of tests, giving -for-compile runs a distinct check without touching the
  required build-gate.

Assisted-By: Claude Opus 4.8
2026-08-27 18:01:26 +02:00
Axel Uhl d31e2510e8 redact token from README.md 2026-08-27 16:05:38 +02:00
Axel Uhl fe95b7b770 updated dorny/test-reporter from 1.9 to 3.0 2026-08-27 14:40:20 +02:00
Axel Uhl 7d5b5093b5 bug48: drop the approving-review environment gate upstream
Upstream committers have more freedom handling PRs, so the pull_request_review
trigger, the privileged-pr-build environment gate, and the associated
head-SHA / persist-credentials / base-ref conditionals are not needed here.
Remove them, keeping the plain push/workflow_dispatch build.

The dorny/paths-filter correctness fix (v4.0.3 + some-with-excludes + a
positive '**' rule) is retained: it fixes a pre-existing bug where docs-only
changes were misclassified as code changes on the push path too.

The downstream (SAP) branch keeps the environment-based approval approach via
a subsequent 'merge -s ours'.

Assisted-By: Claude Opus 4.8
2026-08-27 11:46:25 +02:00
Axel Uhl a91ae444e2 bug48: upgrade dorny/paths-filter to v4.0.3 and use some-with-excludes
v4 adds the 'some-with-excludes' predicate-quantifier, which is the natural
fit here: code is true only when a changed file matches the positive '**'
rule and none of the '!' exclusions. Replaces the v3.0.3 'every' workaround.
The only v4 breaking change is the Node 20->24 runtime bump.

Assisted-By: Claude Opus 4.8
2026-08-27 11:22:20 +02:00
Axel Uhl 03dbc43834 bug48: fix path filter so docs-only PRs are correctly excluded
The 'code' filter used only negated rules under the default 'some'
quantifier. picomatch treats '!README.md' as "any path except README.md",
so a changed README.md still matched a rule and set code=true, forcing a
full build for docs-only PRs (as seen on PR #48).

Add a positive '**' rule and set predicate-quantifier: 'every' (the pinned
v3.0.3 does not support the v4-only 'some-with-excludes'), so code is true
only when a changed file matches the '**' rule AND all '!' exclusions,
i.e. it is a non-trivial file.

Assisted-By: Claude Opus 4.8
2026-08-27 11:22:06 +02:00
Axel Uhl 2f5a5c1bc1 bug48: apply the trivial-changes path filter to approved-PR builds too
The changes job used dorny/paths-filter without an explicit base/ref, so on
a pull_request_review event (which, unlike pull_request, is not auto-detected
by the action) it diffed against the default branch with a shallow clone and
treated every file as changed. A docs-only PR therefore ran a full build and
hit the deployment-review gate needlessly.

Diff the PR head (github.event.pull_request.head.sha) against the PR base
(github.event.pull_request.base.sha) explicitly, fetch full history so the
merge-base resolves, and grant pull-requests: read. Push and workflow_dispatch
behavior is unchanged (base/ref fall back to empty, fetch-depth to 1).

Assisted-By: Claude Opus 4.8
2026-08-27 11:21:54 +02:00
Axel Uhl cfa5cf505c more instructions for Claude Code in CLAUDE.md 2026-08-27 10:41:52 +02:00
Axel Uhl 0ed071ef8d bug48: run release build for PRs only after an approving review
Add a pull_request_review (submitted) trigger and gate the changes/build
jobs on an approving review, so a PR (possibly from an untrusted fork)
never builds with secrets before a maintainer has vetted the exact code.

Secrets are released via a conditional 'privileged-pr-build' environment
referenced only on review runs; on push/workflow_dispatch the environment
name is empty (no gate), keeping existing behavior unchanged. The
environment holds no secrets, so repository-level values are used via
environment>repository precedence and rotation stays in one place.

Review runs check out the PR head SHA with persist-credentials: false so
untrusted build code cannot scrape the token. build-gate now treats a
skipped changes job (non-approving review) as pass rather than failure.

Assisted-By: Claude Opus 4.8
2026-08-27 00:08:00 +02:00
Axel Uhl 2662d15f4b new i18n messages for Sail Insight 2026-08-25 18:07:59 +02:00
Axel Uhl 86e6d8caed added YellowBrick test for RMSR2025 and factored commonalities with RMSR2019 2026-08-24 14:06:14 +02:00
Axel Uhl 2ea18ceddd Merge branch 'eclipse-main' into translation 2026-08-21 13:06:32 +02:00
Axel Uhl e60db6f90e Merge remote-tracking branch 'eclipse/main' into eclipse-main 2026-08-21 13:06:10 +02:00
Axel Uhl f5041c0255 (temporarily?) disabling YellowBrickAdapterTest;
The local / master-SNAPSHOT / master-latest / 19/08/2026 09:58 update on
their yb.tl site may have broken things for us. E-mail to their support
address has been sent, and we need to wait until we receive
clarification.
2026-08-21 13:04:09 +02:00
Axel UhlandCopilot 7304bae8a8 bug6286: fix IndexOutOfBoundsException in FixesAndTails.mergeFixes when switching tail color to a metric
In POLYCHROMATIC mode, Colorline.setPath(...) built zero polylines for a
single-vertex path, so getLength() returned 0 instead of 1. This broke the
FixesAndTails invariant tail.getLength() == lastShownFix - firstShownFix + 1,
after which mergeFixes computed out-of-range tail indices and threw an
IndexOutOfBoundsException while scrubbing the time slider.

Represent a one-vertex path as a single Polyline holding that vertex, matching
the interim single-vertex state insertAt builds up and getLength's case 1
already expects.

Assisted-By: Claude (claude-4.8-opus)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-08-20 22:33:06 +02:00
Axel Uhl 9169a8acb1 Merge remote-tracking branch 'eclipse/bug6281' into eclipse-main 2026-08-20 17:20:37 +02:00
Axel Uhl 0742f4ae3c fixed parameter naming for SailingService.createPairingListTemplate 2026-08-20 02:07:16 +02:00
Axel Uhl 66a0473882 bug6281: added doc and release notes 2026-08-19 14:39:01 +02:00
Axel Uhl 7b014add17 bug6281: first implementation of new /wind_at_position method on RegattasResource 2026-08-19 14:20:58 +02:00
Axel Uhl 2783921cfe Merge branch 'eclipse-main' into bug6281 2026-08-19 09:59:33 +02:00
Axel Uhl 113eac3cca hint for Claude/Copilot to add "Assisted-By: " to commit messages 2026-08-18 17:46:01 +02:00
Axel Uhl eff5ab78b1 added "zuerichsee" as WindFinder spot collection 2026-08-18 13:02:49 +02:00